找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 774|回复: 3

[ARX函数]:偶写的将实体Id加入组的小程序,请大家批判:)

[复制链接]
发表于 2005-4-28 14:23:36 | 显示全部楼层 |阅读模式

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

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

×
void //通过输入组名称,将ObjectId加入组。若没有指定的组则创建指定的组并将ObjectId加入
AddToGroup(const char *pGroupName,AcDbObjectId ObjectId)
{
        AcDbGroup       *pGroup = new AcDbGroup;
        AcDbObjectId     GroupObjectId,entId;
        AcDbDictionary  *pGroupDict = NULL;

        acdbHostApplicationServices()->workingDatabase()->getGroupDictionary(pGroupDict, AcDb::kForWrite);
       
        Acad::ErrorStatus    esCode;
        esCode = pGroupDict->getAt( pGroupName, (AcDbObject *&)pGroup, AcDb::kForWrite);
       
        if(esCode=Acad::eOk)
        {
                //Add  entity to existing  group
                pGroup->append(entId);
        }
        else
        {
       
                pGroupDict->setAt(pGroupName, pGroup, GroupObjectId);
                pGroupDict->close();
                pGroup->append(entId);   
                pGroup->close();
        }

}
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2005-4-29 02:48:49 | 显示全部楼层
不能用new的pGroup指针作为参数去打开Group,这样会造成内存泄漏。
贴出一段代码供搂主参考:

  1.   [FONT=courier new]
  2. AcDbObjectId FuCreateGroup(const char *szGroupName, AcDbObjectIdArray& ids)
  3. {
  4.         if (ids.length() == 0) return AcDbObjectId::kNull;
  5.         AcDbObjectId  groupObjectId;
  6.         AcDbDictionary  *pGroupDict = NULL;
  7.         AcDbGroup *pOtherGroup = NULL;
  8.        
  9.         acdbHostApplicationServices()->workingDatabase()
  10.                 ->getGroupDictionary(pGroupDict, AcDb::kForWrite);
  11.         if (pGroupDict->getAt(szGroupName, (AcDbObject *&)pOtherGroup, AcDb::kForWrite) == Acad::eOk) {
  12.                 CString sTip;
  13.                 sTip.Format("组“%s”已经存在,是否替换?", szGroupName);
  14.                 if (AfxMessageBox(sTip, MB_OKCANCEL) != IDOK) {
  15.                         pOtherGroup->close();
  16.                         pGroupDict->close();
  17.                         return groupObjectId;
  18.                 }
  19.                
  20.                 pOtherGroup->clear();
  21.                 for (int i=0; i<ids.length(); i++) {
  22.                         pOtherGroup->append(ids[i]);   
  23.                 }
  24.                 groupObjectId = pOtherGroup->objectId();
  25.                 pOtherGroup->close();
  26.         }
  27.         else {
  28.                 AcDbGroup *pGroup = new AcDbGroup;
  29.                 pGroupDict->setAt(szGroupName, pGroup, groupObjectId);
  30.                 for (int i=0; i<ids.length(); i++) {
  31.                         pGroup->append(ids[i]);   
  32.                 }               
  33.                 pGroup->close();               
  34.         }
  35.        
  36.         pGroupDict->close();
  37.        
  38.         return groupObjectId;
  39. }
  40.   [/FONT]
复制代码
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-4-29 10:47:17 | 显示全部楼层
多谢 高手指教,在下感激不尽 :)
I do appreciate what you did (^,-)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-6-7 15:44:09 | 显示全部楼层
下面代码中,当把pGroup->append(newbpCID);换成sta = pGroup->insertAt(1, newbpCID);后。然后在执行CAD的“放弃(U)”命令后,就会出现eHadMultipleReaders 错误提示,这是什么原因啊,哦想了好久也不知道原因。
还请大侠指点!!


void addIDToGroup(AcDbObjectId newID, UINT IDpos, CString GroupName)
{

        AcDbDictionary  *pGroupDict = NULL;
    AcDbObjectId groupId;
        acdbCurDwg()->getGroupDictionary(pGroupDict, AcDb::kForWrite);
    pGroupDict->getAt(GroupName.GetBuffer(200), groupId);//group名字
    pGroupDict->close();
    AcDbGroup *pGroup;
//        Acad :: ErrorStatus sta;
        sta = acdbOpenObject(pGroup, groupId, AcDb::kForWrite);
        if (sta != Acad::eOk)
        {
                pGroup->close();
                return;
        }
//        sta = pGroup->insertAt(1, newbpCID);
        sta = pGroup->append(newbpCID);
        //        pGroup->setSelectable(false);
       
        pGroup->close();
}
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-22 21:08 , Processed in 0.390266 second(s), 37 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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