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