[MSCE U13 C++]点云导入和导出添加进度条的问题

老师,您好

       我在导入和导出点云的时候,由于界面长时间出现未响应的状态,需要加入进度条,我参考了论坛上符老师的一个例子,如下:

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,但是论坛上找不到相关的资料。请问一下,这两个接口该怎么使用?可以提供一下相关的例子?

Parents Reply Children
  • 可否提供给我几个大的点云文件做测试?我手头的点云文件都特别小,还没看到进度条呢就完成了。

    如果有保密需求,可通过邮件将下载的百度链接发给我。

    谢谢!



  • 符老师,点云数据下载的链接已经发到您的邮箱了,请注意查收,谢谢。

  • 如下代码可以出现进度条,但是每个文件一次进度展示,没有用双进度条。

    ...
    #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函数呀。

    请仔细读懂我给你代码,然后模仿着写就应该可以的。