You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
86 lines
2.8 KiB
86 lines
2.8 KiB
2 years ago
|
#!/usr/bin/env python
|
||
|
|
||
|
# Demonstrate how to use the vtkBoxWidget 3D widget. This script uses
|
||
|
# a 3D box widget to define a "clipping box" to clip some simple
|
||
|
# geometry (a mace). Make sure that you hit the "i" key to activate
|
||
|
# the widget.
|
||
|
|
||
|
import vtk
|
||
|
|
||
|
# Create a mace out of filters.
|
||
|
sphere = vtk.vtkSphereSource()
|
||
|
cone = vtk.vtkConeSource()
|
||
|
glyph = vtk.vtkGlyph3D()
|
||
|
glyph.SetInputConnection(sphere.GetOutputPort())
|
||
|
glyph.SetSource(cone.GetOutput())
|
||
|
glyph.SetVectorModeToUseNormal()
|
||
|
glyph.SetScaleModeToScaleByVector()
|
||
|
glyph.SetScaleFactor(0.25)
|
||
|
|
||
|
# The sphere and spikes are appended into a single polydata. This just
|
||
|
# makes things simpler to manage.
|
||
|
apd = vtk.vtkAppendPolyData()
|
||
|
apd.AddInput(glyph.GetOutput())
|
||
|
apd.AddInput(sphere.GetOutput())
|
||
|
maceMapper = vtk.vtkPolyDataMapper()
|
||
|
maceMapper.SetInputConnection(apd.GetOutputPort())
|
||
|
maceActor = vtk.vtkLODActor()
|
||
|
maceActor.SetMapper(maceMapper)
|
||
|
maceActor.VisibilityOn()
|
||
|
|
||
|
# This portion of the code clips the mace with the vtkPlanes implicit
|
||
|
# function. The clipped region is colored green.
|
||
|
planes = vtk.vtkPlanes()
|
||
|
clipper = vtk.vtkClipPolyData()
|
||
|
clipper.SetInputConnection(apd.GetOutputPort())
|
||
|
clipper.SetClipFunction(planes)
|
||
|
clipper.InsideOutOn()
|
||
|
selectMapper = vtk.vtkPolyDataMapper()
|
||
|
selectMapper.SetInputConnection(clipper.GetOutputPort())
|
||
|
selectActor = vtk.vtkLODActor()
|
||
|
selectActor.SetMapper(selectMapper)
|
||
|
selectActor.GetProperty().SetColor(0, 1, 0)
|
||
|
selectActor.VisibilityOff()
|
||
|
selectActor.SetScale(1.01, 1.01, 1.01)
|
||
|
|
||
|
# Create the RenderWindow, Renderer and both Actors
|
||
|
ren = vtk.vtkRenderer()
|
||
|
renWin = vtk.vtkRenderWindow()
|
||
|
renWin.AddRenderer(ren)
|
||
|
|
||
|
iren = vtk.vtkRenderWindowInteractor()
|
||
|
iren.SetRenderWindow(renWin)
|
||
|
|
||
|
# The SetInteractor method is how 3D widgets are associated with the
|
||
|
# render window interactor. Internally, SetInteractor sets up a bunch
|
||
|
# of callbacks using the Command/Observer mechanism (AddObserver()).
|
||
|
boxWidget = vtk.vtkBoxWidget()
|
||
|
boxWidget.SetInteractor(iren)
|
||
|
boxWidget.SetPlaceFactor(1.25)
|
||
|
|
||
|
ren.AddActor(maceActor)
|
||
|
ren.AddActor(selectActor)
|
||
|
|
||
|
# Add the actors to the renderer, set the background and size
|
||
|
ren.SetBackground(0.1, 0.2, 0.4)
|
||
|
renWin.SetSize(300, 300)
|
||
|
|
||
|
# This callback funciton does the actual work: updates the vtkPlanes
|
||
|
# implicit function. This in turn causes the pipeline to update.
|
||
|
def SelectPolygons(object, event):
|
||
|
# object will be the boxWidget
|
||
|
global selectActor, planes
|
||
|
object.GetPlanes(planes)
|
||
|
selectActor.VisibilityOn()
|
||
|
|
||
|
# Place the interactor initially. The input to a 3D widget is used to
|
||
|
# initially position and scale the widget. The "EndInteractionEvent" is
|
||
|
# observed which invokes the SelectPolygons callback.
|
||
|
boxWidget.SetInput(glyph.GetOutput())
|
||
|
boxWidget.PlaceWidget()
|
||
|
boxWidget.AddObserver("EndInteractionEvent", SelectPolygons)
|
||
|
|
||
|
iren.Initialize()
|
||
|
renWin.Render()
|
||
|
iren.Start()
|