スポンサーリンク

VTKライブラリのデータ保存形式vtmの出力

vtkPolyData一つだけであればvtp形式で保存できるが、複数のvtkPolyDataを保存する場合はvtm形式にする。vtmは一つの.vtmと、各vtkPolyData毎に.vtpを出力する。

#include <iostream>

//VTK_MODULE_INITに必要
#include <vtkAutoInit.h>

#include <vtkSmartPointer.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>


#include <vtkActor.h>
#include <vtkPolyData.h>
#include <vtkCellArray.h>
#include <vtkPoints.h>
#include <vtkLine.h>
#include <vtkTriangle.h>
#include <vtkPolyDataMapper.h>
//properties
#include <vtkProperty.h>
#include <vtkPolyLine.h>

#include <vtkCylinderSource.h>

#include <vtkXMLPolyDataWriter.h>
#include <vtkXMLMultiBlockDataWriter.h>
#include <vtkMultiBlockDataSet.h>

#pragma comment(lib,"opengl32.lib")
#pragma comment(lib,"psapi.lib")
#pragma comment(lib,"dbghelp.lib")
#pragma comment(lib,"ws2_32.lib")


//必須
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);


vtkSmartPointer<vtkPolyData> PolyLine() {
    // ポイントデータの作成
    vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();

    double rrr = 1.0;
    points->InsertNextPoint(0.0, 0.0, 0.0);
    points->InsertNextPoint(-rrr, 0.0, 0.0);
    points->InsertNextPoint(-rrr, 0.0, rrr);
    points->InsertNextPoint(0.0, 0.0, rrr);
    points->InsertNextPoint(0.0, 0.0, 0.0); // 閉じた形状

    // PolyLineの作成
    vtkSmartPointer<vtkPolyLine> polyLine = vtkSmartPointer<vtkPolyLine>::New();
    polyLine->GetPointIds()->SetNumberOfIds(5);  // 点の数

    for (vtkIdType i = 0; i < 5; ++i)
    {
        polyLine->GetPointIds()->SetId(i, i);
    }

    // CellArrayに追加
    vtkSmartPointer<vtkCellArray> cells = vtkSmartPointer<vtkCellArray>::New();
    cells->InsertNextCell(polyLine);

    // PolyDataの作成
    vtkSmartPointer<vtkPolyData> polyData = vtkSmartPointer<vtkPolyData>::New();
    polyData->SetPoints(points);
    polyData->SetLines(cells);

    return polyData;
}

vtkSmartPointer<vtkPolyData> PolyCylinder() {
    // vtkCylinderSource の作成
    vtkSmartPointer<vtkCylinderSource> cylinderSource = vtkSmartPointer<vtkCylinderSource>::New();
    cylinderSource->SetHeight(5.0);
    cylinderSource->SetRadius(0.2);
    cylinderSource->SetResolution(50);
    cylinderSource->Update(); // 出力を確定させる

    // vtkPolyData に変換
    vtkSmartPointer<vtkPolyData> cylinderPolyData = cylinderSource->GetOutput();

    return cylinderPolyData;
}

void save_as_vtm(std::vector<vtkSmartPointer<vtkPolyData>> polyDataList, const std::string& filename) {

    vtkSmartPointer<vtkXMLMultiBlockDataWriter> writer = vtkSmartPointer<vtkXMLMultiBlockDataWriter>::New();
    writer->SetFileName(filename.c_str());

    vtkSmartPointer<vtkMultiBlockDataSet> multiBlock = vtkSmartPointer<vtkMultiBlockDataSet>::New();
    for (size_t i = 0; i < polyDataList.size(); ++i) {
        multiBlock->SetBlock(i, polyDataList[i]);
    }

    writer->SetInputData(multiBlock);
    writer->Write();
}
int main(int /*argc*/, char** /*argv*/)
{
    vtkSmartPointer<vtkPolyData>  polyline = PolyLine();
    vtkSmartPointer<vtkPolyData> cylinder = PolyCylinder();


    save_as_vtm({ polyline, cylinder }, "items.vtm");
    
    vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
    renderer->SetBackground(0.1, 0.1, 0.1);


    vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
    mapper->SetInputData(polyline);

    // Actorの作成
    vtkSmartPointer<vtkActor> actorPolyline = vtkSmartPointer<vtkActor>::New();
    actorPolyline->SetMapper(mapper);

    vtkSmartPointer<vtkPolyDataMapper> cylinderMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
    cylinderMapper->SetInputData(cylinder);

    vtkSmartPointer<vtkActor> cylinderActor = vtkSmartPointer<vtkActor>::New();
    cylinderActor->SetMapper(cylinderMapper);


    renderer->AddActor(actorPolyline);
    renderer->AddActor(cylinderActor);


    vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
    renderWindow->AddRenderer(renderer);

    vtkSmartPointer<vtkRenderWindowInteractor> interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
    interactor->SetRenderWindow(renderWindow);

    renderWindow->Render();
    interactor->Start();

    return 0;
}

実行すると、

  • items.vtm
  • items/items_0.vtp
  • items/items_1.vtp

の3ファイルが出力される。

動作確認はparaviewでできる。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: