ADN Open CIS
Сообщество программистов Autodesk в СНГ

07/06/2014

Удаление анонимных групп средствами ObjectARX

Когда пользователь создает группу в AutoCAD, он может создать группу анонимной. При этом любая группа (анонимная или нет) хранится в Словаре именованных объектов (NOD) в группе 'ACAD_GROUP'. Если группа анонимная, AutoCAD присваивает ей имена вида '*A1', '*A2' и так далее. Хотя группа и анонимная, но у каждой анонимной группы есть уникальное имя в базе чертежа.

Пользователь может удалить примитивы из группы, так что группа может оказаться пустой. Следующий код демонстрирует как удалить анонимную группу.

Код - C++: [Выделить]
  1. static void removeGroup()
  2. {
  3.  
  4. Acad::ErrorStatus es;
  5. AcDbDictionary *pGroupDict;
  6. AcDbGroup *pGroup;
  7. AcDbDictionaryIterator *pDictIter;
  8. AcDbObjectId groupId;
  9. long numItems;
  10. AcDbObjectIdArray groupMembers;
  11.  
  12. es =
  13. acdbHostApplicationServices()->workingDatabase()->
  14.    getGroupDictionary(pGroupDict,AcDb::kForWrite);
  15. pDictIter = pGroupDict->newIterator();
  16.  
  17. for(; !pDictIter->done(); pDictIter->next())
  18. {
  19.     pDictIter->getObject(
  20.         (AcDbObject*&)pGroup, AcDb::kForRead);
  21.     // Если группа анонимная
  22.     if(pGroup->isAnonymous())
  23.     {
  24.         // Есть ли в этой группе какие-нибудь
  25.         // ассоциированные примитивы?
  26.         numItems = pGroup->numEntities();
  27.         if(numItems > 0)
  28.         {
  29.             // Очищаем группу, но предварительно
  30.             // обеспечиваем возможность записи
  31.             es = pGroup->upgradeOpen();
  32.             es = pGroup->clear();
  33.             es = pGroup->downgradeOpen();
  34.  
  35.             pGroup->close();
  36.         }
  37.  
  38.         // Получаем идентификатор группы и удаляем группу
  39.         // из словаря
  40.         groupId = pDictIter->objectId();
  41.         es = pGroupDict->remove(groupId);
  42.  
  43.     } // if
  44.  
  45.     pGroup->close();
  46.  
  47. } // for
  48.  
  49. pGroupDict->close(); delete pDictIter;
  50.  
  51. }

Источник: 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