pangyugonggong 发表于 2012-9-11 16:23:54

调用3DSolid.CheckInterference()出错,求教

代码如下,CheckInference函数目的是利用3DSolid.CheckInterference()计算出List<Solid3d>中任意两个相交的部分.
但是一运行到copySolid1.BooleanOperation(BooleanOperationType.BoolIntersect, copySolid2)这句话时就出现" eWasOpenForWrite"的异常.哪位高人能解释一下应该如何处理,谢谢.



      private static void CheckInference(List<Solid3d> solids) {
            Database db = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Database;
            using (Transaction tran = db.TransactionManager.StartTransaction()) {
                BlockTable blockTable = tran.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
                BlockTableRecord blockRecord = tran.GetObject(blockTable, OpenMode.ForWrite) as BlockTableRecord;
                for (int i = 0; i < solids.Count - 1; i++) {
                  Solid3d solid1 = solids;
                  for (int j = i + 1; j < solids.Count; j++) {
                        Solid3d solid2 = solids;
                        if (solid1.Layer != solid2.Layer) {
                            if (solid1.CheckInterference(solid2)) {
                              Solid3d copySolid1 = solid1.Clone() as Solid3d, copySolid2 = solid2.Clone() as Solid3d;
                              copySolid1.BooleanOperation(BooleanOperationType.BoolIntersect, copySolid2);
                              copySolid1.ColorIndex = 1;
                              blockRecord.AppendEntity(solid1);
                              tran.AddNewlyCreatedDBObject(solid1, true);
                              tran.Commit();
                            }
                        }
                  }
                }
            }
      }

sieben 发表于 2012-9-11 16:51:04

Solid3d copySolid1 = solid1.Clone() as Solid3d,copySolid2 = solid2.Clone() as Solid3d;
copySolid1.BooleanOperation(BooleanOperationType.BoolIntersect, copySolid2);

BooleanOperation函数操作的实体是要求在数据库里面的(永久的),copySolid1,copySolid2两个克隆而来,并没有提交到数据库,你提交数据库后再执行BooleanOperation函数看看。
不确定报该异常的就是这个原因

nigma 发表于 2012-9-12 09:11:47

本帖最后由 nigma 于 2012-9-12 09:14 编辑

1。tran.Commit(); 这句要放在22行之后,即for 循环之后。
2。下边这两句的solid1应该为      copySolid1                     
blockRecord.AppendEntity(solid1);
tran.AddNewlyCreatedDBObject(solid1, true);
3. 要考虑doclock


pangyugonggong 发表于 2012-9-12 09:12:26

多谢Sieben同学,问题按你的思路已解决,呵呵

nigma 发表于 2012-9-12 09:17:59

我试了下不需要的吧
你只要把tran.commit 放到for之后就可以了
否则blockrecord已经dispose你就没法加了

pangyugonggong 发表于 2012-9-12 09:57:16

我再试一下,nigma你的方法

pangyugonggong 发表于 2012-9-12 10:19:10

nigma 发表于 2012-9-12 09:17 static/image/common/back.gif
我试了下不需要的吧
你只要把tran.commit 放到for之后就可以了
否则blockrecord已经dispose你就没法加了
...

多谢了,但是刚才我试过了,还是同样报错,我发的上述代码是之前的,后来我都已经都更正了,第一次进入循环就出错了
页: [1]
查看完整版本: 调用3DSolid.CheckInterference()出错,求教