找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 142|回复: 0

OBJECT ARX 扩展数据 使用

[复制链接]

1

主题

0

回帖

37

积分

管理员

积分
37
发表于 2024-5-2 22:51:55 | 显示全部楼层 |阅读模式
  1. 添加扩展数据======================
  2. static void TESTaddxdatacmd(){
  3. ads采用name en;
  4. ads采用point pt;
  5. 选择要添加扩展数据的对象
  6. if(acedEntSel(采用T("\n选择要添加扩展数据的实体"),en,pt) != RTNORM){
  7. return;
  8. }
  9. AcDbObjectId entId;
  10. Acad::ErrorStatus es = acdbGetObjectId(entId,en);
  11. 扩展数据的内容
  12. struct resbuf* pRb;
  13. 注册应用程序名称
  14. acdbRegApp(采用T("XData"));
  15. CString strAppName(采用T("XData"));;
  16. CString str(采用T("hello"));
  17. 创建结果缓冲区链表
  18. pRb = acutBuildList(AcDb::kDxfRegAppName,strAppName,
  19. AcDb::kDxfXdAsciiString,str,
  20. AcDb::kDxfXdInteger32,2,
  21. AcDb::kDxfXdReal,3.14,
  22. AcDb::kDxfXdWorldXCoord,pt,
  23. RTNONE);
  24. 为选择的实体添加扩展数据
  25. AcDbEntity* pEnt;
  26. acdbOpenAcDbEntity(pEnt,entId,AcDb::kForWrite);
  27. struct resbuf* pTemp;
  28. pTemp = pEnt->xData(采用T("XData"));
  29. if(pTemp != NULL){如果已经包含扩展数据,不再重复添加
  30. acutRelRb(pTemp);
  31. acutPrintf(采用T("它已经包含了扩展数据"));
  32. }
  33. else{
  34. pEnt->setXData(pRb);
  35. acutPrintf(采用T("\n扩展数据已赋值"));
  36. }
  37. pEnt->close();
  38. acutRelRb(pRb);
  39. }
  40. //查看扩展数据==================
  41. static void TESTviewxdatacmd(){
  42. 提示用户选择要查看的扩展数据对象
  43. ads采用name en;
  44. ads采用point pt;
  45. if(acedEntSel(采用T("\n选择要查看的扩展数据实体"),en,pt) != RTNORM){
  46. return;
  47. }
  48. AcDbObjectId entId;
  49. Acad::ErrorStatus es = acdbGetObjectId(entId,en);
  50. 打开图形对象,查看是否包含扩展数据
  51. AcDbEntity* pEnt;
  52. acdbOpenAcDbEntity(pEnt,entId,AcDb::kForRead);
  53. struct resbuf* pRb;
  54. pRb = pEnt->xData(采用T("XData"));
  55. pEnt->close();
  56. if(pRb != NULL){
  57. 在命令行显示所有的扩展数据
  58. struct resbuf* pTemp;
  59. pTemp = pRb;
  60. 首先要跳过应用程序名称
  61. pTemp = pTemp->rbnext;
  62. acutPrintf(采用T("\n字符串类型的扩展数据是:%s"),pTemp->resval.rstring);
  63. pTemp = pTemp->rbnext;
  64. acutPrintf(采用T("\n整数类型的扩展数据是:%d"),pTemp->resval.rint);
  65. pTemp = pTemp->rbnext;
  66. acutPrintf(采用T("\n实数类型的扩展数据是:%.2f"),pTemp->resval.rreal);
  67. pTemp = pTemp->rbnext;
  68. acutPrintf(采用T("\n点坐标类型的扩展数据是:%.2f,%.2f,%.2f"),pTemp->resval.rpoint[X],pTemp->resval.rpoint[Y],pTemp->resval.rpoint[Z]);
  69. acutRelRb(pRb);
  70. }
  71. else{
  72. acutPrintf(采用T("\n该实体不包含任何的扩展数据"));
  73. }
  74. }
  75. //添加扩展字典======================
  76. static void TESTaddrcdcmd(){
  77. ads采用name en;
  78. ads采用point pt;
  79. if(acedEntSel(采用T("\n选择要添加扩展记录的实体"),en,pt) != RTNORM){
  80. return;
  81. }
  82. AcDbObjectId entId;要添加扩展记录实体ID
  83. Acad::ErrorStatus es = acdbGetObjectId(entId,en);
  84. AcDbXrecord* pXrec = new AcDbXrecord;//= new AcDbxRecord;
  85. AcDbObject* pObj;
  86. AcDbObjectId dictObjId,xRecObjId;
  87. AcDbDictionary* pDict;
  88. 要在扩展记录中保存的字符串
  89. struct resbuf* pRb;
  90. /向实体中添加扩展字典
  91. acdbOpenObject(pObj,entId,AcDb::kForWrite);
  92. pObj->createExtensionDictionary();
  93. dictObjId = pObj->extensionDictionary();
  94. pObj->close();
  95. 向扩展字典中添加一条记录
  96. acdbOpenObject(pDict,dictObjId,AcDb::kForWrite);
  97. pDict->setAt(采用T("XRecord"),pXrec,xRecObjId);
  98. pDict->close();
  99. 设置扩展记录的内容
  100. pRb = acutBuildList(AcDb::kDxfText,采用T("\n直线"),
  101. AcDb::kDxfInt32,12,
  102. AcDb::kDxfReal,3.14,
  103. AcDb::kDxfXCoord,pt,
  104. RTNONE);
  105. pXrec->setFromRbChain(*pRb);
  106. pXrec->close();
  107. acutRelRb(pRb);
  108. }
  109. //查看扩展字典==============
  110. static void TESTviewrcdcmd(){
  111. 提示用户选择要查看扩展记录的图形对象
  112. ads采用name en;
  113. ads采用point pt;
  114. if(acedEntSel(采用T("\n选择要查看扩展记录的实体"),en,pt) != RTNORM)
  115. return;
  116. AcDbObjectId entId;
  117. Acad::ErrorStatus es = acdbGetObjectId(entId,en);
  118. 打开图形对象,获得实体扩展字典的OBJID
  119. AcDbEntity* pEnt;
  120. acdbOpenAcDbEntity(pEnt,entId,AcDb::kForRead);
  121. AcDbObjectId dictObjId = pEnt->extensionDictionary();
  122. pEnt->close();
  123. 查看实体是否包含扩展字典
  124. if(dictObjId == AcDbObjectId::kNull){
  125. acutPrintf(采用T("\n所选择的实体不包含扩展字典"));
  126. return;
  127. }
  128. 打开扩展字典,获得与关键字'XRECORD'关联的扩展记录
  129. AcDbDictionary* pDict;
  130. AcDbXrecord* pXrec;
  131. acdbOpenObject(pDict,dictObjId,AcDb::kForRead);
  132. pDict->getAt(采用T("XRecord"),(AcDbObject* &)pXrec,AcDb::kForRead);
  133. pDict->close();
  134. 获得扩展记录的数据链表并关闭扩展数据对象
  135. struct resbuf* pRb;
  136. pXrec->rbChain(&pRb);
  137. pXrec->close();
  138. if(pRb != NULL){
  139. 在命令行显示所有的扩展数据
  140. struct resbuf* pTemp;
  141. pTemp = pRb;
  142. acutPrintf(采用T("\n字符串类型的扩展数据是:%s"),pTemp->resval.rstring);
  143. pTemp = pTemp->rbnext;
  144. acutPrintf(采用T("\n整数类型的扩展数据是:%d"),pTemp->resval.rint);
  145. pTemp = pTemp->rbnext;
  146. acutPrintf(采用T("\n实数类型的扩展数据是:%.2f"),pTemp->resval.rreal);
  147. pTemp = pTemp->rbnext;
  148. acutPrintf(采用T("\n点坐标类型的扩展数据是:%.2f,%.2f,%.2f"),pTemp->resval.rpoint[X],pTemp->resval.rpoint[Y],pTemp->resval.rpoint[Z]);
  149. acutRelRb(pRb);
  150. }
  151. else{
  152. acutPrintf(采用T("\n没有找到它的扩展数据"));
  153. }
  154. }
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|膜结构网

GMT+8, 2025-1-4 13:12 , Processed in 0.130064 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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