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

29/03/2014

Находим примитив под курсором при помощи Win32 и ObjectARX

Вопрос:
Как найти примитив под курсором с использованием чистого Win32?

Ответ:
Лучший способ для нахождения примитива под курсором/перекрестьем – использование класса AcEdInputPointMonitor. Но если вам нужно использовать только Win32, это можно сделать так …

Во-первых, чтобы перехватить события мыши перед любым обычным действием AutoCAD (таким как нажатие или отпускание кнопки мыши), вы должны зарегистрировать свой обработчик события с помощью функции acedRegisterFilterWinMsg(). В ObjectARX 2008 SDK есть отличный пример, показывающий как это сделать (objectarx\samples\editor\mfcsamps\pretranslate). Посмотрите его, чтобы понять как перехватывать события окна AutoCAD.

Во-вторых, в функции обработки события можно использовать функцию acedSSGet() с опцией "_:E" (выбор всего под курсором внутри pickbox). Указывая только первую точку можно получить выбор точно в позиции курсора.

Следующий код определяет функцию, которая регистрируется при помощи acedRegisterFilterWinMsg(). Чтобы проверить этот код достаточно заменить функцию FilterMouse() из примера проекта (\objectarx\samples\editor\mfcsamps\pretranslate) следующей функцией.

Код - C++: [Выделить]
  1. BOOL filterMouse(MSG *pMsg)
  2. {
  3.  if( pMsg->message == WM_MOUSEMOVE   ||
  4.   pMsg->message == WM_LBUTTONDOWN || pMsg->message == WM_LBUTTONUP ) {
  5.   acedDwgPoint cpt={ 0, 0, 0 };
  6.   CPoint cPnt(pMsg->lParam);
  7.   acedCoordFromPixelToWorld(cPnt, cpt) ;
  8.   ads_point pt={ cpt[X], cpt[Y], 0 } ;
  9.   ads_name ss;
  10.   acedSSGet(L"_:E", pt, NULL, NULL, ss) ;
  11.   long len =0 ;
  12.   acedSSLength(ss, &len) ;
  13.   acutPrintf(L"\nКоличество элементов в ss %d", len) ;
  14.   acedSSFree(ss) ;
  15.   if ( pMsg->message == WM_LBUTTONDOWN || pMsg->message == WM_LBUTTONUP )
  16.    unmouse ();
  17.  }
  18.  return (FALSE) ; //-----  продолжаем
  19. }

Источник: http://adndevblog.typepad.com/autocad/2013/01/find-an-entity-under-the-cursor-position-using-win32-and-objectarx.html

Обсуждение: http://adn-cis.org/forum/index.php?topic=642

Опубликовано 29.03.2014
Отредактировано 31.03.2014 в 00:59:55