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 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
|
#!/usr/bin/env python
"""
This file demonstrates the creation of a directed graph using the
Python interface to VTK.
"""
from vtk import *
from sys import exit
xdim = 400
ydim = 400
#------------------------------------------------------------------------------
# Script Entry Point
#------------------------------------------------------------------------------
if __name__ == "__main__":
#----------------------------------------------------------
# Create a graph (see graph1.py for explanations)
G1 = vtkMutableDirectedGraph()
vertID1 = vtkIntArray()
vertID1.SetName("ID")
G1.GetVertexData().AddArray( vertID1 )
G1.GetVertexData().SetPedigreeIds( vertID1 )
for i in range(10):
G1.AddVertex()
vertID1.InsertNextValue(i)
for i in range(10):
G1.AddGraphEdge(i, (i+1)%10)
#----------------------------------------------------------
# Create a second graph
# - This one is a triangle, with one node's pedigree id field
# ID matching one of the vertices from G1. These nodes will
# be combined as the same node when merge is run.
vertID2 = vtkIntArray()
G2 = vtkMutableDirectedGraph()
vertID2 = vtkIntArray()
vertID2.SetName("ID")
G2.GetVertexData().AddArray(vertID2)
G2.GetVertexData().SetPedigreeIds(vertID2)
G2.AddVertex()
vertID2.InsertNextValue(3)
G2.AddVertex()
vertID2.InsertNextValue(20)
G2.AddVertex()
vertID2.InsertNextValue(21)
G2.AddGraphEdge(0,1)
G2.AddGraphEdge(0,2)
G2.AddGraphEdge(1,2)
#----------------------------------------------------------
# First Programmable Filter -- Add integer field to vertices
# with a 1 for every vertex into G1
G1_labeled = vtkProgrammableFilter()
G1_labeled.AddInputData( G1 )
def vertex_labeler_g1():
input = G1_labeled.GetInput()
output = G1_labeled.GetOutput()
output.ShallowCopy(input)
varray = vtkIntArray()
varray.SetName("color")
varray.SetNumberOfTuples( output.GetNumberOfVertices() )
for i in range( output.GetNumberOfVertices() ):
varray.SetValue(i, 1)
output.GetVertexData().AddArray(varray)
G1_labeled.SetExecuteMethod( vertex_labeler_g1 )
#----------------------------------------------------------
# Second Programmable Filter -- Add integer field to vertices
# with a 2 for every vertex into G2
G2_labeled = vtkProgrammableFilter()
G2_labeled.AddInputData( G2 )
def vertex_labeler_g2():
input = G2_labeled.GetInput()
output = G2_labeled.GetOutput()
output.ShallowCopy(input)
varray = vtkIntArray()
varray.SetName("color")
varray.SetNumberOfTuples( output.GetNumberOfVertices() )
for i in range( output.GetNumberOfVertices() ):
varray.SetValue(i, 2)
output.GetVertexData().AddArray(varray)
G2_labeled.SetExecuteMethod( vertex_labeler_g2 )
#----------------------------------------------------------
# Merge graphs takes two graphs on input ports 0 and 1.
# and combines them according to the pedigree id field.
merge = vtkMergeGraphs()
merge.SetInputConnection(0, G1_labeled.GetOutputPort() )
merge.SetInputConnection(1, G2_labeled.GetOutputPort() )
merge.Update()
#----------------------------------------------------------
# Draw the graph in a window
theme = vtkViewTheme.CreateMellowTheme()
theme.SetLineWidth(4)
theme.SetPointSize(15)
theme.SetCellOpacity(1)
theme.FastDelete()
# Rendered graph representation to make vertices circles
rep = vtkRenderedGraphRepresentation( )
rep.SetInputConnection(0, merge.GetOutputPort())
# vtkGraphToGlyph::CIRCLE == 7
rep.SetGlyphType(7)
# View containing the merged graph
view = vtkGraphLayoutView()
view.SetRepresentation( rep )
view.SetVertexLabelArrayName("ID")
view.SetVertexColorArrayName("color")
view.SetVertexLabelVisibility(True)
view.SetColorVertices(True)
view.SetLayoutStrategyToSimple2D()
view.SetVertexLabelFontSize(20)
view.ApplyViewTheme(theme)
view.GetRenderWindow().SetSize(xdim, ydim)
view.ResetCamera()
view.Render()
view.GetInteractor().Start()
|