pangyugonggong 发表于 2012-9-12 10:30:00

绘制实体时发生eAlreadyInDb异常,求教

代码如下,我的思路是通过CreateBox()函数返回Solid3d列表 ,然后用DrawSolids进行一次性绘制,但是DrawSolids运行到
btr.AppendEntity(solid)时发出如题异常,字面意思可以理解为实体已存在于数据库中,但是之前CreateBox函数并没有进行相关操作,难道创建的任何实体不需要进行事务操作就进入数据库了?求解答


      
private static Solid3d CreateBox(PipeInfo info) {
            Solid3d box = new Solid3d();
            box.CreateBox(info.lenght, info.width, info.pipeLine.Length);
            box.Layer = info.layer;
            return box;
      }
       private static void DrawSolids(List solids) {
            Database db = Autodesk..ApplicationServices.Application.DocumentManager.MdiActiveDocument.Database;
            using (Transaction tran =db.TransactionManager.StartTransaction()) {
                BlockTable bt = tran.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
                BlockTableRecord btr = tran.GetObject(bt, OpenMode.ForWrite) as BlockTableRecord;
                foreach (Solid3d solid in solids){
                  btr.AppendEntity(solid);//-----------此句出现eAlreadyInDb异常
                  tran.AddNewlyCreatedDBObject(solid, true);
                }
                tran.Commit();
            }
      }

sieben 发表于 2012-9-12 10:55:00

代码没有看到 List solids 是怎么来的,或许solids里面的对象重复了。

pangyugonggong 发表于 2012-9-12 11:21:00


不会重复的,代码如下,其中PipeInfo 是根据图形中的线提取的信息复制代码

pangyugonggong 发表于 2012-9-12 11:48:00

自己已解决,是参数传递的原因,将DrawSolids(List solids)改变传递方式即可,
DrawSolids ( ref List solids),即用引用传递

sieben 发表于 2012-9-12 11:52:00

if (solid.ObjectId == ObjectId.Null)
{
               btr.AppendEntity(solid);
               tran.AddNewlyCreatedDBObject(solid, true);
}
那这样试试
页: [1]
查看完整版本: 绘制实体时发生eAlreadyInDb异常,求教