明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2213|回复: 6

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

[复制链接]
发表于 2012-9-11 16:23:54 | 显示全部楼层 |阅读模式
代码如下,CheckInference函数目的是利用3DSolid.CheckInterference()计算出List<Solid3d>中任意两个相交的部分.
但是一运行到copySolid1.BooleanOperation(BooleanOperationType.BoolIntersect, copySolid2)这句话时就出现" eWasOpenForWrite"的异常.哪位高人能解释一下应该如何处理,谢谢.



  1.         private static void CheckInference(List<Solid3d> solids) {
  2.             Database db = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Database;
  3.             using (Transaction tran = db.TransactionManager.StartTransaction()) {
  4.                 BlockTable blockTable = tran.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
  5.                 BlockTableRecord blockRecord = tran.GetObject(blockTable[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;
  6.                 for (int i = 0; i < solids.Count - 1; i++) {
  7.                     Solid3d solid1 = solids;
  8.                     for (int j = i + 1; j < solids.Count; j++) {
  9.                         Solid3d solid2 = solids[j];
  10.                         if (solid1.Layer != solid2.Layer) {
  11.                             if (solid1.CheckInterference(solid2)) {
  12.                                 Solid3d copySolid1 = solid1.Clone() as Solid3d, copySolid2 = solid2.Clone() as Solid3d;
  13.                                 copySolid1.BooleanOperation(BooleanOperationType.BoolIntersect, copySolid2);
  14.                                 copySolid1.ColorIndex = 1;
  15.                                 blockRecord.AppendEntity(solid1);
  16.                                 tran.AddNewlyCreatedDBObject(solid1, true);
  17.                                 tran.Commit();
  18.                             }
  19.                         }
  20.                     }
  21.                 }
  22.             }
  23.         }

发表于 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函数看看。
不确定报该异常的就是这个原因

评分

参与人数 1金钱 +10 收起 理由
pangyugonggong + 10

查看全部评分

发表于 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


 楼主| 发表于 2012-9-12 09:12:26 | 显示全部楼层
多谢Sieben同学,问题按你的思路已解决,呵呵
发表于 2012-9-12 09:17:59 | 显示全部楼层
我试了下不需要的吧
你只要把tran.commit 放到for之后就可以了
否则blockrecord已经dispose你就没法加了
 楼主| 发表于 2012-9-12 09:57:16 | 显示全部楼层
我再试一下,nigma你的方法
 楼主| 发表于 2012-9-12 10:19:10 | 显示全部楼层
nigma 发表于 2012-9-12 09:17
我试了下不需要的吧
你只要把tran.commit 放到for之后就可以了
否则blockrecord已经dispose你就没法加了
...

多谢了,但是刚才我试过了,还是同样报错,我发的上述代码是之前的,后来我都已经都更正了,第一次进入循环就出错了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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