【CAD二次开发】-ObjectARX-扩展数据 (Xdata)
基本思路:
(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)相关推荐
- c# cad二次开发通过获取excel数据 在CAD绘图,将CAD属性导出到excel
c# cad二次开发通过获取excel数据 在CAD绘图,将CAD属性导出到excel using Autodesk.AutoCAD.ApplicationServices; using Autode ...
- <四>objectARX开发:扩展数据XData、扩展记录XRecord和有名对象字典NameDict
1.实体–扩展数据XData 扩展数据能被添加到任何实体上,由一个结果缓冲区链表组成,并且随 AutoCAD 图形 一起保存(AutoCAD 不会使用扩展数据).在许多情况下,扩展数据是向实体追加 ...
- 关于objectArx /CAD二次开发中“属性块”操作
关于objectArx /CAD二次开发中"属性块"操作 属性块就是在图块上附加一些文字属性(Attribute),这些文字可以非常方便地修改.属性块被广泛应用在工程设计和机械设计 ...
- c# cad二次开发实现注记搜索跟扩展属性搜索,并点击即可定位到位置,添加了界面操作
c# cad二次开发实现注记搜索跟扩展属性搜索,并点击即可定位到位置,添加了界面操作 在这里插入图片描述 using Autodesk.AutoCAD.DatabaseServices; using ...
- 用ObjectArx进行CAD二次开发的准备工作
用ObjectArx进行CAD二次开发的准备工作 1.CAD二次开发工具介绍: 2.本文主要介绍ObjectArx工具安装及下载,故此处不讲解VS和CAD的安装 3.有2中下载的资源,并且有安装好的V ...
- CAD二次开发(C#)第三节
前言 这是最后一部分代码,往后若有时间,对其中的代码详细讲解.初心不变,以便日后查看.特别感谢作者孙成波译作<AutoCAD .NET 开发指南 2012 版>.三部分代码里面有些许失误, ...
- c#CAD二次开发全套视频目录
本人非专业编程人员,设计院画图民工一名.自学CAD编程,也写了一些小程序!初期学习lisp编程语言,基本了解CAD各中开发模块,写过一些程序!前段时间自学C#CAD二次开发,遍布网上无教学视频.经过自 ...
- CAD二次开发技术 好辛苦啊!
CAD二次开发技术 好辛苦啊! 2011年03月16日 [b]摘[/b][b][/b][b]要[/b][b][/b] 数据结构算法设计和演示(C++)-树和查找是在面向对象思想和技术的指导下,采用面向 ...
- 常用的CAD二次开发语言:AutoLISP, LISP是List Processor(表处理程序)的缩写,cad系统的第一代开发工具注意和eclipse(IDE编程环境,java实现的)
常用的CAD二次开发语言: 1 AutoLISP 全名是LIST Processing Language,LISP是List Processor(表处理程序)的缩写,cad系统的第一代开发工具,是一种 ...
- 【CAD二次开发】实现双击实体的响应
一.基本双击响应实现 通过向导在VS中创建MFC支持的新项目: 项工程中添加普通CDoubleClick类, 基类选择AcDbDoubleClickEdit: 类的头文件为: class CDoubl ...
最新文章
- mysql内置含糊_mysql内置函数
- 简单搜索(多位自幂数)+数列网站
- C++ string线程不安全
- C++ STL快速入门
- [建议]添加模板功能
- 魔兽世界插件开发-Table Of Contents(TOC)文件
- java企业进销存管理系统_Java实例学习——企业进销存管理系统(1)
- LaTeX中文伪代码
- Android View事件传递机制
- 【干货】交换机网络故障排除
- 网站服务器的宽带是1mb是什么意思,宽带网速小知识:1Mbps,1Mb/s,1MB/s是什么意思?...
- 扫描技术的原理与应用(Nmap使用)
- 怎样快速提升自身的编程水平?
- paper weekly_Java Weekly 24/15:JCache,Hibernate OGM,微服务
- android 地图定位失败,Android 高德地图定位遇到的异常
- word中审阅和修订、批注
- 移动开发技术——近场通信
- 搓丝机传动装置设计F=10KN【机械设计基础课程设计说明书+7张CAD图纸】
- 非结构化数据怎么存?
- html+css书店