明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1417|回复: 6

c# CAD 块BlockTableRecord不能添加图形数据库中已有的实体到块里面去吗??

[复制链接]
发表于 2020-12-21 17:11:31 | 显示全部楼层 |阅读模式
同标题,我在使用c#对CAD进行二次开发的时候发现,使用BlockTableRecord.append往块里面添加实体,报错显示实体已在图形数据库中,
  1. public static ObjectId AddBlockTableRecord(this Database db,string blockName,List<Entity> ents)
  2.         {
  3.             ObjectId btID;
  4.             DocumentLock m_DocumentLock = Application.DocumentManager.MdiActiveDocument.LockDocument();
  5.             using (Transaction trans=db.TransactionManager.StartTransaction())
  6.             {
  7.                 BlockTable bt = (BlockTable)trans.GetObject(db.BlockTableId,OpenMode.ForRead);

  8.                 if (!bt.Has(blockName))
  9.                 {
  10.                     //创建一个blocktablerecord类的对象,表示需要创建的块
  11.                     BlockTableRecord btr = new BlockTableRecord();
  12.                     btr.Name = blockName;   //设置块名
  13.                     //将列表中的实体添加到块里面去
  14.                     foreach (var ent in ents)
  15.                     {
  16.                         btr.AppendEntity(ent);
  17.                     }
  18.                     bt.UpgradeOpen();   //提升块表为写入
  19.                     db.TransactionManager.AddNewlyCreatedDBObject(btr, true);
  20.                     bt.DowngradeOpen();
  21.                     btID = bt[blockName];
  22.                 }
  23.                 else
  24.                 {
  25.                     BlockTableRecord btr;
  26.                     btr = (BlockTableRecord)trans.GetObject(bt[blockName], OpenMode.ForWrite);
  27.                     btr.Erase();    //删除快
  28.                     btr = new BlockTableRecord();
  29.                     btr.Name = blockName;   //设置块名
  30.                     //将列表中的实体添加到块里面去
  31.                     foreach (var ent in ents)
  32.                     {
  33.                         btr.AppendEntity(ent);
  34.                     }
  35.                     bt.UpgradeOpen();   //提升块表为写入
  36.                     db.TransactionManager.AddNewlyCreatedDBObject(btr, true);
  37.                     bt.DowngradeOpen();
  38.                     btID = bt[blockName];
  39.                 }
  40.                 trans.Commit();
  41.             }
  42.             m_DocumentLock.Dispose();
  43.             return btID;
  44.         }
求高手指点,我实现的是,用户选择实体,我这边创建块。
发表于 2020-12-21 19:25:13 来自手机 | 显示全部楼层
bt.UpgradeOpen(); bt. add(blk);  db.TransactionManager.AddNewlyCreatedDBObject(btr, true);
发表于 2020-12-21 19:26:24 来自手机 | 显示全部楼层
btr.Erase();    //删除快之前应判断块是否能够删除
 楼主| 发表于 2020-12-22 09:39:58 | 显示全部楼层
brainstorm 发表于 2020-12-21 19:26
btr.Erase();    //删除快之前应判断块是否能够删除

C:\Users\Administrator\Desktop\sss.png
bt. add(blk);//这句的确是写漏了
但是我都还没有运行到这步来
在上一步就出错了,您帮我帮看看这个,看看哪里有问题
 楼主| 发表于 2020-12-22 09:43:40 | 显示全部楼层
brainstorm 发表于 2020-12-21 19:26
btr.Erase();    //删除快之前应判断块是否能够删除

foreach (var ent in ents)
                    {
                        btr.AppendEntity(ent);//在这里出现Autodesk.AutoCAD.Runtime.Exception:“eAlreadyInDb”错误
                    }
发表于 2020-12-22 10:56:03 | 显示全部楼层
懒林笑笑生 发表于 2020-12-22 09:43
foreach (var ent in ents)
                    {
                        btr.AppendEntity(ent);// ...

btr.AppendEntity(ent .clone() as Entity);
 楼主| 发表于 2020-12-22 11:39:44 | 显示全部楼层
MyNameIsLiLei 发表于 2020-12-22 10:56
btr.AppendEntity(ent .clone() as Entity);

膜拜大佬,我想过用复制实体,不写入数据库来实现,用GetTransformedCopy实现,但是这个复制的点不好确定。还是我基础不够扎实,不知道clone()这个方法,再次感谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 04:40 , Processed in 0.168389 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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