明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3029|回复: 2

遍历AcDbVoidPtrArray的问题?请教,多谢!

[复制链接]
发表于 2005-3-29 10:59:00 | 显示全部楼层 |阅读模式
请教高手:我在炸开一个实体后,产生一个AcDbVoidPtrArray类的数组,在遍历的时候怎么总是有问题:测试过程中炸开实体产生的object的ID和名称都是一样的,程序如下:请指点迷津: void MYEX()//执行的命令函数
{
struct resbuf *pcb;
pcb=acutNewRb(RTDXF0);//创建一个结果缓冲区,组码为0,表示实体类型
ads_name ss;
char sbuf[100];
strcpy(sbuf,"3DSOLID"); pcb->resval.rstring=sbuf;
pcb->rbnext=NULL; acedSSGet("X",NULL,NULL,NULL,ss);//生成选择集
long lenSet;
acedSSLength(ss,&lenSet);
for(int i=0;i<lenSet;i++)
{
ads_name solidName;
acedSSName(ss,i,solidName);
AcDbObjectId objId;
acdbGetObjectId(objId,solidName); acutPrintf("\\n objId=%s",objId);
AcDbEntity *pEnt;
acdbOpenObject(pEnt,objId,AcDb::kForRead);
AcDbVoidPtrArray pArr;//声明一个数组,用于存放返回实体 if(pEnt->isKindOf(AcDb3dSolid::desc()))
{
pEnt->explode(pArr);//这样指针pArr指向的内存地址的内容就是explode后的各实体。
acutPrintf("\\n objID=%s",objId); int lenArr=pArr.length();
for(int j=0;j<lenArr;j++)
{
ads_name objName;
acedSSName(ss,j,objName);
AcDbObjectId objSubId;
acdbGetObjectId(objSubId,objName);
AcDbEntity *pEntPlode;
acdbOpenObject(pEntPlode,objSubId,AcDb::kForRead); CString str;
str.Format("objName=%s",objName);
AfxMessageBox(str);
acutPrintf("\\n objSubId=%s",objSubId);}
pEnt->close();
}
}
acutRelRb(pcb);
acedSSFree(ss);//释放选择集
}
发表于 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的了.. ......................
 楼主| 发表于 2005-4-5 11:23:00 | 显示全部楼层
谢谢pandoram,
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-26 07:24 , Processed in 0.158470 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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