乐筑天下

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

安排模型空间,如纸空间问题

[复制链接]

2

主题

2

帖子

1

银币

初来乍到

Rank: 1

铜币
10
发表于 2021-7-19 11:29:39 | 显示全部楼层 |阅读模式
我编写了一个方法,可以在模型空间中移动一些外部参照,复制它们在图纸空间布局中的排列。
大多数情况下,它都运行良好。但是,脚本下面的示例文件会失败。你可以看到下面的预期结果和冗杂的结果。





  1.        [CommandMethod("tecFixMs")]
  2.         public void tecFixMs()
  3.         {
  4.             Document doc = Application.DocumentManager.MdiActiveDocument;
  5.             Database db = doc.Database;
  6.             Editor ed = doc.Editor;
  7.             LayoutManager layoutMan = LayoutManager.Current;
  8.             using (Transaction Tx = db.TransactionManager.StartTransaction())
  9.             {
  10.                 DBDictionary layoutDict = (DBDictionary)db.LayoutDictionaryId.GetObject(OpenMode.ForWrite);
  11.                 BlockTableRecord ms = (BlockTableRecord)Tx.GetObject(SymbolUtilityServices.GetBlockModelSpaceId(db), OpenMode.ForRead);
  12.                 foreach (DBDictionaryEntry entry in layoutDict)
  13.                 {
  14.                     string layoutName = entry.Key;
  15.                     if (layoutName == "Layout1")
  16.                     {
  17.                         ed.WriteMessage("---------------");
  18.                         Point3d basept = new Point3d(0, 0, 0);
  19.                         //Point3d lastbasept = new Point3d(0, 0, 0);
  20.                         Layout layoutObj = (Layout)layoutMan.GetLayoutId(layoutName).GetObject(OpenMode.ForWrite);
  21.                         ed.WriteMessage("{0} - Viewports: {1}\n", layoutObj.LayoutName, layoutObj.GetViewports().Count);
  22.                         ObjectIdCollection initObj = layoutObj.GetViewports();
  23.                         Vector3d oshift = new Vector3d(0, 0, 0);
  24.                         Point3d lastvpcpt = new Point3d(0, 0, 0);
  25.                         int counter = 0;
  26.                         Point3d psbasept = new Point3d(0, 0, 0);
  27.                         Point3d msbasept = new Point3d(0, 0, 0);
  28.                         foreach (ObjectId vpId in initObj)
  29.                         {
  30.                             Viewport vp = (Viewport)vpId.GetObject(OpenMode.ForWrite);
  31.                             ed.WriteMessage("VP # - {0} - center: {1} view center: {2}\n", vp.Number, vp.CenterPoint, vp.ViewCenter);
  32.                             Polyline vpOutlineInMs = null;
  33.                             if (vp.NonRectClipOn)
  34.                             {
  35.                                 ObjectId vpClipId = vp.NonRectClipEntityId;
  36.                                 Entity vpBoundary = (Entity)Tx.GetObject(vpClipId, OpenMode.ForRead);
  37.                                 vpOutlineInMs = (Polyline)vpBoundary.Clone();
  38.                             }
  39.                             else
  40.                             {
  41.                                 Extents3d vpExt = vp.GeometricExtents;
  42.                                 vpOutlineInMs = new Polyline(4);
  43.                                 vpOutlineInMs.AddVertexAt(0, new Point2d(vpExt.MinPoint.X, vpExt.MinPoint.Y), 0, 0, 0);
  44.                                 vpOutlineInMs.AddVertexAt(1, new Point2d(vpExt.MaxPoint.X, vpExt.MinPoint.Y), 0, 0, 0);
  45.                                 vpOutlineInMs.AddVertexAt(2, new Point2d(vpExt.MaxPoint.X, vpExt.MaxPoint.Y), 0, 0, 0);
  46.                                 vpOutlineInMs.AddVertexAt(3, new Point2d(vpExt.MinPoint.X, vpExt.MaxPoint.Y), 0, 0, 0);
  47.                                 vpOutlineInMs.Closed = true;
  48.                             }
  49.                             // ViewportExtensionMethods.cs  (c) 2007-2012  Tony Tanzillo
  50.                             Point3d vpMScpt = new Point3d(vp.ViewCenter.X, vp.ViewCenter.Y, 0.0);
  51.                             Point3d vpPScpt = vp.CenterPoint;
  52.                             Matrix3d msToPs = Matrix3d.Displacement(new Vector3d(vp.CenterPoint.X - vpMScpt.X, vp.CenterPoint.Y - vpMScpt.Y, 0.0))
  53.                                                     * Matrix3d.Scaling(vp.CustomScale, vpMScpt)
  54.                                                     * Matrix3d.Rotation(vp.TwistAngle, Vector3d.ZAxis, Point3d.Origin)
  55.                                                     * Matrix3d.WorldToPlane(new Plane(vp.ViewTarget, vp.ViewDirection));
  56.                             vpOutlineInMs.TransformBy(msToPs.Inverse());
  57.                             foreach (ObjectId entId in ms)
  58.                             {
  59.                                 Entity ent = (Entity)Tx.GetObject(entId, OpenMode.ForWrite);
  60.                                 try
  61.                                 {
  62.                                     Extents3d entExtents = ent.GeometricExtents;
  63.                                     Point3d cpt = new Point3d(entExtents.MinPoint.X + (entExtents.MaxPoint.X - entExtents.MinPoint.X) / 2, entExtents.MinPoint.Y + (entExtents.MaxPoint.Y - entExtents.MinPoint.Y) / 2, 0);
  64.                                     if (IsInside2D(vpOutlineInMs, cpt))
  65.                                     {
  66.                                         Matrix3d vptargettransform = new Matrix3d();
  67.                                         if (counter == 0)
  68.                                         {
  69.                                             counter = 1;
  70.                                             vptargettransform = Matrix3d.Displacement(vpMScpt.GetVectorTo(msbasept));
  71.                                         }
  72.                                         else
  73.                                         {
  74.                                             Matrix3d bpmat = Matrix3d.Displacement(psbasept.GetVectorTo(vpPScpt).TransformBy(Matrix3d.Scaling(1 / vp.CustomScale, vpPScpt)));
  75.                                             msbasept = msbasept.TransformBy(bpmat);
  76.                                             vptargettransform = Matrix3d.Displacement(vpMScpt.GetVectorTo(msbasept));
  77.                                         }
  78.                                         ent.TransformBy(vptargettransform);
  79.                                         vp.ViewTarget = vp.ViewTarget.TransformBy(vptargettransform); ;
  80.                                         //msbasept = vpMScpt;
  81.                                         psbasept = vpPScpt;
  82.                                     }
  83.                                 }
  84.                                 catch (Autodesk.AutoCAD.Runtime.Exception ex)
  85.                                 {
  86.                                 }
  87.                             }
  88.                         }
  89.                     }
  90.                 }
  91.                 Tx.Commit();
  92.             }
  93.         }

本帖以下内容被隐藏保护;需要你回复后,才能看到!

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2024-11-22 01:15 , Processed in 0.257349 second(s), 59 queries .

© 2020-2024 乐筑天下

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