Можно ли использовать средства записи (polyData) в VTK для типов данных из других библиотек?

Я использую ParaView для визуализации данных, и поэтому мне нужно написать свои собственные данные в поддерживаемом формате (например, ASCII .vtk). Для этой цели я написал устаревший писатель ASCII .vtk, и он работает нормально. Однако, поскольку я написал приложение с интенсивной записью, которое работает параллельно, я хотел бы попробовать средство записи vtk XML.

Можно ли повторно использовать авторов с классами, которые поступают из другой библиотеки?

Смотря на vtkPolyDataWriter документация, Я заметил, что VTK является объектно-ориентированным и что авторы в значительной степени полагаются на поток «Visualization Pipeline» с использованием портов, например:

 353     vtkNew<vtkPolyDataWriter> writer0;
354     writer0->SetFileName( "./hyperTreeGridContour.vtk" );
355     writer0->SetInputConnection( contour->GetOutputPort() );
356     writer0->Write();

от Пример vtkPolyData.

Можно ли использовать повторно? писатели с классами вне иерархии ВТК?

Записываемый объект должен быть vtkObject, но vtkPolyData Класс, который записывается в конце, еще больше зависит от конкретных типов VTK.

1

Решение

Не нужно делать что-то модное. Просто есть метод WriteVTKPolyData (), который использует классы VTK.

#include <vtkXMLPolyDataWriter.h>
#include <vtkSmartPointer.h>
#include <vtkCellArray.h>
#include <vtkPolyData.h>
#include <vtkVersion.h>
#include <vtkPoints.h>
class MyClass {
/* ... */
public:
void WriteVTKPolyData(const char * file_name) const;
};
void MyClass::WriteVTKPolyData(const char * file_name) const {
vtkSmartPointer<vtkPolyData> polyData =
vtkSmartPointer<vtkPolyData>::New();
vtkSmartPointer<vtkPoints> points =
vtkSmartPointer<vtkPoints>::New();
// EXAMPLE CODE POPULATING VTKPOLYDATA
points->InsertNextPoint(+1, +1, +1);
points->InsertNextPoint(-1, -1, +1);
points->InsertNextPoint(-1, +1, -1);
points->InsertNextPoint(+1, -1, -1);
polyData->SetPoints(points);
vtkSmartPointer<vtkCellArray> polys  =
vtkSmartPointer<vtkCellArray>::New();
vtkIdType cell[3];
cell[0] = 0; cell[1] = 2; cell[2] = 1;
polys->InsertNextCell(3,cell);
cell[0] = 1; cell[1] = 2; cell[2] = 3;
polys->InsertNextCell(3,cell);
cell[0] = 2; cell[1] = 0; cell[2] = 3;
polys->InsertNextCell(3,cell);
cell[0] = 3; cell[1] = 0; cell[2] = 1;
polys->InsertNextCell(3,cell);
polyData->SetPolys(polys);
// END EXAMPLE CODE POPULATING
vtkSmartPointer<vtkXMLPolyDataWriter> writer =
vtkSmartPointer<vtkXMLPolyDataWriter>::New();
writer->SetFileName(file_name);
#if VTK_MAJOR_VERSION <= 5
writer->SetInput(polyData);
#else
writer->SetInputData(polyData);
#endif
writer->Write();
}

int main(int argc, char ** argv) {
MyClass myObject;
myObject.WriteVTKPolyData("out.vtp");
}

Если вы хотите сохранить точки и многоугольники в памяти при редактировании:

#include <vtkXMLPolyDataWriter.h>
#include <vtkSmartPointer.h>
#include <vtkCellArray.h>
#include <vtkPolyData.h>
#include <vtkVersion.h>
#include <vtkPoints.h>
class MyClass {
vtkSmartPointer<vtkPolyData> m_PolyData;
vtkSmartPointer<vtkPoints> m_Points;
vtkSmartPointer<vtkCellArray> m_Polygons;
/* ... */
public:
/* ... */
MyClass();
void WriteVTKPolyData(const char * file_name) const;
void f();
};
MyClass::MyClass() :
m_PolyData(vtkSmartPointer<vtkPolyData>::New()),
m_Points(vtkSmartPointer<vtkPoints>::New()),
m_Polygons(vtkSmartPointer<vtkCellArray>::New())
{
m_PolyData->SetPoints(m_Points);
m_PolyData->SetPolys(m_Polygons);
}
void MyClass::f() {
// EXAMPLE CODE POPULATING VTKPOLYDATA
m_Points->InsertNextPoint(+1, +1, +1);
m_Points->InsertNextPoint(-1, -1, +1);
m_Points->InsertNextPoint(-1, +1, -1);
m_Points->InsertNextPoint(+1, -1, -1);
vtkIdType cell[3];
cell[0] = 0; cell[1] = 2; cell[2] = 1;
m_Polygons->InsertNextCell(3,cell);
cell[0] = 1; cell[1] = 2; cell[2] = 3;
m_Polygons->InsertNextCell(3,cell);
cell[0] = 2; cell[1] = 0; cell[2] = 3;
m_Polygons->InsertNextCell(3,cell);
cell[0] = 3; cell[1] = 0; cell[2] = 1;
m_Polygons->InsertNextCell(3,cell);
// END EXAMPLE CODE POPULATING
}
void MyClass::WriteVTKPolyData(const char * file_name) const {
vtkSmartPointer<vtkXMLPolyDataWriter> writer =
vtkSmartPointer<vtkXMLPolyDataWriter>::New();
writer->SetFileName(file_name);
#if VTK_MAJOR_VERSION <= 5
writer->SetInput(m_PolyData);
#else
writer->SetInputData(m_PolyData);
#endif
writer->Write();
}

int main(int argc, char ** argv) {
MyClass myObject;
myObject.f();
myObject.WriteVTKPolyData("out.vtp");
}
2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector