Bernd 发表于 2018-3-6 10:41:25

转换视口时出现问题

我正在尝试遍历绘图的所有布局并移动它们的视口中心,因为在之前的步骤中,所有模型空间的实体都已被移动。只要视口的坐标系是wcs,这就可以正常工作,不幸的是并不总是这样。我尝试使用@gile的GeometryExtensionLibrary,但我想我太笨了,无法理解wcs、ucs、ocs、dcs和psdcs之间的区别(非常欢迎进一步解释)这是我到目前为止尝试的内容:[命令方法("enumerateLayout")]。
公共静态空枚举布局()。
{。
使用(Transaction=_doc.TransactionManager.StartTransaction())。
{。
LayoutManager=LayoutManager.Current;。
字符串当前布局=layoutManager.CurrentLayout;。

尝试。
{。
使用(var layoutDicpedia=(DBDicpedia)trans.GetObject(_db.LayoutDictionaryId,OpenMode.ForRead))。
{。
foreach(layoutDicpedia中的var layoutEntry)。
{。
如果(layoutEntry.Key=="模型")。
继续;。

使用(var布局=(布局)trans.GetObject(layoutEntry.Value,OpenMode.ForRead))。
{。
layoutManager.CurrentLayoutlayout.LayoutName。

bool isPper space=true;。
foreach(ObjectId viewportId inlayout.GetViewports())。
{。
//此列表的第一个ID是Pperispace。
如果(isPpersspace)。
{。
isPperispace=false;。
继续;。
}。

使用(var viewport=(Viewport)trans.GetObject(viewportId,OpenMode.ForWrite))。
{。
双xShift=28999942;。
双yShift=-1729;。

=新的Point3d(viewport.ViewCenter.X,viewport.ViewCenter.Y,0);。
viewCent3d=viewCenter3d.Trans(GeometryExtensions.CoordSystem.UCS,GeometryExtensions.CoordSystem.WCS);。
viewCent3d=viewCenter3d.TransformBy(Matrix3d.Displacement(new Vector3d(xShift, yShift,0)));。
viewport.ViewCenter=新的Point2d(viewCent3D. X, viewCent3D. Y);。
}。

_editor.Regen。
}。
}。
}。

trans.Commit();。
}。
}。
捕获(System.Exceptione)。
{。
_editor.WriteMessagee.Message。
trans.Abort();。
}。
最后。
{。
layoutManager.CurrentLayout当前布局;。
}。
}。
}。
结果:wcs中的布局是正确的,ucs的布局没有改变。我非常感谢任何帮助,Bernd。
**** Hidden Message *****

gile 发表于 2018-3-6 12:00:25

嗨,吉勒,谢谢你——按预期工作(当然也感谢你的图书馆!)。
所以我说ucs只有在模型空间才算数是对的吗?纸张空间的等价物是dcs?psdcs到底是干什么的?
我真的很难理解欧特克在这个主题上的留档:

Bernd 发表于 2018-3-7 03:27:51


我很难用比医生更好的英语来解释这一点,但我会尝试一下。
首先,不可以。您还可以使用图纸空间中的UCS在此空间中绘图,例如添加注释、插入标题栏,当然还有绘制视口。
DCS是与视口(图纸空间视口或模型空间视口)中的视图相关的坐标系。视口中的视图可能已被旋转或3d旋转。
PSDCS仅用于将图纸空间WCS坐标与图纸空间视口视图坐标(DCS)相互转换。

gile 发表于 2018-3-7 04:46:19

Gilles,
感谢您花时间举了一个例子,只是为了向像我这样的人解释一个显然很容易的话题(我希望,我不是唯一的一个)。
这真是太棒了。

gile 发表于 2018-3-7 07:31:20

@吉尔:为什么在我的图片中这样显示?
警告:
“视口不包含WCS2DC的防御”
查看我的图片

Bernd 发表于 2018-3-7 08:18:32

@daboho,如第一条消息中所述,您必须引用包含视口的GeometryExtensions库。DCS2WCS扩展方法。

daboho 发表于 2021-8-15 07:28:12

我在哪里可以获得参考?

gile 发表于 2021-8-15 10:23:19

@gile我有成功来获得几何扩展,但结果是
我是sorri,我仍然是C#中的新手,我已经运行了
我想要首先询问的是
双倍xShift = 28999942;这是为了模型空间中的协调x平均值?
双 yShift = -1729;      这是为了模型空间中的协调y平均值?
请帮忙

daboho 发表于 2021-8-17 16:13:55

