Подсветка объектов под курсором через Viewport

Автор Тема: Подсветка объектов под курсором через Viewport  (Прочитано 12949 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн begizАвтор темы

  • ADN Club
  • ***
  • Сообщений: 161
  • Карма: 8
  • Skype: begiz_i
Доброго времени суток,
Дано: лист с 4 Viewport'aми (спереди, слева, сверху и перспектива)
Вопрос: можно ли как то подсветит объекты видимые во Viewport не перключаясь в модель?

Как подсветить объекты под курсором в модели я знаю, всё работает.

Тут получиется, как я понимаю, проблема в пересчете координат с PAPER_SPACE на MODEL_SPACE?
или еще гдо-то будут подводные камни?

Спасибо

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Как подсветить объекты под курсором в модели я знаю, всё работает.
1. Что ты понимаешь под подсветкой объектов?
2. Как ты подсвечиваешь объекты под курсором в модели?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн begizАвтор темы

  • ADN Club
  • ***
  • Сообщений: 161
  • Карма: 8
  • Skype: begiz_i
Цитировать
1. Что ты понимаешь под подсветкой объектов?
2. Как ты подсвечиваешь объекты под курсором в модели?

1. имею введу эту функцию AcDbEntity::highlight ()
2. использую AcEdInputPointMonitor::monitorInputPoint ()

Отмечено как Решение begiz 05-09-2017, 12:56:13

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн begizАвтор темы

  • ADN Club
  • ***
  • Сообщений: 161
  • Карма: 8
  • Skype: begiz_i
Судя по описанию и примеру именно то что нужно.
попробую и отпишусь

Оффлайн begizАвтор темы

  • ADN Club
  • ***
  • Сообщений: 161
  • Карма: 8
  • Skype: begiz_i
Чтото я делаю не так походу.
при определении extern acedNEntSelPEx фунции, у меня линкер ругается что unresolved token, unresolved external symbol.
accore.lib добавлен

и еще 1 момент, в ссылке указано что в функцию можно передать свою точку при помощи pickFlag, туда 1 нужно передать?

пишу под Acad 2015 Eng, mixed-mode C++

Оффлайн begizАвтор темы

  • ADN Club
  • ***
  • Сообщений: 161
  • Карма: 8
  • Skype: begiz_i
декларация функции видимо не правельная была
выдрал из accore.dll описание и линкер успокоился.
pickFlag видимо всё таки 1, так как какие-то значения возвращает

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
декларация функции видимо не правельная была
Ты ведь её даже не показал.
pickFlag видимо всё таки 1, так как какие-то значения возвращает
Да. Или TRUE.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн begizАвтор темы

  • ADN Club
  • ***
  • Сообщений: 161
  • Карма: 8
  • Skype: begiz_i
Цитировать
Ты ведь её даже не показал.
Код - C++ [Выбрать]
  1. extern int acedNEntSelPEx ( const TCHAR *str, ads_name entres,
  2.                             ads_point ptres, int pickflag,
  3.                             ads_matrix xformres,
  4.                             struct resbuf **refstkres,
  5.                             unsigned int uTransSpaceFlag,
  6.                             int* gsmarker);
я её скопировал из ссылки.

подсвечивать мне нужно куски блока (там тоже отдельные блоки в которых 3д объекты).
вот пытаюсь понять что мне возвращает функция, потому что объекты открываются но не подсвечиваются


Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Вместо:
Код - C++ [Выбрать]
  1. extern int acedNEntSelPEx ( const TCHAR *str, ads_name entres,
  2.                             ads_point ptres, int pickflag,
  3.                             ads_matrix xformres,
  4.                             struct resbuf **refstkres,
  5.                             unsigned int uTransSpaceFlag,
  6.                             int* gsmarker);
должно быть:
Код - C++ [Выбрать]
  1. extern int acedNEntSelPEx ( const TCHAR *str, ads_name entres,
  2.                             ads_point ptres, int pickflag,
  3.                             ads_matrix xformres,
  4.                             struct resbuf **refstkres,
  5.                             unsigned int uTransSpaceFlag,
  6.                             Adesk::GsMarker  *gsmarker);
                     
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн begizАвтор темы

  • ADN Club
  • ***
  • Сообщений: 161
  • Карма: 8
  • Skype: begiz_i
ковырялся ковырялся и вот что получилось
может кому-то будет полезно

Код - C++ [Выбрать]
  1. static AcDbFullSubentPath oldPath;
  2. static AcDbObjectId oldId;
  3.  
  4. //-----------------------------------------------------------------------------
  5. Acad::ErrorStatus CIPMReactor::monitorInputPoint (
  6.         bool &appendToTooltipStr,
  7.         ACHAR *&additionalTooltipString,
  8.         AcGiViewportDraw *drawContext,
  9.         AcApDocument *document,
  10.         bool pointComputed,
  11.         int history,
  12.         const AcGePoint3d &lastPoint,
  13.         const AcGePoint3d &rawPoint,
  14.         const AcGePoint3d &grippedPoint,
  15.         const AcGePoint3d &cartesianSnappedPoint,
  16.         const AcGePoint3d &osnappedPoint,
  17.         AcDb::OsnapMask osnapMask,
  18.         const AcArray<AcDbCustomOsnapMode *> &customOsnapModes,
  19.         AcDb::OsnapMask osnapOverrides,
  20.         const AcArray<AcDbCustomOsnapMode *> &customOsnapOverrides,
  21.         const AcArray<AcDbObjectId> &apertureEntities,
  22.         const AcArray<AcDbObjectIdArray, AcArrayObjectCopyReallocator<AcDbObjectIdArray> > &nestedApertureEntities,
  23.         const AcArray<Adesk::GsMarker> &gsSelectionMark,
  24.         const AcArray<AcDbObjectId> &keyPointEntities,
  25.         const AcArray<AcDbObjectIdArray, AcArrayObjectCopyReallocator<AcDbObjectIdArray> > &nestedKeyPointEntities,
  26.         const AcArray<Adesk::GsMarker> &keyPointGsSelectionMark,
  27.         const AcArray<AcGeCurve3d *> &alignmentPaths,
  28.         const AcGePoint3d &computedPoint,
  29.         const ACHAR *tooltipString
  30. ) {
  31.         appendToTooltipStr =false ;
  32.  
  33.         __int64     gsmarker = -1;
  34.         ads_name  ename;
  35.         struct resbuf *rbChain;
  36.         ads_point  selPt;
  37.         ads_matrix mx;
  38.  
  39.         selPt[X] = rawPoint.x;
  40.         selPt[Y] = rawPoint.y;
  41.         selPt[Z] = rawPoint.z;
  42.  
  43.         // Select a single object. If it's a block reference or a sub-entity
  44.         // within a block reference, rbChain will not be null.
  45.         unsigned int uTransSpaceFlag = 1;
  46.         // set uTransSpaceFlag to 0, if the current layout is in model space
  47.         struct resbuf rb;
  48.         acedGetVar(_T("CVPORT"), &rb);
  49.         if (rb.resval.rint != 1)
  50.                 uTransSpaceFlag = 0;  // Model space
  51.  
  52.         // now do the entity select
  53.         int stat = acedNEntSelPEx(_T("\nPick entity : "), ename,
  54.                 selPt, 1, mx, &rbChain, uTransSpaceFlag, &gsmarker);
  55.         // if everything worked ok
  56.  
  57.         AcDbEntityPointer oldEnt(oldId,AcDb::kForRead);
  58.         if(oldEnt.openStatus()==Acad::eOk)
  59.                 oldEnt->unhighlight(oldPath);
  60.  
  61.         if (RTNORM == stat && rbChain!=NULL)
  62.         {
  63.                 AcDbFullSubentPath subentIds;
  64.  
  65.                 int numInserts = 0;
  66.                 for (resbuf* currentInsert = rbChain; currentInsert != NULL;
  67.                         currentInsert = currentInsert->rbnext)
  68.                         numInserts++;
  69.  
  70.                 Acad::ErrorStatus err;
  71.  
  72.                 // it is inside a block
  73.                 if (numInserts > 1)
  74.                 {
  75.                         // create an array
  76.                         AcDbObjectId* Inserts = new AcDbObjectId[numInserts];
  77.  
  78.                         int currNumber = 0;
  79.                         for (resbuf* current = rbChain;
  80.                                 current != NULL;
  81.                                 current = current->rbnext, currNumber++)
  82.                                 acdbGetObjectId(Inserts[currNumber],
  83.                                 current->resval.rlname);;
  84.  
  85.                         AcDbEntityPointer pEntHighlight(Inserts[numInserts-2],AcDb::kForRead);
  86.                         //numInserts-2 -- потому что при выполнение из Layout, верхний элемент это AcDbViewport
  87.                         for (int i = numInserts-2; i>=0;i--)
  88.                         {
  89.                                 //check how deep to dig
  90.                                 //resbuf * rb = NULL;
  91.                                 //getXdata(Inserts[i],PZ_NOM,rb);
  92.                                 //if(rb!=NULL) { acutRelRb(rb); break; }
  93.                                 subentIds.objectIds().append(Inserts[i]);
  94.                         }
  95.                        
  96.                         pEntHighlight->highlight(subentIds);
  97.                         oldId = Inserts[numInserts-2];
  98.                         oldPath = subentIds;
  99.                 }
  100.                 acutRelRb(rbChain);            
  101.         }
  102.  
  103.         return (Acad::eOk) ;
  104. }
  105.  

Оффлайн begizАвтор темы

  • ADN Club
  • ***
  • Сообщений: 161
  • Карма: 8
  • Skype: begiz_i
Всё замечательно работает.
НО, появилось желание подсвечивать объекты во время модификации выноски.

Сделал оверрул, в функции moveGripPointsAt пытаюсь исползовать acedNEntSelPEx и он мне возвращает RTREJ.

можно это как то решить?

или через какой то другой механизм?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
можно это как то решить?
Нет. В этот момент функция acedNEntSelPEx (как и многие другие) работать не будет.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн begizАвтор темы

  • ADN Club
  • ***
  • Сообщений: 161
  • Карма: 8
  • Skype: begiz_i
Цитировать
Нет. В этот момент функция acedNEntSelPEx (как и многие другие) работать не будет.
Ясно.

А без overrule можно определить за какую вершину пользователь решил потянуть?