[MSCE C++]打开dwg文件的问题

使用API后台打开dwg格式的文件遇到两个问题:

1.如果使用mdlWorkDgn_openFile函数,可以打开文件,但需要将近40秒时间;

2.如果用C++ API,打开文件需要10s左右,但获取不到元素,代码如下,获取到的元素个数是0

 DgnDocumentPtr dgnDocPtr = DgnDocument::CreateForLocalFile(strA.Uni());
 DgnFilePtr dgnFilePtr = DgnFile::Create(*dgnDocPtr, DgnFileOpenMode::ReadOnly);
 dgnFilePtr->LoadDgnFile(NULL);
 ModelId modelId = dgnFilePtr->GetDefaultModelId();
 DgnModelPtr dgnModelPtr = dgnFilePtr->LoadModelById(modelId);
 printf("elm count %d\n", dgnModelPtr->GetElementCount(DgnModelSections::All));

附件是测试用的dwg文件

  • 您获取了dgn文件的模型后 应该激活一下,请参考:

    BeFileName fileName2(fileName);
    DgnDocumentPtr dgnDocument = DgnDocument::CreateForLocalFile(fileName2);
    if (dgnDocument.IsValid())
    {
        s_DgnFile = DgnFile::Create(*dgnDocument, DgnFileOpenMode::ReadOnly);
    
        if (s_DgnFile.IsValid())
             {
                if (SUCCESS == s_DgnFile->LoadDgnFile(nullptr))
                    {
                        for (ModelIndexItemCR modelItem : s_DgnFile->GetModelIndex())
                            {
                                ModelId modelId = modelItem.GetModelId();
                                DgnModelPtr dgnptr = s_DgnFile->LoadModelById(modelId);
                                if (dgnptr->FillSections(DgnModelSections::Model) != SUCCESS)
                                {
                                    return;
                                }
    
                            }
                    }
            }
        }

  • 谢谢分享,确实如您所说,添加FillSections之后能获取到元素了,但时间也从10s提高到36s了。

    我又在v8i版本试了下mdlWorkDgn_openFile函数,相同的代码,在V8i版本需要11s,CE版本需要35s。

    V8i版本代码:

    	char* fileName = "D:\\曹店干渠末端泵站.dwg";
    	DgnModelRefP modelRef = NULL;
    	int format;
    	BoolInt p3D;
    	int tick = System::Environment::TickCount;
    	StatusInt status = mdlWorkDgn_openFile(&modelRef, &format, &p3D, fileName, NULL, TRUE);
    	printf("status:%d\n", status);
    	mdlWorkDgn_closeFile(modelRef);
    	tick = System::Environment::TickCount - tick;
    	printf("tick:%d\n", tick);

    CE版本代码:

    	WCharCP fileName = L"D:\\曹店干渠末端泵站.dwg";
    	DgnModelRefP modelRef = NULL;
    	DgnFileFormatType  format;
    	bool p3D;
    	int tick = System::Environment::TickCount;
    	StatusInt status = mdlWorkDgn_openFile(&modelRef, &format, &p3D, fileName, NULL, true);
    	printf("status:%d\n", status);
    	mdlWorkDgn_closeFile(modelRef);
    	tick = System::Environment::TickCount - tick;
    	printf("tick:%d\n", tick);

    CE版本打开dwg的确是更慢了

  • MSCE处理DWG的方式和V8i不同(废弃了ACIS,直接采用RealDWG了),确实会导致比较慢。这个慢的问题不易解决。

    如果您仔细测试,估计也能发现即使打开DGN文件,CE也会比V8i慢一些,64位的程序需要占用更大的内存和资源,如果代码一点都不修改的话,原则上来说是会比32位慢一些的。