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,这几个多的元素应该调用哪些函数进行二次过滤?
感谢,最后一个问题,
SetPropertiesTest和SetPriorityTest 这两个方法实现什么效果,该如何使用,头文件里的注释实在是没看懂。
这需要您明白什么是元素的Properties(属性,复数形式的单词)和Priority(优先级,即显示优先级)。比如元素的显示和隐藏就是一个属性,叫做ELEMINVISIBLE,我们可以通过这个来过滤掉被隐藏的元素。SetPriorityTest函数要求我们提供最小优先级和最大优先级两个数,在该显示优先级范围内的元素被扫描到。
Answer Verified By: Chao Cheng
Priority在帮助文档里找到了,平面遮罩用的。
但是SetPropertiesTest这个方法的两个参数都是UShort类型,怎么比较属性?
m_scanCriteria->SetPropertiesTest (0, ELEINVISIBLE);
感谢,请问截图里的这些定义在哪个头文件里?找了几个和element相关的,都没看到。。。
在设置扫描条件的时候还有点问题,AddSingleElementTypeTest和AddSingleClassTest叠加的时候结果有问题,请问这两个函数是或还是且的关系,测试出来好像是或?
添加条件都是且的关系,元素既要符合AddSingleElementTypeTest设置的条件,又要符合AddSingleClassTest才会被扫描到,您这两个函数设置的什么值?
好像问题出在SetDrawnElements这个函数上?这个函数应该在什么时候使用?我理解,这个函数的作用是返回绘制的可见元素?但是结果好像和我理解的不一样。
//以下返回265个元素 scan->AddSingleClassTest(Bentley::DgnPlatform::DgnElementClass::Primary); //以下返回8个元素 scan->SetDrawnElements(); scan->AddSingleClassTest(Bentley::DgnPlatform::DgnElementClass::Primary); //以下返回2个元素 scan->AddSingleElementTypeTest((int)Bentley::DgnPlatformNET::CellHeader); //以下返回2个元素 scan->AddSingleClassTest(Bentley::DgnPlatform::DgnElementClass::Primary); scan->AddSingleElementTypeTest((int)Bentley::DgnPlatformNET::CellHeader); //以下返回8个元素 scan->SetDrawnElements();//之前测试的时候,未取消此行,导致我认为是或的关系 scan->AddSingleClassTest(Bentley::DgnPlatform::DgnElementClass::Primary); scan->AddSingleElementTypeTest((int)Bentley::DgnPlatformNET::CellHeader);
2. 多次调用AddSingleClassTest 、AddSingleElementTypeTest和 调用一次SetClassTest、SetElementTypeTest的效果是否一样?
3.OBD的墙,在OBD环境下,使用Element Selection工具选中,显示Element Class不属于任何一个分类,但是在OPM环境下是属于Primary分类的,这个问题需要另外开一帖吗?
SetDrawnElements这个函数应该就是设置扫描到需要绘制的元素,排除控制类型的元素。Dgn文件里边有很多不显示的元素,用来保存一些后台的数据。例如共享单元定义元素