天气与日历 切换到窄版

 找回密码
 立即注册
中国膜结构网
十大进口膜材评选 十大国产膜材评选 十大膜结构设计评选 十大膜结构公司评选
查看: 52|回复: 0

ObjectARX2015 + vs2012组字典

[复制链接]

该用户从未签到

主题

0

回帖

2912

积分

管理员

积分
2912
发表于 2024-6-22 09:46:18 | 显示全部楼层 |阅读模式
[code]1. 说明

        本篇的实例演示编组的创建和删除。在 AutoCAD 中,可以使用 Group 命令来创建和删除编组,但是在 ObjectARX 中就没有直接的函数来创建和删除组,必须通过组的底层实现来操作。
2. 思路
        前面已经介绍,编组的信息保存在图形数据库的有名对象字典中,在 ObjectARX 中对编组的操作实际上就是对有名对象字典中组字典的操作,可以通过 AcDbDatabase 对象的getGroupDictionary 函数获得组字典的指针。
        组字典在有名对象字典的根字典中的关键字是“ACAD_GROUP ”,因此还可以通过有名对象字典的 getAt 函数来获得组字典的指针。

//通过有名对象字典的 getAt 函数来获得组字典的指针
AcDbDictionary *pNameDict;
acdbHostApplicationServices()->workingDatabase()->getNamedObjectsDictionary(pNameDict, AcDb::kForRead);
pNameDict->getAt("ACAD_GROUP", (AcDbObject*&)pGroupDict, AcDb::kForWrite);
pNameDict->close();
        一般情况下都不会用上面的代码来获得组字典,提供这段代码只是为了让读者更好
地理解组字典与根字典的关系。
3. 步骤
(1) 提示用户选择几个实体,将其创建成一个编组
    // 提示用户选择几个实体,将其创建成一个编组
    static void AddGroup(); // 提示用户选择几个实体,将其创建成一个编组
    // 根据指定的 ObjectId 数组创建编组
    static void CreateGroup(AcDbObjectIdArray& objIds, TCHAR* pGroupName); // 根据指定的 ObjectId 数组创建编组
//提示用户选择几个实体,将其创建成一个编组
void CXData::AddGroup()
{
    // 提示用户选择多个实体
    ads_name sset;
    acutPrintf(_T("\n选择要成组的实体:"));
    if (acedSSGet(NULL, NULL, NULL, NULL, sset) != RTNORM)
        return;
    long length;
    acedSSLength(sset, &length);
    AcDbObjectIdArray objIds;
    for (long i = 0; i < length; i++)
    {
        // 获得指定元素的ObjectId
        ads_name ent;
        acedSSName(sset, i, ent);
        AcDbObjectId objId;
        acdbGetObjectId(objId, ent);

        // 获得指向当前元素的指针
        AcDbEntity *pEnt;
        acdbOpenObject(pEnt, objId, AcDb::kForRead);
        objIds.append(pEnt->objectId());

        pEnt->close();
    }

    acedSSFree(sset);

    // 创建组
    TCHAR groupName[] = {_T("MyGroup")};
    CreateGroup(objIds, groupName);
}

// 根据指定的 ObjectId 数组创建编组
void CXData::CreateGroup(AcDbObjectIdArray& objIds, TCHAR* pGroupName)
{
    AcDbGroup *pGroup = new AcDbGroup(pGroupName);
    for (int i = 0; i < objIds.length(); i++)
    {
        pGroup->append(objIds[i]);
    }

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

    AcDbObjectId pGroupId;
    pGroupDict->setAt(pGroupName, pGroup, pGroupId);
    pGroupDict->close();
    pGroup->close();
}

(2)     删除图形中的编组“MyGroup”


    //删除图形中的编组“MyGroup”
    static void DelGroup();
// 删除图形中的编组“MyGroup”
void CXData::DelGroup()
{
    // 获得组字典
    AcDbDictionary *pGroupDict;
    acdbHostApplicationServices()->workingDatabase()->getGroupDictionary(pGroupDict, AcDb::kForWrite);
    if (pGroupDict->has(_T("MyGroup")))
    {
        pGroupDict->remove(_T("MyGroup"));
    }
    pGroupDict->close();
}
(3) 在acrxEntryPoint.cpp中

ACED_ARXCOMMAND_ENTRY_AUTO(CArxConfigApp, MidasMyGroup, MyAddGroup, MyAddGroup, ACRX_CMD_MODAL, NULL) //添加组字典
ACED_ARXCOMMAND_ENTRY_AUTO(CArxConfigApp, MidasMyGroup, MyDelGroup, MyDelGroup, ACRX_CMD_MODAL, NULL) //删除组字典
    //当前项目中注册命令 AddGroup(添加组字典)
    static void MidasMyGroupMyAddGroup()
    {
        CXData::AddGroup();
    }

    //当前项目中注册命令 DelGroup(查看扩展数据)
    static void MidasMyGroupMyDelGroup()
    {
        CXData::DelGroup();
    }

原文链接:https://blog.csdn.net/qq_42981953/article/details/121952128[/code]

 

 

 

 

ObjectARX2015 + vs2012组字典
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|中国膜结构网|中国膜结构协会|进口膜材|国产膜材|ETFE|PVDF|PTFE|设计|施工|安装|车棚|看台|污水池|中国膜结构网_中国空间膜结构协会

GMT+8, 2024-11-1 11:42 , Processed in 0.155655 second(s), 26 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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