【MSCE C++】ScanCriteria的问题

ScanCriteriaP scan= ScanCriteria::Create();
scan->SetModelRef(ACTIVEMODEL);
scan->SetDrawnElements();
std::vector<ElementRefP> list;
mdlScanCriteria_setDisplaySetTest(scan, true);
scan->SetElemRefCallback(ScanHelper::CallBack, (void*)&list);
scan->AddSingleElementTypeTest(MSElementTypes::CELL_HEADER_ELM);
scan->Scan();

为什么设置了ElementType,扫描结果还有其它类型元素?输出格式为ID;ElementType,

另外,mdlScanCriteria_setDisplaySetTest(scan, true);应该是只扫描可见元素吧,模型里全选只显示有5个元素,但是扫描结果有31个

附件dgn为OBD创建

scantest.dgn

Parents
  • 取消掉scan->SetDrawnElements();和mdlScanCriteria_setDisplaySetTest(scan, true);试一下。

    这些条件之间是叠加的关系。

    DisplaySet是一个特殊的概念,是用来隔离元素的显示用的。



  • 使用以下代码,取消scan->SetDrawnElements();和mdlScanCriteria_setDisplaySetTest(scan, true);后,AddSingleElementTypeTest可以正确返回结果。

    ScanCriteriaP scan= ScanCriteria::Create();
    scan->SetModelRef(ACTIVEMODEL);
    std::vector<ElementRefP> list;
    scan->SetElemRefCallback(ScanHelper::CallBack, (void*)&list);
    scan->AddSingleElementTypeTest(MSElementTypes::CELL_HEADER_ELM);
    scan->Scan();

    但是有个问题,OBD的Element Selection界面的Element Type中的很多选项与MSElementTypes枚举不对应,如果想通过ScanCriteria实现Element Selection相同效果,还需要调用哪些函数?

    2.在使用AddSingleClassTest时返回的结果也与Element Selection不同,使用界面选择Primary选项,显示选中4个元素,通过以下代码,返回8个元素

    ScanCriteriaP scan= ScanCriteria::Create();
    scan->SetModelRef(ACTIVEMODEL);
    scan->SetDrawnElements();//加上这句,返回结果少很多
    scan->AddSingleClassTest(DgnElementClass::Primary);
    std::vector<ElementRefP> list;
    scan->SetElemRefCallback(ScanHelper::CallBack, (void*)&list);
    scan->Scan();

    结果里多了两个不可见的Line对象(可能是幕墙的路径线),Wall对象,一个CellHeadEle,这几个多的元素应该调用哪些函数进行二次过滤?

  • 第一段代码和第二段代码比较,SetDrawnElements()看来是起作用了,过滤掉了很多元素。

    但是,第四段和第五段代码,调用SetDrawnElements()后结果增加,不太明白为什么,增加了限制条件,结果应该不变或变少啊?

    还有另外两个问题能否给点提示?

  • DgnElementClass(Primary或Construction)和ElementType是对元素的不同侧面的分类方法。不可见元素或可见元素都可以是Primary或Construction的。

    第一段代码和第二段代码比较,SetDrawnElements()看来是起作用了,过滤掉了很多元素。

    总共有265个Primary的元素,其中仅有8个是可显示的。可知有不可显示的元素为265-8个。

    但是,第四段和第五段代码,调用SetDrawnElements()后结果增加,不太明白为什么,增加了限制条件,结果应该不变或变少啊?

    第四段将过滤条件限定到了仅过滤CellHeader(单元头),所以只有2个。而第五段代码又增加了SetDrawnElements则会把8个可显示元素都扫描到。当然,2个CellHeader也在这8个内。

    多次调用AddSingleClassTest 、AddSingleElementTypeTest和  调用一次SetClassTest、SetElementTypeTest的效果是否一样?

    如果参数给的都相同的话,效果是一样的。但如果多次调用AddSingleElementTypeTest给的参数不同,则会将每次的参数“或”后作为结果。

    OBD的墙,在OBD环境下,使用Element Selection工具选中,显示Element Class不属于任何一个分类,但是在OPM环境下是属于Primary分类的,这个问题需要另外开一帖吗?

    一般不要用Element Class而要要用Element Type来分类元素。正如开头所属,Element Class和Element Type是从不同方面对元素分类的。比如,一个元素可以是Primary Line,也可以是Construction Line。而Line是DrawnElement。



  • OK,不使用Element Class。

    但是对SetDrawnElements的作用还是很困惑

    SetDrawnElements与AddSingleElementTypeTest看起来是或的关系?条件叠加为什么不是且?

    //以下返回31个元素
    scan->SetDrawnElements();
    
    //以下返回2个元素
    scan->AddSingleElementTypeTest((int)Bentley::DgnPlatformNET::CellHeader);
    
    //以下返回31个元素
    scan->SetDrawnElements();
    scan->AddSingleElementTypeTest((int)Bentley::DgnPlatformNET::CellHeader);

    左图是独立使用AddSingleElementTypeTest,剩下两种情况都是右图。

         

  • 有些是或(同一大类的)有些是与(不同大类的)的关系。比如多个AddSingleElementTypeTest就是或的关系,而SetDrawnElements相当于多个AddSingleElementTypeTest,所以,它和AddSingleElementTypeTest也是或的关系。

    但AddSingleClassTest与ElementType不一类,它们之间就是与的关系了。



    Answer Verified By: Chao Cheng 

  • 感谢解惑,原本SetDrawnElements是Element type的集合,终于理清了……

    目前按Element Selection工具的选项卡来分,不同标签为一个大类,相同大类下为或,不同大类下为且。这么理解,上面这些组合结果好像就说得通了。

Reply Children
No Data