一、本节课程
C++ ARX二次开发扩展字典、有名对象字典
二、本节要讲解的知识点
扩展字典的使用和有名对象字典的使用(AddXRecord、ViewXRecord、AddNameDict、ViewNameDict)。
三、具体内容
1、访问实体的扩展字典?扩展字典与特定的实体关联的,但是一个实体在默认情况下是不包含扩展字典的,如果要利用扩展字典保存与实体关联的数据,可以使用createExtentionDictionary函数来为实体建立扩展字典,如果实体已经包含了扩展字典,那么该函数不产生任何影响。 实体的extentionDictionary函数可以获得扩展字典。
2、访问有名对象字典?每个AUTOCAD图形数据库都有一个有名对象字典,默认情况下字典包含了组,多线样式,布局,打印等信息。例如,用户在AUTOCAD中创建一个组,就会有一个代表该组的元素被添加到组字典中。如果需要在有名对象字典中保存自己的数据,一个可以在有名对象字典中添加一个根字典,然后再向根字典添加新的字典,进而在新字典中保存数据。这样的好处是不会与有名对象字典的基本字典相混淆。
3、建立实体的扩展字典,向其中添加扩展记录:
static void YunyouMyGroupAddXRecord() { AcDbEntity *pEnt=NULL; AcGePoint3d pickPoint; if (CSelectUtil::PromptSelctEnts(TEXT("\n选择所要添加扩展记录的实体:"),AcDbEntity::desc(),pEnt,pickPoint)) { //向实体添加扩展字典 pEnt->createExtensionDictionary(); AcDbObjectId dictObjId=pEnt->extensionDictionary(); pEnt->close();
//创建扩展记录实体 AcDbXrecord *pXrec=new AcDbXrecord;
//向扩展字典中添加一条记录 AcDbObjectId xRecObjId; AcDbDictionary *pDict=NULL; if (acdbOpenObject(pDict,dictObjId,AcDb::kForWrite)==Acad::eOk) { pDict->setAt(TEXT("XRecord"),pXrec,xRecObjId); pDict->close(); } //设置扩展记录的内容 struct resbuf *pRb=acutBuildList(AcDb::kDxfText,TEXT("测试字符串数据"), AcDb::kDxfInt32,12, AcDb::kDxfReal,3.14, AcDb::kDxfXCoord,asDblArray(pickPoint), RTNONE); pXrec->setFromRbChain(*pRb); pXrec->close(); acutRelRb(pRb); } } |
4、显示扩展记录:
static void YunyouMyGroupViewXRecord() { AcDbEntity *pEnt=NULL; AcGePoint3d pickPoint; if (CSelectUtil::PromptSelctEnts(TEXT("\n选择所要查看扩展记录的实体:"),AcDbEntity::desc(),pEnt,pickPoint)) { AcDbObjectId dictObjId=pEnt->extensionDictionary(); pEnt->close();
if (dictObjId.isNull()) { acutPrintf(TEXT("\n所选择的实体不包含扩展字典!")); return; } //打开扩展字典,获得与关键字“XRecord”关联的扩展记录 AcDbDictionary *pDict=NULL; AcDbXrecord *pXrec=NULL; struct resbuf * pRb=NULL;if(acdbOpenObject(pDict,dictObjId,AcDb::kForRead)==Acad::eOk) { pDict->getAt(TEXT("XRecord"),(AcDbObject*&)pXrec,AcDb::kForRead); pXrec->rbChain(&pRb); pXrec->close(); pDict->close(); } if (pRb!=NULL) { //在命令行展示扩展记录的内容 struct resbuf *pTemp=pRb; acutPrintf(TEXT("\n字符串类型的扩展数据是:%s"),pTemp->resval.rstring); pTemp=pTemp->rbnext; acutPrintf(TEXT("\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); } } } |
命令行的提示:
选择所要查看扩展记录的实体:
字符串类型的扩展数据是:测试字符串数据
整数类型的扩展数据是:12
实数类型的扩展数据是:3.14
点坐标类型的扩展数据是:(3080.71,1975.51,0.00)
5、创建有名对象字典:
static void YunyouMyGroupAddNameDict() {//获取有名对象字典,向其中添加指定的字典项 AcDbDictionary *pNameObjDict=NULL; acdbHostApplicationServices()->workingDatabase()->getNamedObjectsDictionary(pNameObjDict,AcDb::kForWrite); AcDbObjectId dictObjId; AcDbDictionary *pDict=NULL; if (pNameObjDict->getAt(TEXT("MyDict"),(AcDbObject*&)pDict,AcDb::kForWrite)==Acad::eKeyNotFound) { pDict=new AcDbDictionary; pNameObjDict->setAt(TEXT("MyDict"),pDict,dictObjId); pDict->close(); } pNameObjDict->close(); //向新建的字典添加一个图层对象 if (acdbOpenObject(pDict,dictObjId,AcDb::kForWrite)==Acad::eOk) { AcDbLayerTableRecord *pLayer=new AcDbLayerTableRecord(); AcCmColor color; color.setColorIndex(20); pLayer->setColor(color); pLayer->setIsOff(true); pLayer->setIsFrozen(true); AcDbObjectId layerId; Acad::ErrorStatus es=pDict->setAt(TEXT("LayerKey"),pLayer,layerId); pLayer->close(); pDict->close(); } } |
6、显示有名对象字典:
static void YunyouMyGroupViewNameDict() { //获取有名对象字典,向其中添加指定的字典项 AcDbDictionary *pNameObjDict=NULL; Acad::ErrorStatus es; acdbHostApplicationServices()->workingDatabase()->getNamedObjectsDictionary(pNameObjDict,AcDb::kForRead); AcDbDictionary *pDict=NULL; es=pNameObjDict->getAt(TEXT("MyDict"),(AcDbObject*&)pDict,AcDb::kForRead); pNameObjDict->close(); if (es==Acad::eKeyNotFound) { acutPrintf(TEXT("\n不存在字典项MyDict")); return; } AcDbLayerTableRecord *pLayer=NULL; if (pDict->getAt(TEXT("LayerKey"),(AcDbObject*&)pLayer,AcDb::kForRead)==Acad::eOk) { int colorIndex=pLayer->color().colorIndex(); bool bOff=pLayer->isOff(); bool bFrozen=pLayer->isFrozen(); pLayer->close(); acutPrintf(TEXT("\n字典中的图层颜色:%d"),colorIndex); acutPrintf(TEXT("\n字典中的图层是否是关闭状态:%s"),bOff?TEXT("是"):TEXT("否")); acutPrintf(TEXT("\n字典中的图层是否是冻结状态:%s"),bFrozen?TEXT("是"):TEXT("否")); } pDict->close();
} |
在AUTOCAD中调用命令的结果如下:
命令: ADDNAMEDICT
命令: VIEWNAMEDICT
字典中的图层颜色:20
字典中的图层是否是关闭状态:是
字典中的图层是否是冻结状态:是
用ARXDBG工具查看到数据库中已经有MyDict的有名对象字典。
四、总结
1、如何创建扩展记录和查看扩展记录。在开发中尽量采用扩展记录的,避免使用扩展数据。因为扩展记录的功能更强大,也是AUTOCAD推荐的方式。
2、如何创建有名对象字典和查看有名对象字典。并且使用了ARXDBG工具查看了我们自己创建的有名对象字典。
3、以上的代码都可以应用到开发中。课后对照视频和笔记,自己实现一遍如何创建和查看扩展数据、扩展记录、有名对象字典等,进一步巩固以上知识点。