我想在一个.vtu文件中编写多个非结构化网格。
我在下面试过。MakeHexagonalPrism()和MakeHexahedron()返回vtkSmartPointer类型。结果是输出文件中只有一个非结构化网格。
vtkSmartPointer<vtkXMLUnstructuredGridWriter> writer =
vtkSmartPointer<vtkXMLUnstructuredGridWriter>::New();
writer->SetFileName(filename.c_str());
writer->SetInputData(MakeHexagonalPrism());
writer->SetInputData(MakeHexahedron());
writer->Write();
我也在下面试过。cellArray1和cellArray2的类型是vtkSmartPointer。结果是输出文件中只有一种类型的非结构化网格。
vtkSmartPointer<vtkUnstructuredGrid> unstructuredGrid =
vtkSmartPointer<vtkUnstructuredGrid>::New();
unstructuredGrid->SetPoints(points);
unstructuredGrid->SetCells(VTK_TETRA, cellArray1);
unstructuredGrid->SetCells(VTK_WEDGE, cellArray2);
我不知道如何在一个.vtu文件中编写多个非结构化网格。如果有任何提示,我将不胜感激。
发布于 2017-11-17 16:53:58
正如文档所描述的那样,vtkUnstructuredGrid类非常通用。
dataset表示所有可能的单元格类型的任意组合。
您可以使用vtkAppendFilter将不同的数据集附加到一个数据集中,然后将输出作为vtkUnstructuredGrid结果写入.vtu文件。
// create the append filter
vtkSmartPointer<vtkAppendFilter> append =
vtkSmartPointer<vtkAppendfilter>::New();
// add each data set
append->AddInputData(MakeHexagonalPrism());
append->AddInputData(MakeHexahedron());
append->Update();
// write the result
vtkSmartPointer<vtkXMLUnstructuredGridWriter> writer =
vtkSmartPointer<vtkXMLUnstructuredGridWriter>::New();
writer->SetFileName(filename.c_str());
writer->SetInputData(append->GetOutput());
编辑:我按照Amit的建议添加了缺少的Update()
函数调用
发布于 2017-11-17 13:51:06
引用vtkXMLUnstructuredGridWriter
可用这里的文档
一个非结构化网格输入可以以任意数量的流段写入一个文件中(如果其他管道支持的话)。
因此,我认为不可能使用这个编写类将多个非结构化网格数据集写入一个文件。
您想要同一非结构化网格(可以写入单个.vtu
文件)中的多种类型的单元格,而不是同一.vtu
文件中的多个非结构化网格吗?如果是,则必须首先将两个单元格数组组合为单个单元格数组,并创建一个int
数组,其中包含单元格数组中每个单元格的类型。例如,
// Create a Type vector to store cell types
std::vector<int> types;
// Create a new cell array composed of cellArray1 and cellArray2
vtkSmartPointer<vtkCellArray> allCells =
vtkSmartPointer<vtkCellArray>::New();
// Traverse cellArray1 and add it's cells to allCells
vtkSmartPointer<vtkIdList> nextCell =
vtkSmartPointer<vtkIdList>::New();
cellArray1->InitTraversal()
while( cellArray1->GetNextCell( nextCell ) ){
allCells->InsertNextCell( nextCell );
types.push_back( VTK_TETRA );
}
// Traverse cellArray2 and add it's cells to allCells
cellArray2->InitTraversal()
while( cellArray2->GetNextCell( nextCell ) ){
allCells->InsertNextCell( nextCell );
types.push_back( VTK_WEDGE );
}
//Finally, set allCells to unstructuredGrid
unstructuredGrid->SetCells( &(types[0]), allCells );
现在,当您将这个非结构化网格写入一个.vtu
文件时,我认为您应该在一个文件中同时使用楔形类型和四边形类型的单元格。
发布于 2022-09-29 09:12:40
根据@Gruillaume的建议,使用"vtkAppendFilter",属性将根据以下规则进行过滤:只有所有插入的unstructuredGrid中存在的属性才能保存在保存的数据中(例如,ug1和ug2是两个附加的unstructuredGrid,属性"hight“存在于ug1和ug2的pointData中,那么"hight”仍在append->GetOutPut()中,否则也不是unstructuredGrid)。
在大多数情况下,对于插入的unstructuredGrid (在截图中,它们称为“部分”属性),有些属性不是所有插入的属性的共同之处,这些属性将被vtkAppendFilter擦除。
解决这些情况的更好方法是将vtkMultiBlockDataSet与vtkXMLMultiBlockDataWriter.一起使用。将为每个UnstructedGrid创建一个vtu文件,并创建一个vtm文件(不包含任何数据),以便将所有vtu文件收集到一个结构中。借用@Guillaume Favelier的例子,将有:
vtkSmartPointer<vtkMultiBlockDataSet> multiBlockDataSet = vtkSmartPointer<vtkMultiBlockDataSet>::New();
// add each data set
vtkSmartPointer<vtkUnstructuredGrid> ug1 = MakeHexagonalPrism();
vtkSmartPointer<vtkUnstructuredGrid> ug2 = MakeHexahedron();
multiBlockDataSet->SetBlock(0, ug1);
multiBlockDataSet->SetBlock(1, ug2);
// write the result
vtkSmartPointer<vtkXMLMultiBlockDataWriter> writer = vtkSmartPointer<vtkXMLMultiBlockDataWriter>::New();
writer->SetFileName(filename.c_str());
writer->SetInputData(multiBlockDataSet);
writer->Write();
https://stackoverflow.com/questions/47349086
复制相似问题