写扩展词典程序
//加扩展词典独立程序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;
_tcscpy(Tempchar,_T("TestXre"));
SetEntityDictFromRbChain(ObjID,Tempchar,XreDa);
}
今天测试,这个加词典的涵数在VS2008 写的ARX2010至2012均能成功加上,然后我把代码放上VS2012写的ARX2015去测试经过调试发现程序运行到if(pXrcord->setFromRbChain(*pRbValue) != Acad::eOk) return false; 这句就不成功退出程序。百思不得其解,发上来请教一下大侠们如何解决ARX2015上面增加词典与的这段小程序。 学习学习............. 路过,学习一下 我这里返回的错误代码是:
eInvalidDxfCode = 50,
highflybird 2014/11/10 19:17:22
无效的dxf代码 本帖最后由 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;
_tcscpy(Tempchar,_T("TestXre"));
SetEntityDictFromRbChain(ObjID,Tempchar,XreDa);
你把解决的那部分代码发上来,给我们看看。 BDYCAD 发表于 2014-11-14 11:47 static/image/common/back.gif
自解决了:
问题发生在: XreDa=acutBuildList(RTENAME,WKEname,0);这句, ARX2015和以往的ARX版本有不同 ...
非常有用,感谢BDY
页:
[1]