VTK9.3で、PLY読み込みなどを行う際に進捗状況を%表示する方法。
vtkProgressObserverを指定するSetProgressObserverメンバ関数はvtkAlgorithmで定義されているので、vtkAlgorithmを継承した処理でないとこの方法は使えない。
1.vtkProgressObserverを継承したMyProgressObserverを定義
2.UpdateProgressをオーバーライドし、amountから進捗を取得
3.MyProgressObserverのインスタンスを作成
4.vtkPLYReaderなどのインスタンスを作成
5.SetProgressObserverにオブザーバーのポインタを与える
// 進捗管理用 #include <vtkProgressObserver.h> // PLYファイル読み込み用 #include <vtkPLYReader.h> // 読み込めているか確認用 #include <vtkPointData.h>
////////////////////////////////////////////////// // 進捗管理のためにvtkProgressObserverを継承したクラスを作成 class MyProgressObserver : public vtkProgressObserver { public: // UpdateProgressをオーバーライド virtual void UpdateProgress(double amount)override { // 進捗を表示 printf("== %d\n", int(amount*100) );// amountは進捗状況を0.0~1.0で表現 } };
void myload() { const char* filename = "C:\\test\\mill.ply"; //////////////////////////////////////////////////////////// // 進捗管理用のオブザーバを作成 vtkSmartPointer<MyProgressObserver> observer = vtkSmartPointer<MyProgressObserver>(new MyProgressObserver); //////////////////////////////////////////////////////////// // PLYファイルを読み込むオブジェクト作成 vtkSmartPointer<vtkPLYReader> plyReader = vtkSmartPointer<vtkPLYReader>::New(); plyReader->SetProgressObserver(observer);// オブザーバを設定 plyReader->SetFileName(filename); plyReader->Update(); //////////////////////////////////////////////////////////// // 読み込んだデータを取得 vtkSmartPointer<vtkPolyData> polyData = plyReader->GetOutput(); vtkSmartPointer<vtkPoints> points = polyData->GetPoints(); if (points == nullptr) { return; } for (vtkIdType i = 0; i < points->GetNumberOfPoints(); i++) { double p[3]; points->GetPoint(i, p); printf("%lf %lf %lf\n", p[0], p[1], p[2]); } }