1 | #!/usr/bin/perl -w
|
---|
2 | use strict;
|
---|
3 | use Tk;
|
---|
4 | use Tk::Xrm;
|
---|
5 | use Tk qw(exit);
|
---|
6 |
|
---|
7 | my $version="Analyzer 20020429";
|
---|
8 |
|
---|
9 | my %bases;
|
---|
10 | my $first_file=undef;
|
---|
11 | my $last_file=undef;
|
---|
12 | my $fileno=0;
|
---|
13 |
|
---|
14 | my @panel_labels;
|
---|
15 | my @panel_ones;
|
---|
16 | my @panel_twos;
|
---|
17 | my @panel_onevars;
|
---|
18 | my @panel_twovars;
|
---|
19 | my @panel_keys;
|
---|
20 | my $panel_count;
|
---|
21 |
|
---|
22 | # pop the toplevels
|
---|
23 |
|
---|
24 | my $toplevel=new MainWindow(-class=>'AnalyzerGraph');
|
---|
25 | my $Xname=$toplevel->Class;
|
---|
26 | $toplevel->optionAdd("$Xname.geometry", "800x600",20);
|
---|
27 |
|
---|
28 | my $geometry=$toplevel->optionGet('geometry','');
|
---|
29 | $geometry=~/^(\d+)x(\d+)/;
|
---|
30 |
|
---|
31 | $toplevel->configure(-width=>$1);
|
---|
32 | $toplevel->configure(-height=>$2);
|
---|
33 |
|
---|
34 |
|
---|
35 |
|
---|
36 |
|
---|
37 |
|
---|
38 | $toplevel->optionAdd("$Xname.background", "#4fc627",20);
|
---|
39 | $toplevel->optionAdd("$Xname*highlightBackground", "#80c0d3",20);
|
---|
40 | $toplevel->optionAdd("$Xname.Panel.background", "#4fc627",20);
|
---|
41 | $toplevel->optionAdd("$Xname.Panel.foreground", "#d0d0d0",20);
|
---|
42 | $toplevel->optionAdd("$Xname.Panel.font",
|
---|
43 | '-*-helvetica-bold-r-*-*-18-*-*-*-*-*-*-*',20);
|
---|
44 | $toplevel->optionAdd("$Xname*Statuslabel.font",
|
---|
45 | '-*-helvetica-bold-r-*-*-18-*-*-*-*-*-*-*',20);
|
---|
46 | $toplevel->optionAdd("$Xname*Statuslabel.foreground", "#606060");
|
---|
47 | $toplevel->optionAdd("$Xname*Status.font",
|
---|
48 | '-*-helvetica-bold-r-*-*-18-*-*-*-*-*-*-*',20);
|
---|
49 |
|
---|
50 | $toplevel->optionAdd("$Xname*AlertDetail.font",
|
---|
51 | '-*-helvetica-medium-r-*-*-10-*-*-*-*-*-*-*',20);
|
---|
52 |
|
---|
53 |
|
---|
54 | $toplevel->optionAdd("$Xname*background", "#d0d0d0",20);
|
---|
55 | $toplevel->optionAdd("$Xname*foreground", '#000000',20);
|
---|
56 |
|
---|
57 | $toplevel->optionAdd("$Xname*Button*background", "#f0d0b0",20);
|
---|
58 | $toplevel->optionAdd("$Xname*Button*foreground", '#000000',20);
|
---|
59 | $toplevel->optionAdd("$Xname*Button*borderWidth", '2',20);
|
---|
60 | $toplevel->optionAdd("$Xname*Button*relief", 'groove',20);
|
---|
61 | $toplevel->optionAdd("$Xname*Button*padY", 1,20);
|
---|
62 |
|
---|
63 | #$toplevel->optionAdd("$Xname*Scale*background", "#f0d0b0",20);
|
---|
64 | $toplevel->optionAdd("$Xname*Scale*foreground", '#000000',20);
|
---|
65 | $toplevel->optionAdd("$Xname*Scale*borderWidth", '1',20);
|
---|
66 | #$toplevel->optionAdd("$Xname*Scale*relief", 'groove',20);
|
---|
67 | $toplevel->optionAdd("$Xname*Scale*padY", 1,20);
|
---|
68 |
|
---|
69 | $toplevel->optionAdd("$Xname*Checkbutton*background", "#f0d0b0",20);
|
---|
70 | $toplevel->optionAdd("$Xname*Checkbutton*foreground", '#000000',20);
|
---|
71 | $toplevel->optionAdd("$Xname*Checkbutton*borderWidth", '2',20);
|
---|
72 | $toplevel->optionAdd("$Xname*Checkbutton*relief", 'groove',20);
|
---|
73 |
|
---|
74 | $toplevel->optionAdd("$Xname*activeBackground", "#ffffff",20);
|
---|
75 | $toplevel->optionAdd("$Xname*activeForeground", '#0000a0',20);
|
---|
76 | $toplevel->optionAdd("$Xname*borderWidth", 0,20);
|
---|
77 | $toplevel->optionAdd("$Xname*relief", 'flat',20);
|
---|
78 | $toplevel->optionAdd("$Xname*activeBorderWidth", 1,20);
|
---|
79 | $toplevel->optionAdd("$Xname*highlightThickness", 0,20);
|
---|
80 | $toplevel->optionAdd("$Xname*padX", 2,20);
|
---|
81 | $toplevel->optionAdd("$Xname*padY", 2,20);
|
---|
82 | $toplevel->optionAdd("$Xname*font",
|
---|
83 | '-*-helvetica-bold-r-*-*-12-*-*-*-*-*-*-*',20);
|
---|
84 | $toplevel->optionAdd("$Xname*Entry.font",
|
---|
85 | '-*-helvetica-medium-r-*-*-12-*-*-*-*-*-*-*',20);
|
---|
86 | $toplevel->optionAdd("$Xname*Exit.font",
|
---|
87 | '-*-helvetica-bold-r-*-*-10-*-*-*-*-*-*-*',20);
|
---|
88 | $toplevel->optionAdd("$Xname*Exit.relief", 'groove',20);
|
---|
89 | $toplevel->optionAdd("$Xname*Exit.padX", 1,20);
|
---|
90 | $toplevel->optionAdd("$Xname*Exit.padY", 1,20);
|
---|
91 | $toplevel->optionAdd("$Xname*Exit.borderWidth", 2,20);
|
---|
92 | $toplevel->optionAdd("$Xname*Exit*background", "#a0a0a0",20);
|
---|
93 | $toplevel->optionAdd("$Xname*Exit*disabledForeground", "#ffffff",20);
|
---|
94 |
|
---|
95 | #$toplevel->optionAdd("$Xname*Canvas.background", "#c0c0c0",20);
|
---|
96 |
|
---|
97 | $toplevel->optionAdd("$Xname*Entry.background", "#ffffff",20);
|
---|
98 | $toplevel->optionAdd("$Xname*Entry.disabledForeground", "#c0c0c0",20);
|
---|
99 | $toplevel->optionAdd("$Xname*Entry.relief", "sunken",20);
|
---|
100 | $toplevel->optionAdd("$Xname*Entry.borderWidth", 1,20);
|
---|
101 |
|
---|
102 | $toplevel->optionAdd("$Xname*Field.background", "#ffffff",20);
|
---|
103 | $toplevel->optionAdd("$Xname*Field.disabledForeground", "#c0c0c0",20);
|
---|
104 | $toplevel->optionAdd("$Xname*Field.relief", "flat",20);
|
---|
105 | $toplevel->optionAdd("$Xname*Field.borderWidth", 1,20);
|
---|
106 |
|
---|
107 | $toplevel->optionAdd("$Xname*Label.disabledForeground", "#c0c0c0",20);
|
---|
108 | $toplevel->optionAdd("$Xname*Label.borderWidth", 1,20);
|
---|
109 |
|
---|
110 | $toplevel->configure(-background=>$toplevel->optionGet("background",""));
|
---|
111 |
|
---|
112 | #$toplevel->resizable(FALSE,FALSE);
|
---|
113 |
|
---|
114 | my $panel=new MainWindow(-class=>'AnalyzerPanel');
|
---|
115 | my $X2name=$panel->Class;
|
---|
116 |
|
---|
117 | $panel->optionAdd("$X2name.background", "#353535",20);
|
---|
118 | $panel->optionAdd("$X2name*highlightBackground", "#80c0d3",20);
|
---|
119 | $panel->optionAdd("$X2name.Panel.background", "#353535",20);
|
---|
120 | $panel->optionAdd("$X2name.Panel.foreground", "#4fc627",20);
|
---|
121 | $panel->optionAdd("$X2name.Panel.font",
|
---|
122 | '-*-helvetica-bold-o-*-*-18-*-*-*-*-*-*-*',20);
|
---|
123 | $panel->optionAdd("$X2name*Statuslabel.font",
|
---|
124 | '-*-helvetica-bold-r-*-*-18-*-*-*-*-*-*-*',20);
|
---|
125 | $panel->optionAdd("$X2name*Statuslabel.foreground", "#4fc627",20);
|
---|
126 | $panel->optionAdd("$X2name*Status.font",
|
---|
127 | '-*-helvetica-bold-r-*-*-18-*-*-*-*-*-*-*',20);
|
---|
128 |
|
---|
129 | $panel->optionAdd("$X2name*AlertDetail.font",
|
---|
130 | '-*-helvetica-medium-r-*-*-10-*-*-*-*-*-*-*',20);
|
---|
131 |
|
---|
132 |
|
---|
133 | $panel->optionAdd("$X2name*background", "#d0d0d0",20);
|
---|
134 | $panel->optionAdd("$X2name*foreground", '#000000',20);
|
---|
135 |
|
---|
136 | $panel->optionAdd("$X2name*Button*background", "#f0d0b0",20);
|
---|
137 | $panel->optionAdd("$X2name*Button*foreground", '#000000',20);
|
---|
138 | $panel->optionAdd("$X2name*Button*borderWidth", '2',20);
|
---|
139 | $panel->optionAdd("$X2name*Button*relief", 'groove',20);
|
---|
140 | $panel->optionAdd("$X2name*Button*padY", 1,20);
|
---|
141 |
|
---|
142 | $panel->optionAdd("$X2name*Checkbutton*background", "#f0d0b0",20);
|
---|
143 | $panel->optionAdd("$X2name*Checkbutton*foreground", '#000000',20);
|
---|
144 | $panel->optionAdd("$X2name*Checkbutton*borderWidth", '2',20);
|
---|
145 | #$panel->optionAdd("$X2name*Checkbutton*padX", '0',20);
|
---|
146 | #$panel->optionAdd("$X2name*Checkbutton*padY", '0',20);
|
---|
147 | #$panel->optionAdd("$X2name*Checkbutton*relief", 'groove',20);
|
---|
148 |
|
---|
149 | $panel->optionAdd("$X2name*activeBackground", "#ffffff",20);
|
---|
150 | $panel->optionAdd("$X2name*activeForeground", '#0000a0',20);
|
---|
151 | $panel->optionAdd("$X2name*borderWidth", 0,20);
|
---|
152 | $panel->optionAdd("$X2name*relief", 'flat',20);
|
---|
153 | $panel->optionAdd("$X2name*activeBorderWidth", 1,20);
|
---|
154 | $panel->optionAdd("$X2name*highlightThickness", 0,20);
|
---|
155 | $panel->optionAdd("$X2name*padX", 2,20);
|
---|
156 | $panel->optionAdd("$X2name*padY", 2,20);
|
---|
157 | $panel->optionAdd("$X2name*font",
|
---|
158 | '-*-helvetica-bold-r-*-*-12-*-*-*-*-*-*-*',20);
|
---|
159 | $panel->optionAdd("$X2name*Entry.font",
|
---|
160 | '-*-helvetica-medium-r-*-*-12-*-*-*-*-*-*-*',20);
|
---|
161 |
|
---|
162 | $panel->optionAdd("$X2name*Exit.font",
|
---|
163 | '-*-helvetica-bold-r-*-*-10-*-*-*-*-*-*-*',20);
|
---|
164 | $panel->optionAdd("$X2name*Exit.relief", 'groove',20);
|
---|
165 | $panel->optionAdd("$X2name*Exit.padX", 1,20);
|
---|
166 | $panel->optionAdd("$X2name*Exit.padY", 1,20);
|
---|
167 | $panel->optionAdd("$X2name*Exit.borderWidth", 2,20);
|
---|
168 | $panel->optionAdd("$X2name*Exit*background", "#a0a0a0",20);
|
---|
169 | $panel->optionAdd("$X2name*Exit*disabledForeground", "#ffffff",20);
|
---|
170 |
|
---|
171 | $panel->optionAdd("$X2name*Entry.background", "#ffffff",20);
|
---|
172 | $panel->optionAdd("$X2name*Entry.disabledForeground", "#c0c0c0",20);
|
---|
173 | $panel->optionAdd("$X2name*Entry.relief", "sunken",20);
|
---|
174 | $panel->optionAdd("$X2name*Entry.borderWidth", 1,20);
|
---|
175 |
|
---|
176 | $panel->optionAdd("$X2name*Field.background", "#ffffff",20);
|
---|
177 | $panel->optionAdd("$X2name*Field.disabledForeground", "#c0c0c0",20);
|
---|
178 | $panel->optionAdd("$X2name*Field.relief", "flat",20);
|
---|
179 | $panel->optionAdd("$X2name*Field.borderWidth", 1,20);
|
---|
180 |
|
---|
181 | $panel->optionAdd("$X2name*Label.disabledForeground", "#c0c0c0",20);
|
---|
182 | $panel->optionAdd("$X2name*Label.borderWidth", 1,20);
|
---|
183 |
|
---|
184 | $panel->configure(-background=>$panel->optionGet("background",""));
|
---|
185 |
|
---|
186 | #$panel->resizable("FALSE","FALSE");
|
---|
187 |
|
---|
188 | my $panel_shell=$panel->Label(Name=>"shell",-borderwidth=>1,-relief=>'raised')->
|
---|
189 | place(-x=>10,-y=>36,-relwidth=>1.0,-relheight=>1.0,
|
---|
190 | -width=>-20,-height=>-46,-anchor=>'nw');
|
---|
191 |
|
---|
192 | my $panel_quit=$panel_shell->Button(-class=>"Exit",-text=>"quit",-command=>[sub{Shutdown()}])->
|
---|
193 | place(-x=>-1,-y=>-1,-relx=>1.0,-rely=>1.0,-anchor=>'se');
|
---|
194 |
|
---|
195 | $panel->Label(Name=>"logo text",-class=>"Panel",-text=>$version)->
|
---|
196 | place(-x=>5,-y=>5,-anchor=>'nw');
|
---|
197 |
|
---|
198 |
|
---|
199 | my $graph_shell=$toplevel->Label(Name=>"shell",-borderwidth=>1,-relief=>'raised')->
|
---|
200 | place(-x=>10,-y=>36,-relwidth=>1.0,-relheight=>1.0,
|
---|
201 | -width=>-20,-height=>-46,-anchor=>'nw');
|
---|
202 |
|
---|
203 | my $graph_status=$toplevel->Label(Name=>"logo text",-class=>"Panel",-text=>"Starting up")->
|
---|
204 | place(-x=>5,-y=>5,-anchor=>'nw');
|
---|
205 |
|
---|
206 |
|
---|
207 | my $panely=5;
|
---|
208 | my $panel_rescan=$panel_shell->Button(-text=>"rescan",-command=>[sub{scan_directory()}])->
|
---|
209 | place(-x=>-5,-relx=>1.,-y=>$panely,-anchor=>'ne');
|
---|
210 | $panely+=$panel_rescan->reqheight()+6;
|
---|
211 |
|
---|
212 |
|
---|
213 | my$temp=$graph_shell->Button(-text=>"<<",
|
---|
214 | -command=>[sub{$fileno-=10;$fileno=$first_file if($fileno<$first_file);
|
---|
215 | load_graph();}])->
|
---|
216 | place(-x=>5,-y=>-5,-rely=>1.,-relwidth=>.2,-width=>-5,-anchor=>'sw');
|
---|
217 | $graph_shell->Button(-text=>">>",
|
---|
218 | -command=>[sub{$fileno+=10;$fileno=$last_file if($fileno>$last_file);
|
---|
219 | load_graph();}])->
|
---|
220 | place(-x=>-5,-y=>-5,-relwidth=>.2,-rely=>1.,-width=>-5,-relx=>1.,-anchor=>'se');
|
---|
221 | $graph_shell->Button(-text=>"<",
|
---|
222 | -command=>[sub{$fileno-=1;$fileno=$first_file if($fileno<$first_file);
|
---|
223 | load_graph();}])->
|
---|
224 | place(-x=>5,-y=>-5,-relwidth=>.3,-width=>-7,-rely=>1.,-relx=>.2,-anchor=>'sw');
|
---|
225 | $graph_shell->Button(-text=>">",
|
---|
226 | -command=>[sub{$fileno+=1;$fileno=$last_file if($fileno>$last_file);
|
---|
227 | load_graph();}])->
|
---|
228 | place(-x=>-5,-y=>-5,-relwidth=>.3,-width=>-7,-rely=>1.,-relx=>.8,-anchor=>'se');
|
---|
229 | my$graphy=-10-$temp->reqheight();
|
---|
230 | my$graph_slider=$temp=$graph_shell->Scale(-bigincrement=>1,
|
---|
231 | -resolution=>1,
|
---|
232 | -showvalue=>'TRUE',-variable=>\$fileno,-orient=>'horizontal')->
|
---|
233 | place(-x=>5,-y=>$graphy,-relwidth=>1.,-rely=>1.,-width=>-10,-anchor=>'sw');
|
---|
234 | $graphy-=$temp->reqheight()+5;
|
---|
235 |
|
---|
236 | my$onecrop;
|
---|
237 | my$twocrop;
|
---|
238 |
|
---|
239 | my$oneresize=$temp=$graph_shell->Checkbutton(-text=>"rescale",-variable=>\$onecrop,
|
---|
240 | -command=>[sub{draw_graph();}])->
|
---|
241 | place(-x=>5,-y=>5,-anchor=>'nw');
|
---|
242 |
|
---|
243 | my$one=$graph_shell->Canvas()->
|
---|
244 | place(-relwidth=>1.,-width=>-10,-relheight=>.5,-height=>($graphy/2)-5-$temp->reqheight(),
|
---|
245 | -x=>5,-y=>5+$temp->reqheight,-anchor=>'nw');
|
---|
246 |
|
---|
247 |
|
---|
248 | my$tworesize=$temp=$graph_shell->Checkbutton(-text=>"rescale",-variable=>\$twocrop,
|
---|
249 | -command=>[sub{draw_graph();}])->
|
---|
250 | place(-rely=>1.,-y=>5,-anchor=>'nw',-in=>$one);
|
---|
251 | my$two=$graph_shell->Canvas()->
|
---|
252 | place(-relwidth=>1.,-relheight=>1.,-rely=>1.,-y=>5+$temp->reqheight(),-anchor=>'nw',-in=>$one);
|
---|
253 |
|
---|
254 | scan_directory();
|
---|
255 |
|
---|
256 | my%onestate;
|
---|
257 | my%twostate;
|
---|
258 | my @data;
|
---|
259 |
|
---|
260 | $onestate{"canvas"}=$one;
|
---|
261 | $onestate{"vars"}=\@panel_onevars;
|
---|
262 | $twostate{"canvas"}=$two;
|
---|
263 | $twostate{"vars"}=\@panel_twovars;
|
---|
264 |
|
---|
265 | $graph_slider->configure(-command=>[sub{load_graph()}]);
|
---|
266 | load_graph();
|
---|
267 | $toplevel->bind('MainWindow','<Configure>',[sub{$toplevel->update();
|
---|
268 | draw_graph()}]);
|
---|
269 |
|
---|
270 | Tk::MainLoop();
|
---|
271 |
|
---|
272 | sub load_graph{
|
---|
273 |
|
---|
274 | scan_directory()if(!defined($panel_count));
|
---|
275 |
|
---|
276 | @data=undef;
|
---|
277 |
|
---|
278 | for(my$i=0;$i<$panel_count;$i++){
|
---|
279 | my$filename=$panel_keys[$i]."_$fileno.m";
|
---|
280 | if(open F, "$filename"){
|
---|
281 | $data[$i]=[(<F>)];
|
---|
282 | close F;
|
---|
283 | }
|
---|
284 | }
|
---|
285 | draw_graph();
|
---|
286 | }
|
---|
287 |
|
---|
288 | sub graphhelper{
|
---|
289 | my($graph)=@_;
|
---|
290 | my$count=0;
|
---|
291 | my@colors=("#ff0000","#00df00","#0000ff","#ffff00","#ff00ff","#00ffff","#ffffff",
|
---|
292 | "#9f0000","#007f00","#00009f","#8f8f00","#8f008f","#008f8f","#000000");
|
---|
293 |
|
---|
294 | my$w=$graph->{"canvas"};
|
---|
295 | my$rescale=0;
|
---|
296 |
|
---|
297 | Status("Plotting $fileno");
|
---|
298 | $w->delete('foo');
|
---|
299 | $w->delete('legend');
|
---|
300 | $w->delete('lines');
|
---|
301 |
|
---|
302 | # count range
|
---|
303 | for(my$i=0;$i<$panel_count;$i++){
|
---|
304 | if($graph->{"vars"}->[$i]){
|
---|
305 | if(defined($data[$i])){
|
---|
306 | if(!defined($graph->{"minx"})){
|
---|
307 | $data[$i]->[0]=~m/^\s*(-?[0-9\.]*)[ ,]+(-?[0-9\.]*)/;
|
---|
308 | $graph->{"maxx"}=$1;
|
---|
309 | $graph->{"minx"}=$1;
|
---|
310 | $graph->{"maxy"}=$2;
|
---|
311 | $graph->{"miny"}=$2;
|
---|
312 | $rescale=1;
|
---|
313 | }
|
---|
314 |
|
---|
315 | for(my$j=0;$j<=$#{$data[$i]};$j++){
|
---|
316 | $data[$i]->[$j]=~m/^\s*(-?[0-9\.]*)[ ,]+(-?[0-9\.]*)/;
|
---|
317 | $rescale=1 if($1>$graph->{"maxx"});
|
---|
318 | $rescale=1 if($1<$graph->{"minx"});
|
---|
319 | $rescale=1 if($2>$graph->{"maxy"});
|
---|
320 | $rescale=1 if($2<$graph->{"miny"});
|
---|
321 | $graph->{"maxx"}=$1 if($1>$graph->{"maxx"});
|
---|
322 | $graph->{"minx"}=$1 if($1<$graph->{"minx"});
|
---|
323 | $graph->{"maxy"}=$2 if($2>$graph->{"maxy"});
|
---|
324 | $graph->{"miny"}=$2 if($2<$graph->{"miny"});
|
---|
325 | }
|
---|
326 | }
|
---|
327 | $count++;
|
---|
328 | }
|
---|
329 | }
|
---|
330 |
|
---|
331 | my$width=$w->width();
|
---|
332 | my$height=$w->height();
|
---|
333 |
|
---|
334 | $rescale=1 if(!defined($graph->{"width"}) ||
|
---|
335 | $width!=$graph->{"width"} ||
|
---|
336 | $height!=$graph->{"height"});
|
---|
337 |
|
---|
338 | $graph->{"width"}=$width;
|
---|
339 | $graph->{"height"}=$height;
|
---|
340 |
|
---|
341 | if(defined($graph->{"maxx"})){
|
---|
342 | # draw axes, labels
|
---|
343 | # look for appropriate axis scales
|
---|
344 |
|
---|
345 | if($rescale){
|
---|
346 |
|
---|
347 | $w->delete('ylabel');
|
---|
348 | $w->delete('xlabel');
|
---|
349 | $w->delete('axes');
|
---|
350 |
|
---|
351 | my$yscale=1.;
|
---|
352 | my$xscale=1.;
|
---|
353 | my$iyscale=1.;
|
---|
354 | my$ixscale=1.;
|
---|
355 | while(($graph->{"maxx"}-$graph->{"minx"})*$xscale>15){$xscale*=.1;$ixscale*=10.;}
|
---|
356 | while(($graph->{"maxy"}-$graph->{"miny"})*$yscale>15){$yscale*=.1;$iyscale*=10.;}
|
---|
357 |
|
---|
358 | while(($graph->{"maxx"}-$graph->{"minx"})*$xscale<3){$xscale*=10.;$ixscale*=.1;}
|
---|
359 | while(($graph->{"maxy"}-$graph->{"miny"})*$yscale<3){$yscale*=10.;$iyscale*=.1;}
|
---|
360 |
|
---|
361 | # how tall are the x axis labels?
|
---|
362 | $w->createText(-1,-1,-anchor=>'se',-tags=>['foo'],-text=>"0123456789.");
|
---|
363 | my($x1,$y1,$x2,$y2)=$w->bbox('foo');
|
---|
364 | $w->delete('foo');
|
---|
365 | my$maxlabelheight=$y2-$y1;
|
---|
366 | my$useabley=$height-$maxlabelheight-3;
|
---|
367 | my$pixelpery=$useabley/($graph->{"maxy"}-$graph->{"miny"});
|
---|
368 |
|
---|
369 | # place y axis labels at proper spacing/height
|
---|
370 | my$lasty=-$maxlabelheight/2;
|
---|
371 | my$topyval=int($graph->{"maxy"}*$yscale+1.)*$iyscale;
|
---|
372 |
|
---|
373 | for(my$i=0;;$i++){
|
---|
374 | my$yval= $topyval-$i*$iyscale;
|
---|
375 | my$y= ($graph->{"maxy"}-$yval)*$pixelpery;
|
---|
376 | last if($y>$useabley);
|
---|
377 | if($y-$maxlabelheight>=$lasty){
|
---|
378 | $w->createText(0,$y,-anchor=>'e',-tags=>['ylabel'],-text=>"$yval");
|
---|
379 | $lasty=$y;
|
---|
380 | }
|
---|
381 | }
|
---|
382 |
|
---|
383 | # get the max ylabel width and place them at proper x
|
---|
384 | ($x1,$y1,$x2,$y2)=$w->bbox('ylabel');
|
---|
385 | my$maxylabelwidth=$x2-$x1;
|
---|
386 | $w->move('ylabel',$maxylabelwidth,0);
|
---|
387 |
|
---|
388 | my$beginx=$maxylabelwidth+3;
|
---|
389 | my$useablex=$width-$beginx;
|
---|
390 |
|
---|
391 | # draw basic axes
|
---|
392 | $w->createLine($beginx,0,$beginx,$useabley,$width,$useabley,
|
---|
393 | -tags=>['axes'],-width=>2);
|
---|
394 | # draw y tix
|
---|
395 | $lasty=-$maxlabelheight/2;
|
---|
396 | for(my$i=0;;$i++){
|
---|
397 | my$yval= $topyval-$i*$iyscale;
|
---|
398 | my$y= ($graph->{"maxy"}-$yval)*$pixelpery;
|
---|
399 | last if($y>$useabley);
|
---|
400 | if($yval==0){
|
---|
401 | $w->createLine($beginx,$y,$width,$y,
|
---|
402 | -tags=>['axes'],-width=>1);
|
---|
403 | }else{
|
---|
404 | if($y-$maxlabelheight>=$lasty){
|
---|
405 | $w->createLine($beginx,$y,$width,$y,
|
---|
406 | -tags=>['axes'],-width=>1,
|
---|
407 | -stipple=>'gray50');
|
---|
408 |
|
---|
409 | $lasty=$y;
|
---|
410 | }
|
---|
411 | }
|
---|
412 | }
|
---|
413 |
|
---|
414 | # place x axis labels at proper spacing
|
---|
415 | my$topxval=int($graph->{"maxx"}*$xscale+1.)*$ixscale;
|
---|
416 | my$pixelperx=$useablex/($graph->{"maxx"}-$graph->{"minx"});
|
---|
417 |
|
---|
418 | for(my$i=0;;$i++){
|
---|
419 | my$xval= $topxval-$i*$ixscale;
|
---|
420 | my$x= $width-($graph->{"maxx"}-$xval)*$pixelperx;
|
---|
421 |
|
---|
422 | last if($x<$beginx);
|
---|
423 | # bounding boxen are hard. place temp labels.
|
---|
424 | $w->createText(-1,-1,-anchor=>'e',-tags=>['foo'],-text=>"$xval");
|
---|
425 | }
|
---|
426 |
|
---|
427 | ($x1,$y1,$x2,$y2)=$w->bbox('foo');
|
---|
428 | my$maxxlabelwidth=$x2-$x1;
|
---|
429 | $w->delete('foo');
|
---|
430 | my$lastx=$width;
|
---|
431 |
|
---|
432 | for(my$i=0;;$i++){
|
---|
433 | my$xval= $topxval-$i*$ixscale;
|
---|
434 | my$x= $width-($graph->{"maxx"}-$xval)*$pixelperx;
|
---|
435 |
|
---|
436 | last if($x-$maxxlabelwidth/2<0 || $x<$beginx);
|
---|
437 | if($xval==0 && $x<$width){
|
---|
438 | $w->createLine($x,0,$x,$useabley,-tags=>['axes'],-width=>1);
|
---|
439 | }
|
---|
440 |
|
---|
441 | if($x+$maxxlabelwidth<=$lastx){
|
---|
442 | $w->createText($x,$height-1,-anchor=>'s',-tags=>['xlabel'],-text=>"$xval");
|
---|
443 | $w->createLine($x,0,$x,$useabley,-tags=>['axes'],-width=>1,-stipple=>"gray50");
|
---|
444 | $lastx=$x;
|
---|
445 | }
|
---|
446 | }
|
---|
447 | $graph->{"labelheight"}=$maxlabelheight;
|
---|
448 | $graph->{"xo"}=$beginx;
|
---|
449 | $graph->{"ppx"}=$pixelperx;
|
---|
450 | $graph->{"ppy"}=$pixelpery;
|
---|
451 | }
|
---|
452 |
|
---|
453 | # plot the files
|
---|
454 | $count=0;
|
---|
455 | my$legendy=$graph->{"labelheight"}/2;
|
---|
456 | for(my$i=0;$i<$panel_count;$i++){
|
---|
457 | if($graph->{"vars"}->[$i]){
|
---|
458 | $count++; # count here for legend color selection stability
|
---|
459 | if(defined($data[$i])){
|
---|
460 | # place a legend placard;
|
---|
461 | my$color=$colors[($count-1)%($#colors+1)];
|
---|
462 | $w->createText($width,$legendy,-anchor=>'e',-tags=>['legend'],
|
---|
463 | -fill=>$color,-text=>$panel_keys[$i]);
|
---|
464 | $legendy+=$graph->{"labelheight"};
|
---|
465 |
|
---|
466 | # plot the lines
|
---|
467 | my@pairs=map{if(/^\s*(-?[0-9\.]*)[ ,]+(-?[0-9\.]*)/){
|
---|
468 | (($1-$graph->{"minx"})*$graph->{"ppx"}+$graph->{"xo"},
|
---|
469 | (-$2+$graph->{"maxy"})*$graph->{"ppy"})}} (@{$data[$i]});
|
---|
470 |
|
---|
471 | $w->createLine((@pairs),-fill=>$color,-tags=>['lines']);
|
---|
472 | }
|
---|
473 | }
|
---|
474 | }
|
---|
475 | }
|
---|
476 | }
|
---|
477 |
|
---|
478 | sub draw_graph{
|
---|
479 |
|
---|
480 | if($onecrop){
|
---|
481 | $onestate{"minx"}=undef;
|
---|
482 | $onestate{"miny"}=undef;
|
---|
483 | $onestate{"maxx"}=undef;
|
---|
484 | $onestate{"maxy"}=undef;
|
---|
485 | }
|
---|
486 | if($twocrop){
|
---|
487 | $twostate{"minx"}=undef;
|
---|
488 | $twostate{"miny"}=undef;
|
---|
489 | $twostate{"maxx"}=undef;
|
---|
490 | $twostate{"maxy"}=undef;
|
---|
491 | }
|
---|
492 |
|
---|
493 | for(my$i=0;$i<$panel_count;$i++){
|
---|
494 | if($twostate{"vars"}->[$i]){
|
---|
495 |
|
---|
496 | #re-place the canvases
|
---|
497 |
|
---|
498 | $oneresize->place(-x=>5,-y=>5,-anchor=>'nw');
|
---|
499 |
|
---|
500 | $one->place(-relwidth=>1.,-width=>-10,-relheight=>.5,
|
---|
501 | -height=>($graphy/2)-5-$oneresize->reqheight(),
|
---|
502 | -x=>5,-y=>5+$oneresize->reqheight,-anchor=>'nw');
|
---|
503 |
|
---|
504 | $tworesize->place(-rely=>1.,-y=>5,-anchor=>'nw',-in=>$one);
|
---|
505 | $two->place(-relwidth=>1.,-relheight=>1.,-rely=>1.,
|
---|
506 | -y=>5+$tworesize->reqheight(),-anchor=>'nw',-in=>$one);
|
---|
507 |
|
---|
508 | graphhelper(\%onestate);
|
---|
509 | graphhelper(\%twostate);
|
---|
510 | return;
|
---|
511 | }
|
---|
512 | }
|
---|
513 |
|
---|
514 | $oneresize->place(-x=>5,-y=>5,-anchor=>'nw');
|
---|
515 |
|
---|
516 | $one->place(-relwidth=>1.,-width=>-10,-relheight=>1.,
|
---|
517 | -height=>$graphy-5-$oneresize->reqheight(),
|
---|
518 | -x=>5,-y=>5+$oneresize->reqheight,-anchor=>'nw');
|
---|
519 |
|
---|
520 | $tworesize->placeForget();
|
---|
521 | $two->placeForget();
|
---|
522 |
|
---|
523 | graphhelper(\%onestate);
|
---|
524 | }
|
---|
525 |
|
---|
526 | sub depopulate_panel{
|
---|
527 | my $win;
|
---|
528 | foreach $win (@panel_labels){
|
---|
529 | $win->destroy();
|
---|
530 | }
|
---|
531 | @panel_labels=();
|
---|
532 | foreach $win (@panel_ones){
|
---|
533 | $win->destroy();
|
---|
534 | }
|
---|
535 | @panel_ones=();
|
---|
536 | foreach $win (@panel_twos){
|
---|
537 | $win->destroy();
|
---|
538 | }
|
---|
539 | @panel_twos=();
|
---|
540 | @panel_keys=();
|
---|
541 | }
|
---|
542 |
|
---|
543 | sub populate_panel{
|
---|
544 | my $localy=$panely;
|
---|
545 | my $key;
|
---|
546 | my $i=0;
|
---|
547 | foreach $key (sort (keys %bases)){
|
---|
548 | $panel_keys[$i]=$key;
|
---|
549 | if(!defined($panel_onevars[$i])){
|
---|
550 | $panel_onevars[$i]=0;
|
---|
551 | $panel_twovars[$i]=0;
|
---|
552 | }
|
---|
553 |
|
---|
554 | my $temp=$panel_twos[$i]=$panel_shell->
|
---|
555 | Checkbutton(-variable=>\$panel_twovars[$i],-command=>['main::draw_graph'],-text=>'2')->
|
---|
556 | place(-y=>$localy,-x=>-5,-anchor=>"ne",-relx=>1.);
|
---|
557 | my $oney=$temp->reqheight();
|
---|
558 | my $onex=$temp->reqwidth()+15;
|
---|
559 |
|
---|
560 | $temp=$panel_ones[$i]=$panel_shell->
|
---|
561 | Checkbutton(-variable=>\$panel_onevars[$i],-command=>['main::draw_graph'],-text=>'1')->
|
---|
562 | place(-y=>0,-x=>0,-anchor=>"ne",-in=>$temp,-bordermode=>'outside');
|
---|
563 | $oney=$temp->reqheight() if ($oney<$temp->reqheight());
|
---|
564 | $onex+=$temp->reqwidth();
|
---|
565 |
|
---|
566 | $temp=$panel_labels[$i]=$panel_shell->Label(-text=>$key,-class=>'Field',-justify=>'left')->
|
---|
567 | place(-y=>$localy,-x=>5,-anchor=>"nw",-relwidth=>1.,-width=>-$onex,
|
---|
568 | -bordermode=>'outside');
|
---|
569 | $oney=$temp->reqheight() if ($oney<$temp->reqheight());
|
---|
570 |
|
---|
571 | $localy+=$oney+2;
|
---|
572 | $i++;
|
---|
573 | }
|
---|
574 | $panel_count=$i;
|
---|
575 |
|
---|
576 | $localy+=$panel_quit->reqheight()+50;
|
---|
577 | my $geometry=$panel->geometry();
|
---|
578 | $geometry=~/^(\d+)/;
|
---|
579 |
|
---|
580 | $panel->configure(-height=>$localy);
|
---|
581 | $panel->configure(-width=>$1);
|
---|
582 | }
|
---|
583 |
|
---|
584 | sub Shutdown{
|
---|
585 | Tk::exit();
|
---|
586 | }
|
---|
587 |
|
---|
588 | sub Status{
|
---|
589 | my$text=shift @_;
|
---|
590 | $graph_status->configure(-text=>"$text");
|
---|
591 | $toplevel->update();
|
---|
592 | }
|
---|
593 |
|
---|
594 | sub scan_directory{
|
---|
595 |
|
---|
596 | %bases=();
|
---|
597 | my$count=0;
|
---|
598 |
|
---|
599 | $first_file=undef;
|
---|
600 | $last_file=undef;
|
---|
601 |
|
---|
602 | if(opendir(D,".")){
|
---|
603 | my$file;
|
---|
604 | while(defined($file=readdir(D))){
|
---|
605 | if($file=~m/^(\S*)_(\d+).m/){
|
---|
606 | $bases{"$1"}="0";
|
---|
607 | $first_file=$2 if(!defined($first_file) || $2<$first_file);
|
---|
608 | $last_file=$2 if(!defined($last_file) || $2>$last_file);
|
---|
609 | $count++;
|
---|
610 |
|
---|
611 | Status("Reading... $count")if($count%117==0);
|
---|
612 | }
|
---|
613 | }
|
---|
614 | closedir(D);
|
---|
615 | }
|
---|
616 | Status("Done Reading: $count files");
|
---|
617 | depopulate_panel();
|
---|
618 | populate_panel();
|
---|
619 |
|
---|
620 | $fileno=$first_file if($fileno<$first_file);
|
---|
621 | $fileno=$last_file if($fileno>$last_file);
|
---|
622 |
|
---|
623 | $graph_slider->configure(-from=>$first_file,-to=>$last_file);
|
---|
624 |
|
---|
625 | }
|
---|
626 |
|
---|
627 |
|
---|
628 |
|
---|
629 |
|
---|
630 |
|
---|