gpt4 book ai didi

python - VTK : how to read grid cells' lenth, 宽度和高度?

转载 作者:行者123 更新时间:2023-12-01 02:23:20 25 4
gpt4 key购买 nike

我有一个 *.pvd 格式的巨大网格。我想确保在构建所述网格时遵守一些单元尺寸规范。为此,我应该获取一个包含 (dx,dy,dz) 的单元格数据数组

我首先尝试在 Paraview 中检查这一点,但收效甚微。然后我决定以各种格式(vtk、vtu、ex2)导出网格,并使用 vtk 模块将内容导入到 python 中,如下面的代码所示。不幸的是,网格的大小禁止它,我收到各种错误消息,指出“无法分配大小为 x 的 n 个单元”。

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)

尽管我浏览了该读取器对象的方法和属性,但我仍然不知道在哪里获取网格上的任何几何信息。我还浏览了simple module documentation我真的无法理解它。

那么如何从 paraview.servermanager.LegacyVTKReader 对象中检索有关单元格几何形状的信息呢?

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

最佳答案

您可以使用 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()

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

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 中,当您在管道中选择“ProgrammableFilter1”图标时,您将可以从下拉列表中使用一个新的单元格数据数组,如下面的屏幕截图所示。您可以修改上面的脚本,将数据保存到文件中以便外部分析。

Paraview Screenshot

关于python - VTK : how to read grid cells' lenth, 宽度和高度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47714565/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com