从 VTU 文件中提取三角形 ID

Extract Triangles IDs from VTU file

我有一个 pvtu 文件和关联的 vtu 文件,我想从中显示一些数据。如果我在 Paraview (5.6+) 中加载 pvtu,当我选择 Solid Color (White) 和 Surface With Edges 时,我会得到以下图像: 靠近顶部边界的网格明显是各向异性的,三角形几乎是扁平的;这是预期的行为。

如果我现在在 Python 中加载相同的 pvtu 并按以下方式显示网格,

import numpy
import matplotlib.pyplot as plt
import vtk
gridreader = vtk.vtkXMLPUnstructuredGridReader()
gridreader.SetFileName('whatever.pvtu')
gridreader.Update()
vtkOut = gridreader.GetOutput()
vtkData = vtkOut.GetPoints().GetData()
coords = numpy.array([vtkData.GetTuple3(x)
                      for x in range(vtkData.GetNumberOfTuples())])
plt.triplot(coords[:, 0], coords[:, 1])
plt.gcf().set_size_inches(16, 8)
plt.gca().set_aspect('equal')
plt.savefig('meshPython1.png', bbox_inches='tight')
plt.gca().set_xlim((5e5, 3e6))
plt.gca().set_ylim((6e5, 1e6))
plt.savefig('meshPython2.png', bbox_inches='tight')

我明白了: 在那里你可以很容易地看到各向异性不存在。因此,我天真的问题是:如何使用 Python 重现 Paraview 中显示的网格?但是,可能有一个更准确的问题。我完全知道 matplotlib 的三角剖分库接受三角形作为参数,但我无法找到从 pvtu 中提取它们的命令。所以也许更好的问题是如何从 pvtu 文件中获取三角形?

感谢任何帮助。

您的问题是您没有使用 matplotlib.tritriangles 选项。事实上,当您不在 matplotlib 中指定它时,ParaView 中存在的网格的连接性会丢失。事实上,你给了 matplotlib 一个自由来呈现细胞的任何它想要的,当你知道你的三角形网格的连通性时,这显然是不正确的。您可以使用以下命令提取三角形网格的连通性:

cell_connecitivty_matrix = []

for i in range(vtOut.GetNumberOfCells()):
 assert vtkOut.GetCell(i).GetNumberOfPoints() == 3
 cell_connecitivty_matrix.append(vtkOut.GetCell(i).GetPointIds())

cell_connecitivty_matrix = np.array(cell_connecitivty_matrix, dtype=np.float).reshape((vtOut.GetNumberOfCells(),3))

#plot triangles with their connectivity matrix

plt.triplot(coords[:, 0], coords[:, 1], triangles=cell_connectivity_matrix)

根据Alone Programmer的回答,下面的代码让我实现了与Paraview相同的网格:

import numpy
import matplotlib.pyplot as plt
import vtk
gridreader = vtk.vtkXMLPUnstructuredGridReader()
gridreader.SetFileName('whatever.pvtu')
gridreader.Update()
vtkOut = gridreader.GetOutput()
vtkData = vtkOut.GetPoints().GetData()
coords = numpy.array([vtkData.GetTuple3(x)
                      for x in range(vtkData.GetNumberOfTuples())])
cell_connectivity_matrix = []
for i in range(vtkOut.GetNumberOfCells()):
    assert vtkOut.GetCell(i).GetNumberOfPoints() == 3
    cell_connectivity_matrix.append(
        [vtkOut.GetCell(i).GetPointIds().GetId(j)
         for j in range(vtkOut.GetCell(i).GetPointIds().GetNumberOfIds())])
cell_connectivity_matrix = numpy.array(cell_connectivity_matrix,
                                       dtype=numpy.float)
plt.triplot(coords[:, 0], coords[:, 1], triangles=cell_connectivity_matrix)
plt.gcf().set_size_inches(16, 8)
plt.gca().set_aspect('equal')
plt.show()

这显示