11/04/2021
Как подсветить примитив внутри блока или внешней ссылки
Вопрос: Для того чтобы подсветить примитив в текущем пространстве (Модели или Листа) достаточно воспользоваться методом AcDbEntity::highlight(). А как подсветить примитив, который находится в составе блока (возможно вложенного блока) или во внешней ссылке?
Ответ: Для этой цели следует воспользоваться методом AcDbEntity::highlight(AcDbFullSubentPath& subId), предварительно создав правильный AcDbFullSubentPath.
Ниже приведен код, который подсвечивает примитив внутри самого вложенного блока или внешней ссылки:
Код - C++: [Выделить]
- //////////////////////////////////////////////////////////////////////////
- // XHLight command
- //////////////////////////////////////////////////////////////////////////
- static void RivilisXHLight()
- {
- ads_name en; ads_point p;
- ads_matrix mat;
- resbuf *rben = NULL;
- if (acedNEntSelP(_T("\nВыберите примитив: "), en, p, FALSE, mat, &rben) == RTNORM)
- {
- AcDbObjectId idMain; acdbGetObjectId(idMain, en);
- acutPrintf(_T("\nId=%d Class=%s Database=%s"), idMain.asOldId(),
- idMain.objectClass()->name(), idMain.database()->originalFileName());
- resbuf *rb = rben;
- AcDbObjectIdArray ids;
- while (rb)
- {
- if (rb->restype == RTENAME)
- {
- AcDbObjectId id; acdbGetObjectId(id, rb->resval.rlname);
- acutPrintf(_T("\nId=%d Class=%s Database=%s"), id.asOldId(),
- id.objectClass()->name(), id.database()->originalFileName());
- ids.append(id);
- }
- rb = rb->rbnext;
- }
- if (rben) acutRelRb(rben); rben = NULL;
- ids.reverse(); // Реверсируем массив ObjectId
- ids.append(idMain);
- AcDbObjectPointer<AcDbEntity> pEnt(ids[0], AcDb::kForRead);
- if (pEnt.openStatus() == Acad::eOk)
- {
- AcDbFullSubentPath subid(ids, kNullSubentId);
- pEnt->highlight(subid);
- ACHAR buf[256];
- acedGetString(FALSE, _T("\nДля продолжения нажмите ENTER..."), buf);
- pEnt->unhighlight(subid);
- }
- }
- }
Автор: Александр Ривилис
Опубликовано 11.04.2021
Опубликовано 11.04.2021