ObjectARX, AutoCAD. Среда программирования библиотеки C++

       

Группы и Словарь Группы


Группа - контейнерный объект, который обслуживает{*поддерживает*} упорядоченную{*заказанную*} коллекцию примитивов базы данных. О группах можно думать как названный постоянными наборами выбора. Они не имеют связи{*ссылки*} монопольных использований к примитивам, которые они содержат.

Когда примитив стерт, это автоматически удалено из групп, которые содержат это. Если примитив нестерт, это автоматически повторно вставлено в группу.

Используйте AcDbGroup:: newIterator () функция, чтобы получить iterator и шаг через примитивы в группе. AcDbGroup класс также обеспечивает функции для добавления в конец и prepending примитивов к группе, вставка примитивов по специфическому индексу в группе, удаление примитивов, и передачи примитивов от одной позиции в группе к другому. См. AcDbGroup в ObjectARX Ссылке.

Вы можете также назначать свойства на всех членов группы, использующей

setColor (), setLayer (), setLinetype (), setVisibility (), и

setHighlight () функции AcDbGroup класса. Эти операции имеют тот же самый эффект как открытие каждого примитива в группе и установке ее свойства непосредственно.

Группы должны всегда сохраняться в словаре ГРУППЫ, который может быть получен следующим образом:

AcDbDictionary* pGrpDict =

acdbHostApplicationServices()->working Database()->

getGroupDictionary(pGroupDict, AcDb::kForWrite);

Альтернативный способ получить словарь ГРУППЫ состоит в том, чтобы искать “ACAD_GROUP” в словаре имен объектов.

Следующие функции - часть приложения, что первые подсказки пользователь, чтобы выбрать некоторые примитивы, которые помещены в группу по имени “ASDK_GROUPTEST”. Тогда это вызывает функцию removeAllButLines () чтобы выполнить итерации по группе и удалять все примитивы, которые - не линии. Наконец, это изменяет{*заменяет*} остающиеся примитивы в группе к красному.

void



groups()

{

AcDbGroup *pGroup = new AcDbGroup("grouptest");

AcDbDictionary *pGroupDict;

acdbHostApplicationServices()->workingDatabase()


->getGroupDictionary(pGroupDict, AcDb::kForWrite);

AcDbObjectId groupId;

pGroupDict->setAt("ASDK_GROUPTEST", pGroup, groupId);

pGroupDict->close();

pGroup->close();

makeGroup(groupId);

removeAllButLines(groupId);

}

// Prompts the user to select objects to add to the group,

// opens the group identified by "groupId" passed in as

// an argument, then adds the selected objects to the group.

//

void

makeGroup(AcDbObjectId groupId)

{

ads_name sset;

int err = acedSSGet(NULL, NULL, NULL, NULL, sset);

if (err != RTNORM) {

return;

}

AcDbGroup *pGroup;

acdbOpenObject(pGroup, groupId, AcDb::kForWrite);

// Traverse the selection set, exchanging each ads_name

// for an object ID, then adding the object to the group.

//

long i, length;

ads_name ename;

AcDbObjectId entId;

acedSSLength(sset, &length);

for (i = 0; i < length; i++) {

acedSSName(sset, i, ename);

acdbGetObjectId(entId, ename);

pGroup->append(entId);

}

pGroup->close();

acedSSFree(sset);

}

// Accepts an object ID of an AcDbGroup object, opens it,

// then iterates over the group, removing all entities that

// are not AcDbLines and changing all remaining entities in

// the group to color red.

//

void

removeAllButLines(AcDbObjectId groupId)

{

AcDbGroup *pGroup;

acdbOpenObject(pGroup, groupId, AcDb::kForWrite);

AcDbGroupIterator *pIter = pGroup->newIterator();

AcDbObject *pObj;

for (; !pIter->done(); pIter->next()) {

pIter->getObject(pObj, AcDb::kForRead);

// If it is not a line or descended from a line,

// close it and remove it from the group. Otherwise,

// just close it.

//

if (!pObj->isKindOf(AcDbLine::desc())) {

// AcDbGroup::remove() requires that the object

// to be removed be closed, so close it now.

//

pObj->close();

pGroup->remove(pIter->objectId());

} else {

pObj->close();

}

}

delete pIter;

// Now change the color of all the entities in the group

// to red (AutoCAD color index number 1).

//

pGroup->setColorIndex(1);

pGroup->close();

}


Содержание раздела