(32)ObjectARX2015 + vs2012扩展数据

        在编程中,某些时候不可避免地要向图形中添加一些用户数据,例如,将一条直线解释为输电线、道路中心线,或者其他类型的对象,也可能要将当前图形的编号随图形一起保存起来。

        要向图形中的实体追加一些数据,可以使用扩展数据或者扩展记录;要向图形本身追加一些数据,则可以使用命名对象字典。

1. 说明

        对于同一种类型的实体,可能将其作为管线、道路中心线和建筑物轮廓线等。为了实现这个目的,就可以在实体上追加扩展数据,要获得某个实体类型的时候,就可以读取其扩展数据得到类型信息。
        本篇演示了向实体追加扩展数据和显示一个实体的扩展数据,并且加入了容错的处理:
                向已经包含扩展数据的实体添加扩展数据,程序会自动退出;
                要求显示不包含任何扩展数据的实体的扩展数据,程序同样会退出。
2. 思路
        扩展数据能被添加到任何实体上,由一个结果缓冲区链表组成,并且随 AutoCAD 图形一起保存(AutoCAD 不会使用扩展数据)。在许多情况下,扩展数据是向实体追加用户数据的一个有效途径,但是每个实体上所附加的扩展数据不能超过16K
        AcDbObject 类的 setXData 函数用于设置一个对象的扩展数据,其定义为:
virtual Acad::ErrorStatus 
AcDbObject::setXData(const resbuf* xdata); 
//AcDbObject 类的 xData 函数用于获取一个对象的扩展数据,其定义为:
virtual resbuf* 
AcDbObject::xData(const char* regappName = NULL) const;
        任何一个应用程序都能将扩展数据附加到实体上,因此所有的扩展数据都需要一个唯一的应用程序名称,该名称不超过31 个字符。为了注册一个应用程序,可以使用全局函数acdbRegApp。
3. 步骤
(1) 添加一个新类,命名为 CXData。添加一个新函数 AddXData(),用于向实体追加指定的扩展数据.
        在构建存储扩展数据的结果缓冲区时,除了应用程序名称对应的数据类型为 AcDb::kDxfRegAppName 之外,其他的数据类型前缀均为 AcDb::kDxfXd ,所有的与扩展数据有关的数据类型均带有这个前缀。 在函数结束之前,记得删除结果缓冲区。
        其实现函数为:
    //向实体追加指定的扩展数据
    static void AddXData(); //向实体追加指定的扩展数据
//向实体追加指定的扩展数据
void CXData::AddXData()
{
    //提示用户选择所要添加扩展数据的图形对象
    ads_name en;
    ads_point pt;

    if(acedEntSel(_T("\n选择所要添加的扩展数据的实体:"), en, pt) != RTNORM)
        return;

    AcDbObjectId entId;
    Acad::ErrorStatus es = acdbGetObjectId(entId, en);

    //扩展数据的内容
    struct resbuf* pRb;
    TCHAR appName[] = {_T("XData")};
    TCHAR typeName[] = {_T("道路中心线")};

    //注册应用程序的内容
    acdbRegApp(_T("XData"));

    //创建结果缓冲区链表
    pRb = acutBuildList(AcDb::kDxfRegAppName, appName, //应用程序名称
                        AcDb::kDxfXdAsciiString, typeName, //字符串                
                        AcDb::kDxfXdInteger32, 2, //整数
                        AcDb::kDxfXdReal, 3.14, //实数
                        AcDb::kDxfXdWorldXCoord, pt, //点坐标值
                        RTNONE);

    //为选择的实体添加扩展函数
    AcDbEntity *pEnt;
    acdbOpenAcDbEntity(pEnt, entId, AcDb::kForWrite);
    struct resbuf *pTemp;
    pTemp = pEnt->xData(_T("XData"));
    //判断: 如果已经包含了扩展数据,就不再添加新的扩展数据
    if (pTemp != NULL)   
    {
        acutRelRb(pTemp);
        acutPrintf(_T("\n所选择的实体已经包含了扩展数据! "));
    }else
    {
        pEnt->setXData(pRb);
    }

    //关闭,释放分配给结果缓冲区或结果缓冲区链表的内存
    pEnt->close();
    acutRelRb(pRb);
}

(2)  查看指定的实体的扩展数据
        使用 AcDbObject 类的 xData 函数能够获得一个结果缓冲区链表,该实体的所有扩展数据都保存在该链表中,因此可以通过遍历结果缓冲区的方法获得扩展数据。
    // 查看实体的扩展数据
    static void ViewXData(); // 查看实体的扩展数据

// 查看实体的扩展数据
void CXData::ViewXData()
{
    // 提示用户选择所要查看扩展数据的图形对象
    ads_name en;
    ads_point pt;

    if(acedEntSel(_T("\n选择所要查看扩展数据的实体: "), en, pt) != RTNORM)
    return;

    AcDbObjectId entId;
    Acad::ErrorStatus es = acdbGetObjectId(entId, en);

    // 打开图形对象,查看是否包含扩展数据
    AcDbEntity *pEnt;
    acdbOpenAcDbEntity(pEnt, entId, AcDb::kForRead);
    struct resbuf *pRb;
    pRb = pEnt->xData(_T("XData"));
    pEnt->close(); 

    if (pRb != NULL)
    {
        // 在命令行显示所有的扩展数据
        struct resbuf *pTemp;
        pTemp = pRb;

        // 首先要跳过应用程序的名称这一项
        pTemp = pTemp->rbnext;
        acutPrintf(_T("\n字符串类型的扩展数据是: %s"), pTemp->resval.rstring);

        pTemp = pTemp->rbnext;
        acutPrintf(_T("\n整数类型的扩展数据是; %d"), pTemp->resval.rint);

        pTemp = pTemp->rbnext;
        acutPrintf(_T("\n实数类型的扩展数据是; %.2f"), pTemp->resval.rreal);

        pTemp = pTemp->rbnext;
        acutPrintf(_T("\n坐标类型的扩展数据是; (%.2f, %.2f, %.2f)"), 
            pTemp->resval.rpoint[X], pTemp->resval.rpoint[Y], pTemp->resval.rpoint[Z]);
        
        acutRelRb(pRb);
    }else
    {
        acutPrintf(_T("\n所选择的实体不包含任何的扩展数据! "));
    }
}

