Официальный сайт геоинформационной системы (ГИС) ObjectLandОфициальный сайт геоинформационной системы (ГИС) ObjectLand
  
 
ПОИСК ПО САЙТУ:
yandex.ru
КАРТА САЙТА
 
главная / поддержка / форум
E-MAIL:ПАРОЛЬ: 
регистрация

Обсуждение

 Работа с фильтрами в COM APIРабота с фильтрами в COM API [ nail ]
Четверг, 18 марта 2004, 10:24

Не получается у меня сабж.: группа фильтрации не добавляется в коллекцию FeatureType::FilterGroups.

делаю это так:

gdbFilterGroup = gdbFeatureType->CreateFilterGroup();
gdbFilterGroup->set_Name(newname);

gdbRecordset->MoveFirst();
while( !gdbRecordset->EOF_() )
{
gdbField = gdbRecs->Fields->Item(fieldname);
gdbFilterCondition = gdbFT->CreateFilterCondition(i++ ? gdbLogicalOr : gdbLogicalNone,

gdbField, gdbGeoPropertyNone, gdbFilterRelEQ, gdbField->get_Value(), vtOp2);
gdbFilterGroup->FilterConditions->Append(gdbFilterCondition);
gdbRecs->MoveNext();
}

gdbFilterGroup->LineStyle = gdbEngine->SharedLibrary->LineStyles->Item(linestyle);
gdbFilterGroup->Visibility = true;

gdbFeatureType->FilterGroups->Append(gdbFilterGroup); //вот здесь группа в коллекцию не добавляется!

gdbFeatureType->Layer принадлежит коллекции gdbTheme->Layers

что не так?
Где можно взять пример сабж.?


 Работа с фильтрами в COM API [ ObjectLand Development Team ]
Четверг, 18 марта 2004, 12:47

Группа фильтрации может не добавляться в коллекцию по множеству причин. Чтобы выяснить что именно мешает добавлению, Вам необходимо получить описание возникшей ошибки.

Вот пример на VisualBasic, который выполняет практически то же самое:
[-----------]
Private Const GDB_NAME As String = "City" ' Имя файла ГБД
Private Const MAP_NAME As String = "Город Энск"
Private Const THEME_NAME As String = "Сегменты улиц" ' Имя темы ГБД
Private Const LAYER_NAME As String = "Улицы" ' Имя слоя темы
Private Const FEATURETYPE_NAME As String = "Сегмент улицы" ' Имя типа геометрий
Private Const TABLE_NAME As String = "Сегменты" ' Имя таблицы
Private Const FIELD1_NAME As String = "Код улицы" ' Имя поля
Private Const FILTERGROUP2_NAME As String = "По коду улицы"

Private Sub Main()

Dim objGDBEngine As GDBEngine ' Ядро ObjectLand

Dim objGDB As GDBGeoDatabase ' ГБД

Dim objGDBTheme As GDBTheme ' Тема ГБД

' Установка обработчика ошибок

'On Error GoTo PROC_ERROR

Dim strGDBPath As String ' Путь и имя файла ГБД

' Установка имени и пути к ГБД

strGDBPath = "C:\Documents and Settings\All Users\Application Data\ObjectLand\DEMO\RU\City"

' Создание ядра ObjectLand

Set objGDBEngine = New GDBEngine

' Открытие ГБД с именем, определённым переменной strGDBPath,

' и атрибутами "Монопольно", "Чтение/Запись", "Без файла изменений"

Set objGDB = objGDBEngine.OpenGDB(strGDBPath, gdbOpenExclusive Or gdbOpenReadWrite Or _

gdbOpenNoChgFile, "", "", "")

' Создание темы

Set objGDBTheme = objGDB.CreateTheme(objGDB.Maps(MAP_NAME))

objGDBTheme.Name = THEME_NAME

Dim objGDBLayer As GDBLayer ' Слой

' Получение слоя из коллекции Theme::Layers

Set objGDBLayer = objGDBTheme.Layers(LAYER_NAME)

Dim objGDBFeatureType As IGDBFeatureType ' Тип геометрий

' Получение типа геометрий из коллекции Layer::FeatureTypes

Set objGDBFeatureType = objGDBLayer.FeatureTypes(FEATURETYPE_NAME)

Dim objGDBFilterGroup As IGDBFilterGroup ' Группа фильтрации

Dim objGDBFilterCondition As IGDBFilterCondition ' Критерий фильтрации

' Создание группы фильтрации на основе типа геометрий

Set objGDBFilterGroup = objGDBFeatureType.CreateFilterGroup

' Установка имени группы фильтрации

objGDBFilterGroup.Name = FILTERGROUP2_NAME

' Вывод сообщения о создании группы фильтрации

