怎么通过扫描函数 扫描到当前 活动模型中所有元素 与参考模型中的所有元素.只需获取与当前活动模型相关的参考,参考可能多重

vec_buildings.clear();
UShort typeMask[6];
memset(typeMask, 0, sizeof(typeMask));
typeMask[0] = TMSK0_CELL_HEADER;//扫描cell 建筑元素一定都为cell元素
ScanCriteria* pScanCriteria = NULL;

mdlSelect_allElements();
printf("asdas dasd ");
mdlSelect_freeAll();
if (NULL != (pScanCriteria = mdlScanCriteria_create()) && SUCCESS == mdlScanCriteria_setModel(pScanCriteria, ACTIVEMODEL))
{
mdlScanCriteria_setReturnType(pScanCriteria, MSSCANCRIT_ITERATE_ELMDSCR, FALSE, TRUE);
mdlScanCriteria_setElementTypeTest(pScanCriteria, typeMask, sizeof(typeMask));

//传入参数为空 GetConstructInfoCallback扫描是回调函数
mdlScanCriteria_setElmDscrCallback(pScanCriteria, GetConstructInfoCallback, NULL);
mdlScanCriteria_setStopFilePos(pScanCriteria, mdlModelRef_getEof(MASTERFILE));
mdlScanCriteria_scan(pScanCriteria, NULL, NULL, NULL);
mdlScanCriteria_free(pScanCriteria);
}

老师:这是我的代码只能参考到当前模型中的元素,请问该怎么改进

  • 下边的代码是以前在v8i上写的反选当前选的元素,您可以参考一下:

    	ModelRefIteratorP mrIteratorP;
    	mdlModelRefIterator_create(&mrIteratorP, ACTIVEMODEL, MRITERATE_Root |
    		MRITERATE_PrimaryChildRefs | MRITERATE_ExtendedChildRefs, -1);
    	UInt32* fpp = NULL;
    	DgnModelRefP* dgnModelRefPP = NULL;
    	int nSelected = NULL;
    	mdlSelect_returnPositions(&fpp, &dgnModelRefPP, &nSelected);
    	mdlSelect_freeAll();
    	ScanCriteriaP scanCriP = mdlScanCriteria_create();
    	mdlScanCriteria_setReturnType(scanCriP, MSSCANCRIT_RETURN_FILEPOS, FALSE, TRUE);
    	mdlScanCriteria_setDrawnElements(scanCriP);
    	mdlScanCriteria_setDisplaySetTest(scanCriP, TRUE);
    	mdlScanCriteria_setElementCategory(scanCriP, ELEMENT_CATEGORY_GRAPHICS);
    	UInt32	    scanBuf[MAX_INTERNAL_ELEM_SIZE];
    	int rangeNum = 0;
    	for (DgnModelRefP dgnModelRefPCur = mdlModelRefIterator_getCurrent(mrIteratorP); dgnModelRefPCur != NULL;
    		dgnModelRefPCur = mdlModelRefIterator_getNext(mrIteratorP))
    	{
    		DgnCacheP dgnCachePCur = mdlModelRef_getCache(dgnModelRefPCur); 
    		mdlScanCriteria_setModel(scanCriP, dgnModelRefPCur);
    		rangeNum = sizeof (scanBuf) / sizeof (short);
    		mdlScanCriteria_scan(scanCriP, scanBuf, &rangeNum, NULL);
    
    		for (int i = 0; i < rangeNum / 2; i++)
    		{
    			int j = 0;
    			for (; j < nSelected; j++)
    			{
    				if (dgnModelRefPP[j] == dgnModelRefPCur&&fpp[j] == scanBuf[i])
    				{
    					break;
    				}
    			}
    			if (j == nSelected)
    			{
    				ElementRef eleRef = dgnCache_findElemByFilePos(dgnCachePCur, scanBuf[i], TRUE);
    				mdlSelect_addElementByRef(eleRef, dgnModelRefPCur, 2, SELECT_NEW, FALSE);
    			}
    		}
    	}
    	mdlScanCriteria_free(scanCriP);
    	mdlModelRefIterator_free(&mrIteratorP);
    	dlmSystem_mdlFree((void*)fpp);
    	dlmSystem_mdlFree((void*)dgnModelRefPP);

  • 如果是MSCE下编程的话,还有一个

    ReachableModelRefCollection modelRefCol = ISessionMgr::GetActiveDgnModelRefP()->GetReachableModelRefs();
    for (DgnModelRefP modelRef : modelRefCol)
    {
        对modelRef进行扫描
    }



    Answer Verified By: chen chen