【发布时间】:2015-08-14 16:10:50
【问题描述】:
我正在处理一个任务,其中代码会自动打开用户[在 UI 中] 选择的图形,并选择图形中的所有对象并开始分解所有对象,直到它们不再被分解。这样做时我遇到了一个问题,原始(未爆炸的 3D 对象)仍然存在于绘图中,由 Exploded 对象叠加。 Explode 函数的每次递归调用都会为该对象创建一个新的分解 3D 对象。
这是我正在处理的代码的 sn-p:
PromptSelectionResult ss = ed.SelectAll();
using (DocumentLock acLckDoc = doc.LockDocument())
{
using (Transaction tr = db.TransactionManager.StartTransaction())
{
objs = new DBObjectCollection();
foreach (SelectedObject so in ss.Value)
{
Entity ent = (Entity)tr.GetObject(so.ObjectId, OpenMode.ForWrite);
if (!(ent is Solid3d))
{
ent.Explode(objs);
ent.UpgradeOpen();
ent.Erase();
}
}
tr.Commit();
}
}
一旦控件进入 ent.Erase() 语句 - 它就会引发异常 eCannotBeErasedByCaller。我想不通为什么?我已经解锁了所有层,打开了写入实体,CommandFlags 已设置为 Session 和 UsePickSet(全部随机播放)。
有人有什么建议吗?
【问题讨论】:
-
不确定您的目标是什么,代码在这里工作正常,它会爆炸所有非实体实体(在内存中)并擦除原始实体。之后,绘图没有实体(空),除了实体。
-
当您有 (1) 个需要启用程序的代理对象(例如来自 SysCAD 或 Athena 的对象)或者您有 (2) 个来自 AutoCAD Revit 的对象(或其他来自 AutoCAD 垂直领域的对象)时,您不能只是简单地爆炸和擦除,因为它们有常驻 DbObjects,有时会引用图形对象、图层等,而且它们不是那么容易擦除 :)
-
感谢 Ognyan..!!没有意识到这一点。我改变了程序的流程,现在一切正常。
标签: c# automation autocad