Я как раз сейчас тоже разбираюсь с наборами (группами) объектов.
Цитата |
---|
Реализовать работу с такими объектами как с одним объектом, используя ГИС Конструктор. |
Вот примеры такого поведения где можно посмотреть ?
функции описаны в seekapi.h (после этого комментария идёт набор функций):
Код |
---|
/*******************************************************************
* *
* ФУНКЦИИ ДЛЯ НАБОРА ОБЪЕКТОВ, ОБЪЕДИНЕННЫХ ПО СЕМАНТИЧЕСКОЙ *
* ХАРАКТЕРИСТИКЕ *
* *
* Коды семантик: *
* *
* 32801 - признак объекта, имеющего ссылку на подчиненный объект; *
* 32802 - признак объекта, на который имеется ссылка от главного *
* объекта; *
* 32803 - признак объекта, входящего в группу равноправных *
* объектов. *
* *
* Значением семантики является уникальный номер группы, который *
* формируется автоматически по номеру главного объекта или первого *
* объекта в группе равноправных объектов. *
* *
********************************************************************/
|
Из того что я сейчас разобрал:
Для создания группы из уже созданных объектов нужно сначала создать группу
Код |
---|
// Создание класса набора объектов, объединенных по семантической
// характеристике
// При ошибке возвращает 0
_MAPIMP HOBJSET _MAPAPI mapCreateObjectSet();
|
потом накидать в неё главный и подчинённые объекты:
Код |
---|
// Добавить главный объект группу (с приписыванием семантики 32801)
// hobjset - указатель на набор объектов
// save - сохранение в файл : = 0 - не сохранять, 1 - сохранять
// Если hobj - вновь созданный объект (Key = 0) и save = 1
// вначале info будет сохранен, а потом добавлен в группу
// Если объект hobj содержит групповую семантику и является главным
// - добавляет в набор, не изменяя групповую семантику
// Если объект hobj содержит групповую семантику и является подчиненным
// - добавляет групповую семантику (создает новую группу не разрушая старую)
// Возвращает порядковый номер объекта или 0
_MAPIMP long int _MAPAPI mapObjectSetAppendGeneral(HOBJSET hobjset, HOBJ hobj,
long int save);
// Добавить подчиненный объект группу (с приписыванием семантики 32802)
// hobjset - указатель на набор объектов
// save - сохранение в файл : = 0 - не сохранять, 1 - сохранять
// Если hobj - вновь созданный объект (Key = 0) и save = 1
// вначале info будет сохранен, а потом добавлен в группу
// Если объект hobj содержит групповую семантику и является главным
// - добавляет групповую семантику (создает новую группу не разрушая старую)
// Если объект hobj содержит групповую семантику и является подчиненным
// - добавляет в набор, изменяя групповую семантику
// Возвращает порядковый номер объекта или 0
_MAPIMP long int _MAPAPI mapObjectSetAppendSubordinate(HOBJSET hobjset, HOBJ hobj,
long int save);
|
Причём, если создать объекты и не вызывать для них mapCommitObject, то при параметре save = 1 коммит произойдёт автоматически, правда номер у группы будет странный.
Если у вас уже есть набор(группа) объектов (на вновь открытой карте), то чтобы получить эту группу (имея один объект из группы), нужно -
Создать пустую группу (mapCreateObjectSet()),
Вызвать метод построения группы:
Код |
---|
// Построение группы из объектов карты
// по существующей в объекте групповой семантике
// hobjset - указатель на набора объектов
// info - идентификатор объекта карты
// При ошибке возвращает 0
_MAPIMP long int _MAPAPI mapBuildObjectSet(HOBJSET hobjset, HOBJ info);
|
И здесь, внимание, после вызова mapBuildObjectSet владение над объектом передаётся внутрь группы, то есть если после этого вызывать mapFreeObj(info), а потом mapFreeObjectSet(ваша группа объектов), то получим удаление невалидного (уже удалённог указателя).
При чём владение перехватывается только над тем объектом, для которого был вызван mapBuildObjectSet, не важно, главный он или подчинённый.
При использовании AppendGeneral и AppendSubordinate такой проблемы не будет.
Ещё из нюансов.
Код |
---|
// Запрос признака группового объекта (по семантике)
// groupnumber - переменная, куда помещается номер группы
// (если он нужен) или 0
// hobjset - указатель на набора объектов
// hobj - идентификатор объекта
// Возвращает код групповой семантики (GROUPLEADER,GROUPSLAVE,GROUPPARTNER) или 0
_MAPIMP long int _MAPAPI mapObjectSetIsGroup(HOBJSET hobjset, HOBJ hobj,
long int *groupnumber);
|
Вот в этой функции неважно какую группу объектов вы передаёте первым параметром, даже если объект hobj находится в другой группе объектов вы всё равно получите и номер группы и роль объекта в группе (главный/подчинённый/равноправный)