我有一个与AutoCad接口的C#应用程序。它的工作是遍历模型上的所有实体,并通过查找特定XData标记的存在找到适用于我们正在做的事情的实体。
问题是当绘图员将一个块移动到任何标记为“不可见”的层(即关闭图层)时,xdata不能通过通常的循环发现:
foreach (AcadEntity ent in ACAD.ActiveDocument.ModelSpace)
{
... get xData from the entity.
}
foreach (AcadEntity ent in ACAD.ActiveDocument.ModelSpace)
{
... get xData from the entity.
}
我尝试使用以下代码重新打开图层:
ACAD.ActiveDocument.Layers.Item("HIDDENLAYER").LayerOn = true;
ACAD.Update();
foreach...
...但xData似乎没有带回来。就好像将它移动到一个不可见的层,从对象中剥离XData。那会很糟糕。
是否有“正确”的方法从不可见图层上的项目中获取XData?
感谢。
答案 0 :(得分:1)
我无法在AutoCAD(地图)2012中重现这一点。您使用的是哪个版本的AutoCAD?
你在... get xData from the entity.
内实际做了什么?我这样做了:
static AcadApplication ACAD
{
get
{
return
Autodesk.AutoCAD.ApplicationServices.Application.AcadApplication as AcadApplication;
}
}
[CommandMethod("tlo")]
public static void TestLayerOff()
{
foreach (AcadEntity ent in ACAD.ActiveDocument.ModelSpace)
{
//... get xData from the entity.
object xdata, xdataType;
ent.GetXData("MyRegisteredAppName", out xdataType, out xdata);
//... read and spit out the xdata to the command line to see what we got
}
}
在关闭我的xdata'ed实体所在的图层后,它工作了。在我将它们移动到另一个关闭的层之后,它也起作用了。是否有重现我缺少的步骤? “起草人”在“移动街区”时究竟做了什么?
另外,如果您担心xdata会真正消失,请使用XDLIST命令直接在AutoCAD中查看。
最后,我会抛出一个一般性的建议,即摆脱COM的东西并使用原生的C#API,它将完成你在这里尝试的所有事情。
答案 1 :(得分:0)
目前,答案已变为“请勿将此项目移至隐藏图层”。相反,我在放置XData之前默认将图层标记为隐藏,这似乎工作正常。我不确定XData是如何消失的,但是现在,这对我有用。
如果有人对XData如何消失有任何建议,我仍然很好奇。
答案 2 :(得分:0)
Xdata很不稳定。如果你ATTSYNC一块它就会消失。这可能与您的具体问题无关,但这是不依赖Xdata的坚实理由。