#!/usr/bin/wish -f # descpie - Graph pie chart of expenses by description inside given category # # Written by Alexandr E. Bravo (abravo@tctube.spb.su) # Copyright (C) 1997 Alexandr E. Bravo (abravo@tctube.spb.su) # Based on script graphpie written by Arlindo L. Oliveira (aml@inesc.pt) # Copyright (C) 1996 Arlindo L. Oliveira (aml@inesc.pt) # # $Id: descpie,v 1.1.1.1 1999/12/18 02:06:43 curt Exp $ if { [file exists "$env(HOME)/.cbbrc.tcl"] } { source "$env(HOME)/.cbbrc.tcl" } set data(0,1) " " set desc " " set cnt 1 set dcnt 1 frame .check set iter 1 frame .check.list_$iter button .check.ok -text Ok -command {destroy .check} pack .check.ok -side top -fill x pack .check.list_$iter -side left -anchor n while {[gets stdin line] >= 1 && [lindex $line 0] != "!" } { set desc [lindex $line 0] # This line here is different for the ones that take both pos and neg # option add *font "-cronyx-helvetica-bold-r-normal-*-*-130-*-*-*-*-*-*" option add *font $cbb(msg_text_font) radiobutton .check.list_$iter.but_$cnt \ -text $desc \ -variable desc -relief flat -value $desc \ -relief flat # -font "-cronyx-helvetica-bold-r-normal-*-*-130-*-*-*-*-*-*" pack .check.list_$iter.but_$cnt -anchor w if {$cnt % 20 == 0} { incr iter frame .check.list_$iter pack .check.list_$iter -side left -anchor n } incr cnt } pack .check tkwait window .check while {[gets stdin line] >= 1 } { if { [lindex $line 0] == $desc } { set data($dcnt,0) [lindex $line 1] set data($dcnt,1) [lindex $line 2] incr dcnt } } set cnt $dcnt proc graphData {graph row col} { global data return $data($row,$col) } proc graphCols {canvas} { return 1 } proc graphRows {canvas} { global cnt return [expr $cnt-1] } # # createPieChart # rows : number of data rows 1 ... rows # cols : number of data cols 1 ... cols # data(0,i) contains data labels # data(i,0) contains abcissa labels # set barColors(0) "darkgreen" set barColors(1) "gray40" set barColors(2) "IndianRed3" set barColors(3) "blue3" set barColors(4) "red" set barColors(5) "chartreuse4" set barColors(6) "SkyBlue4" set barColors(7) "gold4" proc graphColor {i} { global barColors return $barColors([expr $i % 8]) } proc defGraphMargin {} { return 120 } proc defGraphHeight {} { return 450 } proc defGraphWidth {} { return 450 } proc defGraphWinHeight {} { return [expr [defGraphHeight]+2*[defGraphMargin]] } proc defGraphWinWidth {} { return [expr [defGraphWidth]+[defGraphMargin]+[defGraphMargin]] } proc createPieChart {graphName {canv 0}} { global graphCnt use canvas cbb set cols [graphCols $graphName] set rows [graphRows $graphName] wm withdraw . if {$canv == 0} { toplevel .graph$graphCnt set canvas [canvas .graph$graphCnt.graph -width [defGraphWinWidth] \ -height [defGraphWinHeight] -bg gray80] button .graph$graphCnt.dismiss -text dismiss \ -command {destroy .} button .graph$graphCnt.print -text Print \ -command { toplevel .m message .m.msg -font 12x24 -text "Printing to file pie.ps" pack .m.msg wm geometry .m +300+300 after 2000 {destroy .m} $canvas postscript -file pie.ps -pagewidth 19c } } pack $canvas pack .graph$graphCnt.dismiss -fill x pack .graph$graphCnt.print -fill x # # Width of each bar # set gw [defGraphWidth] set gh [defGraphHeight] set gm [defGraphMargin] # # Find total # set total 0 for {set j 1} {$j <= $cols} {incr j} { for {set i 1} {$i <= $rows} {incr i} { set total [expr $total+[graphData $graphName $i 1]] } } # # Draw total # set x2 [expr $gm + $gw/2.0] set total2 [expr $total] if { $total < 0 } { set total2 [expr -1.0*$total] } $canvas create text $x2 40 -fill "red" \ -font $cbb(button_font) -text "$graphName=$total2" # # Draw axes # # $canvas create rect $gm $gm [expr $gm+$gw] [expr $gm+$gh] \ # -fill gray80 -outline gray80 # # Draw legends # for {set i 1} {$i <= $cols} {incr i} { # $canvas create rect \ # [expr $gm+$gw+$gm/2] [expr $gm+40*$i] \ # [expr $gm+$gw+$gm+$gm/2] [expr $gm+40*$i+15] \ # -fill [graphColor $i] $canvas create text \ [expr $gm+$gw+$gm/2+10] [expr $gm+40*$i+18] \ -anchor n -text [graphData $graphName 0 $i] } # # Draw pie slices # set parcial 0 for {set i 1} {$i <= $rows} {incr i} { set x [expr -[graphData $graphName $i 1]] set offset 50 set tmp [$canvas create arc [expr $gm-$offset] [expr $gm-$offset] \ [expr $gm+$gw+$offset] [expr $gm+$gh+$offset] \ -extent 2 \ -start [expr 360.0*($parcial+$x/2.0)/$total] \ -tag [graphData $graphName $i 0] \ -style arc -outline gray80] set xx [$canvas bbox [graphData $graphName $i 0]] $canvas create arc $gm $gm [expr $gm+$gw] [expr $gm+$gh] \ -extent [expr 360.0*$x/$total] \ -start [expr 360.0*$parcial/$total] \ -fill [graphColor $i] set parcial [expr $parcial+$x] # # Draw labels # set x1 [expr ([lindex $xx 0]+[lindex $xx 2])/2] set y1 [expr ([lindex $xx 1]+[lindex $xx 3])/2] $canvas delete $tmp set s "[graphData $graphName $i 0] [format "%4.1f" [expr -(1.0*$x/$total*100)]]" set offset 0 set sign 1 while {1} { set a [$canvas create text $x1 [expr $y1+($offset*$sign)]\ -font $cbb(fixed_font) \ -text "$s%" \ -fill [graphColor $i]] set x [$canvas bbox $a] set ll [$canvas find overlap \ [lindex $x 0] [lindex $x 1] \ [lindex $x 2] [lindex $x 3]] if {[llength $ll] == 1} {break} $canvas delete $a set sign [expr -$sign] incr offset } # -font "-cronyx-helvetica-bold-r-normal-*-*-130-*-*-*-*-*-*" \ # set tx [expr $cols*$cw/2+($i-1)*$rs+$gm] # set tt [graphData $graphName $i 0] # set tt [string range $tt 0 7] # $canvas create text $tx \ # [expr $zero+6+(($i-1) % $nlevels)*13] -anchor n \ # -text $tt } } set graphCnt 0 #createPieChart lixo 0 createPieChart $desc 0