VTK:如何读取网格单元格的长度、宽度和高度?

VTK : how to read grid cells' lenth, width and height?

我有一个 *.pvd 格式的巨大网格。我想确保在构建所述网格时遵守某些单元格大小规范。为此,我应该使用 (dx,dy,dz)

获取单元格数据数组

我首先尝试在 Paraview 中检查这个,但收效甚微。然后我决定以各种格式(vtk、vtu、ex2)导出网格,并使用 vtk 模块将内容导入 python,如下面的代码所示。不幸的是,网格的大小不允许这样做,我收到各种错误消息,指出 "Unable to allocate n cells of size x".

import vtk
reader = vtk.vtkXMLUnstructuredGridReader()
reader.SetFileName("my_mesh.vtu")
reader.Update()

最后,在 Paraview 中有一个 python-shell 允许我以 pvdvtk 格式打开网格文件:

>>> from paraview.simple import *
>>> my_vtk = OpenDataFile("my_mesh.vtk")
>>> print dir(my_vtk)

尽管我浏览了这个 reader 对象的方法和属性,但我仍然不知道从哪里获取网格上的任何几何信息。我还浏览了 simple module documentation,但我实在想不通。

那么如何从 paraview.servermanager.LegacyVTKReader 对象中检索有关细胞几何形状的信息?

关于如何通过 paraview GUI 实现此目的的任何线索,或任何将 vtk 对象加载到 python vtk 尽管存在内存问题的 kludge 也非常受欢迎。很抱歉提出这样一个模糊的问题,但我真的不知道从哪里开始......

您可以使用 GetClientSideObject()(参见 here)在 Paraview Python shell 中获取 VTK 对象。之后你可以使用所有常规的 VTK Python 功能。比如你可以在Paraview中这样写 Python shell

>>> from paraview.simple import *
>>> currentSelection = GetActiveSource()
>>> readerObj = currentSelection.GetClientSideObject()
>>> unstructgrid = readerObj.GetOutput()
>>> firstCell = unstructgrid.GetCell(0)
>>> cellPoints = firstCell.GetPoints()

或者,您可以在 ParaView 中使用 Programmable Filter。这允许访问完整的 VTK python 模块甚至 NumPy 或其他模块。您可以在可编程过滤器的脚本 window 中输入以下脚本:

import vtk as v
import numpy as np

inp = self.GetUnstructuredGridInput()
cells = inp.GetCells()
cells.InitTraversal()
cellPtIds = v.vtkIdList()
lenArr = v.vtkDoubleArray()
lenArr.SetNumberOfComponents(3)
lenArr.SetName('CellSize')
while cells.GetNextCell( cellPtIds ):
    pts = []
    for i in range( cellPtIds.GetNumberOfIds() ):
        ptCoords = inp.GetPoint( cellPtIds.GetId(i) )
        pts.append( ptCoords )    
    pts = np.array( pts )
    dx = np.max(pts[:,0]) - np.min(pts[:,0])
    dy = np.max(pts[:,1]) - np.min(pts[:,1])
    dz = np.max(pts[:,2]) - np.min(pts[:,2])
    lenArr.InsertNextTuple3(dx, dy, dz)
out = self.GetUnstructuredGridOutput()
out.ShallowCopy( inp )
out.GetCellData().AddArray( lenArr )

在 Paraview 中,当您 select 管道中的 'ProgrammableFilter1' 图标时,一个新的单元格数据数组将从下拉列表中提供给您,如下面的屏幕截图所示。您可以修改上面的脚本,将数据保存到文件中,供外部分析。

此信息在“信息”选项卡中可见。