LoginSignup
1
1

More than 3 years have passed since last update.

vtkClipPolyData/DataSetまとめ(随時更新)

Last updated at Posted at 2020-05-04

vtkClipPolyData/DataSetについて

ソースとなる形状を元に表示する形状の領域を制限する、Clipについてまとめていきます

STLのようにvertices,lines,triangleで形状を表現する場合はvtkPolyData
OpenFOAMのように非構造格子で表現する場合は、vtkDataSetという使いわけでしょうか、
まだ詳しくはわかっていません

vtkClipPolyDataのclassリファレンス

image.png

vtkClipDataSetのclassリファレンス

image.png

paraviewで機能の確認

Clip機能
image.png

ClipTypeをPlaneにした場合は、原点(Origin)と法線(Normal)を指定した平面を用いて表示領域を制限する

image.png

image.png

Invertのチェックを切り替えることで、表示する領域を逆転させることができる

image.png

Crinkle clipを適用すると、平面に含まれるメッシュは元の形状を維持する
image.png

pythonでの動作確認

環境

python 3.7
vtk 8.1.2

ベースとなるコード(平面(plane)を用いてClipを行う例

)

import vtk

filename = "flange.stl"
reader = vtk.vtkSTLReader()
reader.SetFileName(filename)
reader.Update()

normal='y' # e.g. x,y,z,-x,-y,-z,X,Y,Z,-X,-Y,or -Z

NORMALS = {
    'x': [1, 0, 0],
    'y': [0, 1, 0],
    'z': [0, 0, 1],
    '-x': [-1, 0, 0],
    '-y': [0, -1, 0],
    '-z': [0, 0, -1],
}
normal = NORMALS[normal.lower()] # or e.g. [1.0/sqrt(2.0), 1.0/sqrt(2.0), 0]
origin = (0,0,0)
invert=True

plane = vtk.vtkPlane()
plane.SetNormal(normal)
plane.SetOrigin(origin)

alg = vtk.vtkClipPolyData()
alg.SetInputConnection(reader.GetOutputPort())

alg.SetClipFunction(plane)
alg.SetInsideOut(invert)
alg.Update()

# mapper
mapper = vtk.vtkCompositePolyDataMapper2()
mapper.SetInputConnection(alg.GetOutputPort()) #mapperにfilterを設定
mapper.SetScalarModeToUseCellFieldData() #scalarデータ用に設定

# actor
actor = vtk.vtkActor()
actor.SetMapper(mapper)             #actorにmapperを設定
actor.GetProperty().EdgeVisibilityOn()

# renderer
renderer = vtk.vtkRenderer()
renderer.AddActor(actor)            #rendererにactorを設定

##背景色の設定
renderer.GradientBackgroundOn()      #グラデーション背景を設定
renderer.SetBackground2(0.2,0.4,0.6) #上面の色
renderer.SetBackground(1,1,1)        #下面の色

#Window
renWin = vtk.vtkRenderWindow()
renWin.AddRenderer(renderer)         #Windowにrendererを設定
iren = vtk.vtkRenderWindowInteractor();
iren.SetRenderWindow(renWin);
renWin.SetSize(850, 850)
renWin.Render()
iren.Start();

image.png

SetClipFunction(vtkImplicitFunction e.g. vtkPlane)

vtkPlaneなどのClipのソースとなるオブジェクトをセットします

vtkImplicitFunctionの継承先の一覧
https://vtk.org/doc/nightly/html/classvtkImplicitFunction.html

SetInsideOut(boolean)

Invertの切り替えを行うメソッド

InsideOutOn() or InsideOutOff()でも設定可能

四角形(Cube)を用いてClipを行う例

vtkBoxを用いてBoundingBoxの座標を指定します
https://vtk.org/doc/nightly/html/classvtkBox.html


box = vtk.vtkBox()
box.SetXMin(0.0,-0.001,-0.01) # [xMin,yMin,zMin]
box.SetXMax(0.1,0.1,0.1)      # [xMax,yMax,zMax]

alg = vtk.vtkClipPolyData()
alg.SetInputConnection(reader.GetOutputPort())

alg.SetClipFunction(box)

image.png

OpenFOAMの場合の例

OpenFOAMは非構造格子であることからvtkClipDataSetを用いる

import vtk

filename = "case1.foam"
reader = vtk.vtkOpenFOAMReader()
reader.SetFileName(filename)
reader.CreateCellToPointOn()
reader.DecomposePolyhedraOn()
reader.EnableAllCellArrays()
reader.Update()

n_step = reader.GetTimeValues().GetNumberOfValues()
latest_time = reader.GetTimeValues().GetValue(n_step-1)
reader.UpdateTimeStep(latest_time)
reader.Update()


normal='y' # e.g. x,y,z,-x,-y,-z,X,Y,Z,-X,-Y,or -Z

NORMALS = {
    'x': [1, 0, 0],
    'y': [0, 1, 0],
    'z': [0, 0, 1],
    '-x': [-1, 0, 0],
    '-y': [0, -1, 0],
    '-z': [0, 0, -1],
}

normal = NORMALS[normal.lower()] # or e.g. [1.0/sqrt(2.0), 1.0/sqrt(2.0), 0]

origin = (0,0,0)
invert=False

plane = vtk.vtkPlane()
plane.SetNormal(normal)
plane.SetOrigin(origin)

alg = vtk.vtkClipDataSet()
alg.SetInputConnection(reader.GetOutputPort())
alg.SetClipFunction(plane)
alg.SetInsideOut(invert)
alg.Update()

filter = vtk.vtkGeometryFilter()
filter.SetInputConnection(alg.GetOutputPort())
# filter.SetInputConnection(reader.GetOutputPort()) //clipOff時
filter.Update()

# mapper
mapper = vtk.vtkCompositePolyDataMapper2()
mapper.SetInputConnection(filter.GetOutputPort()) #mapperにfilterを設定
mapper.SetScalarModeToUseCellFieldData() #scalarデータ用に設定

# actor
actor = vtk.vtkActor()
actor.SetMapper(mapper)             #actorにmapperを設定
actor.GetProperty().EdgeVisibilityOn()

# renderer
renderer = vtk.vtkRenderer()
renderer.AddActor(actor)            #rendererにactorを設定

##背景色の設定
renderer.GradientBackgroundOn()      #グラデーション背景を設定
renderer.SetBackground2(0.2,0.4,0.6) #上面の色
renderer.SetBackground(1,1,1)        #下面の色

#Window
renWin = vtk.vtkRenderWindow()
renWin.AddRenderer(renderer)         #Windowにrendererを設定
iren = vtk.vtkRenderWindowInteractor();
iren.SetRenderWindow(renWin);
renWin.SetSize(850, 850)
renWin.Render()
iren.Start();

Clip前
image.png

Clip後
image.png

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1