ObjectARX开发笔记(二)——使用Xdata向AutoCAD图形追加自定义数据

在ObjectARX开发过程中,有时候需要向CAD图形中添加一些用户自定义数据。比如,将一条直线看做工字梁、T型材、角钢、球扁钢,或者其他类型的对象。为了达到这个目的,就需要向CAD图形中原有的实体追加一些额外的数据。要实现此功能,主要有两种方式:使用扩展数据——xData;使用扩展记录——Xrecord;扩展数据(xData)可以被ObjectARX或AutoLISP编写的应用程序创建...
摘要由CSDN通过智能技术生成

1.自定义数据

ObjectARX开发过程中,有时会使用自定义数据,主要包括:

  • 自定义对象——可以让用户按照自己希望的方式封装数据,并向AutoCAD中添加第三方实体类型,这些实体类型用于与AutoCAD自身实体一样的特性,ObjectARX程序能够灵活控制自定义实体的显示。
  • 扩充数据——可以向图形本身或者图形中的实体追加一些数据。
    扩充数据又分为Xdata(eXtension data)和 Xrecord(eXtension record)两种。

2.Xdata

  • AutoCAD数据库的任何对象都可以灵活的附加一定数量的扩展数(Xdata),供开发者使用。
  • 扩展数据的含义由开发者自行解释,AutoCAD只维护这些数据而不管其具体的含义。
  • 扩展数据是链表组,每个组是链表系列,以一个名字开头以做标识。这个名字是应用程序名。
  • 应用程序名通过acdbRegApp()进行注册,最长可达31个字符 所附着的数据链表不能超过16K。
  • DXF组码只能采用1000~1071之间的组码值。

2.1 Xdata相关函数—acdbRegApp

定义

int acdbRegApp(
    const ACHAR * appname
);

作用:在当前图形中注册一个应用程序名称,用于分组,存储,检索和修改实体的扩展数据。appname必须遵守符号表名称(例如图层名称)的规则,且不能和已经存在的RegApp重复。每个新名称将产生一个新的acdbRegApp记录。
返回值

  • appname注册成功,返回RTNORM;
  • appname已存在,返回RTERROR;
  • appname注册失败,返回一个表明失败原因的系统变量ERRNO。

2.2 Xdata相关函数—setXData

定义

virtual Acad::ErrorStatus setXData(
    const resbuf* xdata
);

作用:设置一个对象的扩展数据。

  • 每个注册(regappname)链表以 restype = 1001 分界,并且resval.rstring应该是合法字符。
  • RegappName必须是AcDbRegAppTable中存在的。
  • 如果xdata中已经有该regappname组, 则新的链表将覆盖之 。
  • 要清除xdata中某个regappname的所有内容,只需建立一个以此regappname开头的空链表即可。

返回值

  • 如果xdata成功添加到对象,则返回Acad :: eOk。
  • 如果对象的xdata区域中没有足够的空间,则返回Acad::eXdataSizeExceeded。
  • 如果xdata中的所有regappName均不存在,则返回Acad :: eRegappIdNotFound。

2.3 Xdata相关函数—XData

定义

virtual resbuf* xData(
    const ACHAR* regappName = nullptr
) const;

作用:获取一个对象中名为“regappName”的扩展数据。如果regappName == NULL,则返回所有xdata,否则仅返回指定名称为regappName的xdata。如果需要多个regappName的xdata,则必须对该成员函数进行多次调用,每个regappName调用一次。
返回值

  • 返回包含对象xdata副本的resbuf结构的链接列表。

2.4 Xdata实例,添加、查看和删除Xdata

添加Xdata代码如下:

//添加Xdata
	static void MyGroupaddXdata() 
	{
   
		//提示用户选择对象
		AcDbObject* pObj = selectObject(AcDb::kForRead);
		if (!pObj) {
   
			acutPrintf(_T("Error selecting object\n"));
			return;
		}

		//获取Xdata名称
		TCHAR appName[132], resString[200];
		appName[0] = resString[0] = _T('\0');

		acedGetString(NULL, _T("Enter application name: "), appName);
		acedGetString(NULL, _T("Enter string to be added: "), resString);

		struct  resbuf  *pRb, *pTemp;

		pRb = pObj->xData(appName);

		if (pRb != NULL) 
		{
   
			//如果Xdata已经存在,不执行任何操作
			for (pTemp = pRb; pTemp->rbnext != NULL;pTemp = pTemp->rbnext)
			{
    
				; 
			}
		} 
		else 
		{
   
			//如果Xdata不存在,向当前对象注册名为appName的Xdata
			acdbRegApp(appName);

			pRb = acutNewRb(AcDb::kDxfRegAppName);
			pTemp = pRb;
			pTemp->resval.rstring
				= (TCHAR*) malloc
  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值