C++ ARX二次开发扩展字典、有名对象字典

一、本节课程
C++
ARX二次开发扩展字典、有名对象字典

二、本节要讲解的知识点

扩展字典的使用和有名对象字典的使用(AddXRecordViewXRecordAddNameDictViewNameDict)。

三、具体内容

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

猜你喜欢

转载自blog.csdn.net/yunyouxy/article/details/81049495