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