老师好,我现在想实现对一个模型的元素进行提取其相关属性。读取元素并进行判断代码:
void ExportProperties(WCharCP unparsed) { BeXMLRoot dialog_xml_node; PersistentElementRefList *pGraElement = ISessionMgr::GetActiveDgnModelP()->GetGraphicElementsP(); for (PersistentElementRefP elemRef : *pGraElement) { EditElementHandle eeh(elemRef); BeXMLNode *elmNode = dialog_xml_node.AddXMLNode(L"RebarElement"); if (RebarElement::IsRebarElement(eeh)) { RebarElementCP rep = RebarElement::Fetch(eeh); RebarDataToXmlHelper::ProcessRebarElement(*elmNode, rep, eeh.GetModelRef()); return ERROR; } dialog_xml_node.WriteFile(L"E://RebarProperties.xml"); } }
我的代码实现思路是:先从模型中读取到元素,然后再判断元素是否我要提取的元素,再提取元素的属性写到XML文件。
但现在编译提示没有生成对象文件。
“E:\RebarSDKzuixinbeifen\RebarSDK\RebarSDKExample.vcxproj”(Rebuild 目标) (1) ->(ClCompile 目标) -> e:\rebarsdkzuixinbeifen\rebarsdk\exportproperties.cpp(180): error C2220: 警告被视为错误 - 没有生成“object”文件 [E:\RebarSDKzuixinbeifen\RebarSDK\RebarSDKExample.vcxproj]
想请老师帮我看下这段读取元素并提取属性的这段代码,谢谢
谢谢符老师的解答,已经成功实现提取属性
根据你列出的IsRebarElement函数的原型来看,你传递的没有问题。推测应该是你当前拿到的eeh不是钢筋元素从而if条件没有成立吧。你首先要确认你的模型中存在Rebar(钢筋)元素。
Answer Verified By: wu xuebin
符老师,我调试的时候,这个if条件里面的语句没有执行,也就是if条件为假,而 if条件的函数参数类型 static bool IsRebarElement(ElementHandleCR eh); 这里该怎么进行转换,是我传的值有问题?还是类型转换的有问题?若是类型转换这里该怎么转换呢?
mdlDialog_dmsgsPrint(L"ProcessRebarElement222 start"); PersistentElementRefList *pGraElement = ISessionMgr::GetActiveDgnModelP()->GetGraphicElementsP(); for (PersistentElementRefP elemRef : *pGraElement) { EditElementHandle eeh(elemRef); BeXMLNode *elmNode = dialog_xml_node.AddXMLNode(L"RebarElementAA"); mdlDialog_dmsgsPrint(L"ProcessRebarElement333 start"); if (RebarElement::IsRebarElement(eeh)) { mdlDialog_dmsgsPrint(L"ProcessRebarElement444 start"); //MSElementP elP = const_cast<MSElementP> (eeh.GetElementCP()); RebarElementCP rep = RebarElement::Fetch(eeh); mdlDialog_dmsgsPrint(L"ProcessRebarElement555 start"); RebarDataToXmlHelper::ProcessRebarElement(*elmNode, rep, eeh.GetModelRef()); mdlDialog_dmsgsPrint(L"1_OnElementModify1 start"); return ERROR; } dialog_xml_node.WriteFile(L"E://RebarSDKProperties.xml"); mdlDialog_dmsgsPrint(L"ProcessRebarElement666 start"); return TRUE; }
这个写法是可以的。还有就是调用ScanCriteria根据一些准则扫描元素。
符老师你好,我上面这个写法,没有拿到具体元素的句柄。如果我要通过加载命令行,直接拿到模型的元素出来,然后再构造元素句柄,上面这个写法有什么问题吗?
PersistentElementRefList *pGraElement = ISessionMgr::GetActiveDgnModelP()->GetGraphicElementsP(); for (PersistentElementRefP elemRef : *pGraElement) { EditElementHandle eeh(elemRef);
或者从模型中直接遍历拿到每一个元素还有其他什么写法吗?麻烦符老师解答