zjh2785 发表于 2018-11-9 03:33:49

我这段代码应该没有问题吧? 为什么删除失败呢

本帖最后由 zjh2785 于 2018-11-9 03:37 编辑

外部有一个文件, 我要删除其中的某一个块(没有任何参照引用)
用我这段代码, 无法删除,也没有任何异常发生;
      public static bool DeleteBlock(string path, string fileName, string blockName)
      {
            try
            {
                using (Database db = new Database(false, true))
                {
                  db.ReadDwgFile(path + "\\\" + fileName, FileOpenMode.OpenForReadAndWriteNoShare, true, “”);
                  using (Transaction tr = db.TransactionManager.StartTransaction())
                  {
                        BlockTable bt = tr.GetObject(db.BlockTableId, OpenMode.ForWrite) as BlockTable;
                        if (!bt.Has(blockName))
                        {
                            return false;
                        }
                        BlockTableRecord btr = tr.GetObject(bt, OpenMode.ForWrite) as BlockTableRecord;
                        btr.Erase();//无法删除,单步调试的时候直接走过,没有异常;用btr.Erase(true)也无效;
                        tr.Commit();
                  }
                  db.SaveAs(fileName, false, DwgVersion.AC1024);
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return true;
      }

问号兄233 发表于 2018-11-14 09:44:13

这个btr是数据库中的记录,删除图形记录的话,你需要通过btr的ObjectId,或者进一步获取到图面上的Entity,当你获取到entity之后,再进行entity.Erase()命令即可。

zjh2785 发表于 2018-12-8 20:35:10

本帖最后由 zjh2785 于 2018-12-8 20:40 编辑

问号兄233 发表于 2018-11-14 09:44
这个btr是数据库中的记录,删除图形记录的话,你需要通过btr的ObjectId,或者进一步获取到图面上的Entity, ...
额。。。没懂,你的意思是把BlockTableRecord转换成Entity么?我去试试,我印象中块表记录不是实体啊 ,块引用(BlockReference)才是实体啊
而且上面的代码删除当前文档是有效的哦 ,但是要删除外部文档就有问题了(没有任何块引用)

刚才试了Entity btr = tr.GetObject(bt, OpenMode.ForWrite) as Entity ;   返回的是null   

问号兄233 发表于 2018-12-10 10:27:03

zjh2785 发表于 2018-12-8 20:35
额。。。没懂,你的意思是把BlockTableRecord转换成Entity么?我去试试,我印象中块表记录不是实体 ...

不是把BlockTableRecord转换成Entity,而是你用btr.Erase这种方法是错误的。我只知道获取外部dwg文件的btr用bt这种方式是获取不到的,内部机制不懂。要先用个BlockTableRecord btr = (BlockTableRecord)tr.GetObject(bt,OpenMode.ForRead,false);语句获取所有块表记录。再用foreach(ObjectId objId in btr)
{
Entity ent = tr.GetObject(ObjId, OpenMode.ForWrite) as Entity;
//对你的ent属性进行判断,这里应该是你的blockName,判断之后再删除符合条件的blockName即可;
}
这种就没有问题了。

zjh2785 发表于 2018-12-10 23:38:26

问号兄233 发表于 2018-12-10 10:27
不是把BlockTableRecord转换成Entity,而是你用btr.Erase这种方法是错误的。我只知道获取外部dwg文件的bt ...

哈哈搞定了,虽然不是用您的方法,但还是非常感谢你热心的回答。

我找到问题所在了,由于我的文件路径是采用目录+“\\”+文件名 的方式打开的,然后在我SaveAs的时候 却只提供了文件名, 所以自然保存的位置不是原来的位置,具体保存到哪去了就要看CAD当前的工作目录了,   

再次感谢你的解答

问号兄233 发表于 2018-12-11 08:47:29

zjh2785 发表于 2018-12-10 23:38
哈哈搞定了,虽然不是用您的方法,但还是非常感谢你热心的回答。

我找到问题所在了,由于我的 ...

那你的问题和我遇到的问题还是不一样的。
页: [1]
查看完整版本: 我这段代码应该没有问题吧? 为什么删除失败呢