乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
楼主: gile

从 PaperSpace 到 ModelSpace 的转换点

[复制链接]

2

主题

31

帖子

1

银币

初来乍到

Rank: 1

铜币
39
发表于 2019-9-10 03:28:14 | 显示全部楼层
谢谢,这对我帮助很大
如果你想用另一种方式来做:从模型空间到纸上空间,这里是我提出的一个小测试项目。我希望它能帮助别人
关键位有以下几种方法:
  1. Matrix3d m = ed.WCS2DCS();
  2.                 Matrix3d m2 = ed.DCS2PSDCS();

首先我们需要从WCS到DCS,然后从DCS到PSDC。它们是使用Gilles几何扩展库中提供的方便扩展方法完成的。我会将它们粘贴在这里,以便于您参考-但请务必获取原件及其相关注释:
  1.         public static Matrix3d WCS2DCS(this Editor ed)
  2.         {
  3.             return ed.DCS2WCS().Inverse();
  4.         }
  5. public static Matrix3d DCS2PSDCS(this Editor ed)
  6.         {
  7.             Database db = ed.Document.Database;
  8.             if (db.TileMode)
  9.                 throw new AcRx.Exception(AcRx.ErrorStatus.NotInPaperspace);
  10.             using (Transaction tr = db.TransactionManager.StartTransaction())
  11.             {
  12.                 Viewport vp =
  13.                     (Viewport)tr.GetObject(ed.CurrentViewportObjectId, OpenMode.ForRead);
  14.                 if (vp.Number == 1)
  15.                 {
  16.                     try
  17.                     {
  18.                         ed.SwitchToModelSpace();
  19.                         vp = (Viewport)tr.GetObject(ed.CurrentViewportObjectId, OpenMode.ForRead);
  20.                         ed.SwitchToPaperSpace();
  21.                     }
  22.                     catch
  23.                     {
  24.                         throw new AcRx.Exception(AcRx.ErrorStatus.CannotChangeActiveViewport);
  25.                     }
  26.                 }
  27.                 return vp.DCS2PSDCS();
  28.             }
  29.         }

说明:打开CAD文件。下载DLL。考虑到视口UCS的定义不同,应在图纸空间中在模型空间中拾取的几何图形上绘制圆
  1.         [CommandMethod("ViewPortTest")]
  2.         public static void ViewPortTest()
  3.         {
  4.             Document doc = Application.DocumentManager.MdiActiveDocument;
  5.             Database db = doc.Database;
  6.             Editor ed = doc.Editor;
  7.             using (Transaction tr = db.TransactionManager.StartTransaction())
  8.             {
  9.                 BlockTable bt = tr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
  10.                 BlockTableRecord ms = tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;
  11.                 Line line = new Line();
  12.                 line.StartPoint = new Point3d(3167, 448, 0);
  13.                 line.EndPoint = new Point3d(3167, 594, 0);
  14.                 ms.AppendEntity(line);
  15.                 tr.AddNewlyCreatedDBObject(line, true);
  16.                 tr.Commit();
  17.             }
  18.             using (Transaction tr = db.TransactionManager.StartTransaction())
  19.             {
  20.                 BlockTable bt = tr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
  21.                 BlockTableRecord ms = tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;
  22.                 RXClass rxLine = RXClass.GetClass(typeof(Line));
  23.                 Line line =  ms.Cast().Where(id => id.ObjectClass == rxLine).Select(id => tr.GetObject(id, OpenMode.ForRead) as Line).First();
  24.                 Point3d startPoint = line.StartPoint;
  25.                 Point3d endPoint = line.EndPoint;
  26.                 //// When working with paper space
  27.                 /// PSDCS to DCS
  28.                 /// DCS to WCS
  29.                 Matrix3d m = ed.WCS2DCS();
  30.                 Matrix3d m2 = ed.DCS2PSDCS();
  31.                 Point3d newStart = startPoint.TransformBy(m).TransformBy(m2);
  32.                 Point3d newEnd = endPoint.TransformBy(m).TransformBy(m2);
  33.                 ed.SwitchToPaperSpace();
  34.                 BlockTableRecord ps = tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite) as BlockTableRecord;
  35.                 using (Circle circle = new Circle(newStart, Vector3d.ZAxis, 20))
  36.                 {
  37.                     ps.AppendEntity(circle);
  38.                     tr.AddNewlyCreatedDBObject(circle, true);
  39.                 }
  40.                 using (Circle circle = new Circle(newEnd, Vector3d.ZAxis, 20))
  41.                 {
  42.                     ps.AppendEntity(circle);
  43.                     tr.AddNewlyCreatedDBObject(circle, true);
  44.                 }
  45.                 tr.Commit();
  46.             }
  47.         }
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2024-11-22 05:41 , Processed in 0.231017 second(s), 63 queries .

© 2020-2024 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表