【问题标题】:Erasing AutoCAD drawing objects after exploding them, using C#使用 C# 在爆炸后擦除 AutoCAD 绘图对象
【发布时间】: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


【解决方案1】:

查看您的描述,您可能需要递归分解。前段时间我为其他类型的实体做了一个代码,但你可以调整它。

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

【讨论】:

  • 嗨 Augusto,谢谢你的提示,我想我忘了提及.. 在这段代码下面,我将新创建的 explodedObjs (DBObjectCollection) 添加到数据库中,然后再次递归调用该函数直到出现没有什么可以爆炸的。但我似乎无法擦除原始对象(我们爆炸的对象)。我不断收到 AutoCAD Plant3D 中 PipeLines 和 InlineAssets 的异常
【解决方案2】:

我终于找到了原始对象没有被删除的原因。

在代码的前面部分,AutoCAD Plant3D dwg 被导出到 AutoCAD (ExporttoAutoCAD / Saveas),这是创建代理项。这些不能手动或通过代码删除。 唯一的方法是在导出文件之前分解 PipeLines 和 Inline 资产。 如果您导出文件,这会自动发生,但如果您使用另存为,则必须在导出文件之前分解 PipeLine 组件.

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-17
    • 1970-01-01
    相关资源
    最近更新 更多