- 积分
- 1320
- 明经币
- 个
- 注册时间
- 2005-3-7
- 在线时间
- 小时
- 威望
-
- 金钱
- 个
- 贡献
-
- 激情
-
|
发表于 2005-4-1 17:00:00
|
显示全部楼层
这个问题是因为..
你的遍历根本不是在对AcDbVoidPtrArray操作..
原因如下:
if(pEnt->isKindOf(AcDb3dSolid::desc())) { pEnt->explode(pArr);
AcDbEntity的explode函数只制造array, 并不负责把里头的东西加到CAD数据库里面去. 这个跟CAD自己的explode命令系不一样地, CAD自己的explode会自动把explode出来的array里面的所有东西都加入数据库..(不要问偶为什么ARX这么笨, 它不是偶写的..)
偶的意思就是说ARX里面这个函数完了之后产生的array中的实体还都是孤儿, object ID是要等实体被加入CAD数据库时才分配的, 所以没有加数据库的意思就是array里头的实体在你手动把它们加入数据库之前都没有objectID..
但是你的程序并没有报找不到object ID, 那系因为:
for(int j=0;j<lenArr;j++) { ads_name objName; acedSSName(ss,j,objName);
这个选择集ss是原来选中所有3D实体形成的, 到这里为止都没有变过, 所以你取出来的objName是原来3dSolid的名字, 不是炸开后形成的实体的名字, 下面的所有遍历操作都是对数据库里已经存在的那些3dSolid的记录进行的, 而不是对pArr的数组对象进行, 所以取出来的object ID和名字当然都是一样的, 因为是同一个3dSolid object的ID和名字..
你可以只留第一个选择集的遍历部分, 在CAD里画一个3D盒子, 用MYEX命令显示ID一次, 然后在CAD里用CAD自己的炸开命令炸开这个盒子, 再用MYEX命令显示ID一次, 就能看到炸开后的实体的ID了:)
......
搞啊, 快要变成专业debug的了..
...................... |
|