找回密码
 立即注册

QQ登录

只需一步,快速开始

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

ObjectARX_命名对象字典

[复制链接]

0

主题

0

回帖

26

积分

管理员

积分
26
发表于 2024-2-19 20:22:54 | 显示全部楼层 |阅读模式
  1. 为了使用方便,再此封装了,图形数据库字典项数据库
  2. //绑定命名字典值
  3. bool SetDictdata(const CString& strDictName,const CString strRecord,CString& strDictVal);
  4. //获取命名字典的值
  5. bool GetDictdata(const CString& strDictName,const CString strRecord, CString& strDictVal);
  6. bool CQKQuery::SetDictdata(  const CString& strDictName,const CString strRecord,CString& strDictVal )
  7. {
  8.         // 得到有名对象字典,向其中添加指定的字典项
  9.         AcDbDictionary *pNameObjDict = NULL;
  10.         Acad::ErrorStatus es = m采用pDb->getNamedObjectsDictionary(pNameObjDict,AcDb::kForWrite);
  11.         if (Acad::eOk != es || NULL == pNameObjDict)
  12.                 return false;
  13.         // 检查所要添加的字典项是否已经存在
  14.         AcDbDictionary *pDict = NULL;
  15.         es = pNameObjDict->getAt(strDictName, (AcDbObject*&)pDict,AcDb::kForWrite);
  16.         if (es == Acad::eKeyNotFound || NULL == pDict)//没有字典项,新建一个
  17.         {
  18.                 pDict = new AcDbDictionary;
  19.                 AcDbObjectId dictObjId;
  20.                 es = pNameObjDict->setAt(strDictName, pDict, dictObjId);
  21.                 if (Acad::eOk != es)
  22.                 {
  23.                         delete pDict;
  24.                         pDict = NULL;
  25.                         pNameObjDict->close();
  26.                         return false;
  27.                 }
  28.                 AcDbXrecord *pXrec = new AcDbXrecord;
  29.                 // 设置扩展记录的内容
  30.                 struct resbuf *pRb = NULL;
  31.                 pRb = acutBuildList(AcDb::kDxfText, strDictVal,RTNONE);
  32.                 if (NULL == pRb)
  33.                 {
  34.                         delete pXrec;
  35.                         pXrec = NULL;
  36.                         pDict->close();
  37.                         pNameObjDict->close();
  38.                         return false;
  39.                 }
  40.                 pXrec->setFromRbChain(*pRb);
  41.                 acutRelRb(pRb);
  42.                 AcDbObjectId xrecObjId;
  43.                 es = pDict->setAt(strRecord, pXrec, xrecObjId);
  44.                 if (Acad::eOk != es)
  45.                 {
  46.                         delete pXrec;
  47.                         pXrec = NULL;
  48.                         pDict->close();
  49.                         pNameObjDict->close();
  50.                         return false;
  51.                 }
  52.                 pXrec->close();
  53.                 pDict->close();
  54.                 pNameObjDict->close();
  55.         }
  56.         else//已经存在字典项
  57.         {
  58.                 //得到扩展数据
  59.                 AcDbXrecord* pXrec = NULL;
  60.                 es = pDict->getAt(strRecord, (AcDbObject*&)pXrec, AcDb::kForWrite);
  61.                 if (es == Acad::eKeyNotFound || NULL == pXrec)//没有扩展数据
  62.                 {
  63.                         AcDbXrecord *pXrec = new AcDbXrecord;
  64.                         // 设置扩展记录的内容
  65.                         struct resbuf *pRb = NULL;
  66.                         pRb = acutBuildList(AcDb::kDxfText, strDictVal,RTNONE);
  67.                         if (NULL == pRb)
  68.                         {
  69.                                 delete pXrec;
  70.                                 pXrec = NULL;
  71.                                 pDict->close();
  72.                                 pNameObjDict->close();
  73.                                 return false;
  74.                         }
  75.                         pXrec->setFromRbChain(*pRb);
  76.                         acutRelRb(pRb);
  77.                         AcDbObjectId xrecObjId;
  78.                         es = pDict->setAt(strRecord, pXrec, xrecObjId);
  79.                         if (Acad::eOk != es)
  80.                         {
  81.                                 delete pXrec;
  82.                                 pXrec = NULL;
  83.                                 pDict->close();
  84.                                 pNameObjDict->close();
  85.                                 return false;
  86.                         }
  87.                         pXrec->close();
  88.                         pDict->close();
  89.                         pNameObjDict->close();
  90.                 }
  91.                 else//有扩展数据
  92.                 {
  93.                         // 设置扩展记录的内容
  94.                         struct resbuf *pRb = NULL;
  95.                         pRb = acutBuildList(AcDb::kDxfText, strDictVal,RTNONE);
  96.                         if (NULL == pRb)
  97.                         {
  98.                                 pXrec->close();
  99.                                 pDict->close();
  100.                                 pNameObjDict->close();
  101.                                 return false;
  102.                         }
  103.                         pXrec->setFromRbChain(*pRb);
  104.                         acutRelRb(pRb);
  105.                         pXrec->close();
  106.                         pDict->close();
  107.                         pNameObjDict->close();
  108.                 }
  109.         }
  110.         return true;
  111. }
  112. bool CQKQuery::GetDictdata( const CString& strDictName,const CString strRecord, CString& strDictVal )
  113. {
  114.         // 得到有名对象字典,向其中添加指定的字典项
  115.         AcDbDictionary *pNameObjDict = NULL;
  116.         AcDbDictionary *pDict = NULL;
  117.         Acad::ErrorStatus es = m采用pDb->getNamedObjectsDictionary(pNameObjDict,AcDb::kForRead);
  118.         if (es != Acad::eOk || NULL == pNameObjDict)
  119.                 return false;       
  120.         // 检查所要添加的字典项是否已经存在
  121.         AcDbObjectId dictObjId;
  122.         es = pNameObjDict->getAt(strDictName,  (AcDbObject*&)pDict, AcDb::kForRead);
  123.         if (es == Acad::eKeyNotFound || NULL == pDict)
  124.         {
  125.                 pNameObjDict->close();
  126.                 return false;
  127.         }
  128.         // 得到指定的对象字典
  129.         AcDbXrecord *pXrec = NULL;
  130.         es = pDict->getAt(strRecord, (AcDbObject*&)pXrec, AcDb::kForRead);
  131.         if (es != Acad::eOk || NULL == pXrec)
  132.         {
  133.                 pDict->close();
  134.                 pNameObjDict->close();
  135.                 return false;
  136.         }
  137.         // 得到扩展记录的数据链表并关闭扩展数据对象
  138.         struct resbuf *pRb = NULL;
  139.         es = pXrec->rbChain(&pRb);
  140.         if (es != Acad::eOk || NULL == pRb)
  141.         {
  142.                 pXrec->close();
  143.                 pDict->close();
  144.                 pNameObjDict->close();
  145.                 return false;
  146.         }
  147.         strDictVal = pRb->resval.rstring;
  148.         acutRelRb(pRb);
  149.         pXrec->close();
  150.         pDict->close();
  151.         pNameObjDict->close();
  152.         return true;
  153. }
  154. 具体用法:ui
  155. SetDictdata(采用T("FLAG"),采用T("XRecord"),strId);
  156. GetDictdata(采用T("FLAG"),采用T("XRecord"),strId);
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-12-28 14:17 , Processed in 0.121506 second(s), 23 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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