找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2539|回复: 14

[讨论]:AcDbVoidPtrArray 使用帮助

[复制链接]
发表于 2005-12-22 15:35:09 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
我已将选择集中的实体添加道 AcDbVoidPtrArray  pEntArr 中了 可怎么用它呢

AcDbEntity *pEnt;

  for (int i = 0; i < pEntArr.length(); i++ ){
         pEnt = (AcDbEntity*)pEntArr.at(i);
         //....在这里我怎么用pEnt 呢
     // 不管做什么出错 为什么呀
     objId = pEnt->objectId();          //----------- 出错
   };
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2005-12-22 18:31:24 | 显示全部楼层
length() method get the physical length of array, that's to say, the real memory allocated for the array.
logicallength() method get the real length which is occupied by the stored elements.

You'd better use array that store the AcDbObjectId instead of the pointer to the entity in the database. Use AcDbObjectId is more safe and reliable than pointer.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-12-26 09:44:38 | 显示全部楼层
从ObjectArx帮助可见,length() 和 logicalLength() 是一样的:

inline int

length() const;

This function returns the logical length of the array. Calling this function is equivalent to calling the AcArray::logicalLength() function.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-12-26 10:36:45 | 显示全部楼层
如果pEntArr 里不空的话,确信实体加到块表记录中了吗
AcDbEntity *pEnt;

for (int i = 0; i < pEntArr.length(); i++ ){
pEnt = (AcDbEntity*)pEntArr.at(i); //      我用过pEntArr这种方式,没问题
//....在这里我怎么用pEnt 呢
// 不管做什么出错 为什么呀
objId = pEnt->objectId(); //----------- 出错  //
};
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-12-26 11:07:46 | 显示全部楼层
to TechMan78  我以改用 logicalLength()  没问题 不知为何 帮助没有细看
to hljcxh 我是从选择集种获得的实体 应该在块表记录中了

我以不用 AcDbVoidPtrArray 了 改用将实体id保存导数组中的方式了
不过 我依然很想知道 AcDbVoidPtrArray  的方式到底如何来做
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-1-16 11:21:28 | 显示全部楼层
这里pEnt 与 AcDbVoidPointArray 使用过程中
pEnt是否添加到块表记录,与使用错误是没有关系的
楼主是否可以提供你添加到数组的代码?
我估计有可能是你添加的实体类,已经被析构掉了,所以使用出错
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-1-17 10:20:19 | 显示全部楼层
我看了代码 好像是close了 有问题吗? 还望多多指点

void CMydlg::OnBnClickedButton1()
{
        // TODO: 在此添加控件通知处理程序代码
        UpdateData();
                    BeginEditorCommand();
  
                     ads_name ssname;// 用户选择集
        long sscount ; //

        if (acedSSGet(NULL,NULL,NULL,NULL,ssname) != RTNORM)  {
                 acutPrintf("\n没有选择对象! ");
                              CompleteEditorCommand();
                 acedCommand(RTSTR,"redraw",0) ;//acedCommand();
            return ;
        };

        int rt;
                      rt = acedSSLength(ssname,&sscount);
   
        ads_name enta;
        AcDbObjectId objId;
        long i;
       
                   for(i=0;i< sscount; i++)
                    {
          
                          rt = acedSSName(ssname,i,enta);
          
           if (rt != RTNORM) { acutPrintf("\n选择集有误!取消操作!"); break; }

           if (acdbGetObjectId(objId,enta) != Acad::eOk ){acutPrintf("\n选择集有误!取消操作!"); break;  };

          
                if(acdbOpenObject(pEnt,objId,AcDb::kForWrite)!= Acad::eOk){ acutPrintf("\n 实体操作错误"); break;}
            acutPrintf("\\\\n objId = %s,classname = %s",objId,pEnt->desc()->name());
       pEntArr.append(pEnt);
   
       pEnt->close();
           };




  
        acedSSFree(ssname);
        CompleteEditorCommand();
};



void CMydlg::OnBnClickedButton2()
{
          AcDbObjectId objId;
        AcDbEntity *pEnt;
        bool entclass = 0;

        for (int i = 0; i < pEntArr.logicalLength() ; i++ ){
                                   pEnt = (AcDbEntity*)pEntArr.at(i);
               
                // pEnt->highlight();
                 //pEnt->setColorIndex(1);
                 objId = pEnt->objectId();
                                          acutPrintf("\\\\n objId=%d",objId);
    };
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-1-17 19:06:52 | 显示全部楼层
oh no!
请保存id,不要指针
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-1-18 09:54:01 | 显示全部楼层
指针跟ID都可以用
如果是数据库中的实体,打开之后再关闭,就不要在使用指针了,否则容易出错
如果还没有添加进数据库,则使用指针

你这里的情况的确是CLOSE引起的,关闭了的实体,怎么还能进行set...等命令呢?
另外,你这里的程序写法也有问题
既然是数据库中的实体,还是使用实体id来得安全
实体id也可以有数组  AcDbObjectIdArray
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-1-19 16:35:36 | 显示全部楼层
谢谢
我这是以前的 现在已改用实体id

看来数据库中的实体打开就不能关了 太不安全了
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-1-20 09:20:19 | 显示全部楼层
不是打开不能关,而是你要对实体操作的时候,不能关
用id虽然用起来相对安全一些,但是效率不理想,改进的办法当然有事务处理
很多情况下指针非常有用的,比如在复杂自定义实体的设计过程中就需要用到
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-1-20 09:49:36 | 显示全部楼层
就是close引起的错误,
其实如果使用得当,指针是很方便的,AcDbVoidPtrArray存放的是指针数组,你把实体在加入array之后就close了,意味着将实体指针所指向的内容还给了数据库,导致array中的指针地址变成了无效地址,自然无法在进行操作
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-1-20 15:43:26 | 显示全部楼层
13樓的答案非常正確﹐AcDbVoidPtrArray存放的是實體指針﹐而實體在close之后﹐根本就無法保証再次引用該內存的正確性﹐建議直接在acdbGetObjectId(,enta) 成功之后就保存objId﹐要用的時候再打開。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-9-2 22:22:21 | 显示全部楼层
如何在打开AcDbObjectIdArray中保存 Id来访问的实体对象?
acdbOpenObject()只能打开单个实体阿/
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-9-10 11:46:40 | 显示全部楼层
是不是没有new呀
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-9-23 18:18 , Processed in 0.417820 second(s), 60 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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