基本思路:

(1)创建一个新项目,命名为Xdata.注册一个命令AddXData.

实现代码为:

static void AAAMyGroupAddXData() {// 提示用户选择所要添加扩展数据的图形对象AcDbEntity *pEnt = NULL;AcGePoint3d pickPoint;if (CSelectUtil::PromptSelectEntity(TEXT("\n选择所要添加的扩展数据的实体:"),AcDbEntity::desc(),pEnt,pickPoint)){CString appName = TEXT("XDataApp");//注册应用程序名称acdbRegApp(appName);//创建结果缓冲区链表struct resbuf* rb = acutBuildList(AcDb::kDxfRegAppName, appName,//应用程序名称AcDb::kDxfXdAsciiString, TEXT("字符串测试数据"),//字符创AcDb::kDxfXdInteger32, 2,//整数AcDb::kDxfXdReal, 3.14,//实数AcDb::kDxfXdWorldXCoord, asDblArray(pickPoint),//点坐标值RTNONE);//为选择的实体添加扩展数据pEnt->setXData(rb);acutRelRb(rb);acutPrintf(TEXT("\n成功为实体添加了扩展数据."));pEnt->close();}}// Modal Command with pickfirst selection// ACED_ARXCOMMAND_ENTRY_AUTO(CXdataApp, AAAMyGroup, MyPickFirst, MyPickFirstLocal, ACRX_CMD_MODAL | ACRX_CMD_USEPICKSET)static void AAAMyGroupMyPickFirst () {ads_name result ;int iRet =acedSSGet (ACRX_T("_I"), NULL, NULL, NULL, result) ;if ( iRet == RTNORM ){// There are selected entities// Put your command using pickfirst set code here}else{// There are no selected entities// Put your command code here}}

创建一个类CSelectUtil,实现函数PromptSelectEntity:

函数声明:

 // 提示用户选择某个类型的实体// 注意:调用者必须关闭实体  static bool PromptSelectEntity(const TCHAR* prompt, AcRxClass* classDesc, AcDbEntity *&pEnt, AcGePoint3d &pickPoint,bool bOpenForWrite = true);static bool PromptSelectEntity(const TCHAR* prompt, const std::vector<AcRxClass*> &classDescs, AcDbEntity *&pEnt,AcGePoint3d &pickPoint, bool bOpenForWrite = true);

函数实现:

bool CSelectUtil::PromptSelectEntity(const TCHAR* prompt, AcRxClass* classDesc, AcDbEntity *&pEnt,AcGePoint3d &pickPoint, bool bOpenForWrite /*= true*/)
{std::vector<AcRxClass*> descs;descs.push_back(classDesc);return PromptSelectEntity(prompt, descs, pEnt, pickPoint, bOpenForWrite);
}bool CSelectUtil::PromptSelectEntity(const TCHAR* prompt, const std::vector<AcRxClass*> &classDescs, AcDbEntity *&pEnt,AcGePoint3d &pickPoint, bool bOpenForWrite/*= true*/ )
{ads_name ename;
RETRY:if (acedEntSel(prompt, ename, asDblArray(pickPoint)) != RTNORM){pEnt = NULL;return false;}AcDbObjectId entId;acdbGetObjectId(entId, ename);// 判断选择的实体是否是指定类型的实体Acad::ErrorStatus es;if (bOpenForWrite){es = acdbOpenObject(pEnt, entId, AcDb::kForWrite);}else{es = acdbOpenObject(pEnt, entId, AcDb::kForRead);}assert(es == Acad::eOk);bool bRet = false;for (int i = 0; i < (int)classDescs.size(); i++){if (pEnt->isKindOf(classDescs[i])){bRet = true;break;}}if (bRet){return true;}else{pEnt->close();acutPrintf(TEXT("\n选择的实体类型不合要求, 请再次选择..."));goto RETRY;}
}

(2)注册一个ViewXData命令,用于查看指定的实体的扩展数据。

实现函数为:

static void AAAMyGroupViewXData() {//提示用户选择所要查看扩展数据的图形对象AcDbEntity *pEnt = NULL;AcGePoint3d pickPoint;if (CSelectUtil::PromptSelectEntity(TEXT("\n选择所要添加扩展数据的实体:"), AcDbEntity::desc(), pEnt, pickPoint)){CString appName = TEXT("XDataApp");//获取实体的扩展数据struct resbuf *pRb = pEnt->xData(appName);if (pRb != NULL){//在命令行显示所有的扩展数据struct resbuf *pTemp = pRb; //使用临时的结果缓冲区指针进行//遍历,pRb不修改便于释放//首先要跳过数据名称这一项pTemp = pTemp->rbnext;acutPrintf(TEXT("\n字符串类型的扩展数据是:%s"), pTemp->resval.rstring);pTemp = pTemp->rbnext;acutPrintf(_T("\n整数类型的扩展数据是:%d"), pTemp->resval.rint);pTemp = pTemp->rbnext;acutPrintf(TEXT("\n实数类型的扩展数据是:%.2f"), pTemp->resval.rreal);pTemp = pTemp->rbnext;acutPrintf(TEXT("\n点坐标的数据类型的扩展数据是:(%.2f,%.2f,%.2f)"),pTemp->resval.rpoint[X], pTemp->resval.rpoint[Y],pTemp->resval.rpoint[Z]);acutRelRb(pRb);}else{acutPrintf(TEXT("\n所选择的实体不包含任何的扩展数据!"));}pEnt->close();}}

(3)注册新命令DeleteXData,用于从实体中删除特定的扩展数据.

实现代码:

static void AAAMyGroupDeleteXData() {//提示用户选择所要删除扩展数据的图形对象AcDbEntity *pEnt = NULL;AcGePoint3d pickPoint;if (CSelectUtil::PromptSelectEntity(TEXT("\n选择所要删除扩展数据的实体:"),AcDbEntity::desc(),pEnt,pickPoint)){CString appName = TEXT("XDataApp");//注册应用程序名称acdbRegApp(appName);//创建结果缓冲区链表struct resbuf *rb = acutBuildList(AcDb::kDxfRegAppName, appName, RTNONE);//应用程序名称//设置内容为空的结果缓冲区链表就是删除扩展数据pEnt->setXData(rb);acutRelRb(rb);acutPrintf(TEXT("\n成功为实体删除了扩展数据."));pEnt->close();}}

完整的项目代码:

https://pan.baidu.com/s/1MSW-sefDViI244swYH8XFA

效果:

①先创建两条直线,执行AddXData命令,选择其中一条直线,为其添加扩展数据;

②执行ViewXData命令,查看扩展数据

③执行DeleteXData命令,删除扩展命令。

还没有结束!


 还有另一种查看扩展数据的方法:

①在CAD中加载ArxDbg.arx

如果你没有这个使用程序,我这里提供给您下载:

https://pan.baidu.com/s/1q5fJ94q2RcPNXgvmvbQYDA
包括从AutoCAD 2000到AutoCAD 2019的所有AutoCAD版本

②右键,选择EntityInfo

③根据提示选择实体,然后按回车键

④出现刚刚选择的三个实体,Xdata不可选说明没有扩展数据

⑤实体 圆有扩展数据

⑥点击Xdata,可看到其扩展数据:

Reference:

张帆《AutoCAD ObjectARX(VC)开发基础与实例教程》

【CAD二次开发】-ObjectARX-扩展数据 (Xdata)相关推荐

  1. c# cad二次开发通过获取excel数据 在CAD绘图,将CAD属性导出到excel

    c# cad二次开发通过获取excel数据 在CAD绘图,将CAD属性导出到excel using Autodesk.AutoCAD.ApplicationServices; using Autode ...

  2. <四>objectARX开发:扩展数据XData、扩展记录XRecord和有名对象字典NameDict

    1.实体–扩展数据XData   扩展数据能被添加到任何实体上,由一个结果缓冲区链表组成,并且随 AutoCAD 图形 一起保存(AutoCAD 不会使用扩展数据).在许多情况下,扩展数据是向实体追加 ...

  3. 关于objectArx /CAD二次开发中“属性块”操作

    关于objectArx /CAD二次开发中"属性块"操作 属性块就是在图块上附加一些文字属性(Attribute),这些文字可以非常方便地修改.属性块被广泛应用在工程设计和机械设计 ...

  4. c# cad二次开发实现注记搜索跟扩展属性搜索,并点击即可定位到位置,添加了界面操作

    c# cad二次开发实现注记搜索跟扩展属性搜索,并点击即可定位到位置,添加了界面操作 在这里插入图片描述 using Autodesk.AutoCAD.DatabaseServices; using ...

  5. 用ObjectArx进行CAD二次开发的准备工作

    用ObjectArx进行CAD二次开发的准备工作 1.CAD二次开发工具介绍: 2.本文主要介绍ObjectArx工具安装及下载,故此处不讲解VS和CAD的安装 3.有2中下载的资源,并且有安装好的V ...

  6. CAD二次开发(C#)第三节

    前言 这是最后一部分代码,往后若有时间,对其中的代码详细讲解.初心不变,以便日后查看.特别感谢作者孙成波译作<AutoCAD .NET 开发指南 2012 版>.三部分代码里面有些许失误, ...

  7. c#CAD二次开发全套视频目录

    本人非专业编程人员,设计院画图民工一名.自学CAD编程,也写了一些小程序!初期学习lisp编程语言,基本了解CAD各中开发模块,写过一些程序!前段时间自学C#CAD二次开发,遍布网上无教学视频.经过自 ...

  8. CAD二次开发技术 好辛苦啊!

    CAD二次开发技术 好辛苦啊! 2011年03月16日 [b]摘[/b][b][/b][b]要[/b][b][/b] 数据结构算法设计和演示(C++)-树和查找是在面向对象思想和技术的指导下,采用面向 ...

  9. 常用的CAD二次开发语言:AutoLISP, LISP是List Processor(表处理程序)的缩写,cad系统的第一代开发工具注意和eclipse(IDE编程环境,java实现的)

    常用的CAD二次开发语言: 1 AutoLISP 全名是LIST Processing Language,LISP是List Processor(表处理程序)的缩写,cad系统的第一代开发工具,是一种 ...

  10. 【CAD二次开发】实现双击实体的响应

    一.基本双击响应实现 通过向导在VS中创建MFC支持的新项目: 项工程中添加普通CDoubleClick类, 基类选择AcDbDoubleClickEdit: 类的头文件为: class CDoubl ...

最新文章

  1. mysql内置含糊_mysql内置函数
  2. 简单搜索(多位自幂数)+数列网站
  3. C++ string线程不安全
  4. C++ STL快速入门
  5. [建议]添加模板功能
  6. 魔兽世界插件开发-Table Of Contents(TOC)文件
  7. java企业进销存管理系统_Java实例学习——企业进销存管理系统(1)
  8. LaTeX中文伪代码
  9. Android View事件传递机制
  10. 【干货】交换机网络故障排除
  11. 网站服务器的宽带是1mb是什么意思,宽带网速小知识:1Mbps,1Mb/s,1MB/s是什么意思?...
  12. 扫描技术的原理与应用(Nmap使用)
  13. 怎样快速提升自身的编程水平?
  14. paper weekly_Java Weekly 24/15:JCache,Hibernate OGM,微服务
  15. android 地图定位失败,Android 高德地图定位遇到的异常
  16. word中审阅和修订、批注
  17. 移动开发技术——近场通信
  18. 搓丝机传动装置设计F=10KN【机械设计基础课程设计说明书+7张CAD图纸】
  19. 非结构化数据怎么存?
  20. html+css书店

热门文章

  1. 网络安全相关基础知识
  2. 杰力科创手持小风扇芯片——DLTAP703SC
  3. 暗黑下品中文图文全集,mo下载。没听说过的就别进了,不是爱好者打不开
  4. 数据分析(二)----- 描述性统计分析
  5. php过滤ascii控制字符
  6. 中国银行人工智能行业现状与发展趋势及前景预测报告
  7. 如何查看手机蓝牙的HFP的版本
  8. Loose Ends
  9. OpenHarmony-RK3568开发板操作流程
  10. Leaflet实现地图按照行政区划遮罩