懒林笑笑生 发表于 2020-12-21 17:11:31

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;
      }求高手指点,我实现的是,用户选择实体,我这边创建块。

brainstorm 发表于 2020-12-21 19:25:13

bt.UpgradeOpen(); bt. add(blk);db.TransactionManager.AddNewlyCreatedDBObject(btr, true);

brainstorm 发表于 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”错误
                  }

MyNameIsLiLei 发表于 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()这个方法,再次感谢
页: [1]
查看完整版本: c# CAD 块BlockTableRecord不能添加图形数据库中已有的实体到块里面去吗??