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

11/04/2021

Как подсветить примитив внутри блока или внешней ссылки

Вопрос: Для того чтобы подсветить примитив в текущем пространстве (Модели или Листа) достаточно воспользоваться методом AcDbEntity::highlight(). А как подсветить примитив, который находится в составе блока (возможно вложенного блока) или во внешней ссылке?

Ответ:  Для этой цели следует воспользоваться методом AcDbEntity::highlight(AcDbFullSubentPath& subId), предварительно создав правильный AcDbFullSubentPath.

Ниже приведен код, который подсвечивает примитив внутри самого вложенного блока или внешней ссылки:

Код - C++: [Выделить]
  1. //////////////////////////////////////////////////////////////////////////
  2. //                        XHLight command
  3. //////////////////////////////////////////////////////////////////////////
  4. static void RivilisXHLight()
  5. {
  6.   ads_name en; ads_point p;
  7.   ads_matrix mat;
  8.   resbuf *rben = NULL;
  9.  
  10.   if (acedNEntSelP(_T("\nВыберите примитив: "), en, p, FALSE, mat, &rben) == RTNORM)
  11.   {
  12.     AcDbObjectId idMain; acdbGetObjectId(idMain, en);
  13.     acutPrintf(_T("\nId=%d Class=%s Database=%s"), idMain.asOldId(),
  14.       idMain.objectClass()->name(), idMain.database()->originalFileName());
  15.  
  16.     resbuf *rb = rben;
  17.  
  18.     AcDbObjectIdArray ids;
  19.  
  20.     while (rb)
  21.     {
  22.       if (rb->restype == RTENAME)
  23.       {
  24.         AcDbObjectId id; acdbGetObjectId(id, rb->resval.rlname);
  25.         acutPrintf(_T("\nId=%d Class=%s Database=%s"), id.asOldId(),
  26.           id.objectClass()->name(), id.database()->originalFileName());
  27.         ids.append(id);
  28.       }
  29.       rb = rb->rbnext;
  30.     }
  31.  
  32.     if (rben) acutRelRb(rben); rben = NULL;
  33.  
  34.     ids.reverse(); // Реверсируем массив ObjectId
  35.  
  36.     ids.append(idMain);
  37.     AcDbObjectPointer<AcDbEntity> pEnt(ids[0], AcDb::kForRead);
  38.     if (pEnt.openStatus() == Acad::eOk)
  39.     {
  40.       AcDbFullSubentPath subid(ids, kNullSubentId);
  41.       pEnt->highlight(subid);
  42.       ACHAR buf[256];
  43.       acedGetString(FALSE, _T("\nДля продолжения нажмите ENTER..."), buf);
  44.       pEnt->unhighlight(subid);
  45.     }
  46.   }
  47. }
  48.  

 

Автор: Александр Ривилис
Опубликовано 11.04.2021