老师,您好
我在导入和导出点云的时候,由于界面长时间出现未响应的状态,需要加入进度条,我参考了论坛上符老师的一个例子,如下:
void completionBarTest() { WString txtLine; int percent, totLines = 45267; MSDialogP cmplDbP = mdlDialog_completionBarOpen(L"Reading ASC DEM DataFile ..."); mdlDialog_completionBarUpdate(cmplDbP, NULL, 0); BeFileStatus status; BeTextFilePtr fp = BeTextFile::Open(status, L"D:\\Foo-src\\MDL.V8i\\NorthStar\\catenary\\test\\13.asc", TextFileOpenType::Read, TextFileOptions::KeepNewLine); for (int i = 0; i<totLines; i++) { fp->GetLine (txtLine); percent = i * 100 / totLines; if (percent > 100) percent = 100; mdlDialog_completionBarUpdate(cmplDbP, NULL, percent); } mdlDialog_completionBarClose(cmplDbP); fp->Close(); }
可以出现进度条对话框,但是进度条并不会更新。后来我发现API文档中自带了点云导入和导出的进度接口IPointCloudImportProgress和IPointCloudPodWriterProgress,但是论坛上找不到相关的资料。请问一下,这两个接口该怎么使用?可以提供一下相关的例子?
您是在导入一个点云文件还是多个点云文件?我看您找到的这两个接口是用于多个文件的导入的。其中有totalPercentage和filePercentage两个百分比。
符老师,您好,我是导入的多个文件。
可否提供给我几个大的点云文件做测试?我手头的点云文件都特别小,还没看到进度条呢就完成了。
如果有保密需求,可通过邮件将下载的百度链接发给我。
谢谢!
符老师,点云数据下载的链接已经发到您的邮箱了,请注意查收,谢谢。
如下代码可以出现进度条,但是每个文件一次进度展示,没有用双进度条。
... #include <PointCloud\PointCloudApi.h> ... ... USING_NAMESPACE_BENTLEY_POINTCLOUD .... MSDialogP g_cmplDbP; struct MyPointCloudImportProgress : public IPointCloudImportProgress { virtual bool _OnProgress(WCharCP filename, Int32 TotalPercentage, Int32 FilePercentage, ConvertPhase step) { mdlDialog_completionBarUpdate(g_cmplDbP, filename, FilePercentage); return true; } virtual void _OnError(WCharCP message) { } }; void importPointCloud() { g_cmplDbP = mdlDialog_completionBarOpen(L"PointCloud Importing ..."); mdlDialog_completionBarUpdate(g_cmplDbP, NULL, 0); IPointCloudImporterPtr importer = IPointCloudImporter::CreateImporter(L"PointCloud Importer", *ACTIVEMODEL); BeFileListIterator myIter(L"D:\\ValuableQuestions\\0075.LAS-PointCloud", true); BeFileName myName; while (SUCCESS == myIter.GetNextFileName(myName)) { importer->AddImportFile(myName.GetName()); } MyPointCloudImportProgress progress; importer->SetImportProgress(progress); importer->SetOutputFileName(L"C:\\temp"); importer->SetMultipleOutput(true); importer->ConvertToPOD(); mdlDialog_completionBarClose(g_cmplDbP); }
Answer Verified By: nian chen
符老师,我现在可以用鼠标选中一块点云导出了,麻烦您可以再测试一下IPointCloudPodWriterProgress接口?我写了一个测试代码,进度条还是不能更新,如果您有时间,麻烦您再帮忙测试一下,谢谢。
/**************点云另存为pod进度条测试代码*****************/ bvector<Dpoint3d> rand_point; rand_point.resize(1000*10000); for (int i = 0; i < 1000 * 10000; ++i) { rand_point[i].x = 1024 * rand() / (RAND_MAX + 1.0f); rand_point[i].y = 1024 * rand() / (RAND_MAX + 1.0f); rand_point[i].z = 1024 * rand() / (RAND_MAX + 1.0f); } StatusInt stat; PointCloud::PointCloudPodWriter podW; //将点云导出为pod UChar ch = 0; stat = podW.Initialize(); //Load the dll to write a pod file. if (stat != SUCCESS) { mdlDialog_dmsgsPrint(L"The pod File initialize was failed!"); } WCharCP filename = L"C:\\mypod.pod"; stat = podW.StartStream(filename); if (stat != SUCCESS) { mdlDialog_dmsgsPrint(L"The startstream was completed failed!"); } //podW.SetProgressCallback(myProcessBar); PointCloud::PointCloudPodWriter::AddGroup(/*podW.Group_GenNormals | */podW.Group_RescaleIntensities, L"Group"); stat = podW.AddCloud(/*podW.Cloud_Normal | */podW.Cloud_Intensity, L"myPod", NULL, 0, 0); if (stat != SUCCESS) { mdlDialog_dmsgsPrint(L"create cloud failed!"); } for (int j = 0; j < 1000 * 10000; ++j) { stat = podW.AddPoint(rand_point[j], NULL, 1000, NULL, ch); //myProcessBar._OnProgress(j * 100 / 10000000); //mdlDialog_completionBarUpdate(g_cmplDbP, filename, j * 100 / 10000000); } stat = podW.EndStream(); if (stat != SUCCESS) { mdlDialog_dmsgsPrint(L"EndStream failed!"); } stat = podW.BuildPod(); if (stat != SUCCESS) { mdlDialog_dmsgsPrint(L"BuildPod failed!"); } //mdlDialog_completionBarClose(g_cmplDbP);
我从你以上代码中没有看到你声明了一个派生于IPointCloudPodWriterProgress的一个类,并在该类中重载_OnProgress函数呀。
请仔细读懂我给你代码,然后模仿着写就应该可以的。