@吉尔:我已经尝试了一周了,但仍然坚持执行此代码。步骤1:我在模型空间中选择边框/矩形。步骤2:每个边框/矩形都将缩放到所有纸张空间。问题在于,多选时,所有纸张空间都与边框/第一选择相同。此代码有什么问题private List lisFindObjIdOfCircle()
      {
            Document doc = acApp.DocumentManager.MdiActiveDocument;
            Editor ed = doc.Editor;
            List lisObjectIdFound = new List();
            try
            {
                var option = new PromptSelectionOptions(); option.MessageForAdding = "\nselect Rectangle/Borders Cover Gambar";
                var psr = ed.GetSelection(option, new SelectionFilter(new[] { new TypedValue(0, "LWPOLYLINE,Polyline") }));
            
                SelectionSet acSSet = psr.Value;
                if (psr.Status == PromptStatus.OK)
                {
                  
                  foreach (SelectedObject recID in acSSet)
                  {
                        lisObjectIdFound.Add(recID.ObjectId);
                  }
                }
            }
            catch (System.Exception ex)
            {
                ed.WriteMessage("\nError in getting ObjectId of all circles on the drawing. " +
                                 "Error message is: " + ex.Message);
            }
            return (lisObjectIdFound);
      }
      
      public void testview()
      {
            var doc = acApp.DocumentManager.MdiActiveDocument;
            Database db = HostApplicationServices.WorkingDatabase;
            var ed = doc.Editor;
            List lisCircleObjId = new List();
            lisCircleObjId = this.lisFindObjIdOfCircle();
         
            using (Transaction trans = db.TransactionManager.StartTransaction())
            {
                using (var layoutDictionary = (DBDictionary)trans.GetObject(db.LayoutDictionaryId, OpenMode.ForRead))
                {
                  using (var mylock = doc.LockDocument())
                  {
                            foreach (var layoutEntry in layoutDictionary)
                            {
                              if (layoutEntry.Key == "Model") continue;
                              using (var layout = (Layout)trans.GetObject(layoutEntry.Value, OpenMode.ForWrite))
                              {
                                    var n = 0;
                                    var extSelObj = new Extents3d();
                                    // ObjectId layoutId = LayoutManager.Current.CreateLayout(layout.LayoutName);             // membuat layout
                                    LayoutManager.Current.CurrentLayout = layout.LayoutName;
                                    Entity entObj = (Entity)trans.GetObject(lisCircleObjId, OpenMode.ForRead);
                                    ObjectId idcover = entObj.ObjectId;
                                    extSelObj.AddExtents(entObj.GeometricExtents);
                                    bool isPaperspace = true;
                                    foreach (ObjectId viewportId in layout.GetViewports())
                                    {
                                        if (isPaperspace)
                                        {
                                          isPaperspace = false;
                                          continue;
                                        }
                                        using (var viewport = (Viewport)trans.GetObject(viewportId, OpenMode.ForWrite))
                                        {
                                          if (viewport.Locked == true) viewport.Locked = false;
                                          viewport.On = true;
                                          ed.Command("._MSPACE");
                                          // buat extend dari objectID
                                          var pl = trans.GetObject(entObj.ObjectId, OpenMode.ForRead) as Polyline;
                                          var ext = new Extents3d();
                                          ext = pl.GeometricExtents;
                                          var mn = ext.MinPoint;
                                          var mx = ext.MaxPoint;
                                          dynamic appAcad = acApp.AcadApplication;
                                          //appAcad.ZoomWindow(mn.ToArray(), mx.ToArray());
                                          ObjectId[] newIds = new ObjectId;
                                          ed.SetImpliedSelection(newIds);
                                          appAcad.ZoomWindow(extSelObj.MinPoint.ToArray(), extSelObj.MaxPoint.ToArray());
                                          ed.SetImpliedSelection(new ObjectId[] { idcover });
                                          // ed.SetImpliedSelection(new ObjectId[] { myRec });
                                          ed.Command("._PSPACE", "");
                                          doc.Editor.SwitchToPaperSpace();
                                          dynamic acadApp = acApp.AcadApplication;
                                          acadApp.ZoomExtents();
                                          ed.WriteMessage("\n viewlocked : " + viewport.Locked.ToString());
                                          break;
                                        }
                                        n += 1;
                                        ed.Regen();
                                    }
                              }
                            }
                  }
                }
                trans.Commit();
               
            }
      }

daboho 发表于 2021-8-17 16:53:37

@gile
在这个文件中,每个文件都应该是我想要的
页: [1]
查看完整版本: 转换视口时出现问题