我有一个*.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允许我以pvd
或vtk
格式打开网格文件:
>>> from paraview.simple import *
>>> my_vtk = OpenDataFile("my_mesh.vtk")
>>> print dir(my_vtk)
尽管我浏览了这个阅读器对象的方法和属性,但我仍然不知道在网格上获取任何几何信息的位置。我也浏览了simple
module documentation,我无法真正地绕过它。
那么如何从paraview.servermanager.LegacyVTKReader
对象中检索有关细胞几何的信息呢?
关于如何通过paraview GUI实现这一点的任何线索,或任何kludge将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()
或者,您可以在ParaView中使用Programmable Filter。这允许访问完整的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”图标时,将从下拉列表中为您提供新的单元格数据阵列,如下面的屏幕截图所示。您可以修改上面的脚本以将数据保存到文件以进行外部分析。
此信息在“信息”选项卡中可见。