From c44bfbc8abfa8e30c1db02713436bcc183b1687a Mon Sep 17 00:00:00 2001 From: marko Date: Mon, 26 Mar 2007 11:51:39 +0000 Subject: [PATCH] Bug found by: Submitted by: Requested by: Reviewed by: Approved by: Obtained from: Do not show odd grid lines when zooming is set to or lower than 50%. Refactor TopoGen procedures so that they can operate on already existing nodes. Implement utilities for connecting selected nodes in a chain, star, cycle or clique topology. The functions are accessible when holding the right button over a selected node. Minor indentation cleanups. --- editor.tcl | 93 +++++++++++++++++++++++++--------------- topogen.tcl | 120 +++++++++++++++++++--------------------------------- 2 files changed, 103 insertions(+), 110 deletions(-) diff --git a/editor.tcl b/editor.tcl index 9362e6b..f6b5531 100755 --- a/editor.tcl +++ b/editor.tcl @@ -149,9 +149,9 @@ proc updateUndoLog {} { set t_undolog "" dumpCfg string t_undolog incr undolevel - if { $undolevel == 1 } { - .menubar.edit entryconfigure "Undo" -state normal - } + if { $undolevel == 1 } { + .menubar.edit entryconfigure "Undo" -state normal + } set undolog($undolevel) $t_undolog set redolevel $undolevel set changed 0 @@ -172,11 +172,10 @@ proc undo {} { global undolevel undolog oper_mode if {$oper_mode == "edit" && $undolevel > 0} { - .menubar.edit entryconfigure "Redo" -state normal incr undolevel -1 - if { $undolevel == 0 } { - .menubar.edit entryconfigure "Undo" -state disabled - } + if { $undolevel == 0 } { + .menubar.edit entryconfigure "Undo" -state disabled + } .c config -cursor watch loadCfg $undolog($undolevel) switchCanvas none @@ -200,12 +199,12 @@ proc redo {} { if {$oper_mode == "edit" && $redolevel > $undolevel} { incr undolevel - if { $undolevel == 1 } { - .menubar.edit entryconfigure "Undo" -state normal - } - if {$redolevel <= $undolevel} { - .menubar.edit entryconfigure "Redo" -state disabled - } + if { $undolevel == 1 } { + .menubar.edit entryconfigure "Undo" -state normal + } + if {$redolevel <= $undolevel} { + .menubar.edit entryconfigure "Redo" -state disabled + } .c config -cursor watch loadCfg $undolog($undolevel) switchCanvas none @@ -243,8 +242,10 @@ proc redrawAll {} { if { 1 } { for { set x $e_grid } { $x < $e_sizex } { incr x $e_grid } { if { [expr {$x % $e_grid2}] != 0 } { - .c create line $x 1 $x $e_sizey -fill gray -dash {1 7} \ - -tags "background" + if { $zoom > 0.5 } { + .c create line $x 1 $x $e_sizey \ + -fill gray -dash {1 7} -tags "background" + } } else { .c create line $x 1 $x $e_sizey -fill gray -dash {1 3} \ -tags "background" @@ -252,8 +253,10 @@ proc redrawAll {} { } for { set y $e_grid } { $y < $e_sizey } { incr y $e_grid } { if { [expr {$y % $e_grid2}] != 0 } { - .c create line 1 $y $e_sizex $y -fill gray -dash {1 7} \ - -tags "background" + if { $zoom > 0.5 } { + .c create line 1 $y $e_sizex $y \ + -fill gray -dash {1 7} -tags "background" + } } else { .c create line 1 $y $e_sizex $y -fill gray -dash {1 3} \ -tags "background" @@ -763,19 +766,32 @@ proc selectNodes { nodelist } { } } -proc selectAdjacent {} { - global curcanvas +proc selectedNodes {} { + set selected {} + foreach obj [.c find withtag "node && selected"] { + lappend selected [lindex [.c gettags $obj] 1] + } + return $selected +} +proc selectedRealNodes {} { set selected {} - set adjacent {} foreach obj [.c find withtag "node && selected"] { set node [lindex [.c gettags $obj] 1] - if { [getNodeCanvas $node] != $curcanvas || \ - [getNodeMirror $node] != "" } { - return + if { [getNodeMirror $node] != "" || + [nodeType $node] == "rj45" } { + continue } lappend selected $node } + return $selected +} + +proc selectAdjacent {} { + global curcanvas + + set selected [selectedNodes] + set adjacent {} foreach node $selected { foreach ifc [ifcList $node] { set peer [peerByIfc $node $ifc] @@ -884,10 +900,8 @@ proc button3link { c x y } { proc movetoCanvas { canvas } { global changed - set selected_nodes {} - foreach obj [.c find withtag "node && selected"] { - set node [lindex [.c gettags $obj] 1] - lappend selected_nodes $node + set selected_nodes [selectedNodes] + foreach node $selected_nodes { setNodeCanvas $node $canvas set changed 1 } @@ -1027,12 +1041,24 @@ proc button3node { c x y } { .button3menu add cascade -label "Create link to" \ -menu .button3menu.connect } - .button3menu.connect add command -label "Canvas:" -state disabled + destroy .button3menu.connect.selected + menu .button3menu.connect.selected -tearoff 0 + .button3menu.connect add cascade -label "Selected" \ + -menu .button3menu.connect.selected + .button3menu.connect.selected add command \ + -label "Chain" -command "P \[selectedRealNodes\]" + .button3menu.connect.selected add command \ + -label "Star" \ + -command "Kb \[lindex \[selectedRealNodes\] 0\] \ + \[lrange \[selectedNodes\] 1 end\]" + .button3menu.connect.selected add command \ + -label "Cycle" -command "C \[selectedRealNodes\]" + .button3menu.connect.selected add command \ + -label "Clique" -command "K \[selectedRealNodes\]" + .button3menu.connect add separator foreach canvas $canvas_list { destroy .button3menu.connect.$canvas menu .button3menu.connect.$canvas -tearoff 0 - .button3menu.connect.$canvas add command \ - -label "Node:" -state disabled .button3menu.connect add cascade -label [getCanvasName $canvas] \ -menu .button3menu.connect.$canvas } @@ -1448,7 +1474,7 @@ proc newGUILink { lnode1 lnode2 } { #**** proc button1-release { c x y } { global node_list activetool newlink curobj grid - global changed undolog undolevel redolevel selectbox selected + global changed undolog undolevel redolevel selectbox global lastX lastY sizex sizey zoom global autorearrange_enabled @@ -2602,8 +2628,7 @@ proc deleteSelection { } { catch {unset viewid} .c config -cursor watch; update - foreach obj [.c find withtag "node && selected"] { - set lnode [lindex [.c gettags $obj] 1] + foreach lnode [selectedNodes] { if { $lnode != "" } { removeGUINode $lnode } @@ -2621,7 +2646,7 @@ proc deleteSelection { } { proc align2grid {} { - global sizex sizey grid zoom changed + global sizex sizey grid zoom set node_objects [.c find withtag node] if { [llength $node_objects] == 0 } { diff --git a/topogen.tcl b/topogen.tcl index 02bb535..af47465 100755 --- a/topogen.tcl +++ b/topogen.tcl @@ -36,42 +36,45 @@ set m .menubar.t_g.chain menu $m -tearoff 0 .menubar.t_g add cascade -label "Chain" -menu $m -underline 0 -state disabled for { set i 2 } { $i <= 24 } { incr i } { - $m add command -label "P($i)" -command "P $i" + $m add command -label "P($i)" -command "P \[newNodes $i\]" } set m .menubar.t_g.star menu $m -tearoff 0 .menubar.t_g add cascade -label "Star" -menu $m -underline 0 -state disabled for { set i 3 } { $i <= 25 } { incr i } { - $m add command -label "S($i)" -command "S $i" + $m add command -label "S($i)" \ + -command "Kb \[newNodes 1\] \[newNodes [expr {$i - 1}]\]" } set m .menubar.t_g.cycle menu $m -tearoff 0 .menubar.t_g add cascade -label "Cycle" -menu $m -underline 0 -state disabled for { set i 3 } { $i <= 24 } { incr i } { - $m add command -label "C($i)" -command "C $i" + $m add command -label "C($i)" -command "C \[newNodes $i\]" } set m .menubar.t_g.wheel menu $m -tearoff 0 .menubar.t_g add cascade -label "Wheel" -menu $m -underline 0 -state disabled for { set i 4 } { $i <= 25 } { incr i } { - $m add command -label "W($i)" -command "W $i" + $m add command -label "W($i)" \ + -command "W \"\[newNodes 1\] \[newNodes [expr {$i - 1}]\]\"" } set m .menubar.t_g.cube menu $m -tearoff 0 .menubar.t_g add cascade -label "Cube" -menu $m -underline 0 -state disabled for { set i 2 } { $i <= 6 } { incr i } { - $m add command -label "Q($i)" -command "Q $i" + $m add command -label "Q($i)" \ + -command "Q \[newNodes [expr {int(pow(2,$i))}]\]" } set m .menubar.t_g.clique menu $m -tearoff 0 .menubar.t_g add cascade -label "Clique" -menu $m -underline 0 -state disabled for { set i 3 } { $i <= 24 } { incr i } { - $m add command -label "K($i)" -command "K $i" + $m add command -label "K($i)" -command "K \[newNodes $i\]" } set m .menubar.t_g.bipartite @@ -83,27 +86,27 @@ for { set i 1 } { $i <= 12 } { incr i } { menu $n -tearoff 0 $m add cascade -label "K($i,N)" -menu $n -underline 0 for { set j $i } { $j <= [expr {24 - $i}] } { incr j } { - $n add command -label "K($i,$j)" -command "Kb $i $j" + $n add command -label "K($i,$j)" -command "Kbhelper $i $j" } } -proc newNodes { node_type n } { - global curcanvas grid sizex sizey +proc newNodes { n } { + global curcanvas grid sizex sizey activetool set v {} set r [expr {($n - 1) * (1 + 4 / $n) * $grid / 2}] set x0 [expr {$sizex / 2}] set y0 [expr {$sizey / 2}] set twopidivn [expr {acos(0) * 4 / $n}] - if { $node_type == "router" } { + if { $activetool == "router" } { set dy 24 } else { set dy 32 } for { set i 0 } { $i < $n } { incr i } { - set new_node [newNode $node_type] + set new_node [newNode $activetool] set x [expr {$x0 + $r * cos($twopidivn * $i)}] set y [expr {$y0 - $r * sin($twopidivn * $i)}] setNodeCoords $new_node "$x $y" @@ -115,94 +118,60 @@ proc newNodes { node_type n } { return $v } -proc topoGenDone { nodes } { +proc topoGenDone { v } { global changed set changed 1 updateUndoLog redrawAll - selectNodes $nodes + selectNodes $v } # # Chain # -proc P { n } { - global activetool - +proc P { v } { .c config -cursor watch; update - - set v [newNodes $activetool $n] + set n [llength $v] for { set i 0 } { $i < [expr {$n - 1}] } { incr i } { newLink [lindex $v $i] [lindex $v [expr {($i + 1) % $n}]] } - topoGenDone $v } -# -# Star -# -proc S { n } { - global activetool - - .c config -cursor watch; update - - incr n -1 - set cv [newNodes $activetool 1] - set v [newNodes $activetool $n] - for { set i 0 } { $i < $n } { incr i } { - newLink [lindex $v $i] $cv - } - - topoGenDone "$cv $v" -} - # # Cycle # -proc C { n } { - global activetool - +proc C { v } { .c config -cursor watch; update - - set v [newNodes $activetool $n] + set n [llength $v] for { set i 0 } { $i < $n } { incr i } { newLink [lindex $v $i] [lindex $v [expr {($i + 1) % $n}]] } - topoGenDone $v } # # Wheel # -proc W { n } { - global activetool - +proc W { v } { .c config -cursor watch; update - - incr n -1 - set cv [newNodes $activetool 1] - set v [newNodes $activetool $n] - for { set i 0 } { $i < $n } { incr i } { - newLink [lindex $v $i] [lindex $v [expr {($i + 1) % $n}]] - newLink [lindex $v $i] $cv + set n [llength $v] + set vr [lindex $v 0] + set vt "$v [lindex $v 1]" + for { set i 1 } { $i < $n } { incr i } { + newLink $vr [lindex $v $i] + newLink [lindex $v $i] [lindex $vt [expr {$i + 1}]] } - - topoGenDone "$cv $v" + topoGenDone $v } # # Cube # -proc Q { order } { - global activetool - - .c config -cursor watch; update - - set n [expr {int(pow(2,$order))}] - set v [newNodes $activetool $n] +proc Q { v } { + set n [llength $v] + set order [expr int(log($n)/log(2))] for { set i 0 } { $i < $order } { incr i } { animateCursor set d [expr {int(pow(2, $i))}] @@ -212,40 +181,39 @@ proc Q { order } { } } } - topoGenDone $v } # # Clique # -proc K { n } { - global activetool - - set v [newNodes $activetool $n] +proc K { v } { + set n [llength $v] for { set i 0 } { $i < [expr {$n - 1}] } { incr i } { animateCursor for { set j [expr {$i + 1}] } { $j < $n } {incr j } { newLink [lindex $v $i] [lindex $v $j] } } - topoGenDone $v } # # Bipartite # -proc Kb { n m } { - global activetool - - set v [newNodes $activetool [expr {$n + $m}]] - for { set i 0 } { $i < $n } { incr i } { +proc Kb { v1 v2 } { + set n1 [llength $v1] + set n2 [llength $v2] + for { set i 0 } { $i < $n1 } { incr i } { animateCursor - for { set j 0 } { $j < $m } {incr j } { - newLink [lindex $v $i] [lindex $v [expr { $j + $n }]] + for { set j 0 } { $j < $n2 } {incr j } { + newLink [lindex $v1 $i] [lindex $v2 $j] } } + topoGenDone "$v1 $v2" +} - topoGenDone $v +proc Kbhelper { n m } { + set v [newNodes [expr $n + $m]] + Kb [lrange $v 0 [expr $n -1]] [lrange $v $n end] } -- 2.39.5