符老师 ,如何获得隔离集里面所有元素(这些元素不一定选中,SelectionSetManager这个不能用) 求符老师指导
可以调用mdlScanCritera_xxx这套函数来扫描。其中有mdlScanCritera_setDisplaySetTest (pScanCriteria, true)来控制对显示集里面的元素的过滤。
顺便问一下符老师 如何判断view存不存在隔离集?
mdlView_getDisplayControl(VIEWCONTROL_DISPLAYSET...
小郭老师 我都displayclear了 mdlView_getDisplayControl还是得到1 我发现 我displayclear后 还有这个标记 是不是按这个标记来的?
是的,上边返回的就是如下图所示的View Attributes的DisplaySet的开关状态,您可以试试选中若干元素后放到显示集中,然后反复打开关闭这个开关,就明白了
Andy said: 如何判断view存不存在隔离集?
设置mdlScanCritera_setDisplaySetTest 函数中enable的值分别为true和false进行两次扫描,如果两次扫描扫到的元素个数相同,就表示该视图不存在被隔离的元素。
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中)?