我这段代码应该没有问题吧? 为什么删除失败呢
本帖最后由 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;
}
这个btr是数据库中的记录,删除图形记录的话,你需要通过btr的ObjectId,或者进一步获取到图面上的Entity,当你获取到entity之后,再进行entity.Erase()命令即可。 本帖最后由 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
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即可;
}
这种就没有问题了。 问号兄233 发表于 2018-12-10 10:27
不是把BlockTableRecord转换成Entity,而是你用btr.Erase这种方法是错误的。我只知道获取外部dwg文件的bt ...
哈哈搞定了,虽然不是用您的方法,但还是非常感谢你热心的回答。
我找到问题所在了,由于我的文件路径是采用目录+“\\”+文件名 的方式打开的,然后在我SaveAs的时候 却只提供了文件名, 所以自然保存的位置不是原来的位置,具体保存到哪去了就要看CAD当前的工作目录了,
再次感谢你的解答 zjh2785 发表于 2018-12-10 23:38
哈哈搞定了,虽然不是用您的方法,但还是非常感谢你热心的回答。
我找到问题所在了,由于我的 ...
那你的问题和我遇到的问题还是不一样的。
页:
[1]