1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
|
# This example demonstrates the use of pvtk.
# pvtk is a slightly different version of wish specially modified
# to be used with MPI. It allows Tcl scripts to be interpreted in
# parallel.
#
# In this example, a synthetic source (vtkRTAnalyticSource) generates
# image data (only one piece of the data is generated on each processor).
# Next, an isosurface (vtkContourFilter) is generated by each process.
# The resulting polygonal data is then rendered and then composited
# (vtkCompositeManager) and displayed on the first process (all processes
# will create render windows but only the render window of the root
# process will contain the composited image).
package require vtk
package require vtkinteraction
# Create a controller. At this point, MPI has already been initialized
# therefore there is no need to call Initialize.
vtkMPIController controller
# Get the local process id to be used later
set myId [controller GetLocalProcessId]
# The "global" extent of the source is (2*EXTENT+1)*(2*EXTENT+1)*(2*EXTENT+1)
# Each processor will generate one piece of this extent.
set EXTENT 20
# This is a synthetic source. The equation is:
# Maximum*Gaussian*XMag*sin(XFreq*x)*sin(YFreq*y)*cos(ZFreq*z)
vtkRTAnalyticSource source1
source1 SetWholeExtent [expr -1*$EXTENT] $EXTENT [expr -1*$EXTENT] $EXTENT \
[expr -1*$EXTENT] $EXTENT
source1 SetCenter 0 0 0
source1 SetStandardDeviation 0.5
source1 SetMaximum 255.0
source1 SetXFreq 60
source1 SetXMag 10
source1 SetYFreq 30
source1 SetYMag 18
source1 SetZFreq 40
source1 SetZMag 5
eval [source1 GetOutput] SetSpacing [expr 2.0/$EXTENT] \
[expr 2.0/$EXTENT] [expr 2.0/$EXTENT]
# Generate an isosurface
vtkContourFilter cf
cf SetInputConnection [source1 GetOutputPort]
cf SetNumberOfContours 1
cf SetValue 0 220
vtkElevationFilter elev
elev SetInputConnection [cf GetOutputPort]
elev SetScalarRange $myId [expr $myId + 0.001]
# Create the rendering part of the pipeline
vtkPolyDataMapper mapper
mapper SetInputConnection [elev GetOutputPort]
mapper SetScalarRange 0 [expr [controller GetNumberOfProcesses]]
vtkActor actor
actor SetMapper mapper
vtkRenderer ren
ren AddActor actor
vtkRenderWindow renWin
renWin AddRenderer ren
vtkRenderWindowInteractor iren
iren SetRenderWindow renWin
# This class allows all processes to composite their images.
# The root process then displays it in it's render window.
vtkCompositeRenderManager tc
tc SetRenderWindow renWin
# Tell the pipeline that we requests pieces not the whole
# data.
tc InitializePieces
# Reset camera so that a global clipping range is computed
# before the first render
ren ResetCamera
wm withdraw .
# Only the root process will have an active interactor. All
# the other render windows will be slaved to the root.
tc StartInteractor
# This has to be called to clean-up. If it is not called, MPI
# will most probably complain at exit.
vtkCommand DeleteAllObjects
exit
|