我正在处理一个任务,其中代码自动打开用户[在UI中]选择的绘图并选择绘图中的所有对象并开始爆炸所有这些对象,直到它们不再爆炸为止。在这样做时我遇到了一个问题,原始(未爆炸的3D对象)仍然存在于绘图中,由Exploded对象强加。每次对Explode函数的递归调用都会创建该对象的新爆炸3D对象。
以下是我正在处理的代码片段:
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(通过全部洗牌)。
有人有任何建议吗?
答案 0 :(得分:0)
查看您的描述,您可能需要递归爆炸。前一段时间我为其他类型的实体做了一个代码,但你可以调整它。
private List<DBObject> FullExplode(Entity ent)
{
// final result
List<DBObject> fullList = new List<DBObject>();
// explode the entity
DBObjectCollection explodedObjects = new DBObjectCollection();
ent.Explode(explodedObjects);
foreach (Entity explodedObj in explodedObjects)
{
// if the exploded entity is a blockref or mtext
// then explode again
if (explodedObj.GetType() == typeof(BlockReference) ||
explodedObj.GetType() == typeof(MText))
{
fullList.AddRange(FullExplode(explodedObj));
}
else
fullList.Add(explodedObj);
}
return fullList;
}
来源:http://adndevblog.typepad.com/infrastructure/2013/04/get-cogopoint-label-text.html
答案 1 :(得分:0)
我终于找到了原始物品没有被删除的原因。
在代码的前一部分中,AutoCAD Plant3D dwg导出到AutoCAD( ExporttoAutoCAD / Saveas),这是创建代理项目。这些不能手动删除或通过代码删除。 唯一的方法是在导出文件之前爆炸PipeLines和Inline资源。如果导出文件会自动发生这种情况,但如果使用saveas,则必须在导出文件之前爆炸管道组件
浪费了很多时间了解原因,但终于明白了!