找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 144|回复: 0

[每日一码] 几个视图ARX代码

[复制链接]

1

主题

0

回帖

43

积分

管理员

积分
43
发表于 2024-3-14 20:14:32 | 显示全部楼层 |阅读模式
  1. static bool GetActiveViewPortInfo (AcDbDatabase *pDb, ads采用real &height, ads采用real &width,
  2.                                                                 AcGePoint3d &target, AcGeVector3d &viewDir,
  3.                                                                 ads采用real &viewTwist,
  4.                                                                 AcDbObjectId ¤tVsId,
  5.                                                                 bool getViewCenter)
  6.         {
  7.           // if not ok
  8.           if (pDb == NULL)
  9.                 return false;
  10.           // get the current document associated with the PDb database and set it current
  11.           AcApDocument *pDoc = acDocManager->document(pDb);
  12.           acDocManager->setCurDocument(pDoc);
  13.           acDocManager->lockDocument(pDoc);
  14.           // make sure the active view port is uptodate
  15.           acedVports2VportTableRecords();
  16.           // open the view port records
  17.           AcDbViewportTablePointer pVTable(pDb->viewportTableId(), AcDb::kForRead);
  18.           // if we opened them ok
  19.           if (pVTable.openStatus() == Acad::eOk)
  20.           {
  21.                 AcDbViewportTableRecord *pViewPortRec = NULL;
  22.                 Acad::ErrorStatus es = pVTable->getAt (采用T("*Active"), pViewPortRec, AcDb::kForRead);
  23.                 if (es == Acad::eOk)
  24.                 {
  25.                   // get the height of the view
  26.                   height = pViewPortRec->height ();
  27.                   // get the width
  28.                   width = pViewPortRec->width ();
  29.                   // if the user wants the center of the viewport used
  30.                   if (getViewCenter == true)
  31.                   {
  32.                         struct resbuf rb;
  33.                         memset (&rb, 0, sizeof (struct resbuf));
  34.                         // get the system var VIEWCTR
  35.                         acedGetVar (采用T("VIEWCTR"), &rb);
  36.                         // set that as the target
  37.                         target = AcGePoint3d (rb.resval.rpoint[X], rb.resval.rpoint[Y], rb.resval.rpoint[Z]);
  38.                   }
  39.                   // we want the viewport's camera target setting
  40.                   else
  41.                   {
  42.                         // get the target of the view
  43.                         target = pViewPortRec->target ();
  44.                   }               
  45.                   // get the view direction
  46.                   viewDir = pViewPortRec->viewDirection ();
  47.                   // get the view twist of the viewport
  48.                   viewTwist = pViewPortRec->viewTwist ();
  49.                   // return the current Visual Style
  50.                   currentVsId = pViewPortRec->visualStyle();
  51.                 }
  52.                 // close after use
  53.                 pViewPortRec->close();                        
  54.           }        
  55.           acDocManager->unlockDocument(pDoc);
  56.           // now restore the original document
  57.           acDocManager->setCurDocument(acDocManager->mdiActiveDocument());
  58.           return (true);
  59.         }
  60. // set the passed AcGsView to the *Active* AutoCAD AcDbDatabase view
  61.         static AcDbObjectId SetViewTo(AcGsView *pView, AcDbDatabase *pDb, AcGeMatrix3d& viewMat)
  62.         {
  63.           // we are going to set the view to the current view of the drawing
  64.           // The overall approach is to calculate the extents of the database in the coordinate system of the view
  65.           // Calculate the extents in WCS
  66.           AcGePoint3d extMax = pDb->extmax();
  67.           AcGePoint3d extMin = pDb->extmin();
  68.           // initialize it with sensible numbers - even if there is no entity
  69.           if (extMin.distanceTo(extMax) > 1e20)
  70.           {
  71.                   extMin.set(0, 0, 0);
  72.                   extMax.set(100, 100, 100);
  73.           }
  74.           // get the view port information - see parameter list
  75.           ads采用real height = 0.0, width = 0.0, viewTwist = 0.0;
  76.           AcGePoint3d targetView;
  77.           AcGeVector3d viewDir;
  78.           AcDbObjectId currentVsId;
  79.           GetActiveViewPortInfo (pDb, height, width, targetView, viewDir, viewTwist, currentVsId, true);
  80.           // we are only interested in the directions of the view, not the sizes, so we normalise.
  81.           viewDir = viewDir.normal();
  82.           //**********************************************
  83.           // Our view coordinate space consists of z direction
  84.           // get a perp vector off the z direction
  85.           // Make sure its normalised
  86.           AcGeVector3d viewXDir = viewDir.perpVector ().normal();
  87.           // correct the x angle by applying the twist
  88.           viewXDir = viewXDir.rotateBy (viewTwist, -viewDir);
  89.           // now we can work out y, this is of course perp to the x and z directions. No need to normalise this,
  90.           // as we know that x and z are of unit length, and perpendicular, so their cross product must be on unit length
  91.           AcGeVector3d viewYDir = viewDir.crossProduct (viewXDir);
  92.           // find a nice point around which to transform the view. We'll use the same point as the center of the view.
  93.           AcGePoint3d boxCenter = extMin + 0.5 * ( extMax - extMin );
  94.           //**********************************************
  95.           // create a transform from WCS to View space
  96.           // this represents the transformation from WCS to the view space. (Actually not quite since
  97.           // we are keeping the fixed point as the center of the box for convenience )
  98.           viewMat = AcGeMatrix3d::alignCoordSys (boxCenter, AcGeVector3d::kXAxis, AcGeVector3d::kYAxis, AcGeVector3d::kZAxis,  
  99.                 boxCenter, viewXDir, viewYDir, viewDir).inverse();
  100.           AcDbExtents wc**tents(extMin, extMax);
  101.           // now we have the view Extents
  102.           AcDbExtents viewExtents = wc**tents;
  103.           // transforms the extents in WCS->view space
  104.           viewExtents.transformBy (viewMat);
  105.           //**********************************************
  106.           // get the extents of the AutoCAD view
  107.           double xMax = fabs(viewExtents.maxPoint ().x - viewExtents.minPoint ().x);
  108.           double yMax = fabs(viewExtents.maxPoint ().y - viewExtents.minPoint ().y);
  109.           //**********************************************
  110.           // setup the view
  111.           AcGePoint3d eye = boxCenter + viewDir;
  112.           // upvector                                
  113.           pView->setView(eye, boxCenter, viewYDir, xMax, yMax);
  114.           // update the gsView
  115.           refreshView(pView);
  116.           return currentVsId;
  117.         }
  118. static void refreshView(AcGsView *pView)
  119.         {
  120.           if (pView != NULL)
  121.           {
  122.                 pView->invalidate();
  123.                 pView->update();
  124.           }
  125.         }
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|膜结构网

GMT+8, 2025-1-11 00:47 , Processed in 0.091588 second(s), 22 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表