ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/util/do_action.tcl
Revision: 2.6
Committed: Tue Dec 6 13:00:31 1994 UTC (29 years, 4 months ago) by greg
Content type: application/x-tcl
Branch: MAIN
Changes since 2.5: +27 -11 lines
Log Message:
added host name tracking to batch rendering processes

File Contents

# Content
1 # SCCSid "$SunId$ LBL"
2 #
3 # Action screen for trad
4 #
5
6 set batch_fmt "Process %d on %s started"
7 set hostname [exec hostname]
8
9 proc make_script {} { # make run script
10 global scname rpview curmess
11 set rfn /usr/tmp/rf[pid]
12 if {! [save_vars $rfn]} {
13 beep
14 set curmess "Cannot save variables to temporary file!"
15 return
16 }
17 set radcom {rad -n}
18 if {"$rpview" != " ALL"} {
19 lappend radcom -v $rpview
20 }
21 if {"$scname" == {}} {
22 set rof /usr/tmp/ro[pid]
23 } else {
24 set rof $scname
25 }
26 lappend radcom $rfn > $rof
27 set badrun [catch "exec $radcom" curmess]
28 if {"$scname" == {}} {
29 if {! $badrun} {
30 view_txt $rof
31 }
32 exec rm $rof
33 }
34 exec rm $rfn
35 }
36
37 proc make_oct args { # Make octree file ($args is {-t} or {})
38 global radvar curmess
39 if {"$radvar(scene)" == {} && "$radvar(illum)" == {}} {
40 set fi [open "|make $radvar(OCTREE) $args" r]
41 while {[gets $fi curmess] >= 0} { update ; after 1000 }
42 catch {close $fi} curmess
43 }
44 if {"$args" == {}} {
45 run_rad -v 0
46 } else {
47 run_rad $args
48 }
49 }
50
51 proc run_rad args { # Run rad command with given arguments
52 global curmess
53 set rfn /usr/tmp/rf[pid]
54 if {! [save_vars $rfn]} {
55 beep
56 set curmess "Cannot save variables to temporary file!"
57 return
58 }
59 set ot [file mtime $rfn]
60 set fi [open "|rad $args $rfn" r]
61 while {[gets $fi curmess] >= 0} { update ; after 1000 }
62 if {! [catch {close $fi} curmess] && [file mtime $rfn] > $ot} {
63 load_vars $rfn {view}
64 make_vmenus
65 }
66 exec rm $rfn
67 }
68
69 proc run_batch {} { # start rendering in background
70 global rpview bfname batch_pid curmess rifname mywin batch_fmt hostname
71 if {! [chksave]} {return}
72 if [catch {set fo [open $bfname w]} curmess] {
73 return
74 }
75 # Make space for PID to be written later
76 puts $fo " "
77 if {$rpview == " ALL"} {
78 set radcom "rad"
79 } else {
80 set radcom "rad -v $rpview"
81 }
82 lappend radcom "[file tail $rifname]"
83 # Put out command
84 puts $fo $radcom
85 flush $fo
86 # Execute in background
87 set batch_pid [eval exec $radcom >>& $bfname &]
88 # Now, write PID and close file
89 seek $fo 0
90 puts -nonewline $fo "[format $batch_fmt $batch_pid $hostname]\
91 [exec date]"
92 close $fo
93 set curmess "Batch rendering process $batch_pid started."
94 # Correct button stati
95 $mywin.rbst configure -state disabled
96 $mywin.rbki configure -state normal
97 $mywin.rbce configure -state normal
98 $mywin.rbvmb configure -state disabled
99 }
100
101 proc kill_batch {} { # kill batch rendering
102 global batch_pid env curmess mywin
103 # Kill batch process and children
104 switch -glob [exec uname] {
105 SunOS -
106 ULTRIX {set ps "ps -lg"}
107 default {set ps "ps -lu $env(LOGNAME)"}
108 }
109 set fi [open "|$ps" r]
110 gets $fi li
111 regexp -indices -nocase { *PID} $li pidsec
112 regexp -indices -nocase { *PPID} $li ppidsec
113 while {[gets $fi li] >= 0} {
114 lappend plist "[eval string range {$li} $pidsec]\
115 [eval string range {$li} $ppidsec]"
116 }
117 if [catch {close $fi} curmess] {
118 return
119 }
120 set plist [lsort $plist]
121 set procs $batch_pid
122 # Two passes required when process id's go into recycling
123 for {set i 0} {$i < 2} {incr i} {
124 foreach pp $plist {
125 if {[lsearch -exact $procs [lindex $pp 1]] >= 0 &&
126 ($i == 0 || [lsearch -exact $procs \
127 [lindex $pp 0]] < 0)} {
128 lappend procs [lindex $pp 0]
129 }
130 }
131 }
132 if {! [catch {eval exec kill $procs} curmess]} {
133 set curmess "Batch process $batch_pid and children killed."
134 }
135 # change modes
136 $mywin.rbki configure -state disabled
137 $mywin.rbst configure -state normal
138 $mywin.rbvmb configure -state normal
139 set batch_pid 0
140 }
141
142 proc make_vmenus {} { # make/update view menus
143 global mywin radvar rvview
144 if {"$radvar(view)" == {}} {
145 set rvview X
146 } else {
147 set rvview [lindex [lindex $radvar(view) 0] 0]
148 }
149 catch {destroy $mywin.rivmb.m}
150 catch {destroy $mywin.rbvmb.m}
151 if {[llength $radvar(view)] < 2} {
152 $mywin.rivmb configure -state disabled
153 return
154 }
155 menu $mywin.rivmb.m
156 $mywin.rivmb configure -menu $mywin.rivmb.m -state normal
157 foreach v $radvar(view) {
158 $mywin.rivmb.m add radiobutton -label [lindex $v 0] \
159 -variable rvview -value [lindex $v 0]
160 }
161 menu $mywin.rbvmb.m
162 $mywin.rbvmb configure -menu $mywin.rbvmb.m
163 $mywin.rbvmb.m add radiobutton -label ALL \
164 -variable rpview -value " ALL"
165 $mywin.rbvmb.m add separator
166 foreach v $radvar(view) {
167 $mywin.rbvmb.m add radiobutton -label [lindex $v 0] \
168 -variable rpview -value [lindex $v 0]
169 }
170 }
171
172 proc do_action w { # Action screen
173 global rifname rvview rpview radvar bfname batch_pid \
174 curmess scname mywin alldone batch_fmt hostname
175 if {"$w" == "done"} {
176 unset rpview bfname batch_pid mywin
177 return
178 }
179 set bfname [file rootname [file tail $rifname]].err
180 frame $w
181 set mywin $w
182 # Generate octree
183 label $w.octl -text {Compile scene only}
184 place $w.octl -relx .1429 -rely .0610
185 button $w.octb -text oconv -relief raised -command make_oct
186 place $w.octb -relwidth .1071 -relheight .0610 -relx .4643 -rely .0610
187 helplink $w.octb trad action oconv
188 button $w.octt -text Touch -relief raised -command {make_oct -t}
189 place $w.octt -relwidth .1071 -relheight .0610 -relx .7143 -rely .0610
190 helplink $w.octt trad action touch
191 button $w.octf -text Force -relief raised -command \
192 {catch {exec rm -f $radvar(OCTREE)} ; make_oct}
193 place $w.octf -relwidth .1071 -relheight .0610 -relx .5893 -rely .0610
194 helplink $w.octf trad action force
195 # Render interactively
196 label $w.ril -text {Render interactively}
197 place $w.ril -relx .1429 -rely .2439
198 button $w.rirv -text rview -relief raised \
199 -command {run_rad -v $rvview -o x11}
200 place $w.rirv -relwidth .1071 -relheight .0610 -relx .4643 -rely .2439
201 helplink $w.rirv trad action rview
202 label $w.rivl -text View:
203 place $w.rivl -relx .6072 -rely .2439
204 menubutton $w.rivmb -textvariable rvview -anchor w -relief raised
205 place $w.rivmb -relwidth .1071 -relheight .0610 -relx .7143 -rely .2439
206 helplink $w.rivmb trad action view
207 # Render in background
208 label $w.rbl -text {Render in background}
209 place $w.rbl -relx .1429 -rely .4268
210 button $w.rbst -text Start -relief raised -command run_batch
211 place $w.rbst -relwidth .1071 -relheight .0610 -relx .4643 -rely .4268
212 helplink $w.rbst trad action start
213 label $w.rbvl -text View:
214 place $w.rbvl -relx .6072 -rely .4268
215 menubutton $w.rbvmb -textvariable rpview -anchor w -relief raised
216 place $w.rbvmb -relwidth .1071 -relheight .0610 -relx .7143 -rely .4268
217 helplink $w.rbvmb trad action view
218 button $w.rbki -text Kill -relief raised -command kill_batch
219 place $w.rbki -relwidth .1071 -relheight .0610 -relx .4643 -rely .5488
220 helplink $w.rbki trad action kill
221 button $w.rbce -text "Check errors" -relief raised \
222 -command {view_txt $bfname}
223 place $w.rbce -relwidth .1786 -relheight .0610 -relx .6429 -rely .5488
224 helplink $w.rbce trad action checkerr
225 if [file exists $bfname] {
226 set fi [open $bfname r]
227 scan [gets $fi] $batch_fmt batch_pid batch_host
228 gets $fi radcom
229 close $fi
230 if [string match "rad -v *" $radcom] {
231 set rpview [lindex $radcom 2]
232 } else {
233 set rpview " ALL"
234 }
235 if {"$hostname" != "$batch_host"} {
236 if $alldone {
237 set curmess "Batch rendering finished\
238 on host $batch_host."
239 } else {
240 set curmess "Unknown batch rendering status\
241 on host $batch_host."
242 $w.rbst configure -state disabled
243 $w.rbvmb configure -state disabled
244 }
245 set batch_pid 0
246 $w.rbki configure -state disabled
247 } elseif {[catch {exec /bin/kill -0 $batch_pid}]} {
248 if $alldone {
249 set curmess "Batch rendering finished."
250 } else {
251 set curmess "Batch rendering stopped."
252 }
253 set batch_pid 0
254 set rpview " ALL"
255 $w.rbki configure -state disabled
256 } else {
257 set curmess "Batch rendering process $batch_pid running."
258 $w.rbst configure -state disabled
259 $w.rbvmb configure -state disabled
260 }
261 } else {
262 set curmess "No batch rendering in progress."
263 set batch_pid 0
264 set rpview " ALL"
265 $w.rbki configure -state disabled
266 $w.rbce configure -state disabled
267 }
268 make_vmenus
269 # Dry run
270 label $w.drl -text {Dry run}
271 place $w.drl -relx .1429 -rely .7317
272 button $w.drsc -text Script -relief raised -command make_script
273 place $w.drsc -relwidth .1071 -relheight .0610 -relx .4643 -rely .7317
274 entry $w.drsf -textvariable scname -relief sunken
275 place $w.drsf -relwidth .2143 -relheight .0610 -relx .6429 -rely .7317
276 helplink "$w.drsc $w.drsf" trad action script
277 button $w.drvw -text Edit -relief raised -command {view_txt $scname}
278 place $w.drvw -relwidth .1071 -relheight .0610 -relx .4643 -rely .8537
279 helplink $w.drvw trad action edit
280 button $w.drdel -text Delete -relief raised \
281 -command {catch {exec rm $scname < /dev/null} curmess}
282 place $w.drdel -relwidth .1071 -relheight .0610 -relx .6429 -rely .8537
283 helplink $w.drdel trad action delete
284 }