使用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文件
曹店干渠末端泵站.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位慢一些的。