TA的每日心情![](source/plugin/dsu_paulsign/img/emot/kx.gif) | 开心 昨天 15:23 |
---|
签到天数: 69 天 [LV.6]常住居民II
管理员
- 积分
- 2704
|
展数据(xdata)是由应用程序通过ObjectArx或AutoLISP建立并添加到任何对象上.扩展数据包含一个应用程序使用的结果缓冲区(resbuf)链接表.数据与在1000至1071范围内的DXF组码相对应.
该方法节省空间,在向对象添加少量数据时是很有用的.然而,扩展数据不能超过16KB,其数据只能在既有的DXF组码和类型范围内.
void printXdata(); // 打印扩展数据
void addXdata(); // 添加扩展数据
void printList(struct resbuf* pRb); //打印扩展数据列表
AcDbObject* selectObject(AcDb::OpenMode openMode); //选择并打开对象
// 打印扩展数据
void
printXdata()
{
// 选择并打开一个对象,selectObject函数为自定义函数,下面即是
AcDbObject *pObj;
if ((pObj = selectObject(AcDb::kForRead)) == NULL) {
return;
}
// 输入扩展数据的应用程序名,以便查找时用,在扩展数据方面,查询函数为xData(char*)
char appname[133];
if (acedGetString(NULL,
"/n输入想获取扩展数据的应用程序名: ",
appname) != RTNORM)
{
return;
}
// 这里就是根据上面的字符串来查询相应的程序名是否存在
struct resbuf *pRb;
pRb = pObj->xData(appname);
if (pRb != NULL) {
// 如果扩展数据为空,注册应用程序将appName添加到表的第一个结果缓冲区中
printList(pRb); //打印列表,为自定义函数,详细看下面其实现
acutRelRb(pRb); //释放pRb的内在空间
} else {
acutPrintf("/n该名字的应用程序没有扩展数据");
}
pObj->close();
}
//添加扩展数据
void
addXdata()
{
// 选择并打开一个对象,selectObject函数为自定义函数,下面即是
AcDbObject* pObj = selectObject(AcDb::kForRead);
if (!pObj) {
acutPrintf("选择对象出错/n");
return;
}
//获取应用程序名和要添加到扩展数据的字符串
char appName[132], resString[200];
appName[0] = resString[0] = '/0';
acedGetString(NULL, "/n输入应用程序名: ",
appName);
acedGetString(NULL, "/n输入要添加的字符串: ",
resString);
struct resbuf *pRb, *pTemp;
// 查询或搜索应用程序名
pRb = pObj->xData(appName);
if (pRb != NULL) {
// 如果应用程序名已存在,将指针指向表尾,以便添加的字符串位于整个应用程序的最后
for (pTemp = pRb; pTemp->rbnext != NULL;
pTemp = pTemp->rbnext)
{ ; }
} else {
// 如果扩展数据为空,说明目前的对象中没有该程序的扩展数据,则就注册应用程序
// 并添加到表的第一个结果缓冲区中
acdbRegApp(appName); //注册应用程序扩展数据
pRb = acutNewRb(AcDb::kDxfRegAppName); //以DXF组码建立应用程序名缓冲区
pTemp = pRb;
pTemp->resval.rstring
= (char*) malloc(strlen(appName) + 1);
strcpy(pTemp->resval.rstring, appName);
}
// 将用户指定的字符串添加到扩展数据中
pTemp->rbnext = acutNewRb(AcDb::kDxfXdAsciiString); //以DXF组码建立字符串缓冲区
pTemp = pTemp->rbnext;
pTemp->resval.rstring
= (char*) malloc(strlen(resString) + 1);
strcpy(pTemp->resval.rstring, resString);
//由于pObj是以读方式打开的,所以这里要调用upgradeOpen()函数将实体从读模式改为写模式
pObj->upgradeOpen();
pObj->setXData(pRb); //为对象指定扩展数据
pObj->close();
acutRelRb(pRb);
}
//打印扩展数据列表,
void
printList(struct resbuf* pRb)
{
int rt, i;
char buf[133];
for (i = 0;pRb != NULL;i++, pRb = pRb->rbnext) {
if (pRb->restype < 1010) {
rt = RTSTR;
} else if (pRb->restype < 1040) {
rt = RT3DPOINT;
} else if (pRb->restype < 1060) {
rt = RTREAL;
} else if (pRb->restype < 1071) {
rt = RTSHORT;
} else if (pRb->restype == 1071) {
rt = RTLONG;
} else {
rt = pRb->restype;
}
switch (rt) {
case RTSHORT:
if (pRb->restype == RTSHORT) {
acutPrintf(
"RTSHORT : %d/n", pRb->resval.rint);
} else {
acutPrintf("(%d . %d)/n", pRb->restype,
pRb->resval.rint);
};
break;
case RTREAL:
if (pRb->restype == RTREAL) {
acutPrintf("RTREAL : %0.3f/n",
pRb->resval.rreal);
} else {
acutPrintf("(%d . %0.3f)/n", pRb->restype,
pRb->resval.rreal);
};
break;
case RTSTR:
if (pRb->restype == RTSTR) {
acutPrintf("RTSTR : %s/n",
pRb->resval.rstring);
} else {
acutPrintf("(%d . /"%s/")/n", pRb->restype,
pRb->resval.rstring);
};
break;
case RT3DPOINT:
if (pRb->restype == RT3DPOINT) {
acutPrintf(
"RT3DPOINT : %0.3f, %0.3f, %0.3f/n",
pRb->resval.rpoint[X],
pRb->resval.rpoint[Y],
pRb->resval.rpoint[Z]);
} else {
acutPrintf("(%d %0.3f %0.3f %0.3f)/n",
pRb->restype,
pRb->resval.rpoint[X],
pRb->resval.rpoint[Y],
pRb->resval.rpoint[Z]);
}
break;
case RTLONG:
acutPrintf("RTLONG : %dl/n", pRb->resval.rlong);
break;
}
if ((i == 23) && (pRb->rbnext != NULL)) {
i = 0;
acedGetString(0,
"Press <ENTER> to continue...", buf);
}
}
}
//选择并打开对象
AcDbObject*
selectObject(AcDb::OpenMode openMode)
{
// 允许用户拾取对象或者输入对象的句柄值
int ss;
ads_name en;
ads_point pt;
acedInitGet(RSG_OTHER, "Handle _Handle"); //设置关键字
ss = acedEntSel("/n选择对象或者输入用户的句柄(H)", en, pt);
char handleStr[132];
AcDbObjectId eId;
switch (ss) {
case RTNORM: // 选择对象模式
break;
case RTKWORD: //句柄模式
if ((acedGetString(Adesk::kFalse,
"输入用效的对象句柄: ",
handleStr) == RTNORM)
&& (acdbHandEnt(handleStr, en) == RTNORM))
{
break;
}
default:
acutPrintf("应用选择对象,返回 Code==%d/n",ss);
return NULL;
}
// 通过acdbGetObjectId由ads_name转折炙ObjectId
Acad::ErrorStatus retStat;
retStat = acdbGetObjectId(eId, en);
if (retStat != Acad::eOk) {
acutPrintf("/nacdbGetObjectId failed");
acutPrintf("/nen==(%lx,%lx), retStat==%d/n",
en[0], en[1], eId);
return NULL;
}
AcDbObject* obj;
// 打开对象
if ((retStat = acdbOpenObject(obj, eId, openMode))
!= Acad::eOk)
{
acutPrintf("打开对象失败: ename:(%lx,%lx),"
" mode:%d retStat:%d", en[0], en[1],
openMode, retStat);
return NULL;
}
return obj;
}
其相关的例子在ObjetARX2006包下的smaples/database/xdata_dg,我在这里对例子的重点内容进行讲解下,如果大家有什么问题可以一起探讨. |
|