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

ADN Club => ObjectARX => Тема начата: begiz от 05-09-2017, 12:06:26

Название: Подсветка объектов под курсором через Viewport
Отправлено: begiz от 05-09-2017, 12:06:26
Доброго времени суток,
Дано: лист с 4 Viewport'aми (спереди, слева, сверху и перспектива)
Вопрос: можно ли как то подсветит объекты видимые во Viewport не перключаясь в модель?

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

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

Спасибо
Название: Re: Подсветка объектов под курсором через Viewport
Отправлено: Александр Ривилис от 05-09-2017, 12:23:41
Как подсветить объекты под курсором в модели я знаю, всё работает.
1. Что ты понимаешь под подсветкой объектов?
2. Как ты подсвечиваешь объекты под курсором в модели?
Название: Re: Подсветка объектов под курсором через Viewport
Отправлено: begiz от 05-09-2017, 12:38:44
Цитировать
1. Что ты понимаешь под подсветкой объектов?
2. Как ты подсвечиваешь объекты под курсором в модели?

1. имею введу эту функцию AcDbEntity::highlight ()
2. использую AcEdInputPointMonitor::monitorInputPoint ()
Название: Re: Подсветка объектов под курсором через Viewport
Отправлено: Александр Ривилис от 05-09-2017, 12:43:15
Попробуй этот способ: http://adn-cis.org/vyibor-primitivov-prostranstva-modeli-iz-prostranstva-lista-bez-predvaritelnogo-vyibora-vidovogo.html
Название: Re: Подсветка объектов под курсором через Viewport
Отправлено: begiz от 05-09-2017, 12:56:03
Судя по описанию и примеру именно то что нужно.
попробую и отпишусь
Название: Re: Подсветка объектов под курсором через Viewport
Отправлено: begiz от 06-09-2017, 08:54:34
Чтото я делаю не так походу.
при определении extern acedNEntSelPEx фунции, у меня линкер ругается что unresolved token, unresolved external symbol.
accore.lib добавлен

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

пишу под Acad 2015 Eng, mixed-mode C++
Название: Re: Подсветка объектов под курсором через Viewport
Отправлено: begiz от 06-09-2017, 15:49:26
декларация функции видимо не правельная была
выдрал из accore.dll описание и линкер успокоился.
pickFlag видимо всё таки 1, так как какие-то значения возвращает
Название: Re: Подсветка объектов под курсором через Viewport
Отправлено: Александр Ривилис от 06-09-2017, 15:56:34
декларация функции видимо не правельная была
Ты ведь её даже не показал.
pickFlag видимо всё таки 1, так как какие-то значения возвращает
Да. Или TRUE.
Название: Re: Подсветка объектов под курсором через Viewport
Отправлено: begiz от 06-09-2017, 16:03:33
Цитировать
Ты ведь её даже не показал.
Код - 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д объекты).
вот пытаюсь понять что мне возвращает функция, потому что объекты открываются но не подсвечиваются

Название: Re: Подсветка объектов под курсором через Viewport
Отправлено: Александр Ривилис от 06-09-2017, 16:10:00
Вместо:
Код - 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);
                     
Название: Re: Подсветка объектов под курсором через Viewport
Отправлено: Александр Ривилис от 06-09-2017, 16:15:42
Посмотри еще этот пример: http://adndevblog.typepad.com/autocad/2013/01/select-the-edge-of-a-nested-solid.html
Название: Re: Подсветка объектов под курсором через Viewport
Отправлено: begiz от 08-09-2017, 07:40:45
ковырялся ковырялся и вот что получилось
может кому-то будет полезно

Код - 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.  
Название: Re: Подсветка объектов под курсором через Viewport
Отправлено: begiz от 26-09-2017, 10:06:26
Всё замечательно работает.
НО, появилось желание подсвечивать объекты во время модификации выноски.

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

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

или через какой то другой механизм?
Название: Re: Подсветка объектов под курсором через Viewport
Отправлено: Александр Ривилис от 26-09-2017, 10:08:25
можно это как то решить?
Нет. В этот момент функция acedNEntSelPEx (как и многие другие) работать не будет.
Название: Re: Подсветка объектов под курсором через Viewport
Отправлено: begiz от 26-09-2017, 10:15:34
Цитировать
Нет. В этот момент функция acedNEntSelPEx (как и многие другие) работать не будет.
Ясно.

А без overrule можно определить за какую вершину пользователь решил потянуть?
Название: Re: Подсветка объектов под курсором через Viewport
Отправлено: Александр Ривилис от 26-09-2017, 10:17:49
А без overrule можно определить за какую вершину пользователь решил потянуть?
Ну наверное определить ближе к какой из вершин был последний клик.