Ich werde "Clip" zusammenfassen, der den Bereich der anzuzeigenden Form basierend auf der Quellform begrenzt.
Wenn Sie eine Form mit Vertikalen, Linien und Dreiecken wie "STL", "vtkPolyData" ausdrücken Wenn Sie mit einem nicht strukturellen Raster wie "OpenFOAM" ausdrücken, ist es eine ordnungsgemäße Verwendung von "vtkDataSet"? Ich kenne die Details noch nicht
https://vtk.org/doc/nightly/html/classvtkClipPolyData.html
https://vtk.org/doc/nightly/html/classvtkClipDataSet.html
Clip-Funktion
Wenn ClipType auf Ebene eingestellt ist, wird der Anzeigebereich mithilfe der Ebene mit Ursprung und Normal begrenzt.
Durch Umschalten der Invert-Prüfung kann der angezeigte Bereich umgekehrt werden.
Wenn Crinkle-Clip angewendet wird, behält das in der Ebene enthaltene Netz seine ursprüngliche Form bei.
python 3.7 vtk 8.1.2
)
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()) #Filter im Mapper einstellen
mapper.SetScalarModeToUseCellFieldData() #Für skalare Daten einstellen
# actor
actor = vtk.vtkActor()
actor.SetMapper(mapper) #Stellen Sie den Mapper für den Schauspieler ein
actor.GetProperty().EdgeVisibilityOn()
# renderer
renderer = vtk.vtkRenderer()
renderer.AddActor(actor) #Stellen Sie den Schauspieler im Renderer ein
##Hintergrundfarbeneinstellung
renderer.GradientBackgroundOn() #Stellen Sie einen Verlaufshintergrund ein
renderer.SetBackground2(0.2,0.4,0.6) #Top Farbe
renderer.SetBackground(1,1,1) #Grundfarbe
#Window
renWin = vtk.vtkRenderWindow()
renWin.AddRenderer(renderer) #Stellen Sie den Renderer im Fenster ein
iren = vtk.vtkRenderWindowInteractor();
iren.SetRenderWindow(renWin);
renWin.SetSize(850, 850)
renWin.Render()
iren.Start();
SetClipFunction(vtkImplicitFunction e.g. vtkPlane)
Legen Sie das Objekt fest, das die Quelle des Clips sein soll, z. B. "vtkPlane"
Liste der Vererbungsziele von vtkImplicitFunction
https://vtk.org/doc/nightly/html/classvtkImplicitFunction.html
SetInsideOut(boolean)
Methode zum Umschalten von "Invertieren"
Kann auch mit "InsideOutOn ()" oder "InsideOutOff ()" festgelegt werden
Verwenden Sie vtkBox
, um die Koordinaten von BoundingBox
anzugeben
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)
Da "OpenFOAM" ein nicht strukturelles Gitter ist, verwenden Sie "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()) //Beim Abschalten
filter.Update()
# mapper
mapper = vtk.vtkCompositePolyDataMapper2()
mapper.SetInputConnection(filter.GetOutputPort()) #Filter im Mapper einstellen
mapper.SetScalarModeToUseCellFieldData() #Für skalare Daten einstellen
# actor
actor = vtk.vtkActor()
actor.SetMapper(mapper) #Stellen Sie den Mapper für den Schauspieler ein
actor.GetProperty().EdgeVisibilityOn()
# renderer
renderer = vtk.vtkRenderer()
renderer.AddActor(actor) #Stellen Sie den Schauspieler im Renderer ein
##Hintergrundfarbeneinstellung
renderer.GradientBackgroundOn() #Stellen Sie einen Verlaufshintergrund ein
renderer.SetBackground2(0.2,0.4,0.6) #Top Farbe
renderer.SetBackground(1,1,1) #Grundfarbe
#Window
renWin = vtk.vtkRenderWindow()
renWin.AddRenderer(renderer) #Stellen Sie den Renderer im Fenster ein
iren = vtk.vtkRenderWindowInteractor();
iren.SetRenderWindow(renWin);
renWin.SetSize(850, 850)
renWin.Render()
iren.Start();
Vor dem Clip
Nach dem Clip