明经CAD社区

 找回密码
 注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 146|回复: 5

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

[复制链接]
发表于 2018-11-9 03:33 | 显示全部楼层 |阅读模式
本帖最后由 zjh2785 于 2018-11-9 03:37 编辑

外部有一个文件, 我要删除其中的某一个块(没有任何参照引用)
用我这段代码, 无法删除,也没有任何异常发生;
  1.         public static bool DeleteBlock(string path, string fileName, string blockName)
  2.         {
  3.             try
  4.             {
  5.                 using (Database db = new Database(false, true))
  6.                 {
  7.                     db.ReadDwgFile(path + "\\" + fileName, FileOpenMode.OpenForReadAndWriteNoShare, true, “”);
  8.                     using (Transaction tr = db.TransactionManager.StartTransaction())
  9.                     {
  10.                         BlockTable bt = tr.GetObject(db.BlockTableId, OpenMode.ForWrite) as BlockTable;
  11.                         if (!bt.Has(blockName))
  12.                         {
  13.                             return false;
  14.                         }
  15.                         BlockTableRecord btr = tr.GetObject(bt[blockName], OpenMode.ForWrite) as BlockTableRecord;
  16.                         btr.Erase();//无法删除,单步调试的时候直接走过,没有异常;用btr.Erase(true)也无效;
  17.                         tr.Commit();
  18.                     }
  19.                     db.SaveAs(fileName, false, DwgVersion.AC1024);
  20.                 }
  21.             }
  22.             catch (Exception ex)
  23.             {
  24.                 throw ex;
  25.             }
  26.             return true;
  27.         }


发表于 2018-11-14 09:44 | 显示全部楼层
这个btr是数据库中的记录,删除图形记录的话,你需要通过btr的ObjectId,或者进一步获取到图面上的Entity,当你获取到entity之后,再进行entity.Erase()命令即可。
 楼主| 发表于 2018-12-8 20:35 | 显示全部楼层
本帖最后由 zjh2785 于 2018-12-8 20:40 编辑
问号兄233 发表于 2018-11-14 09:44
这个btr是数据库中的记录,删除图形记录的话,你需要通过btr的ObjectId,或者进一步获取到图面上的Entity, ...

额。。。没懂,  你的意思是把BlockTableRecord转换成Entity么?  我去试试,  我印象中块表记录不是实体啊 ,  块引用(BlockReference)才是实体啊
而且上面的代码删除当前文档是有效的哦 ,  但是要删除外部文档就有问题了(没有任何块引用)

刚才试了  Entity btr = tr.GetObject(bt[blockName], OpenMode.ForWrite) as Entity ;     返回的是null   
发表于 2018-12-10 10:27 | 显示全部楼层
zjh2785 发表于 2018-12-8 20:35
额。。。没懂,  你的意思是把BlockTableRecord转换成Entity么?  我去试试,  我印象中块表记录不是实体 ...

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

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

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

再次感谢你的解答
发表于 2018-12-11 08:47 | 显示全部楼层
zjh2785 发表于 2018-12-10 23:38
哈哈  搞定了,  虽然不是用您的方法,但还是非常感谢你热心的回答。

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

那你的问题和我遇到的问题还是不一样的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号  
©2000-2017 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2019-1-16 19:13 , Processed in 0.189413 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表