VTK Multi-block Dataset中のシェル要素(VTK Unstructured Grid形式)を抽出し、要素値として定義されているシェル厚さ‘Thickness’に応じて押し出す。変数resolutionを変更することで、押し出し方向の層数を変更できる。現状では三角形1次要素および四角形1次要素の押し出しのみに対応している。
本スクリプト中では、VTKに用意されている各種フィルタを直接呼び出している。
動作確認バージョン
ParaView 4.2.0
Output Data Set Type
vtkUnstructuredGrid
Script
import vtk
resolution = 1
pdi = self.GetInput().GetBlock(0)
dss = vtk.vtkDataSetSurfaceFilter() # not included in paraview.vtk
dss.SetInputData(pdi)
dss.Update()
c2p = vtkCellDataToPointData()
c2p.SetInputData(dss.GetOutput())
c2p.Update()
pdn = vtkPolyDataNormals()
pdn.SetInputData(c2p.GetOutput())
pdn.Update()
pdo = self.GetOutput()
pts = vtk.vtkPoints()
np = pdi.GetNumberOfPoints()
for i in range(resolution + 1):
for j in range(np):
x, y, z = pdi.GetPoint(j)
nx = pdn.GetOutput().GetPointData().GetArray('Normals').GetValue(i * 3) * pdn.GetOutput().GetPointData().GetArray('Thickness').GetValue(i * 3)
ny = pdn.GetOutput().GetPointData().GetArray('Normals').GetValue(i * 3 + 1) * pdn.GetOutput().GetPointData().GetArray('Thickness').GetValue(i * 3 + 1)
nz = pdn.GetOutput().GetPointData().GetArray('Normals').GetValue(i * 3 + 2) * pdn.GetOutput().GetPointData().GetArray('Thickness').GetValue(i * 3 + 2)
pts.InsertNextPoint(x + nx * i / resolution, y + ny * i / resolution, z + nz * i / resolution)
pdo.SetPoints(pts)
nc = pdi.GetNumberOfCells()
pdo.Allocate(nc, 0)
for i in range(resolution):
for j in range(nc):
ids = vtk.vtkIdList()
cell = pdi.GetCell(j)
cnp = cell.GetNumberOfPoints()
for k in range(cnp):
ids.InsertId(k, np * i + cell.GetPointId(k))
for k in range(cnp):
ids.InsertId(k + cnp, np * (i + 1) + cell.GetPointId(k))
if cnp == 3:
pdo.InsertNextCell(13, ids)
elif cnp == 4:
pdo.InsertNextCell(12, ids)
arr = vtk.vtkDoubleArray()
pdo.GetCellData().AddArray(arr)
arr.SetNumberOfComponents(1)
arr.SetName('scalar')
for i in range(pdo.GetNumberOfCells()):
arr.InsertNextValue(i)
arr = vtk.vtkDoubleArray()
pdo.GetPointData().AddArray(arr)
arr.SetNumberOfComponents(1)
arr.SetName('scalar_node')
for i in range(pdo.GetNumberOfPoints()):
arr.InsertNextValue(i)
numPntArr = pdn.GetOutput().GetPointData().GetNumberOfArrays()
for i in range(numPntArr):
arr_pnt = vtk.vtkDoubleArray()
pdo.GetPointData().AddArray(arr_pnt)
arr_val = pdn.GetOutput().GetPointData().GetArray(i)
numComp = arr_val.GetNumberOfComponents()
arr_pnt.SetNumberOfComponents(numComp)
arr_pnt.SetName(pdn.GetOutput().GetPointData().GetArrayName(i))
for r in range(resolution + 1):
for j in range(pdn.GetOutput().GetNumberOfPoints()):
for nc in range(numComp):
arr_pnt.InsertNextValue(arr_val.GetValue(j * numComp + nc))
コメントを残す