找回密码
 开放注册

QQ登录

只需一步,快速开始

微信登录

微信扫码,快速开始

搜索
查看: 1294|回复: 4

AutoCAD非图形特征的存取和应用

[复制链接]

0

主题

113

回帖

2

牛毛

初生牛犊

积分
2
发表于 2012-2-19 21:23:02 | 显示全部楼层 来自 广东省汕头市
谢了.学习中,先顶

146

主题

-21

回帖

414

牛毛

一级牛人

积分
414
 楼主| 发表于 2012-2-19 16:59:13 | 显示全部楼层 |阅读模式 来自 河北省石家庄市
在AutoCAD中,图形是指存储在数据库中的对象的集合。基本的数据库对象包括实体、符号表和字典。实体是一种指定类型的数据库对象,它在AutoCAD中有图形表示,如直线、圆、曲线和文字等;符号表和字典是用来存储数据库对象的容器对象。ObjectARX 使用户的应用程序能够访问这些数据库对象,另外,用户也可以为指定的应用程序创建新的数据库对象。     在通常的设计中,图纸中只包含了各种图形实体及实体的基本属性,如线型、图层和可见性等,一般都不包括基本属性以外的非图形特征属性,如实体的材料、加工方法等。我们可以利用扩展数据(Xdata)和扩展记录对象(Xrecord)来存储其非图形特征参数,为关联设计和CAPP等提供必要的信息。
1.扩展实体数据(Xdata)
    ObjectARX、Visual Lisp等应用程序都可以创建扩展实体数据(Xdata),扩展实体数据可以附在任何对象上,AutoCAD 只负责维护这些信息,但并不使用这些信息。一个实体的扩展数据由应用程序所建立,跟随在该实体的正常定义数据之后,包含一个或多个1001组。每一组均以一个互不相同的应用程序名开头,扩展数据的组码在1000至1071之间,不同组码对应不同类型的信息。可用以下方法为指定对象附加扩展实体数据,获取指定对象的扩展实体数据。
(1)为指定对象附加扩展实体数据
Acad::ErrorStatus AcDbObject::setXData(const resbuf* xdata);
其中,xdata 为结果缓冲区链表,包含要添加的信息。
(2)获取指定对象的扩展实体数据
Acad::ErrorStatus AcDbObject::XData(const char* regappName);
其中,regappName 欲获取信息所属的应用程序名。
2.扩展实体词典和扩展实体记录
    词典用以存储用户自己定义的各类符号表及其他大量数据。扩展实体记录就是一个Resbuf链表。该链表是一个数据组的列表,链表中每一节点都包含一个DXF组码及相关数据。扩展实体记录的DXF组码的范围是1~369,其中的数据没有任何限制,可以被任何其它对象所拥有。我们可以通过以下方法来实现对非图形特征信息的存储和提取。
(1)创建词典对象
Acad::ErrorStatus createExtensionDictionary();
(2)添加对象到扩展数据词典
Acad::ErrorStatus;
setAt(char* Key,AcDbObject* obj,AcDbObjectId& retobjId);
其中,Key为加入到词典的新对象的索引关键字;
obj为加入到词典的新对象指针;
retobjId为加入到词典的新对象Id。
(3)检索指定关键字的扩展数据词典记录
Acad::ErrorStatus getAt(const char* entryName,AcDbObject*&entryObj,AcDb::OpenMode mode) const;
其中,entryName为指定检索的关键字;
entryObj为返回的检索到的对象指针;
mode为对象打开的方式。
(4)添加数据到扩展数据记录
Acad::ErrorStatusAcDbXrecord::setFromRb
Chain(resbuf& pRb,AcDbDatabase*pDb=NULL);
其中,pRb为包含特征信息的结果缓冲区链表。
(5)获取扩展实体记录的内容
Acad::ErrorStatusAcDbXrecord::rbChain(resbuf**ppRb,AcDbDatabase*pAuxDb=NULL);
其中,ppRb为结果缓冲区结构指针。
三、非图形特征存储提取方法的应用
    以上介绍了通过扩展实体数据和扩展实体记录对象来存储和提取非图形特征的方法。下面通过3个实例来介绍其应用。
1.利用扩展实体数据保存和提取实体非图形特征
    在工厂电气布线中,需要对电缆设定代号、名称、产地等非几何特征,以便于对电缆等材料进行自动统计等后续工作。
