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

18/09/2013

Зумирование, панорамирование и орбита текущего вида AutoCAD с помощью ObjectARX

Наш коллега Киан написал статью о зумировании, панорамировании и орбите текущего вида при помощи .NET. Я переписал этот код с помощью ObjectARX. Общий сценарий для зумирования, панорамирования и орбиты:
  1. Получить текущую запись таблицы видов
  2. Настроить её параметры, т.е.:
    •    зумирование: настроить высоту и ширину
    •    панорамирование: настроить центр вида
    •    орбита: настроить направление вида вдоль оси.
  3. Обновить текущий вид из записи таблицы видов.

Код - C++: [Выделить]
  1. static void panView()
  2. {
  3.     AcDbDatabase *pDb =
  4.     acdbHostApplicationServices()->workingDatabase();  
  5.  
  6.        acedVports2VportTableRecords();
  7.  
  8.      //get the active viewport object
  9.       AcDbViewportTable *pVpT = NULL;
  10.       AcDbViewportTableRecord *pActVp = NULL; 
  11.       //get the *Active view port
  12.       pDb->getViewportTable(pVpT,AcDb::kForRead);
  13.       pVpT->getAt(_T("*Active"),pActVp,AcDb::kForWrite);
  14.       pVpT->close();
  15.  
  16.       //get the view center point
  17.  
  18.       //assume we need to pan the view along X & Y in 10
  19.       double panStep = 10;
  20.       AcGePoint2d mCentPt = pActVp->centerPoint();
  21.       mCentPt.x += panStep;
  22.       mCentPt.y += panStep;
  23.  
  24.       //set the view center
  25.       pActVp->setCenterPoint(mCentPt);
  26.       //close the Active viewport
  27.       pActVp->close();  
  28.       //update the viewport
  29.       acedVportTableRecords2Vports(); 
  30. }
  31.  
  32. static void zoomView()
  33. {
  34.     AcDbDatabase *pDb =
  35.     acdbHostApplicationServices()->workingDatabase();  
  36.  
  37.        acedVports2VportTableRecords();
  38.  
  39.      //get the active viewport object
  40.       AcDbViewportTable *pVpT = NULL;
  41.       AcDbViewportTableRecord *pActVp = NULL; 
  42.       //get the *Active view port
  43.       pDb->getViewportTable(pVpT,AcDb::kForRead);
  44.       pVpT->getAt(_T("*Active"),pActVp,AcDb::kForWrite);
  45.       pVpT->close();  
  46.  
  47.       //assume we need to zoom the view out in scaling 10
  48.       double zoomFactor = 10;
  49.  
  50.       pActVp->setHeight(pActVp->height() * zoomFactor);
  51.       pActVp->setWidth(pActVp->width() * zoomFactor); 
  52.  
  53.       //close the Active viewport
  54.       pActVp->close();  
  55.       //update the viewport
  56.       acedVportTableRecords2Vports(); 
  57. }
  58.  
  59. static void orbitView()
  60. {
  61.     AcDbDatabase *pDb =
  62.     acdbHostApplicationServices()->workingDatabase();  
  63.  
  64.        acedVports2VportTableRecords();
  65.  
  66.      //get the active viewport object
  67.       AcDbViewportTable *pVpT = NULL;
  68.       AcDbViewportTableRecord *pActVp = NULL; 
  69.       //get the *Active view port
  70.       pDb->getViewportTable(pVpT,AcDb::kForRead);
  71.       pVpT->getAt(_T("*Active"),pActVp,AcDb::kForWrite);
  72.       pVpT->close();  
  73.      
  74.       //assume we need to orbit the view direction
  75.       // along (1,0,0) in angle 30 degree.
  76.  
  77.       AcGeVector3d oOldDir =  pActVp->viewDirection();
  78.       AcGeMatrix3d oM;
  79.       oM.setToRotation(30 * 3.1415926 / 180,AcGeVector3d(1,0,0),AcGePoint3d::kOrigin);
  80.       oOldDir.transformBy(oM);
  81.       pActVp->setViewDirection(oOldDir);      
  82.  
  83.       //close the Active viewport
  84.       pActVp->close();  
  85.       //update the viewport
  86.       acedVportTableRecords2Vports(); 
  87. }

 

Источник: http://adndevblog.typepad.com/autocad/2013/07/zooming-panning-and-orbiting-the-current-autocad-view-using-objectarx.html

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

Опубликовано 18.09.2013