Debug.Print vbCrLf & "Создана группа фильтрации """ & objGDBFilterGroup.Name & """."

' Получение таблицы

Dim objGDBTable As IGDBTable ' Таблица критерия фильтрации

Set objGDBTable = objGDB.Tables(TABLE_NAME)

' Получение поля для первого критерия фильтрации

Dim objGDBField As IGDBField ' Поле критерия фильтрации

Set objGDBField = objGDBTable.Fields(FIELD1_NAME)

' Создание критерия фильтрации

Set objGDBFilterCondition = _

objGDBFeatureType.CreateFilterCondition(gdbLogicalNone, objGDBField, _

gdbGeoPropertyNone, gdbFilterRelEQ, 1, Null)

objGDBFilterGroup.FilterConditions.Append objGDBFilterCondition

Set objGDBFilterCondition = _

objGDBFeatureType.CreateFilterCondition(gdbLogicalOr, objGDBField, _

gdbGeoPropertyNone, gdbFilterRelEQ, 2, Null)

objGDBFilterGroup.FilterConditions.Append objGDBFilterCondition

Set objGDBFilterCondition = _

objGDBFeatureType.CreateFilterCondition(gdbLogicalOr, objGDBField, _

gdbGeoPropertyNone, gdbFilterRelEQ, 3, Null)

objGDBFilterGroup.FilterConditions.Append objGDBFilterCondition

Set objGDBFilterCondition = _

objGDBFeatureType.CreateFilterCondition(gdbLogicalOr, objGDBField, _

gdbGeoPropertyNone, gdbFilterRelEQ, 4, Null)

objGDBFilterGroup.FilterConditions.Append objGDBFilterCondition

objGDBFilterGroup.LineStyle = objGDBEngine.SharedLibrary.LineStyles("_Пунктир 10x2")

objGDBFilterGroup.Visibility = True

' Добавление группы фильтрации в коллекцию FeatureType::FilterGroups

objGDBFeatureType.FilterGroups.Append objGDBFilterGroup

' Каталогизация темы

objGDB.Themes.Append objGDBTheme

' Сохранение модификации темы

objGDBTheme.Update gdbThemeWindowStay

' Закрытие ГБД

objGDBEngine.Close

' Освобождение ядра ObjectLand

Set objGDBEngine = Nothing

' Завершение программы

Exit Sub

' Выдача сообщения об ошибке
PROC_ERROR:

MsgBox Err.Description

End Sub
[-----------]


 Работа с фильтрами в COM API [ nail ]
Четверг, 18 марта 2004, 14:16

описания всех ошибок: "Успешное завершение операции".

спасибо за пример!

от моего случая он отличается тем, что тема в момент редактирования фильтров уже принадлежит коллекции GDBGeoDatabase::Themes и на ее основе создан ThemeBrowser. это может влиять на возможность добавления групп фильтрации?
где-нибудь можно почитать про это "множество причин"?


 Работа с фильтрами в COM API [ ObjectLand Development Team ]
Четверг, 18 марта 2004, 15:45

Видимо, Вы получаете описание не для той ошибки. Любой вызов метода или свойства COM-интерфейса ObjectLand, окончившийся неуспешно, устанавливает код ошибки ГБД (свойство GDBEngine.GdbError), код ошибки СУБД (свойство GDBEngine.DbmsError), генерирует событие об ошибке GDBError) и устанавливает расширенную информацию об ошибке через вызов CreateErrorInfo. Подробное описание механизма реализации и использования интерфейсов с информацией об ошибке приведено по адресу
http://msdn.microsoft.com/library/en-us/automat/htm/chap11_0fqr.asp

Факт принадлежности темы коллекции в данном случае не должен влиять на поведение.

Документация по COM-интерфейсам ObjectLand содержит описание для каждого метода и функции. Описание это в том числе содержит и ограничения по использованию данного метода или функции. Описание же всего множества причин, по которому то или иное свойство или метод могут устанавливать код ошибки, не представляется возможным. В любом случае, описание кода возникшей ошибки содержит информацию о причинах возникновения данной ошибки.


 Спасибо, коллеги!Спасибо, коллеги! [ nail ]
Четверг, 18 марта 2004, 17:45

а дело оказалось в том, что при создании gdbFilterCondition я использовал объект GDBField из коллекции GDBRecordset::Fields, а надо было получить таблицу из GDBGeoDatabase::Tables и брать поле оттуда.
еще раз спасибо за пример, очень помог.

Ответить

Знаком «*» отмечены обязательные для заполнения поля.
Ваше имя:  *
Адрес электронной почты:  
Тема:  *
Сообщение:
 *
Подтверждение:
(не требуется для зарегистрированных пользователей)
 *
 



Copyright © 1999–2025 ГИС ObjectLand
ГИС ObjectLand ® ООО «Радом-АйТи»
Информация о лицензировании
главная | о продукте | скачать | купить | поддержка | новости