c# CAD 块BlockTableRecord不能添加图形数据库中已有的实体到块里面去吗??
同标题,我在使用c#对CAD进行二次开发的时候发现,使用BlockTableRecord.append往块里面添加实体,报错显示实体已在图形数据库中,public static ObjectId AddBlockTableRecord(this Database db,string blockName,List<Entity> ents)
{
ObjectId btID;
DocumentLock m_DocumentLock = Application.DocumentManager.MdiActiveDocument.LockDocument();
using (Transaction trans=db.TransactionManager.StartTransaction())
{
BlockTable bt = (BlockTable)trans.GetObject(db.BlockTableId,OpenMode.ForRead);
if (!bt.Has(blockName))
{
//创建一个blocktablerecord类的对象,表示需要创建的块
BlockTableRecord btr = new BlockTableRecord();
btr.Name = blockName; //设置块名
//将列表中的实体添加到块里面去
foreach (var ent in ents)
{
btr.AppendEntity(ent);
}
bt.UpgradeOpen(); //提升块表为写入
db.TransactionManager.AddNewlyCreatedDBObject(btr, true);
bt.DowngradeOpen();
btID = bt;
}
else
{
BlockTableRecord btr;
btr = (BlockTableRecord)trans.GetObject(bt, OpenMode.ForWrite);
btr.Erase(); //删除快
btr = new BlockTableRecord();
btr.Name = blockName; //设置块名
//将列表中的实体添加到块里面去
foreach (var ent in ents)
{
btr.AppendEntity(ent);
}
bt.UpgradeOpen(); //提升块表为写入
db.TransactionManager.AddNewlyCreatedDBObject(btr, true);
bt.DowngradeOpen();
btID = bt;
}
trans.Commit();
}
m_DocumentLock.Dispose();
return btID;
}求高手指点,我实现的是,用户选择实体,我这边创建块。
bt.UpgradeOpen(); bt. add(blk);db.TransactionManager.AddNewlyCreatedDBObject(btr, true); btr.Erase(); //删除快之前应判断块是否能够删除 brainstorm 发表于 2020-12-21 19:26
btr.Erase(); //删除快之前应判断块是否能够删除
C:\Users\Administrator\Desktop\sss.png
bt. add(blk);//这句的确是写漏了
但是我都还没有运行到这步来
在上一步就出错了,您帮我帮看看这个,看看哪里有问题 brainstorm 发表于 2020-12-21 19:26
btr.Erase(); //删除快之前应判断块是否能够删除
foreach (var ent in ents)
{
btr.AppendEntity(ent);//在这里出现Autodesk.AutoCAD.Runtime.Exception:“eAlreadyInDb”错误
} 懒林笑笑生 发表于 2020-12-22 09:43
foreach (var ent in ents)
{
btr.AppendEntity(ent);// ...
btr.AppendEntity(ent .clone() as Entity); MyNameIsLiLei 发表于 2020-12-22 10:56
btr.AppendEntity(ent .clone() as Entity);
膜拜大佬,我想过用复制实体,不写入数据库来实现,用GetTransformedCopy实现,但是这个复制的点不好确定。还是我基础不够扎实,不知道clone()这个方法,再次感谢
页:
[1]