07/06/2014
Удаление анонимных групп средствами ObjectARX
Когда пользователь создает группу в AutoCAD, он может создать группу анонимной. При этом любая группа (анонимная или нет) хранится в Словаре именованных объектов (NOD) в группе 'ACAD_GROUP'. Если группа анонимная, AutoCAD присваивает ей имена вида '*A1', '*A2' и так далее. Хотя группа и анонимная, но у каждой анонимной группы есть уникальное имя в базе чертежа.
Пользователь может удалить примитивы из группы, так что группа может оказаться пустой. Следующий код демонстрирует как удалить анонимную группу.
Код - C++: [Выделить]
- static void removeGroup()
- {
- Acad::ErrorStatus es;
- AcDbDictionary *pGroupDict;
- AcDbGroup *pGroup;
- AcDbDictionaryIterator *pDictIter;
- AcDbObjectId groupId;
- long numItems;
- AcDbObjectIdArray groupMembers;
- es =
- acdbHostApplicationServices()->workingDatabase()->
- getGroupDictionary(pGroupDict,AcDb::kForWrite);
- pDictIter = pGroupDict->newIterator();
- for(; !pDictIter->done(); pDictIter->next())
- {
- pDictIter->getObject(
- (AcDbObject*&)pGroup, AcDb::kForRead);
- // Если группа анонимная
- if(pGroup->isAnonymous())
- {
- // Есть ли в этой группе какие-нибудь
- // ассоциированные примитивы?
- numItems = pGroup->numEntities();
- if(numItems > 0)
- {
- // Очищаем группу, но предварительно
- // обеспечиваем возможность записи
- es = pGroup->upgradeOpen();
- es = pGroup->clear();
- es = pGroup->downgradeOpen();
- pGroup->close();
- }
- // Получаем идентификатор группы и удаляем группу
- // из словаря
- groupId = pDictIter->objectId();
- es = pGroupDict->remove(groupId);
- } // if
- pGroup->close();
- } // for
- pGroupDict->close(); delete pDictIter;
- }
Источник: http://adndevblog.typepad.com/autocad/2012/09/remove-anonymous-groups-with-arx.html
Обсуждение: http://adn-cis.org/forum/index.php?topic=791
Опубликовано 07.06.2014