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
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
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
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"
}
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"
}
}
-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]
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
}
.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
}
#****
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
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
}
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 } {
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
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"
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))}]
}
}
}
-
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]
}