Annotation of capa/capa51/GUITools/seating.tcl, revision 1.1.1.1
1.1 albertel 1: proc RSgetSeats { file } {
2: set seats ""
3: set fileId [open $file ]
4: while { 1 } {
5: set line [gets $fileId]
6: if { [eof $fileId] } { break }
7: set location [string first " #" $line]
8: incr location -1
9: if { $location > 0 } { set line [string range $line 0 $location] }
10: set line [string trim $line]
11: lappend seats $line
12: }
13: return $seats
14: }
15:
16: proc RSprocessSeats { seats moveVar unmoveVar } {
17: upvar $moveVar move
18: upvar $unmoveVar unmove
19: set length [llength $seats]
20: for {set i 0} {$i < $length} {incr i} {
21: set seat [lindex $seats $i]
22: if { [set location [string first " !" $seat]] > 0 } {
23: incr location -1
24: set seat [string trim [string range $seat 0 $location] ]
25: set unmove($i) $seat
26: } else {
27: lappend move $seat
28: }
29: }
30: }
31:
32: proc RSdoAssignment { movable unmovableVar outputfile } {
33: upvar $unmovableVar unmovable
34:
35: set fileId [open $outputfile "w"]
36: set totallength [expr {[llength $movable] + [llength [array names unmovable]]}]
37: for { set i 0 } { $i < $totallength } { incr i } {
38: if { [set which [lsearch [array names unmovable] $i]] != -1} {
39: set which [lindex [array names unmovable] $which]
40: set seat $unmovable($which)
41: unset unmovable($which)
42: } else {
43: set which [expr int(rand() * [llength $movable])]
44: set seat [lindex $movable $which]
45: set movable [lreplace $movable $which $which]
46: }
47: puts $fileId $seat
48: }
49: close $fileId
50: }
51:
52: proc RSassign {file output seed} {
53: set move ""
54: expr srand($seed)
55: RSprocessSeats [RSgetSeats $file] move unmove
56: RSdoAssignment $move unmove $output
57: }
58:
59: proc RSopenFile { num which } {
60: global gRS
61: set gRS($num.$which) [tk_getOpenFile]
62: }
63:
64: proc RSsaveFile { num which } {
65: global gRS
66: set gRS($num.$which) [tk_getSaveFile]
67: }
68:
69: proc RSrun { num } {
70: global gRS
71: RSassign $gRS($num.file) $gRS($num.output) $gRS($num.seed)
72: displayMessage "Done"
73: }
74:
75: proc RSstart {num} {
76: global gRS
77: set gRS($num.file) ""
78: set gRS($num.output) ""
79: set gRS($num.seed) 100
80:
81: set window [toplevel .randomSeating$num]
82:
83: set infoFrame [frame $window.infoFrame]
84: set pathFrame [frame $window.pathFrame]
85: set seedFrame [frame $window.seedFrame]
86: set buttonFrame [frame $window.buttonFrame]
87: pack $infoFrame $pathFrame $seedFrame $buttonFrame
88:
89: set inputFrame [frame $pathFrame.inputFrame]
90: set outputFrame [frame $pathFrame.outputFrame]
91: pack $inputFrame $outputFrame
92:
93: label $inputFrame.label -text "Input File:"
94: set ientryFrame [frame $inputFrame.ientryFrame]
95: button $inputFrame.select -text "Select File" \
96: -command "RSopenFile $num file"
97: pack $inputFrame.label $ientryFrame $inputFrame.select -side left
98: entry $ientryFrame.entry -textvariable gRS($num.file) \
99: -xscrollcommand "$ientryFrame.scroll set"
100: scrollbar $ientryFrame.scroll -orient h -command \
101: "$ientryFrame.entry xview"
102: pack $ientryFrame.entry $ientryFrame.scroll
103: pack configure $ientryFrame.scroll -fill x
104:
105: label $outputFrame.label -text "Output File:"
106: set oentryFrame [frame $outputFrame.oentryFrame]
107: button $outputFrame.select -text "Select File" \
108: -command "RSsaveFile $num output"
109: pack $outputFrame.label $oentryFrame $outputFrame.select -side left
110: entry $oentryFrame.entry -textvariable gRS($num.output) \
111: -xscrollcommand "$oentryFrame.scroll set"
112: scrollbar $oentryFrame.scroll -orient h -command \
113: "$oentryFrame.entry xview"
114: pack $oentryFrame.entry $oentryFrame.scroll
115: pack configure $oentryFrame.scroll -fill x
116:
117: scale $seedFrame.seed -from 1 -to 30000 -variable gRS($num.seed) \
118: -label "Random number seed" -orient h -length 300
119: pack $seedFrame.seed
120:
121: button $buttonFrame.assign -text Assign -command "RSrun $num"
122: button $buttonFrame.exit -text "Exit" -command \
123: "unset gRS($num.file); unset gRS($num.output); unset gRS($num.seed); destroy $window"
124: pack $buttonFrame.assign $buttonFrame.exit -side left
125: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>