设为首页收藏本站

中国膜结构网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

膜结构车棚
膜结构车棚膜结构资质国产膜材 膜结构网中国膜结构协会
查看: 165|回复: 4

ObjectARX学习笔记(一)----中如何根据组名将组里的所有实体删除,以及清除组

[复制链接]
  • TA的每日心情
    开心
    2021-6-20 09:04
  • 签到天数: 1540 天

    [LV.Master]伴坛终老

    发表于 2021-1-29 23:23 | 显示全部楼层 |阅读模式
    AcDbDictionary *pGroupDict = NULL;
    Acad::ErrorStatus es;
    acdbHostApplicationServices()->workingDatabase()->getGroupDictionary(pGroupDict,AcDb::kForWrite);
    AcDbObjectId groupId;
    es =pGroupDict->getAt("Test",groupId);
    if (Acad::eOk == es)
    {
    pGroupDict->close();
    }
    AcDbGroup *pGroup = NULL;
    es = acdbOpenObject(pGroup, groupId, AcDb::kForWrite);
    if ( Acad::eOk == es)
    {
    AcDbObjectIdArray arrIds;
    pGroup->allEntityIds(arrIds);  //得到组中所有实体的ID
    if (!arrIds.isEmpty())
    {
    AcDbEntity *pEnty = NULL;
    Acad::ErrorStatus es;
    int j;
    for (j = 0; j < arrIds.length(); j++)
    {
    es = acdbOpenObject(pEnty, arrIds.at(j), AcDb::kForWrite);
    if (Acad::eOk == es)
    {
    pEnty->erase();  //删除组中包含的实体
    pEnty->close();
    }
    }
    }
    pGroup->erase();//删除组
    pGroup->close();
    }
    回复


    http://www.mjgw.org/ 专业从事膜结构设计、制作加工、施工安装的膜结构工程服务,能够为客户提供专业的膜结构整体解决方案。做中国最好的膜结构综合服务平台。欢迎大家联系电话:198-7840-1958,QQ:463017170.
    相关关键词:膜结构车棚,膜结构车棚覆盖,膜结构车棚公司,膜结构车棚多少钱,膜结构车棚厂家,膜结构车棚价格,社区膜结构车棚,膜结构车棚膜布厂家 ,膜结构车棚哪家好,膜结构车棚多少钱一米,膜结构车棚报价,膜结构车棚哪里有,膜结构车棚定制,膜结构车棚安装,膜结构车棚设计,膜结构车棚电话,膜结构车棚加工,膜结构车棚膜布价格,膜结构车棚批发,膜结构车棚制造商,膜结构车棚生产厂家,膜结构车棚设计,膜结构车棚施工,膜结构车棚多少钱一平米,膜结构车棚订制,张拉膜车棚,张拉膜车棚覆盖,张拉膜车棚公司,张拉膜车棚多少钱,张拉膜车棚厂家,张拉膜车棚价格,社区张拉膜车棚,张拉膜车棚膜布厂家 ,张拉膜车棚哪家好,张拉膜车棚多少钱一米,张拉膜车棚报价,张拉膜车棚哪里有,张拉膜车棚定制,张拉膜车棚安装,张拉膜车棚设计,张拉膜车棚电话,张拉膜车棚加工,张拉膜车棚膜布价格,张拉膜车棚批发,张拉膜车棚制造商,张拉膜车棚生产厂家,张拉膜车棚设计,张拉膜车棚施工,张拉膜车棚多少钱一平米,张拉膜车棚订制,常用膜材品牌:德国杜肯、法国法拉利、德国海德斯、德国米乐、日本平岗、韩国秀博、比利时希运、美国赫虏伯、中国科宝、上海慧遥。

    使用道具 举报

  • TA的每日心情
    开心
    2021-6-20 09:04
  • 签到天数: 1540 天

    [LV.Master]伴坛终老

     楼主| 发表于 2021-1-29 23:24 | 显示全部楼层
    static void AAAMyGroupAddGroup() {
                    //提示用户选择多个实体
                    AcDbObjectIdArray entIds;
                    if (CSelectUtil:romptSelectEnts(TEXT("\n选择要成组的实体:"),
                            AcDbEntity::desc(), entIds))
                    {
                            //创建组
                            AcDbGroup *pGroup = new AcDbGroup();
                            for (int i = 0; i < entIds.length(); i++)
                            {
                                    pGroup->append(entIds[i]);
                            }

                            //将组添加到有名对象字典的组字典中
                            AcDbDictionary *pGroupDict = NULL;
                            acdbHostApplicationServices()->workingDatabase()
                                    ->getGroupDictionary(pGroupDict, AcDb::kForWrite);

                            //如果组名为*,则会创建匿名组
                            CString groupName = TEXT("*");
                            AcDbObjectId groupId;
                            pGroupDict->setAt(groupName, pGroup, groupId);
                            pGroupDict->close();
                            pGroup->close();
                    }

            }
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2021-6-20 09:04
  • 签到天数: 1540 天

    [LV.Master]伴坛终老

     楼主| 发表于 2021-1-29 23:24 | 显示全部楼层
    bool CSelectUtil:romptSelectEnts(const TCHAR* prompt, AcRxClass* classDesc, AcDbObjectIdArray &entIds)
    {
            std::vector<AcRxClass*> vecClassDesc;
            vecClassDesc.push_back(classDesc);

            return PromptSelectEnts(prompt, vecClassDesc, entIds);
    }

    bool CSelectUtil:romptSelectEnts(const TCHAR* prompt, const std::vector<AcRxClass*> &classDescs, AcDbObjectIdArray &entIds)
    {
            // 初始化
            entIds.setLogicalLength(0);

            // 提示用户选择实体
            ads_name sset;
            int result = 0;
            acutPrintf(prompt);
            result = acedSSGet(NULL, NULL, NULL, NULL, sset);

            if (result != RTNORM)
            {
                    return false;
            }

            // 取得选择集的长度
            long length = 0;
            acedSSLength(sset, reinterpret_cast<Adesk::Int32*>(&length));

            // 遍历选择集
            Acad::ErrorStatus es;
            AcDbEntity* pEnt = NULL;
            for (long i = 0; i < length; i++)
            {
                    ads_name ename;
                    acedSSName(sset, i, ename);

                    AcDbObjectId curEntId;
                    es = acdbGetObjectId(curEntId, ename);
                    if (es != Acad::eOk)
                    {
                            continue;
                    }

                    // 打开实体
                    es = acdbOpenObject(pEnt, curEntId, AcDb::kForRead);
                    if (es != Acad::eOk)
                    {
                            continue;
                    }

                    // 判断当前实体是否是指定的实体类型
                    for (int j = 0; j < (int)classDescs.size(); j++)
                    {
                            if (pEnt->isKindOf(classDescs[j]))
                            {
                                    entIds.append(pEnt->objectId());
                                    break;
                            }
                    }

                    pEnt->close();        // 关闭实体
            }
            acedSSFree(sset);        // 释放选择集

            return (entIds.length() > 0);
    }
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2021-6-20 09:04
  • 签到天数: 1540 天

    [LV.Master]伴坛终老

     楼主| 发表于 2021-1-29 23:25 | 显示全部楼层
    注册一个命令DeleteGroup,

    提示用户选择图形中位于编组内的实体,然后删除这个编组。

    实现函数为:

            static void AAAMyGroupDeleteGroup() {
                    AcDbObjectIdArray entIds;
                    if (CSelectUtil:romptSelectEnts(TEXT("\n选择要分解的组中的实体:"), AcDbEntity::desc(), entIds))
                    {
                            //遍历组字典,判断是否包含了给定的实体
                            AcDbDictionary *pGroupDict = NULL;
                            acdbHostApplicationServices()->workingDatabase()->getGroupDictionary(pGroupDict, AcDb::kForWrite);
                            AcDbDictionaryIterator *it = pGroupDict->newIterator();
                            for (; !it->done(); it->next())
                            {
                                    AcDbGroup *pGroup = NULL;
                                    if (it->getObject((AcDbObject*&)pGroup, AcDb::kForWrite) == Acad::eOk)
                                    {
                                            AcDbObjectIdArray groupEntIds;
                                            pGroup->allEntityIds(groupEntIds);
                                            bool bFound = false;
                                            for (int i = 0; i < entIds.length(); i++)
                                            {
                                                    if (groupEntIds.contains(entIds[i]))
                                                    {
                                                            bFound = true;
                                                            break;
                                                    }
                                            }
                                            //删除包含选择集中实体的组
                                            if (bFound)
                                            {
                                                    pGroup->erase();
                                            }

                                            pGroup->close();
                                    }
                                   
                            }
                            pGroupDict->close();
                    }

            }
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2021-6-20 09:04
  • 签到天数: 1540 天

    [LV.Master]伴坛终老

     楼主| 发表于 2021-1-29 23:37 | 显示全部楼层
    创建组,把选择的实体放入组内,并改变组的层为新层
    static void TESTgrpcmd()
    {


    CString strGrp;
    if(acedGetString(0,_T("\n输入组名"),strGrp.GetBuffer(10)) != RTNORM)
    {
    return;
    }
    strGrp.ReleaseBuffer();


    ads_name ss;
    if(acedSSGet(NULL,NULL,NULL,NULL,ss) != RTNORM)
    {
    return;
    }
    CString strLayer;
    if(acedGetString(0,_T("\n输入层名称"),strLayer.GetBuffer(10)) != RTNORM)
    {
    acedSSFree(ss);
    return;
    }


    创建组,改变层
    AcDbGroup* pGrp = new AcDbGroup(strGrp);
    long len ;
    acedSSLength(ss,&len);
    AcDbObjectId idObj;
    ads_name enName;
    AcDbEntity* pEnt;
    ErrorStatus es;


    for(int i = 0;i < len;i ++)
    {
    if(acedSSName(ss,i,enName) != RTNORM)
    {
    continue;
    }
    acdbGetObjectId(idObj,enName);
    pGrp->append(idObj);
    }
    pGrp->setLayer(strLayer);




    把组添加到词典中
    AcDbDictionary* pGrpDic;
    acdbHostApplicationServices()->workingDatabase()->getGroupDictionary(pGrpDic,AcDb::kForWrite);
    AcDbObjectId idGrp;
    pGrpDic->setAt(strGrp,pGrp,idGrp);

    释放内存
    pGrp->close();
    pGrpDic->close();
    acedSSFree(ss);
    }
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

    推荐膜材品牌上一条 /6 下一条

    进口膜材 国产膜材 pvdf膜材ptfe膜材ETFE膜材
    最好的膜结构公司 一级膜结构资质 膜结构一级资质
    膜结构设计-膜结构十大品牌-etfe设计-充气膜结构
    诺科膜结构
    遨都膜结构设计
    中国膜结构网
    中国空间膜结构

    QQ|申请友链|手机版|中国膜结构论坛