【MSCE C++】 遍历模型文件元素,并直接提取元素的属性

老师好,我现在想实现对一个模型的元素进行提取其相关属性。读取元素并进行判断代码:

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:\RebarSDKzuixinb
eifen\RebarSDK\RebarSDKExample.vcxproj]

想请老师帮我看下这段读取元素并提取属性的这段代码,谢谢

Parents
  • PersistentElementRefList *pGraElement = ISessionMgr::GetActiveDgnModelP()->GetGraphicElementsP();
     for (PersistentElementRefP elemRef : *pGraElement) {
      EditElementHandle eeh(elemRef); 

    上面这两三行代码可以实现提取到模型文件的元素吗?现在编译报错指示就是这个函数导致没有生成“object”文件。

  • 根据您黑窗口的提示,主要问题是你的函数ExportProperties写得有问题。推测该函数是有返回值的,但你的函数中并非每个分支都有正确的返回值。请先修正该函数后再编译。

    ——————————————————————————————————————————————

    不好意思,您已经贴出该函数的代码了。你函数无返回值,但你在循环中用了return ERROR; 从而造成警告错误。



  • 符老师你好,我上面这个写法,没有拿到具体元素的句柄。如果我要通过加载命令行,直接拿到模型的元素出来,然后再构造元素句柄,上面这个写法有什么问题吗?

    PersistentElementRefList *pGraElement = ISessionMgr::GetActiveDgnModelP()->GetGraphicElementsP();
     for (PersistentElementRefP elemRef : *pGraElement) {
      EditElementHandle eeh(elemRef); 

    或者从模型中直接遍历拿到每一个元素还有其他什么写法吗?麻烦符老师解答

  • 这个写法是可以的。还有就是调用ScanCriteria根据一些准则扫描元素。



  • 符老师,我调试的时候,这个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;
    	  }

Reply
  • 符老师,我调试的时候,这个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;
    	  }

Children