转换视口时出现问题
我正在尝试遍历绘图的所有布局并移动它们的视口中心,因为在之前的步骤中,所有模型空间的实体都已被移动。只要视口的坐标系是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 ***** 嗨,吉勒,谢谢你——按预期工作(当然也感谢你的图书馆!)。
所以我说ucs只有在模型空间才算数是对的吗?纸张空间的等价物是dcs?psdcs到底是干什么的?
我真的很难理解欧特克在这个主题上的留档:
我很难用比医生更好的英语来解释这一点,但我会尝试一下。
首先,不可以。您还可以使用图纸空间中的UCS在此空间中绘图,例如添加注释、插入标题栏,当然还有绘制视口。
DCS是与视口(图纸空间视口或模型空间视口)中的视图相关的坐标系。视口中的视图可能已被旋转或3d旋转。
PSDCS仅用于将图纸空间WCS坐标与图纸空间视口视图坐标(DCS)相互转换。 Gilles,
感谢您花时间举了一个例子,只是为了向像我这样的人解释一个显然很容易的话题(我希望,我不是唯一的一个)。
这真是太棒了。 @吉尔:为什么在我的图片中这样显示?
警告:
“视口不包含WCS2DC的防御”
查看我的图片 @daboho,如第一条消息中所述,您必须引用包含视口的GeometryExtensions库。DCS2WCS扩展方法。 我在哪里可以获得参考? @gile我有成功来获得几何扩展,但结果是
我是sorri,我仍然是C#中的新手,我已经运行了
我想要首先询问的是
双倍xShift = 28999942;这是为了模型空间中的协调x平均值?
双 yShift = -1729; 这是为了模型空间中的协调y平均值?
请帮忙 @吉尔:我已经尝试了一周了,但仍然坚持执行此代码。步骤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();
}
}
@gile
在这个文件中,每个文件都应该是我想要的
页:
[1]