(1)为电缆实体设定非图形特征
char appName[40];//应用程序名
char daihao[40];//电缆代号
char mingcheng[40];//电缆名称
ads_real length;//电缆长度
struct resbuf *pRb,*pTemp;
……//通过对话框等方式对daihao,mingcheng,length赋初值
strcpy(appName,“diqibuxian”);
acdbRegApp(appName);//以appName登记图形中一个应用程序名
pRb = acutNewRb(AcDb::kDxfRegAppName);//分配结果缓冲器
pTemp = pRb;
pTemp->resval.rstring= (char*)malloc(strlen(appName)+1);
strcpy(pTemp->resval.rstring, appName);//将数据存入结果缓冲器链表
pTemp->rbnext=acutNewRb(AcDb::kDxfXdAsciiString);
pTemp=pTemp->rbnext;
pTemp->resval.rstring= (char*)malloc(strlen(daihao)+1);
strcpy(pTemp->resval.rstring, daihao); //将代号存入结果缓冲器链表
……
pTemp->rbnext=acutNewRb(AcDb::kDxfxdLong);
pTemp=pTemp->rbnext;
pTemp->resval.rreal=length;
AcdbObject *pObj;//通过一定的方式获取需要添加数据的对象
pObj->SetXData(pRb);//为对象添加扩展实体数据
pObj->close();
acutRelRb(pRb);
(2)获取指定对象的扩展实体数据
AcDbObject* pObj;
char appName[40];//应用程序名
char daihao[40];//电缆代号
char mingcheng[40];//电缆名称
ads_real length;//电缆长度
struct resbuf *pRb;
strcpy(appName,“dianqibuxian”);
pRb=pObj->xData(appName);//获取应用名appName指定的扩展数据
if(pRb!=NULL)
{ int n=0;
for(;pRb!=NULL;pRb=pRb->rbnext)
{ if(pRb->restype==1000)
{ n++;
if(n==1)
strcpy(daihao,pRb->resval.rstring);//得到电缆代号
if(n==2)
strcpy(mingcheng,pRb->resval.rstring);//得到电缆名称
}
if(pRb->restype==1040)
length=pRb->resval.rreal;
}
}
acutRelRb(pRb);
2.利用扩展记录对象实现关联设计
    在参数化设计过程中,零件甲中的某些参数与零件乙的设计有关联。我们设计零件乙时就需要从零件甲的图纸数据库中获取所需的参数,实现关联设计。
(1) 在零件甲的图纸空间中保存关联参数
ads_real bl,fl;//零件甲与零件乙相关联的参数
AcDbDictionary *pNamedobj, *pDict;
acdbHostApplicationServices()->workingDatabase()
->getNamedObjectsDictionary(pNamedobj, AcDb::kForWrite);
//获取当前数据库中的命名对象字典
pNamedobj->setAt("Guanliansheji", pDict, DictId);
pNamedobj->close();
AcDbXrecord *pXrec = new AcDbXrecord;
AcDbObjectId xrecObjId;
pDict->setAt("XREC1", pXrec, xrecObjId);
pDict->close();
struct resbuf *pHead;
pHead = acutBuildList(AcDb::kDxfReal, bl,AcDb::kDxfReal,fl,0);
//设置包含参数bl,fl的结果缓冲器链表
pXrec->setFromRbChain(*pHead);//给扩展记录对象附加信息
acutRelRb(pHead);
pXrec->close();
(2) 在设计零件乙的过程中,从零件甲的图形文件中获取所需的相关参数
AcDbDatabase* pDb = new AcDbDatabase(false, true);
pDb->readDwgFile(fname);//fname为零件甲的图形文件名
AcDbDictionary *pNamedobj;
pDb->getNamedObjectsDictionary(pNamedobj, AcDb::kForRead);
AcDbDictionary *pDict;
pNamedobj->getAt("Guanliansheji", (AcDbObject*&)pDict,
AcDb::kForRead);//获取名为Guanliansheji的数据词典
pNamedobj->close();
AcDbXrecord *pXrec;
pDict->getAt("XREC1", (AcDbObject*&) pXrec,AcDb::kForRead);
//获取关键字为XREC1的扩展记录对象
pDict->close();
struct resbuf *pRbList;
pXrec->rbChain(&pRbList);//获取包含特征信息的结果缓冲器链表
pXrec->close();
bl=pRbList->resval.rreal;//获取关联参数bl
pRbList=pRbList->rbnext;
fl=pRbList->resval.rreal; //获取关联参数fl
acutRelRb(pRbList);

20

主题

307

回帖

107

牛毛

一级牛人

积分
107
发表于 2012-2-26 00:00:05 | 显示全部楼层 来自 广东省河源市
获取指定对象的扩展实体数据

0

主题

28

回帖

4

牛毛

初生牛犊

积分
4
发表于 2012-3-8 16:50:47 | 显示全部楼层 来自 浙江省湖州市
- -.......

143

主题

62

回帖

158

牛毛

一级牛人

积分
158
发表于 2012-3-12 15:37:15 | 显示全部楼层 来自 湖北省武汉市
学习了
您需要登录后才可以回帖 登录 | 开放注册

本版积分规则

帮助|Archiver|小黑屋|通信管理局专项备案号:[2008]238号|NB5社区 ( 皖ICP备08004151号;皖公网安备34010402700514号 )

GMT+8, 2025-1-26 17:05 , Processed in 0.148813 second(s), 41 queries , Yac On.

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表