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; }
実行すると、
の3ファイルが出力される。
動作確認はparaviewでできる。