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

25/07/2013

Как получить координаты курсора мыши в ПСК?

Следующий код (фильтр сообщений окна) получает и печатает координаты курсора мыши в ПСК. Координаты те же, что показывает AutoCAD в свой строке состояния.

Код - C++: [Выделить]
  1. BOOL filterMouse(MSG *pMsg)
  2. {
  3.  if( pMsg->message == WM_MOUSEMOVE )
  4. {
  5.   acedDwgPoint cpt;
  6.   ads_point ptDCS, norm;
  7.   AcGePoint3d  origin;
  8.   AcGeVector3d e0, e1, e2;
  9.   AcGeMatrix3d  matUcs2Wcs, matWcs2Ucs;
  10.  
  11.   // 1: Получаем координаты мыши в ДСК (дисплейная система координат)
  12.   //
  13.  
  14.   CPoint cPnt (pMsg->lParam) ;
  15.   acedCoordFromPixelToWorld (cPnt, cpt) ;
  16.   ads_point_set ( cpt, ptDCS );
  17.  
  18.   // 2: Преобразуем координаты из ДСК в ПСК
  19.   //
  20.   ads_point result;
  21.   struct resbuf fromrb, torb;
  22.  
  23.   fromrb.restype = RTSHORT;
  24.   fromrb.resval.rint = 2; // ДСК
  25.  
  26.  
  27.   torb.restype = RTSHORT;
  28.   torb.resval.rint = 1; // ПСК
  29.  
  30.  
  31.   // disp == 0 означает, что pt – это точка (а не вектор)
  32.   acedTrans(ptDCS, &fromrb, &torb, FALSE, result);
  33.  
  34.   // 3: Проецируем точку в ПСК на плоскость XY ПСК
  35.   //
  36.   struct resbuf rbview;
  37.   ads_getvar( _T("viewdir"), &rbview );
  38.   ads_point_set( rbview.resval.rpoint, norm );
  39.  
  40.  
  41.   AcGePlane thePlane; // Конструктор по-умолчанию создаёт плоскость XY
  42.  
  43.   AcGePoint3d  pntInUCS( result[X], result[Y], result[Z] );
  44.   AcGeVector3d vecViewdir( norm [X], norm [Y], norm [Z] );
  45.   AcGePoint3d resPnt = pntInUCS.project (thePlane, vecViewdir);
  46.  
  47.   // 4: Печатаем результат
  48.   //
  49.   ads_printf ( _T("\nКоординаты мыши в ПСК -resPnt %f, %f, %f")
  50.    resPnt[X],resPnt[Y], resPnt[Z] );
  51. }
  52.  else if( pMsg->message ==WM_LBUTTONDOWN)
  53. {
  54.   acedRemoveFilterWinMsg(filterMouse);
  55. }
  56.  return FALSE; // продолжаем
  57. }

Вы можете зарегистрировать этот фильтр как-нибудь так:

acedRegisterFilterWinMsg(filterMouse);

А отменить регистрацию так:

acedRemoveFilterWinMsg(filterMouse);

 

Источник: http://adndevblog.typepad.com/autocad/2013/02/how-to-get-the-mouse-cursor-coordinates-in-ucs.html

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

Опубликовано 25.07.2013
Отредактировано 04.08.2013 в 17:19:46