【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

  • 取消掉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,这几个多的元素应该调用哪些函数进行二次过滤?

  • OBD中的对象基本上都是元素类型Cell(Type=2),要想细分它们,需要调用OBD中的函数才能做到。请看OBD SDK带有的例子:

    C:\Program Files\Bentley\OpenBuildings CONNECT Edition\OpenBuildingsDesignerSDK\OBDSDK\examples\tfshowinfo



    MISSING RESOURCE: VerifiedBy Chao Cheng 

  • 感谢,最后一个问题,

    SetPropertiesTest和SetPriorityTest 这两个方法实现什么效果,该如何使用,头文件里的注释实在是没看懂。

  • 这需要您明白什么是元素的Properties(属性,复数形式的单词)和Priority(优先级,即显示优先级)。比如元素的显示和隐藏就是一个属性,叫做ELEMINVISIBLE,我们可以通过这个来过滤掉被隐藏的元素。SetPriorityTest函数要求我们提供最小优先级和最大优先级两个数,在该显示优先级范围内的元素被扫描到。



    MISSING RESOURCE: VerifiedBy Chao Cheng