调用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();
}
}
}
}
}
}
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:14 编辑
1。tran.Commit(); 这句要放在22行之后,即for 循环之后。
2。下边这两句的solid1应该为 copySolid1
blockRecord.AppendEntity(solid1);
tran.AddNewlyCreatedDBObject(solid1, true);
3. 要考虑doclock
多谢Sieben同学,问题按你的思路已解决,呵呵 我试了下不需要的吧
你只要把tran.commit 放到for之后就可以了
否则blockrecord已经dispose你就没法加了
我再试一下,nigma你的方法 nigma 发表于 2012-9-12 09:17 static/image/common/back.gif
我试了下不需要的吧
你只要把tran.commit 放到for之后就可以了
否则blockrecord已经dispose你就没法加了
...
多谢了,但是刚才我试过了,还是同样报错,我发的上述代码是之前的,后来我都已经都更正了,第一次进入循环就出错了
页:
[1]