[C++\C# MSCE] 获得隔离集所有元素

符老师  ,如何获得隔离集里面所有元素(这些元素不一定选中,SelectionSetManager这个不能用)   求符老师指导

Parents Reply Children
  • 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;
    }
       CLR代码如下

  • 您可以试试这个函数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中)?