Annotation of capa/capa51/GUITools/seating.tcl, revision 1.3

1.2       albertel    1: # randomiz a seating chart file
                      2: #  Copyright (C) 1992-2000 Michigan State University
                      3: #
                      4: #  The CAPA system is free software; you can redistribute it and/or
1.3     ! albertel    5: #  modify it under the terms of the GNU General Public License as
1.2       albertel    6: #  published by the Free Software Foundation; either version 2 of the
                      7: #  License, or (at your option) any later version.
                      8: #
                      9: #  The CAPA system is distributed in the hope that it will be useful,
                     10: #  but WITHOUT ANY WARRANTY; without even the implied warranty of
                     11: #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
1.3     ! albertel   12: #  General Public License for more details.
1.2       albertel   13: #
1.3     ! albertel   14: #  You should have received a copy of the GNU General Public
1.2       albertel   15: #  License along with the CAPA system; see the file COPYING.  If not,
                     16: #  write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
                     17: #  Boston, MA 02111-1307, USA.
                     18: #
                     19: #  As a special exception, you have permission to link this program
                     20: #  with the TtH/TtM library and distribute executables, as long as you
                     21: #  follow the requirements of the GNU GPL in regard to all of the
                     22: #  software in the executable aside from TtH/TtM.
                     23: 
1.1       albertel   24: proc RSgetSeats { file } {
                     25:     set seats ""
                     26:     set fileId [open $file ]
                     27:     while { 1 } {
                     28: 	set line [gets $fileId]
                     29: 	if { [eof $fileId] } { break }
                     30: 	set location [string first " #" $line]
                     31: 	incr location -1
                     32: 	if { $location > 0 } { set line [string range $line 0 $location] }
                     33: 	set line [string trim $line]
                     34: 	lappend seats $line
                     35:     }
                     36:     return $seats
                     37: }
                     38: 
                     39: proc RSprocessSeats { seats moveVar unmoveVar } {
                     40:     upvar $moveVar move
                     41:     upvar $unmoveVar unmove
                     42:     set length [llength $seats]
                     43:     for {set i 0} {$i < $length} {incr i} {
                     44: 	set seat [lindex $seats $i]
                     45: 	if { [set location [string first " !" $seat]] > 0 } {
                     46: 	    incr location -1
                     47: 	    set seat [string trim [string range $seat 0 $location] ]
                     48: 	    set unmove($i) $seat
                     49: 	} else {
                     50: 	    lappend move $seat
                     51: 	}
                     52:     }
                     53: }
                     54: 
                     55: proc RSdoAssignment { movable unmovableVar outputfile } {
                     56:     upvar $unmovableVar unmovable
                     57:     
                     58:     set fileId [open $outputfile "w"]
                     59:     set totallength [expr {[llength $movable] + [llength [array names unmovable]]}]
                     60:     for { set i 0 } { $i < $totallength } { incr i } {
                     61: 	if { [set which [lsearch [array names unmovable] $i]] != -1} {
                     62: 	    set which [lindex [array names unmovable] $which]
                     63: 	    set seat $unmovable($which)
                     64: 	    unset unmovable($which)
                     65: 	} else {
                     66: 	    set which [expr int(rand() * [llength $movable])]
                     67: 	    set seat [lindex $movable $which]
                     68: 	    set movable [lreplace $movable $which $which]
                     69: 	}
                     70: 	puts $fileId $seat
                     71:     }
                     72:     close $fileId
                     73: }
                     74: 
                     75: proc RSassign {file output seed} {
                     76:     set move ""
                     77:     expr srand($seed)
                     78:     RSprocessSeats [RSgetSeats $file] move unmove
                     79:     RSdoAssignment $move unmove $output
                     80: }
                     81: 
                     82: proc RSopenFile { num which } {
                     83:     global gRS
                     84:     set gRS($num.$which) [tk_getOpenFile]
                     85: }
                     86: 
                     87: proc RSsaveFile { num which } {
                     88:     global gRS
                     89:     set gRS($num.$which) [tk_getSaveFile]
                     90: }
                     91: 
                     92: proc RSrun { num } {
                     93:     global gRS
                     94:     RSassign $gRS($num.file) $gRS($num.output) $gRS($num.seed)
                     95:     displayMessage "Done"
                     96: }
                     97: 
                     98: proc RSstart {num} {
                     99:     global gRS
                    100:     set gRS($num.file) ""
                    101:     set gRS($num.output) ""
                    102:     set gRS($num.seed) 100
                    103: 
                    104:     set window [toplevel .randomSeating$num]
                    105: 
                    106:     set infoFrame [frame $window.infoFrame]
                    107:     set pathFrame [frame $window.pathFrame]
                    108:     set seedFrame [frame $window.seedFrame]
                    109:     set buttonFrame [frame $window.buttonFrame]
                    110:     pack $infoFrame $pathFrame $seedFrame $buttonFrame
                    111: 
                    112:     set inputFrame [frame $pathFrame.inputFrame]
                    113:     set outputFrame [frame $pathFrame.outputFrame]
                    114:     pack $inputFrame $outputFrame
                    115: 
                    116:     label $inputFrame.label -text "Input File:"
                    117:     set ientryFrame [frame $inputFrame.ientryFrame]
                    118:     button $inputFrame.select -text "Select File" \
                    119: 	-command "RSopenFile $num file"
                    120:     pack $inputFrame.label $ientryFrame $inputFrame.select -side left
                    121:     entry $ientryFrame.entry -textvariable gRS($num.file) \
                    122: 	    -xscrollcommand "$ientryFrame.scroll set"
                    123:     scrollbar $ientryFrame.scroll -orient h -command \
                    124: 	    "$ientryFrame.entry xview"
                    125:     pack $ientryFrame.entry $ientryFrame.scroll
                    126:     pack configure $ientryFrame.scroll -fill x
                    127: 
                    128:     label $outputFrame.label -text "Output File:"
                    129:     set oentryFrame [frame $outputFrame.oentryFrame]
                    130:     button $outputFrame.select -text "Select File" \
                    131: 	-command "RSsaveFile $num output"
                    132:     pack $outputFrame.label $oentryFrame $outputFrame.select -side left
                    133:     entry $oentryFrame.entry -textvariable gRS($num.output) \
                    134: 	    -xscrollcommand "$oentryFrame.scroll set"
                    135:     scrollbar $oentryFrame.scroll -orient h -command \
                    136: 	    "$oentryFrame.entry xview"
                    137:     pack $oentryFrame.entry $oentryFrame.scroll
                    138:     pack configure $oentryFrame.scroll -fill x
                    139: 
                    140:     scale $seedFrame.seed -from 1 -to 30000 -variable gRS($num.seed) \
                    141: 	-label "Random number seed" -orient h -length 300
                    142:     pack $seedFrame.seed
                    143: 
                    144:     button $buttonFrame.assign -text Assign -command "RSrun $num"
                    145:     button $buttonFrame.exit -text "Exit" -command \
                    146: 	"unset gRS($num.file); unset gRS($num.output); unset gRS($num.seed); destroy $window"
                    147:     pack $buttonFrame.assign $buttonFrame.exit -side left
                    148: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>