vertex

TCL/TK UseCase4



Abstract : Contains all procedure for creating and maintaining a vertex object. Comments : For Use Case 4 we have switch from having Tcl/Tk track objects (which was done through label name) to have C++ track them with a unique ID number passed to Tcl/Tk. This will allow for better tracking and object manipulation. In files edge.tcl, vertex.tcl, and bindings.tcl, most any referrence to the varible "name" or "$name" is actually the ID number.
### # vertex.tcl # #Contains procedures for creating new vertices and for retrieving and setting #data related to vertex objects. ### ### # Where is everything? ### set bmp_Constr "constr.xbm" set bmp_Alter "alter.xbm" set BITMAP_PATH "bitmaps" ### # Set up the vertex/node "data structure." ### proc newVertex { name type {lbl ""} {lblOff { 0 -20 }} {coords { 0 0}} } { #Makes global vars accessible global Vertex bmp_Constr bmp_Alter iGraph inform changes #Inform C++ of new vertex created by user and get ID number if {$inform == 1} { #Formats data that will be sent to C++ set formatted "{$coords}" set formatted2 "{$lblOff}" if {$type == "Constr"} { set changes yes puts "Sending: $lbl $formatted $formatted2" set name [$iGraph cppCreCVertex: $lbl $formatted $formatted2] } else { set changes yes puts "Sending: $lbl $formatted $formatted2" set name [$iGraph cppCreAVertex: $lbl $formatted $formatted2] } } ##### #puts "Getting: $name $lbl $lblOff $coords" # Must append characters to ID number so that confusion with # binding number is removed. The ID number must then be fixed # when sending back to C++. set name ID$name #Initializes new vertex array set Vertex($name,Label) $lbl set Vertex($name,LabelOff) $lblOff set Vertex($name,Coords) $coords set Vertex($name,EdgeOut) {} set Vertex($name,EdgeIn) {} set Vertex($name,Type) $type eval set Vertex($name,Bitmap) \$bmp_$type #Initialize the item IDs. (Tcl will use for set Vertex($name,BmpID) -1 set Vertex($name,LabelID) -1 #draw it createVertex $name } ### # The following functions are used to set and obtain data # relating to vertex objects. If the need be, these functions # could be used to call propogation patterns that would # set or return the item requested. ### # #Sets the label of a given vertex proc setVertexLabel { name label } { global Vertex set Vertex($name,Label) $label } # #Returns the label of a given vertex proc getVertexLabel { name } { global Vertex return $Vertex($name,Label) } # #Sets the offset for the label of a given vertex proc setVertexLabelOff { name offset } { global Vertex iGraph changes set changes yes set Vertex($name,LabelOff) $offset set formatted "{$offset}" # puts "Sending: $name $formatted" $iGraph cppUpdVLabel: [fixID $name] $formatted } # #Returns the label offset for a given vertex proc getVertexLabelOff { name } { global Vertex return $Vertex($name,LabelOff) } # #Sets the coordinates of a given vertex proc setVertexCoords { name coords } { global Vertex iGraph changes set changes yes set Vertex($name,Coords) $coords set formatted "{$coords}" # puts "Sending: $name $formatted" $iGraph cppUpdVertex: [fixID $name] $formatted } # #Returns the coordinates of a given vertex proc getVertexCoords { name } { global Vertex return $Vertex($name,Coords) } # #Appends a new outgoing vertex to the list proc appendVertexEdgeOut { name edgeName } { global Vertex lappend Vertex($name,EdgeOut) $edgeName } # #Returns the list of outgoing vertices proc getVertexEdgeOut { name } { global Vertex return $Vertex($name,EdgeOut) } # #Appends a new incoming vertex to the list proc appendVertexEdgeIn { name edgeName } { global Vertex lappend Vertex($name,EdgeIn) $edgeName } # #Returns the list of incoming vertices proc getVertexEdgeIn { name } { global Vertex return $Vertex($name,EdgeIn) } # #Returns the type of a given vertex proc getVertexType { name } { global Vertex return $Vertex($name,Type) } # #Returns the bitmap of a vertex proc getVertexBitmap { name } { global Vertex return $Vertex($name,Bitmap) } # #Sets the bitmap id for a given vertex proc setVertexBmpID { name id } { global Vertex set Vertex($name,BmpID) $id } # #Returns the bitmap id of a vertex proc getVertexBmpID { name } { global Vertex return $Vertex($name,BmpID) } # #Sets the label id of a vertex proc setVertexLabelID { name id } { global Vertex set Vertex($name,LabelID) $id } # #Returns the label id of a vertex proc getVertexLabelID { name } { global Vertex return $Vertex($name,LabelID) } ### #Creates a new vertex and label, each with the proper bindings, on the canvas ### proc createVertex { name } { #Makes global vars accessible global INCLUDE can #Initializes coordinate and name vars set shapeX [getXCoord [getVertexCoords $name]] set shapeY [getYCoord [getVertexCoords $name]] set bmpName [getVertexBitmap $name] set labelName [getVertexLabel $name] set labelX [expr $shapeX + [getXCoord [getVertexLabelOff $name]]] set labelY [expr $shapeY + [getYCoord [getVertexLabelOff $name]]] #Creates vertex and label objects set node [$can create bitmap $shapeX $shapeY \ -bitmap "@$INCLUDE/$bmpName" -tags "$name _vertex_"] set nodelabel [$can create text $labelX $labelY \ -text $labelName -tags "$name _label_ _vertex_"] $can lower $node #Adds event bindings to the vertex and label #puts "Setting bindings for: $name $node $nodelabel" $can bind $node " onVertDown $name %x %y " $can bind $node " onVertMove $name %x %y " $can bind $node " onVertUp $name %x %y " $can bind $nodelabel " onVertLblMove $name %x %y " $can bind $nodelabel " onVertUp $name %x %y " $can bind $name "onVertEnter $name %x %y" $can bind $name "onVertLeave $name %x %y" #Sets ids setVertexBmpID $name $node #puts "Setting VertLbl id: $name $nodelabel" setVertexLabelID $name $nodelabel setVertexLabelOff $name [getVertexLabelOff $name] } ### #Resets the coordinates of a vertex label after its vertex is moved ### proc moveVertexLabel { name {coords {0 -20}} } { global can setVertexLabelOff $name $coords #Calculates where the label should be moved to set bmpX [getXCoord [getVertexCoords $name]] set bmpY [getYCoord [getVertexCoords $name]] set newX [expr $bmpX + [getXCoord $coords]] set newY [expr $bmpY + [getYCoord $coords]] set id [getVertexLabelID $name] $can coords $id $newX $newY } ### #Resets the coordinates of a moved vertex ### proc moveVertex { name coords } { global can setVertexCoords $name $coords set id [getVertexBmpID $name] $can coords $id [getXCoord $coords] [getYCoord $coords] #Moves the label relative to the new vertex position moveVertexLabel $name [getVertexLabelOff $name] } ### #Redraws the edges going in and out of a given vertex ### proc vertRedrawEdges { name } { foreach i [getVertexEdgeIn $name] { createEdge $i } foreach i [getVertexEdgeOut $name] { createEdge $i } } # Cool Hiliting stuff... ### #Highlights a vertex and its label ### proc vertHilite { name color } { global can lastHilited $can itemconfigure [getVertexLabelID $name] -fill $color $can itemconfigure [getVertexBmpID $name] -background $color set lastHilited $name } ### #Unhighlights a vertex and label ### proc vertUnhilite { name } { global can $can itemconfigure [getVertexLabelID $name] -fill black $can itemconfigure [getVertexBmpID $name] -background {} }