(Nov 11, 2008) This is a bwise setup I've recently used on Linux (Fedora 8/64, tcl version 8,5, patchlevel 8.5.1), all in one file:
Same as textfile (.txt) to load in browser:
This version contains the 'Block' button to create blocks from procesdures automatically.
I used this file to start up on an HD format screen:
source ~/tcl/unixconsole.tcl
console eval {.console conf -font {courier 21}}
console eval { wm geom . 80x26+10+708 }
update
source ~/tcl/bwiseprocs0343.tcl
bwise
update
wm geom . 1149x653+9+4
# comment out when no more need..
welcome
# package require Img
# is there a Linux version ?
procs_window
update
wm geom .f 514x450+1168+25
.f.fu.lr conf -font {{MS Sans Serif} 13}
.f.fu.l conf -font {{MS Sans Serif} 13}
.f.ft.t conf -font {{MS Sans Serif} 14}
.f.fe.ffargs.e conf -font {{MS Sans Serif} 13}
.f.fe.ffcom.e conf -font {{MS Sans Serif} 13}
.f.fe.ffargs.b conf -font {{MS Sans Serif} 13}
.f.fe.ffcom.b conf -font {{MS Sans Serif} 13}I packed the files with my latest bwise experiments which when the right packages are installed even as I use it on both Linux (Fedora at least) and windows XP (pro):
A quick update result of some editing, debugging and adding to bwise: selection of blocks with a "select left" which also inverts and also on part of a function-like tree, info windows check with function names better, vars and windows belonging to deleted blocks are destroyed, sub-menus are tested on block and canvas menus, nnewmax* variables can contain maxima code, which can be instantiated on the canvas as a block by the cascaded menu atuomatically and in place (works, reuires latest maxima procs see elsewhere but is experimental), and possibly some more things:
proc canmenu { } {
global rmbut
global mc
catch "destroy $mc.pm"
catch "destroy $mc.pm.c1"
menu $mc.pm -tearoff 0
menu $mc.pm.c1 -tearoff 0
$mc.pm insert 1 command -label {none} -state disabled
$mc.pm insert 2 command -label "Eval" -command {global mc; set t "[$mc.pm entrycget 0 -label]" ; uplevel #0 eval $\{[blockfunc $t]\} }
$mc.pm insert 3 command -label "Data" -command {global mc; set t "[$mc.pm entrycget 0 -label]" ; canbwin $t }
$mc.pm insert 4 command -label "Propagate" -command {global mc; set t "[$mc.pm entrycget 0 -label]" ; run $t}
$mc.pm insert 5 command -label "Transfer" -command {global mc; set t "[$mc.pm entrycget 0 -label]" ; transfer $t}
$mc.pm insert 6 command -label "Run" -command {global mc; set t "[$mc.pm entrycget 0 -label]" ;uplevel #0 eval $\{[blockfunc $t]\}; run $t}
$mc.pm insert 7 command -label "Init" -command {global mc; set t "[$mc.pm entrycget 0 -label]" ;uplevel #0 eval $\{[blockfunc $t]_init\}; }
$mc.pm insert 8 command -label "Funprop" -command {global mc; set t "[$mc.pm entrycget 0 -label]" ; net_funprop $t}
$mc.pm insert 9 command -label "Selectallleft" -command {
global mc; set t "[$mc.pm entrycget 0 -label]" ;
foreach i [net_allleft $t] {
if { [llength [
listunion [ $mc find withtag $i ] \
[ $mc find withtag bbox ]
] ] == 0 } \
{
cbbox $i selection0
} {
eval $mc del [listunion [$mc find withtag bbox] [$mc find withtag $i ]]
} ;
}
}
$mc.pm.c1 insert 1 command -label Clear -command {
global mc; set t "[$mc.pm entrycget 0 -label]" ; puts "Unfunctional Clear selected on $t"}
$mc.pm insert 9 cascade -label "New" -menu $mc.pm.c1
# $mc.pm insert 5 command -label "Info" -command {global mc; set t "[$mc.pm entrycget 0 -label]" ; set infoline "$t [block_get_pinnames $t]"; eval set befunc "\${$t.bfunc}" }
$mc bind all $rmbut {global mc; $mc.pm entryco 0 -label [block_name_fromid current]; tk_popup $mc.pm [expr %X-0] %Y 1}
}
canmenu
proc mnewmenu { {X} {Y} {x} {y} } {
global mc
set x [$mc canvasx $x]
set y [$mc canvasy $y]
if {[llength [$mc find overlapping [expr $x-2] [expr $y-2] [expr $x+2] [expr $y+2] ] ] < 1} {
set pp [$mc find overlapping [expr $x-2] [expr $y-2] [expr $x+2] [expr $y+2] ]
# puts $x,$y,$pp,
catch {destroy $mc.m}; menu $mc.m; $mc.m del 0 end
catch {destroy $mc.m.c}; menu $mc.m.c; $mc.m.c del 0 end
foreach i [lsort -dict [info proc new*]] {$mc.m add command -label [string range $i 3 end] -command "mnewinst $i $x $y"}
foreach i [lsort -dict [uplevel #0 "info var nnewmax*"] ] {
global $i
eval "$mc.m.c add command -label [string range $i 4 end] -command \"maxtoblock [set $i] 9 [expr int($x)] [expr int($y)]\""
}
$mc.m add cascade -label 'nnewmax*' -menu $mc.m.c
tk_popup $mc.m $X $Y
}
}
proc canbwin { {b} } {
global tt
set bn {} ; append bn ".$b" "info" ; set bn [string tolower $bn]
catch "destroy $bn"
toplevel $bn
# here's the change:
set bs $b.*
uplevel #0 "eval {set tt \[info var $bs*\]} "
set j 0
foreach i [lsort -dict $tt] {
set il [string tolower $i]
frame $bn.n$j ; pack $bn.n$j -side top -expand n -fill x
label $bn.n$j.l -text $i -width 8 -anchor e
pack $bn.n$j.l -side left -expand n -fill x
entry $bn.n$j.e -textvar $i
pack $bn.n$j.e -side left -expand y -fill x
incr j
}
frame $bn.n$j ; pack $bn.n$j -side bottom -expand n -fill none
button $bn.n$j.c -text Close -command "destroy $bn"
pack $bn.n$j.c -side left -expand n -fill none
button $bn.n$j.e -text Eval -command "uplevel #0 eval \$\\{[blockfunc $b]\\}"
pack $bn.n$j.e -side left -expand n -fill none
incr j
}
proc block_del { {n} } {
global mc;
# remove proc window
set bn {} ; append bn ".$n" "info" ; set bn [string tolower $bn]
catch "destroy $bn"
# kill all blockvars
# It would be possible to also kill all other vars with blockname.* as name
set v [blockfunc $n init];
global $v ; unset $v
set v [blockfunc $n];
global $v ; unset $v
foreach pin [block_get_pinnames $n] {
set p [pinvar $n $pin]
global $p
unset $p
}
# delete all graphics elements
foreach i [$mc find withtag $n] {
if {[lindex [ $mc itemcget $i -tag ] 0] == $n} {$mc del $i}
}
}
proc maxtoblock { {a} {rec {8}} {x {850}} {y {50}} } {
incr rec
# this version will return formulas, not variables at pins as it reaches recursion limit, which is 1 deep per default
if {$rec > 10} {return end}
set r [maxcompo1 $a]
if [string equal $r end] {return end}
set op [lindex $r 0]
set r [lrange $r 1 end]
set name [newop $op [llength $r] {} in out 40 {} {} $x $y]
update
if {[llength $r] == 1} {
set name2 [maxtoblock $r $rec [expr $x-95] $y]
if ![string equal $name2 end] {
connect {} $name in $name2 out
incr y 85
} {
uplevel #0 set $name.in $r
}
} {
set j 0
foreach i $r {
set name2 [maxtoblock $i $rec [expr $x-95] $y]
if ![string equal $name2 end] {
connect {} $name in$j $name2 out
incr y 85
} {
uplevel #0 set $name.in$j [lindex $r $j]
}
incr j
}
}
return $name
}I'll organize and completify some of this later.