(3) 在acrxEntryPoint.cpp中

ACED_ARXCOMMAND_ENTRY_AUTO(CArxConfigApp, MidasMyGroup, MyAddXData, MyAddXData, ACRX_CMD_MODAL, NULL) //添加扩展数据
ACED_ARXCOMMAND_ENTRY_AUTO(CArxConfigApp, MidasMyGroup, MyViewXData, MyViewXData, ACRX_CMD_MODAL, NULL) //查看扩展数据
    //当前项目中注册命令 AddXData(添加扩展数据)
    static void MidasMyGroupMyAddXData()
    {
        CXData::AddXData();
    }

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

效果展示

1. 画两条线输入命令:

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: ObjectARX(Autodesk Runtime Extension)是Autodesk公司开发的一种用于编写AutoCAD和AutoCAD衍生软件的应用程序编程接口(API)。它允许开发人员通过使用C++编程语言和AutoCAD提供的功能来创建自定义的功能和工具。 ObjectARX提供了广泛的功能,使开发人员可以轻松地访问和操作AutoCAD文件中的对象和数据。开发人员可以创建自定义的命令和功能,通过菜单、工具栏或命令行调用并与AutoCAD进行交互。还可以使用ObjectARX创建自定义的对象和实体,并对它们进行编辑和修改。 通过ObjectARX,开发人员还可以访问AutoCAD的各种功能和服务,包括图形显示、图层管理、块定义、属性和数据提取等。这使得开发人员可以构建功能强大的应用程序,扩展AutoCAD的功能并提高设计和绘图效率。 ObjectARX电子书是一种电子书籍,用于指导开发人员如何使用ObjectARX进行AutoCAD开发。这些电子书通常包含有关ObjectARX的详细信息和示例代码,以帮助开发人员掌握ObjectARX编程技巧和最佳实践。开发人员可以通过阅读这些电子书,了解ObjectARX的概念和用法,并学习如何应用它来创建自定义的AutoCAD应用程序。 总之,ObjectARX是一种用于编写AutoCAD和AutoCAD衍生软件的API,它提供了丰富的功能和服务,可以通过编程方式访问和操作AutoCAD文件中的对象和数据ObjectARX电子书则是提供给开发人员的辅助材料,以帮助他们学习和应用ObjectARX编程。 ### 回答2: ObjectARX是为AutoCAD软件开发插件和自定义应用程序的一种编程接口。它允许开发者使用C++语言来创建诸如工具栏、菜单、命令、实体、绘图对象等功能,从而扩展和增强AutoCAD的功能和性能。ObjectARX是基于面向对象的编程理念构建的,它提供了广泛的类库和函数,以及丰富的开发文档和示例。同时,ObjectARX可以与其他Autodesk产品(如AutoCAD Mechanical、AutoCAD Civil 3D等)进行集成开发,实现跨软件平台的应用程序。 ObjectARX电子书是一种提供关于ObjectARX编程接口的电子书籍。它通常包含了ObjectARX的入门介绍、编程指导、开发技巧、实例代码等内容。ObjectARX电子书可以帮助开发者快速了解和掌握ObjectARX的使用方法和技术,并且可以作为参考资料在实际开发过程中查询和学习。 通过阅读ObjectARX电子书,开发者可以学习如何利用ObjectARX接口进行自定义应用程序的开发,从而实现更加强大和个性化的AutoCAD软件功能。ObjectARX电子书提供了丰富的示例代码,可以帮助开发者快速上手,并且了解和掌握ObjectARX的核心概念和编程技术。 总之,ObjectARX电子书是一种便捷的学习工具,可以帮助开发者深入学习和应用ObjectARX编程接口,以实现更加高效和创新的AutoCAD自定义应用程序。 ### 回答3: ObjectARX是由AutoCAD提供的一个编程接口,用于开发AutoCAD的定制应用程序。它是一种强大的工具,可以允许开发人员通过编写ObjectARX代码来扩展和定制AutoCAD的功能。它提供了与AutoCAD内部对象交互的能力,可以创建和修改图形元素、添加自定义命令、实现自定义绘图功能等。 ObjectARX电子书是为了帮助开发者更好地学习和应用ObjectARX而创建的一种资源。它通常包含有关ObjectARX编程的理论知识、实用技巧和示例代码等内容。 ObjectARX电子书可以帮助开发者了解ObjectARX的核心概念和基本用法,通过详细的讲解和示例代码,开发者可以学习如何使用ObjectARX来创建自定义的AutoCAD应用程序。它可以覆盖ObjectARX的各个方面,包括对象操作、图元绘制、用户界面开发、数据交互等。 通过学习ObjectARX电子书,开发者可以掌握使用ObjectARX进行AutoCAD应用程序开发的技能,从而能够根据实际需求对AutoCAD进行定制和扩展ObjectARX电子书还可以帮助开发者解决实际开发过程中遇到的问题,提高开发效率和质量。 总之,ObjectARX电子书是一种有助于开发者学习和应用ObjectARX编程接口的资源,通过学习它可以帮助开发者掌握AutoCAD应用程序的开发技能,并且能够进行定制和扩展

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值