我正在尝试将关于我自己制作的网格的数据结构转换为vtu格式文件。感谢我仍然提出的question的答案,我能够创建vtu格式文件。
但是,属于多个单元格的所有点都输出到与文件数量一样多的文件。 (在output.vtu中,NumberOfPoints =“10648”NumberOfCells =“1331”.1331 * 8 = 10648)如果我试图在paraview中看到该文件,我无法打开它。
我不知道如何用共享坐标编写vtkUnstructuredGrid。我会感激任何提示。
这是我写的代码。
MyMesh
包含单元格和顶点信息。
bool writeVtu(MyMesh *mesh, const char *path)
{
// create the append filter
vtkSmartPointer<vtkAppendFilter> append =
vtkSmartPointer<vtkAppendFilter>::New();
// add each data set
for(int i = 0; i < num_cell; i++)
{
append->AddInputData(addCell(mesh->cell(i)));
}
append->Update();
// write the result
vtkSmartPointer<vtkXMLUnstructuredGridWriter> writer =
vtkSmartPointer<vtkXMLUnstructuredGridWriter>::New();
writer->SetFileName(path);
writer->SetInputData(append->GetOutput());
writer->Write();
return true;
}
vtkSmartPointer<vtkUnstructuredGrid>
addCell(MyCell* cell)
{
int numberOfVertices = cell->numVertices();
vtkSmartPointer<vtkPoints> points =
vtkSmartPointer<vtkPoints>::New();
for(int i = 0; i < numberOfVertices; i++){
points->InsertNextPoint(cell->getVertex(i)->getxyz());
}
vtkSmartPointer<vtkIdList> idList = vtkIdList::New();
idList->SetNumberOfIds(numberOfVertices);
for (vtkIdType i = 0; i < numberOfVertices; i++)
{
idList->SetId(i, i);
}
vtkSmartPointer<vtkUnstructuredGrid> ug =
vtkSmartPointer<vtkUnstructuredGrid>::New();
ug->InsertNextCell(
vtkCellType(cell->vtkType()) , idList);
ug->SetPoints(points);
return ug;
}
答案 0 :(得分:0)
Apriori,假设MyMesh
提供顶点的全局标识符,您可以执行以下操作:
bool writeVtu(MyMesh *mesh, const char *path)
{
// create the unstructured grid
vtkSmartPointer<vtkUnstructuredGrid> ug =
vtkSmartPointer<vtkUnstructuredGrid>::New();
// create the shared points structure
vtkSmartPointer<vtkPoints> pts =
vtkSmartPointer<vtkPoints>::New();
pts->SetNumberOfPoints(num_points);
// add each cell
for(int i = 0; i < num_cell; i++)
{
addCell(mesh->cell(i), ug, pts);
}
// add the points
ug->SetPoints(pts);
// write the result
vtkSmartPointer<vtkXMLUnstructuredGridWriter> writer =
vtkSmartPointer<vtkXMLUnstructuredGridWriter>::New();
writer->SetFileName(path);
writer->SetInputData(ug);
writer->Write();
return true;
}
void addCell(MyCell *cell,
vtkSmartPointer<vtkUnstructuredGrid> ug,
vtkSmartPointer<vtkPoints> points)
{
int numberOfVertices = cell->numVertices();
vtkSmartPointer<vtkIdList> idList = vtkIdList::New();
idList->SetNumberOfIds(numberOfVertices);
for(int i = 0; i < numberOfVertices; i++){
int globalId = cell->getVertex(i)->getId();
idList->SetId(i, globalId);
points->SetPoint(globalId, cell->getVertex(i)->getxyz());
}
ug->InsertNextCell(
vtkCellType(cell->vtkType()) , idList);
}
此addCell
版本同时添加拓扑和几何图形,并且在开始时相应地分配管理点的结构。
在这里,我没有使用vtkAppendFilter
,因为我认为一个vtkUnstructuredGrid
可以完成相同的工作(基于代码的原始版本)。
请注意,此代码未经测试,因此请注意它可能包含错误。在插入单元格之前调用ug->Allocate(num_cells)
可能是必要的。
编辑:我按照R. Y的建议将函数SetId()
的第二个参数修改为globalId