天气与日历 切换到窄版

 找回密码
 立即注册
中国膜结构网
十大进口膜材评选 十大国产膜材评选 十大膜结构设计评选 十大膜结构公司评选
查看: 133|回复: 0

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

[复制链接]
  • TA的每日心情
    开心
    昨天 06:36
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    105

    主题

    11

    回帖

    1308

    积分

    管理员

    积分
    1308
    QQ
    发表于 2024-3-14 20:14:02 | 显示全部楼层 |阅读模式
    1. tatic 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.         }
    复制代码

     

     

     

     

    [每日一码] 几个视图ARX代码
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|中国膜结构网|中国膜结构协会|进口膜材|国产膜材|ETFE|PVDF|PTFE|设计|施工|安装|车棚|看台|污水池|中国膜结构网_中国空间膜结构协会

    GMT+8, 2024-11-1 13:32 , Processed in 0.152294 second(s), 26 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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