|
一、本节课程
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、以上的代码都可以应用到开发中。课后对照视频和笔记,自己实现一遍如何创建和查看扩展数据、扩展记录、有名对象字典等,进一步巩固以上知识点。
|
|