Post

XM MDL Programming - #4(Element 탐색하기)

이번에는 dgn 파일에 있는 element들을 찾는 방법을 알아보도록 합시다.

먼저 간단한 코드를 먼저 보시죠.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
int ScanFile(UShort* typeMask , constintmaskSize)
{
    intstatus = 0;
    intnElemCnt = 0;
    intnElemType;
    ULong elemAddr[50];

    ScanCriteria* pScanCrit = NULL;

    UShort usTypeMask[8];

    MSElement element;

    // Initialize the scan criteria
    pScanCrit = mdlScanCriteria_create();

    mdlScanCriteria_setReturnType(pScanCrit, MSSCANCRIT_RETURN_FILEPOS, FALSE, FALSE);

    memset(usTypeMask, 0, sizeof(usTypeMask));

    mdlScanCriteria_setElementTypeTest(pScanCrit , typeMask , maskSize);
    mdlScanCriteria_setModel (pScanCrit,mdlModelRef_getActive());

    mdlScanCriteria_setElementCategory (pScanCrit,ELEMENT_CATEGORY_GRAPHICS);

    do
    {
        intscanWords = sizeof(elemAddr) / sizeof(short);
        status = mdlScanCriteria_scan(pScanCrit, elemAddr, &scanWords, NULL);

        if( status == BAD_FILE || status == BAD_ELEMENT ) break;

        intnumAddr = scanWords / sizeof(short);
        for(inti=0; i < numAddr; i++)
        {
            if(mdlElement_read(&element, MASTERFILE, elemAddr[i]) == SUCCESS)
            {
                nElemCnt++;
                nElemType = mdlElement_getType(&element);
            }
        } //end for
    } while(status == BUFF_FULL);

    mdlScanCriteria_free(pScanCrit);

    return nElemCnt;
}

원리는 먼저 ScanCriteria 생성한 후에 탐색할 Element Type을 설정합니다. 그리고 난후 ScanCriteria로 탐색을 하면 설정한 Element Type만 탐색을 하게 됩니다. 또한 탐색한 Element의 file position을 돌려줍니다.

모든 프로그래밍에서도 다 그렇지만 생성한 ScanCriteria를 해제해 주면 됩니다.