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

11/07/2021

Удаление выбранных примитивов из групп, в которых они содержатся

Вопрос: Как средствами ObjectARX можно удалить выбранные примитивы из групп, в которых они содержатся?

Ответ: Для этого в первую очередь необходимо отключить групповой выбор (PICKSTYLE должно быть равно 0 или 2), чтобы можно было выбирать отдельные примитивы из групп. Ниже приведен код, позволяющий удалять выбранные примитивы из групп:

Код - C++: [Выделить]
  1. /// <summary>
  2. /// Удаление выбранных примитивов из групп, в которых они содержатся
  3. /// </summary>
  4. static void RivilisRemoveFromGroup()
  5. {
  6.   ads_name ss;
  7.   resbuf rbPickStyleOld;
  8.   acedGetVar(_T("PICKSTYLE"), &rbPickStyleOld);
  9.   resbuf rbPickStyleNew = rbPickStyleOld;
  10.   // Отключаем выбор групп
  11.   rbPickStyleNew.resval.rint &= 0x02;
  12.   acedSetVar(_T("PICKSTYLE"), &rbPickStyleNew);
  13.   if (acedSSGet(NULL, NULL, NULL, NULL, ss) == RTNORM)
  14.   {
  15.     Adesk::Int32 n = 0;  acedSSLength(ss, &n);
  16.     if (n == 0) { acedSSFree(ss); return; }
  17.     AcDbObjectIdArray ids;
  18.     for (int i = 0; i < (int)n; i++)
  19.     {
  20.       ads_name en; acedSSName(ss, i, en);
  21.       AcDbObjectId id; acdbGetObjectId(id, en);
  22.       if (id.isValid()) ids.append(id);
  23.     }
  24.     acedSSFree(ss);
  25.  
  26.     for (int i = 0; i < ids.length(); i++)
  27.     {
  28.       AcDbObjectId idEnt = ids[i];
  29.       const AcDbVoidPtrArray* reacts = NULL;
  30.       {
  31.         AcDbEntityPointer pEnt(idEnt, AcDb::kForRead);
  32.         if (pEnt.openStatus() == Acad::eOk)
  33.         {
  34.           reacts = pEnt->reactors();
  35.         }
  36.       }
  37.  
  38.       if (reacts && reacts->length() > 0)
  39.       {
  40.         for (int j = 0; j < reacts->length(); j++)
  41.         {
  42.           if (acdbIsPersistentReactor(reacts->at(j)))
  43.           {
  44.             AcDbObjectId idReact = acdbPersistentReactorObjectId(reacts->at(j));
  45.             if (idReact.objectClass() == AcDbGroup::desc())
  46.             {
  47.               AcDbObjectPointer<AcDbGroup> pGroup(idReact, AcDb::kForWrite);
  48.               if (pGroup.openStatus() == Acad::eOk)
  49.               {
  50.                 // acutPrintf(_T("\nGroup name: '%s'"), pGroup->name());
  51.                 // Удаляем примитив из группы
  52.                 pGroup->remove(idEnt);
  53.                 // Если группа больше не содержит ни одного примитива,
  54.                 // то удаляем и группу
  55.                 if (pGroup->numEntities() == 0)
  56.                   pGroup->erase();
  57.               }
  58.             }
  59.           }
  60.         }
  61.       }
  62.     }
  63.   }
  64.   acedSetVar(_T("PICKSTYLE"), &rbPickStyleOld);
  65. }

 

Автор: Александр Ривилис
Опубликовано 11.07.2021
Отредактировано 11.07.2021 в 16:29:58