绘制实体时发生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<Solid3d> solids) {
Database db = Autodesk.AutoCAD.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();
}
}
代码没有看到 List<Solid3d> solids 是怎么来的,或许solids里面的对象重复了。 sieben 发表于 2012-9-12 10:55 static/image/common/back.gif
代码没有看到 List solids 是怎么来的,或许solids里面的对象重复了。
不会重复的,代码如下,其中PipeInfo 是根据图形中的线提取的信息 foreach (PipeInfo pipeInfo in pipeInfos) {
if (pipeInfo.isBox)
solids.Add(CreateBox(info));
else
solids.Add(CreateCylinder(info));
} 自己已解决,是参数传递的原因,将DrawSolids(List<Solid3d> solids)改变传递方式即可,
DrawSolids ( ref List<Solid3d> solids),即用引用传递 if (solid.ObjectId == ObjectId.Null)
{
btr.AppendEntity(solid);
tran.AddNewlyCreatedDBObject(solid, true);
}
那这样试试
页:
[1]