明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2507|回复: 6

写扩展词典程序

[复制链接]
发表于 2014-11-1 23:35:59 | 显示全部楼层 |阅读模式
//加扩展词典独立程序
bool SetEntityDictFromRbChain(AcDbObjectId entId,ACHAR *strDictName,resbuf* pRbValue)
{
AcDbEntityPointer pObj(entId,AcDb::kForWrite);
if (pObj.openStatus()!=Acad::eOk ) return false;
AcDbObjectId extDictId = pObj->extensionDictionary();
if (extDictId == AcDbObjectId::kNull)
{
  Acad::ErrorStatus es = pObj->createExtensionDictionary();
  if (es != Acad::eOk)
   return false;
  if ((extDictId = pObj->extensionDictionary()) == AcDbObjectId::kNull)
   return false;
}
AcDbDictionaryPointer pDict(extDictId,AcDb::kForRead);
if(pDict.openStatus() != Acad::eOk)
  return false;
AcDbObjectId xRecId;
if(pDict->getAt(strDictName,xRecId) != Acad::eOk)
{
  AcDbXrecord* pXrec = new AcDbXrecord();
  //pXrec 可以使用scoped_ptr
  pDict->upgradeOpen();
  if(pDict->setAt(strDictName,pXrec,xRecId) != Acad::eOk)
  {
   delete pXrec;
   return false;
  }
  pXrec->close();
}
AcDbObjectPointer<AcDbXrecord> pXrcord(xRecId,AcDb::kForWrite);
if(pXrcord.openStatus() != Acad::eOk) return false;
if(pXrcord->setFromRbChain(*pRbValue) != Acad::eOk) return false;
acutRelRb(pRbValue);
return true;
}

下面是调用增加扩展词典示例程序代码
ads_point p1;
  ads_name Ename,WKEname;
  AcDbObjectId ObjID,BMBKObjID;
  if (acedEntSel(_T("\n选对象1:"),WKEname,p1)!=RTNORM)return;
  acdbGetObjectId(BMBKObjID,WKEname);
  if (acedEntSel(_T("\n选对象2:"),Ename,p1)==RTNORM)
  {
   acdbGetObjectId(ObjID,Ename);
   acutRelRb(XreDa);
   XreDa=acutBuildList(RTENAME,WKEname,0);
   ACHAR Tempchar[MAX_PATH];
   _tcscpy(Tempchar,_T("TestXre"));
   SetEntityDictFromRbChain(ObjID,Tempchar,XreDa);
  }

今天测试,这个加词典的涵数在VS2008 写的ARX2010至2012均能成功加上,然后我把代码放上VS2012写的ARX2015去测试经过调试发现程序运行到if(pXrcord->setFromRbChain(*pRbValue) != Acad::eOk) return false; 这句就不成功退出程序。百思不得其解,发上来请教一下大侠们如何解决ARX2015上面增加词典与的这段小程序。
发表于 2014-11-2 09:31:33 | 显示全部楼层
学习学习.............
发表于 2014-11-7 08:48:46 | 显示全部楼层
路过,学习一下
发表于 2014-11-10 19:24:10 | 显示全部楼层
我这里返回的错误代码是:
eInvalidDxfCode            = 50,

highflybird 2014/11/10 19:17:22
无效的dxf代码
 楼主| 发表于 2014-11-14 11:47:27 | 显示全部楼层
本帖最后由 BDYCAD 于 2014-11-14 12:37 编辑

自解决了:
问题发生在:   XreDa=acutBuildList(RTENAME,WKEname,0);这句, ARX2015和以往的ARX版本有不同之处。
在新建链表时如果acutBuildList涵数时里面使用了RTENAME、RTREAL、RTSTR、RTPOINT.....等方式来做,只能用在ARX2010版本以下。
到了ARX2015版本上面需要写词典的话,acutBuildList涵数里面要使用正规的DXF组码方式的链表,才可以成功写入。之前写ARX比较大意,到今天闲下来尝试才发现有这么一点点差别。特发上来得瑟一下!

在ARX2015正确的示例代码如下:
ads_point p1;
  ads_name Ename,WKEname;
  AcDbObjectId ObjID,BMBKObjID;
  if (acedEntSel(_T("\n选对象1:"),WKEname,p1)!=RTNORM)return;
  acdbGetObjectId(BMBKObjID,WKEname);
  if (acedEntSel(_T("\n选对象2:"),Ename,p1)==RTNORM)
  {
   acdbGetObjectId(ObjID,Ename);
   acutRelRb(XreDa);
   //XreDa=acutBuildList(RTENAME,WKEname,0);//合适ARX2010或以下版本用
   XreDa=acutBuildList(AcDb::kDxfSoftPointerId,WKEname,RTNONE);//合适ARX2015版本用
   ACHAR Tempchar[MAX_PATH];
   _tcscpy(Tempchar,_T("TestXre"));
   SetEntityDictFromRbChain(ObjID,Tempchar,XreDa);

评分

参与人数 1明经币 +1 金钱 +30 收起 理由
highflybir + 1 + 30 很给力!很有用的经验!

查看全部评分

发表于 2014-11-14 12:29:55 | 显示全部楼层
你把解决的那部分代码发上来,给我们看看。
发表于 2014-11-14 15:29:54 | 显示全部楼层
BDYCAD 发表于 2014-11-14 11:47
自解决了:
问题发生在:   XreDa=acutBuildList(RTENAME,WKEname,0);这句, ARX2015和以往的ARX版本有不同 ...

非常有用,感谢BDY
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-16 12:59 , Processed in 0.195072 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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