package require vtk package require vtkinteraction set xcoord 52 set ycoord 1 set i 6 # Set GPS possitions of Main Server's #vtkPolyDataReader reader # reader SetFileName "g:/servers.txt" # reader Read float vtkPoints servers #Alpha Main Server servers InsertPoint 0 0 51.5 0.25 #Lambda Main Server servers InsertPoint 1 -3.1 51.3 0.25 #Omega Main Server servers InsertPoint 2 -3.1 55.5 0.25 #Zeta Check Server servers InsertPoint 3 -1.24 50.54 0.25 #Sigma Check Server servers InsertPoint 4 -2.58 53.24 0.25 #Psi Check Server servers InsertPoint 5 -1.05 53.57 0.25 vtkPolyData serversPoints serversPoints SetPoints servers vtkCellArray backbone backbone InsertNextCell 4 backbone InsertCellPoint 0 backbone InsertCellPoint 1 backbone InsertCellPoint 2 backbone InsertCellPoint 0 vtkCellArray serverCheck serverCheck InsertNextCell 3 serverCheck InsertCellPoint 0 serverCheck InsertCellPoint 3 serverCheck InsertCellPoint 1 serverCheck InsertNextCell 3 serverCheck InsertCellPoint 1 serverCheck InsertCellPoint 4 serverCheck InsertCellPoint 2 serverCheck InsertNextCell 3 serverCheck InsertCellPoint 2 serverCheck InsertCellPoint 5 serverCheck InsertCellPoint 0 vtkRenderer ren1 vtkRenderWindow renWin renWin AddRenderer ren1 vtkRenderWindowInteractor iren iren SetRenderWindow renWin ren1 SetBackground 1.8 1.8 1.8 renWin SetSize 720 720 ###################################################### # Import files vtkSTLReader mapUK mapUK SetFileName "g:/university/Simulation/UKMap3D.stl" vtkPolyDataMapper mapUKMapper mapUKMapper SetInput [mapUK GetOutput] vtkLODActor mapUKActor mapUKActor SetMapper mapUKMapper [mapUKActor GetProperty] SetColor 0.75 0.75 0 ren1 AddActor mapUKActor renWin Render ###################################################### # Create Node for adding to map # create a sphere called 'Node' vtkSphereSource node node SetRadius 0.125 node SetPhiResolution 18 node SetThetaResolution 18 #create a glyph using 'balls' as the object and 'inputData' for location with 3D space vtkGlyph3D glyphPointsServers glyphPointsServers SetInput serversPoints #glyphPointsServers SetInputConnection [reader GetOutputPort] glyphPointsServers SetSource [node GetOutput] #Assign simple mapper to glyph vtkPolyDataMapper glyphMapperServers glyphMapperServers SetInput [glyphPointsServers GetOutput] #create actor of gylph to enable rendering of #primary server's vtkActor glyphServers glyphServers SetMapper glyphMapperServers [glyphServers GetProperty] SetColor 255 0 0 [glyphServers GetProperty] SetSpecular .3 [glyphServers GetProperty] SetSpecularPower 10 ren1 AddActor glyphServers renWin Render ###################################################### # Create connections between server's (BackBone) vtkPolyData mainProfileData mainProfileData SetPoints servers mainProfileData SetLines backbone vtkPolyData checkProfileDate checkProfileDate SetPoints servers checkProfileDate SetLines serverCheck # Add thickness to the resulting line. vtkTubeFilter mainProfileTubes mainProfileTubes SetNumberOfSides 8 mainProfileTubes SetInput mainProfileData mainProfileTubes SetRadius .025 vtkPolyDataMapper mainProfileMapper mainProfileMapper SetInput [mainProfileTubes GetOutput] vtkActor mainProfile mainProfile SetMapper mainProfileMapper [mainProfile GetProperty] SetColor 0 255 0 [mainProfile GetProperty] SetSpecular .1 [mainProfile GetProperty] SetSpecularPower 0 vtkTubeFilter checkProfileTubes checkProfileTubes SetNumberOfSides 8 checkProfileTubes SetInput checkProfileDate checkProfileTubes SetRadius .015 vtkPolyDataMapper checkProfileMapper checkProfileMapper SetInput [checkProfileTubes GetOutput] vtkActor checkProfile checkProfile SetMapper checkProfileMapper [checkProfile GetProperty] SetColor 0 255 0 [checkProfile GetProperty] SetSpecular .1 [checkProfile GetProperty] SetSpecularPower 0 ren1 AddActor mainProfile ren1 AddActor checkProfile ####################################################### # Perform a 2D Delaunay triangulation on them. vtkDelaunay2D nodes nodes SetAlpha 1.0 nodes SetInput serversPoints #nodes SetInputConnection [reader GetOutputPort] nodes SetTolerance 0.01 vtkPolyDataMapper mapMesh mapMesh SetInputConnection [nodes GetOutputPort] vtkActor meshActor meshActor SetMapper mapMesh meshActor GetProperty SetColor .1 .2 .4 # We will now create a nice looking mesh by wrapping the edges in tubes, # and putting fat spheres at the points. vtkExtractEdges extract extract SetInputConnection [nodes GetOutputPort] vtkTubeFilter tubes tubes SetInputConnection [extract GetOutputPort] tubes SetRadius 0.009 tubes SetNumberOfSides 6 vtkPolyDataMapper mapEdges mapEdges SetInputConnection [tubes GetOutputPort] vtkActor edgeActor edgeActor SetMapper mapEdges [edgeActor GetProperty] SetColor 0 255 0 [edgeActor GetProperty] SetSpecularColor 1 1 1 [edgeActor GetProperty] SetSpecular 0.3 [edgeActor GetProperty] SetSpecularPower 20 [edgeActor GetProperty] SetAmbient 0.2 [edgeActor GetProperty] SetDiffuse 0.8 ren1 AddActor edgeActor ###################################################### # Create a cell picker. vtkCellPicker picker picker AddObserver EndPickEvent annotatePick # Create a text mapper and actor to display the results of picking. vtkTextMapper textMapper set tprop [textMapper GetTextProperty] $tprop SetFontFamilyToArial $tprop SetFontSize 10 $tprop BoldOn $tprop ShadowOn $tprop SetColor 1 0 0 vtkActor2D textActor textActor VisibilityOff textActor SetMapper textMapper # Create the Renderer, RenderWindow, and RenderWindowInteractor vtkInteractorStyleTrackballCamera style style AddObserver LeftButtonPressEvent {set MouseMotion 0; style OnLeftButtonDown} style AddObserver MouseMoveEvent {set MouseMotion 1; style OnMouseMove} style AddObserver LeftButtonReleaseEvent cbLBR vtkRenderer ren1 vtkRenderWindow renWin renWin AddRenderer ren1 vtkRenderWindowInteractor iren iren SetRenderWindow renWin iren SetInteractorStyle style iren SetPicker picker ren1 AddActor2D textActor # Create a Tcl procedure to create the text for the text mapper used to # display the results of picking. proc annotatePick {} { global xcoord global ycoord if { [picker GetCellId] < 0 } { textActor VisibilityOff } else { set selPt [picker GetSelectionPoint] set x [lindex $selPt 0] set y [lindex $selPt 1] set pickPos [picker GetPickPosition] set xp [lindex $pickPos 0] set yp [lindex $pickPos 1] set zp [lindex $pickPos 2] set xcoord $yp set ycoord $xp textMapper SetInput "($xp, $yp, $zp)" textActor VisibilityOn } renWin Render } proc cbLBR {} { global MouseMotion if {$MouseMotion == 0} { eval picker Pick [iren GetEventPosition] 0 ren1 } # Do the default things for the trackball style style OnLeftButtonUp } # Pick the cell at this location. picker Pick 85 126 0 ren1 ################################################### # create buttons for control of the interface #Declare that there is a menu menu .mbar . config -menu .mbar #The Main Buttons .mbar add cascade -label "File" -underline 0 \ -menu [menu .mbar.file -tearoff 0] .mbar add cascade -label "Insert" \ -underline 0 -menu [menu .mbar.oth -tearoff 1] .mbar add cascade -label "Help" -underline 0 \ -menu [menu .mbar.help -tearoff 0] ## File Menu ## set m .mbar.file $m add checkbutton -label "Open" -underline 0 -command { set loadfile [tk_getOpenFile -initialdir "g:/" ] tk_messageBox -message "Loading: $loadfile" vtkPolyDataReader reader reader SetFileName "$loadfile" #create a glyph using 'balls' as the object and 'inputData' for location with 3D space vtkGlyph3D glyphPointsNode glyphPointsNode SetInputConnection [reader GetOutputPort] glyphPointsNode SetSourceConnection [node GetOutputPort] #Assign simple mapper to glyph vtkPolyDataMapper glyphMapperNode glyphMapperNode SetInput [glyphPointsNode GetOutput] #create actor of gylph to enable rendering of #primary server's vtkActor glyphNode glyphNode SetMapper glyphMapperNode [glyphNode GetProperty] SetColor 255 0 0 [glyphNode GetProperty] SetSpecular 30 [glyphNode GetProperty] SetSpecularPower 10 ren1 AddActor glyphNode renWin Render } $m add command -label "Save" -underline 0 -command { set savefile [tk_getSaveFile -initialdir "f:/" ] vtkPolyDataWriter writer writer SetInput serversPoints writer SetFileName "$savefile" writer Write } $m add separator $m add command -label "Exit" -underline 1 -command exit ## Others Menu ## set m .mbar.oth global inputDate $m add cascade -label "Insert" -underline 0 -menu [menu $m.mnu -title "Insert"] $m.mnu add command -label "Node" -command addNode $m.mnu add command -label "Backbone Connection" -command { } $m.mnu add command -label "Server" -command { } ## Help ## set m .mbar.help $m add command -label "About" -command { tk_messageBox -message "Hello" } # Scale that the map is zoom in by vtkCamera cam1 cam1 SetClippingRange 0.0 0.0 cam1 SetFocalPoint -2.5 53.75 0.0 cam1 SetPosition -2.5 53.75 20.0 cam1 SetViewUp 0.0 0.0 0.0 frame .interface frame .interface.head -borderwidth 2 -relief ridge label .head1 \ -text "T.I.N man" -font { Helvetica -20 bold } label .head2 \ -text "Total Information Network" -font { Helvetica -12 bold } entry .interface.ns -width 10 -textvariable xcoord entry .interface.ew -width 10 -textvariable ycoord label .head3 -text "North" if { $xcoord > 0 } { label .head4 -text East } else { label .head4 -text West } button .interface.goto -text Goto -command goto frame .zoom set zoom [scale .zoom.in \ -from 2 -to 0 -res 0.1 \ -orient horizontal \ -command zoomIn] $zoom [cam1 factor] frame .command set dist [scale .command.dist \ -from 0.01 -to 5 -res 0.001 \ -orient horizontal \ -command varDistance] $dist set [nodes GetAlpha] button .command.reset -text "Reset Camera" -command resetCamera button .command.addNode -text "Add Node" -command addNode proc zoomIn {factor} { cam1 Zoom $factor ren1 SetActiveCamera cam1 renWin Render } proc varDistance {factor} { nodes SetAlpha $factor renWin Render } proc resetCamera {} { cam1 SetClippingRange 0.0 0.0 cam1 SetFocalPoint -2.5 53.75 0.0 cam1 SetPosition -2.5 53.75 20.0 cam1 SetViewUp 0.0 0.0 0.0 ren1 SetActiveCamera cam1 renWin Render } proc goto {} { set zoom 20 global xcoord global ycoord cam1 SetClippingRange 0.0 0.0 cam1 SetFocalPoint $ycoord $xcoord 0.0 cam1 SetViewUp 0.0 0.0 0.0 cam1 Zoom 5.0 ren1 SetActiveCamera cam1 renWin Render } proc addNode { } { global i global xcoord global ycoord servers InsertPoint $i $ycoord $xcoord 0.25 incr i 1 } label .command.serverNumber -text "Number of Node's" entry .command.serverNEntry -width 10 -justify right -textvariable i grid .interface -in . -row 1 -column 1 -columnspan 2 grid .head1 -in .interface -row 1 -column 1 -columnspan 2 grid .head2 -in .interface -row 2 -column 1 -columnspan 2 grid .head3 -in .interface -row 3 -column 1 grid .head4 -in .interface -row 3 -column 2 grid .interface.ns -in .interface -row 4 -column 1 grid .interface.ew -in .interface -row 4 -column 2 grid .interface.goto -in .interface -row 4 -column 3 grid .zoom -in . -row 2 -column 2 grid .zoom.in -in .zoom -row 1 -column 1 grid .command -in . -row 3 -column 1 -columnspan 2 grid .command.reset -in .command -row 1 -column 1 grid .command.addNode -in .command -row 1 -column 2 grid .command.dist -in .command -row 3 -column 1 grid .command.serverNumber -in .command -row 2 -column 2 grid .command.serverNEntry -in .command -row 3 -column 2 wm protocol . WM_DELETE_WINDOW ::vtk::cb_exit