11/07/2021
Удаление выбранных примитивов из групп, в которых они содержатся
Вопрос: Как средствами ObjectARX можно удалить выбранные примитивы из групп, в которых они содержатся?
Ответ: Для этого в первую очередь необходимо отключить групповой выбор (PICKSTYLE должно быть равно 0 или 2), чтобы можно было выбирать отдельные примитивы из групп. Ниже приведен код, позволяющий удалять выбранные примитивы из групп:
Код - C++: [Выделить]
- /// <summary>
- /// Удаление выбранных примитивов из групп, в которых они содержатся
- /// </summary>
- static void RivilisRemoveFromGroup()
- {
- ads_name ss;
- resbuf rbPickStyleOld;
- acedGetVar(_T("PICKSTYLE"), &rbPickStyleOld);
- resbuf rbPickStyleNew = rbPickStyleOld;
- // Отключаем выбор групп
- rbPickStyleNew.resval.rint &= 0x02;
- acedSetVar(_T("PICKSTYLE"), &rbPickStyleNew);
- if (acedSSGet(NULL, NULL, NULL, NULL, ss) == RTNORM)
- {
- Adesk::Int32 n = 0; acedSSLength(ss, &n);
- if (n == 0) { acedSSFree(ss); return; }
- AcDbObjectIdArray ids;
- for (int i = 0; i < (int)n; i++)
- {
- ads_name en; acedSSName(ss, i, en);
- AcDbObjectId id; acdbGetObjectId(id, en);
- if (id.isValid()) ids.append(id);
- }
- acedSSFree(ss);
- for (int i = 0; i < ids.length(); i++)
- {
- AcDbObjectId idEnt = ids[i];
- const AcDbVoidPtrArray* reacts = NULL;
- {
- AcDbEntityPointer pEnt(idEnt, AcDb::kForRead);
- if (pEnt.openStatus() == Acad::eOk)
- {
- reacts = pEnt->reactors();
- }
- }
- if (reacts && reacts->length() > 0)
- {
- for (int j = 0; j < reacts->length(); j++)
- {
- if (acdbIsPersistentReactor(reacts->at(j)))
- {
- AcDbObjectId idReact = acdbPersistentReactorObjectId(reacts->at(j));
- if (idReact.objectClass() == AcDbGroup::desc())
- {
- AcDbObjectPointer<AcDbGroup> pGroup(idReact, AcDb::kForWrite);
- if (pGroup.openStatus() == Acad::eOk)
- {
- // acutPrintf(_T("\nGroup name: '%s'"), pGroup->name());
- // Удаляем примитив из группы
- pGroup->remove(idEnt);
- // Если группа больше не содержит ни одного примитива,
- // то удаляем и группу
- if (pGroup->numEntities() == 0)
- pGroup->erase();
- }
- }
- }
- }
- }
- }
- }
- acedSetVar(_T("PICKSTYLE"), &rbPickStyleOld);
- }
Автор: Александр Ривилис
Опубликовано 11.07.2021
Отредактировано 11.07.2021 в 16:29:58
Опубликовано 11.07.2021
Отредактировано 11.07.2021 в 16:29:58