明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3585|回复: 4

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

[复制链接]
发表于 2012-9-12 10:30:55 | 显示全部楼层 |阅读模式
代码如下,我的思路是通过CreateBox()函数返回Solid3d列表 ,然后用DrawSolids进行一次性绘制,但是DrawSolids运行到
btr.AppendEntity(solid)时发出如题异常,字面意思可以理解为实体已存在于数据库中,但是之前CreateBox函数并没有进行相关操作,难道创建的任何实体不需要进行事务操作就进入数据库了?求解答

  1.         
  2. private static Solid3d CreateBox(PipeInfo info) {
  3.             Solid3d box = new Solid3d();
  4.             box.CreateBox(info.lenght, info.width, info.pipeLine.Length);
  5.             box.Layer = info.layer;
  6.             return box;
  7.         }



  1.        private static void DrawSolids(List<Solid3d> solids) {
  2.             Database db = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Database;
  3.             using (Transaction tran =db.TransactionManager.StartTransaction()) {
  4.                 BlockTable bt = tran.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
  5.                 BlockTableRecord btr = tran.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;
  6.                 foreach (Solid3d solid in solids){
  7.                     btr.AppendEntity(solid);//-----------此句出现eAlreadyInDb异常
  8.                     tran.AddNewlyCreatedDBObject(solid, true);
  9.                 }
  10.                 tran.Commit();
  11.             }
  12.         }



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2012-9-12 10:55:39 | 显示全部楼层
代码没有看到 List<Solid3d> solids 是怎么来的,或许solids里面的对象重复了。
 楼主| 发表于 2012-9-12 11:21:40 | 显示全部楼层
sieben 发表于 2012-9-12 10:55
代码没有看到 List solids 是怎么来的,或许solids里面的对象重复了。

不会重复的,代码如下,其中PipeInfo 是根据图形中的线提取的信息
  1.                 foreach (PipeInfo pipeInfo in pipeInfos) {
  2.                     if (pipeInfo.isBox)
  3.                     solids.Add(CreateBox(info));
  4.                     else
  5.                         solids.Add(CreateCylinder(info));
  6.                 }
复制代码
 楼主| 发表于 2012-9-12 11:48:08 | 显示全部楼层
自己已解决,是参数传递的原因,将DrawSolids(List<Solid3d> solids)改变传递方式即可,
DrawSolids ( ref List<Solid3d> solids),即用引用传递
发表于 2012-9-12 11:52:34 | 显示全部楼层
if (solid.ObjectId == ObjectId.Null)
{
                 btr.AppendEntity(solid);
                 tran.AddNewlyCreatedDBObject(solid, true);
}
那这样试试
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 17:40 , Processed in 0.164598 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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