符老师 ,如何获得隔离集里面所有元素(这些元素不一定选中,SelectionSetManager这个不能用) 求符老师指导
可以调用mdlScanCritera_xxx这套函数来扫描。其中有mdlScanCritera_setDisplaySetTest (pScanCriteria, true)来控制对显示集里面的元素的过滤。
顺便问一下符老师 如何判断view存不存在隔离集?
Andy said: 如何判断view存不存在隔离集?
设置mdlScanCritera_setDisplaySetTest 函数中enable的值分别为true和false进行两次扫描,如果两次扫描扫到的元素个数相同,就表示该视图不存在被隔离的元素。
我 后理论没有隔离集了 但还有这个标签 有这个标签 我用函数 mdlView_getDisplayControl 就一直判断有隔离集 这就尬尴了
这个标签仅仅表示View Attributes中的DisplaySet这个开关是On的,并不表明某些元素被隐藏了(隔离了)
mdlScanCritera_setDisplaySetTest true与false 都搜索不到元素
public ref class ScanEle { private: ScanCriteriaP m_sc; static int ScanCallback(ElementRefP eleRef, void* userData, ScanCriteriaP scP); private: static SCG::List<BMElements::Element^>^ m_eles; public: ScanEle() { m_sc = mdlScanCriteria_create(); m_eles = gcnew SCG::List<BMElements::Element^>(); } ~ScanEle() { if(m_sc!=NULL) { mdlScanCriteria_scan(m_sc, nullptr, nullptr, nullptr); mdlScanCriteria_free(m_sc); } } public: void ScanIoslate(bool includeDisplaySet); SCG::List<BMElements::Element^>^ GetScanEles(); }; void ScanEle::ScanIoslate(bool includeDisplaySet) { mdlScanCriteria_setDisplaySetTest(m_sc, includeDisplaySet); } int ScanEle::ScanCallback(ElementRefP eleRef, void* userData, ScanCriteriaP scP) { EditElementHandle eeh(eleRef, scP->GetModelRef());//这里就不会进 BMElements::Element^ scE = ...... m_eles->Add(scE); return 0; } SCG::List<BMElements::Element^>^ ScanEle::GetScanEles() { PFScanElemRefCallback callb = reinterpret_cast<PFScanElemRefCallback>(ScanEle::ScanCallback); mdlScanCriteria_setElemRefCallback(m_sc, callb, NULL); return m_eles; }
您可以试试这个函数elementRef_isInDisplaySet
scanCriteria调用方法不对。你仅创建了scanCriteria并设置了扫描条件,但没有调用关键的mdlScanCriteria_scan函数来启动扫描呀。给你一个我以前写的可以正常工作的调用方法供参考:
int scanCallback(ElementRefP elRef, void* arg, ScanCriteriaP pSC) { ElementAgendaP agdP = reinterpret_cast<ElementAgendaP>(arg); agdP->Insert(elRef, pSC->GetModelRef()); return SUCCESS; } void scanDemo() { ElementAgenda eleList; ScanCriteriaP pScanCriteria = ScanCriteria::Create(); //pScanCriteria->SetDrawnElements(); pScanCriteria->SetModelRef(ACTIVEMODEL); pScanCriteria->AddSingleElementTypeTest(2); pScanCriteria->AddSingleElementTypeTest(106); // 106 = Extended Element //pScanCriteria->AddSingleElementTypeTest(MSElementTypes::LINE_ELM); //pScanCriteria->AddSingleElementTypeTest(MSElementTypes::LINE_STRING_ELM); //pScanCriteria->SetReturnType (MSSCANCRIT_ITERATE_ELMREF, FALSE, FALSE); mdlScanCriteria_setReturnType(pScanCriteria, MSSCANCRIT_ITERATE_ELMREF, FALSE, FALSE); pScanCriteria->SetElemRefCallback((PFScanElemRefCallback)scanCallback, &eleList); pScanCriteria->Scan(); ScanCriteria::Delete(pScanCriteria); WPrintfString wStr(L"agenda size = %d", (int)eleList.size()); mdlDialog_dmsgsPrint(wStr); WString myString, elDescr; for (ElementHandle eh : eleList) { eh.GetHandler().GetDescription(eh, elDescr, 100); myString.Sprintf(L"ElemType = %s(%d), ElementId=%d", elDescr.GetWCharCP(), eh.GetElementType(), eh.GetElementId()); mdlDialog_dmsgsPrint(myString.GetWCharCP()); } }
我是在尽量调用面向对象的方法,你可以都改成函数调用形式,其实都是一样的。对象方式下好像没有与DisplaySet相关的函数。
Answer Verified By: Andy
符老师 我测试过了 mdlScanCritera_setDisplaySetTest就是不会进 设置元素类型 我这也会进 ,是不是还要设置 view之类的呢? 还有model?以及 是否包含 参考的model(因为我的在参考model中)?
如果含有参考模型中的元素,则需要逐个模型(model)去Scan,因为这个ScanCriteria每次只能扫描一个模型(model)。你需要先获得当前模型下的所有模型,然后对每个模型调用一次这个Scan,在每次调用时通过setModel去改变模型,其他条件保持不变。
不行 符老师 当前model隔离也不行 感觉这个mdlScanCritera_setDisplaySetTest 冇 用 .....