Как преобразовать меш в формат VTK?

У меня есть сетка в собственном формате, и я хочу экспортировать ее в файл .vtk. Как мне это сделать?

Исходный меш имеет следующий формат: (псевдокод)

class Mesh {

   List<Float[3]> _coordinates

   List<int[4]> _tetra //(elements, Faces, etc.)

}

Надеюсь, это прояснит мою проблему. Я просто хочу загрузить его с помощью Paraview, поэтому мне все равно, будет ли он структурированным, полигональным и т. д.


person Alvaro Fuentes    schedule 22.11.2013    source источник


Ответы (2)


Вы можете создать vtkUnstructuredGrid:

//vtkPolyData *data = vtkPolyData::New();
vtkUnstructuredGrid *mesh = vtkUnstructuredGrid::New();
vtkPoints *points = vtkPoints::New();
vtkCellArray *cells = vtkCellArray::New();

//vtkIdType pointIDs[4];

std::vector<point>::const_iterator iterator1 = fpoints.begin();

point aux;

if ( event_report != NULL ) { event_report->SetMaxTicks(fpoints.size() + fnodes.size()); }
points->SetNumberOfPoints(fpoints.size());
int pointId = 0;
for (;iterator1 != fpoints.end();iterator1++)
{
    aux = *iterator1;
    points->SetPoint(pointId, aux.coord);
    pointId++;
}

std::vector<node>::const_iterator iterator2 = fnodes.begin();

node aux1;

vtkSmartPointer<vtkIdTypeArray> idCells = 
  vtkSmartPointer<vtkIdTypeArray>::New();
idCells->SetNumberOfComponents(5);
idCells->SetNumberOfTuples(fnodes.size());

int cellIndex = 0;
for (;iterator2 != fnodes.end(); iterator2++)
{
    aux1 = *iterator2;
    vtkIdType * tuple = new vtkIdType[4];
    tuple[0] = 4;
    tuple[1] = aux1.indexs[0] - 1;
    tuple[2] = aux1.indexs[1] - 1;
    tuple[3] = aux1.indexs[2] - 1;
    tuple[4] = aux1.indexs[3] - 1;
    idCells->SetTupleValue(cellIndex, tuple);
    cellIndex++;
}
cells->SetCells(fnodes.size(), idCells);

mesh->SetPoints(points);
mesh->SetCells(VTK_TETRA, cells);

//vtkPolyDataWriter *writer = vtkPolyDataWriter::New();
vtkUnstructuredGridWriter *tetra_writer = vtkUnstructuredGridWriter::New();
tetra_writer->SetFileName( filename );

#if VTK_MAJOR_VERSION <= 5
    tetra_writer->SetInput(mesh);
#else
    tetra_writer->SetInputData(mesh);
#endif

tetra_writer->Write();
tetra_writer->Delete( );
person El Marce    schedule 22.11.2013
comment
У меня нет сетки, и я хочу создать сетку тетраэдра из vtkPolyData, как мне это сделать (есть ли примеры)? Мой другой вопрос заключается в том, что вы прокомментировали data (первая строка), какие входные данные здесь для создания сетки, а затем unstructuredGrid? - person sc241; 06.11.2019

Проверьте meshio (мой проект), он поможет вам преобразовать сетки из многих форматов во многие другие (включая ВТК). Код интерфейса VTK может дать вам представление о том, как настроить его.

person Nico Schlömer    schedule 12.01.2017
comment
Спасибо, я думаю, это очень полезно. - person Alvaro Fuentes; 13.01.2017
comment
Спасибо, это пригодится. Я работаю с VTK на бэкэнде и хотел бы генерировать сетки. Мне нужно включить набор геологических горизонтов, представляющих плоскости напластования. Порекомендуете ли вы какие-либо генераторы сеток? - person skytaker; 22.04.2017
comment
@NicoSchlömer Спасибо, что поделились своим проектом, у вас есть примеры C++ для ITK и VTK? Я изо всех сил пытаюсь извлечь неструктурированную сетку тетраэдра из файла двоичной метки vtkImageData. - person sc241; 06.11.2019