如何使用共享坐标编写 vtkUnstructuredGrid
How to write vtkUnstructuredGrid with sharing coordinates
我正在尝试将我自己制作的关于网格的数据结构转换为vtu 格式文件。多亏了本人的回答,我才能够创建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;
}
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
我正在尝试将我自己制作的关于网格的数据结构转换为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;
}
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