使用C#

时间:2015-08-13 17:32:44

标签: c# automation autocad

我正在处理一个任务,其中代码自动打开用户[在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(通过全部洗牌)。

有人有任何建议吗?

2 个答案:

答案 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,则必须在导出文件之前爆炸管道组件

浪费了很多时间了解原因,但终于明白了!