找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 78|回复: 1

objectARX 添加布局视口

[复制链接]

0

主题

0

回帖

26

积分

管理员

积分
26
发表于 2024-9-25 22:41:11 | 显示全部楼层
  1.     static void MyGroupTest136()
  2.     {
  3.         AcDbDatabase* pDbUse = acdbHostApplicationServices()->workingDatabase();
  4.         AcDbDictionary* pNOD;
  5.         Acad::ErrorStatus eStat;
  6.         // 打开数据库的命名对象字典 (NamedObjects)
  7.         eStat = pDbUse->getNamedObjectsDictionary(pNOD, AcDb::kForRead);
  8.         if (eStat != Acad::eOk)
  9.             return;
  10.         AcDbObjectId idDict;
  11.         eStat = pNOD->getAt(_T("ACAD_LAYOUT"), idDict);
  12.         pNOD->close();
  13.         if (eStat != Acad::eOk)
  14.             return;
  15.         AcDbDictionary* pDict;
  16.         eStat = acdbOpenObject(pDict, idDict, AcDb::kForRead);
  17.         if (eStat != Acad::eOk)
  18.             return;
  19.         AcDbObjectId idLyt;
  20.         eStat = pDict->getAt(_T("Layout1"), idLyt);
  21.         pDict->close();
  22.         // 布局管理器
  23.         AcApLayoutManager* pLayM = (AcApLayoutManager*)acdbHostApplicationServices()->layoutManager();
  24.         // 设置当前布局
  25.         pLayM->setCurrentLayout(_T("Layout1"));
  26.         AcDbLayout* pLyt;
  27.         if (acdbOpenObject(pLyt, idLyt, AcDb::kForRead) != Acad::eOk)
  28.             return;
  29.         AcDbObjectId idBtr = pLyt->getBlockTableRecordId();
  30.         pLyt->close();
  31.         AddViewPort(idBtr, AcGePoint3d(2, 5, 0), AcGeVector3d(0, 0, 1));
  32.         AddViewPort(idBtr, AcGePoint3d(5, 5, 0), AcGeVector3d(-1, -1, 1));
  33.         AddViewPort(idBtr, AcGePoint3d(8, 5, 0), AcGeVector3d(1, 1, 1));
  34.     }
  35.     // 添加视口
  36.     static void AddViewPort(AcDbObjectId idToBtr, AcGePoint3d centerPoint, AcGeVector3d vecVPoint)
  37.     {
  38.         AcDbDatabase* pDb = acdbHostApplicationServices()->workingDatabase();
  39.         AcDbViewport* pVp = new AcDbViewport;
  40.         // 将新视口附加到图纸空间
  41.         AcDbBlockTableRecord* pBTR;
  42.         if (acdbOpenObject(pBTR, idToBtr, AcDb::kForWrite) != Acad::eOk)
  43.         {
  44.             acutPrintf(_T("\n无法访问图纸空间."));
  45.             delete pVp;
  46.             return;
  47.         }
  48.         if (pBTR->appendAcDbEntity(pVp) != Acad::eOk)
  49.         {
  50.             acutPrintf(_T("\n无法将视口附加到图纸空间."));
  51.             pBTR->close();
  52.             delete pVp;
  53.             return;
  54.         }
  55.         pBTR->close();
  56.         pVp->setCenterPoint(centerPoint);
  57.         // 设置查看方向
  58.         pVp->setViewDirection(vecVPoint);
  59.         // 假设目标点是WCS(0,0,0)
  60.         AcGeMatrix3d ucsMatrix;
  61.         getTrnsMatrix(ucsMatrix, vecVPoint, AcGePoint3d(0, 0, 0));
  62.         // 在视口的x-y平面中获取一个矩形窗口,该平面表示绘图的范围
  63.         AcGePoint2d maxExt, minExt;
  64.         getUcsExts(maxExt, minExt, ucsMatrix);
  65.         // 这里2是视图的高度。 您可以将其更改为任何高度
  66.         SetViewportExtents(pVp, maxExt, minExt, 2);
  67.         pVp->setOn();
  68.         pVp->close();
  69.     }
  70.     // 获取 WCS 到 UCS 转换矩阵
  71.     static void getTrnsMatrix(AcGeMatrix3d& ucsMatrix, AcGeVector3d ViewDirection, AcGePoint3d origin)
  72.     {
  73.         AcGePlane XYPlane(origin, ViewDirection);
  74.         ucsMatrix.setToWorldToPlane(XYPlane);
  75.     }
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-12-27 21:46 , Processed in 0.103729 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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