cannam@86: #!/usr/bin/perl -w cannam@86: use strict; cannam@86: use Tk; cannam@86: use Tk::Xrm; cannam@86: use Tk qw(exit); cannam@86: cannam@86: my $version="Analyzer 20020429"; cannam@86: cannam@86: my %bases; cannam@86: my $first_file=undef; cannam@86: my $last_file=undef; cannam@86: my $fileno=0; cannam@86: cannam@86: my @panel_labels; cannam@86: my @panel_ones; cannam@86: my @panel_twos; cannam@86: my @panel_onevars; cannam@86: my @panel_twovars; cannam@86: my @panel_keys; cannam@86: my $panel_count; cannam@86: cannam@86: # pop the toplevels cannam@86: cannam@86: my $toplevel=new MainWindow(-class=>'AnalyzerGraph'); cannam@86: my $Xname=$toplevel->Class; cannam@86: $toplevel->optionAdd("$Xname.geometry", "800x600",20); cannam@86: cannam@86: my $geometry=$toplevel->optionGet('geometry',''); cannam@86: $geometry=~/^(\d+)x(\d+)/; cannam@86: cannam@86: $toplevel->configure(-width=>$1); cannam@86: $toplevel->configure(-height=>$2); cannam@86: cannam@86: cannam@86: cannam@86: cannam@86: cannam@86: $toplevel->optionAdd("$Xname.background", "#4fc627",20); cannam@86: $toplevel->optionAdd("$Xname*highlightBackground", "#80c0d3",20); cannam@86: $toplevel->optionAdd("$Xname.Panel.background", "#4fc627",20); cannam@86: $toplevel->optionAdd("$Xname.Panel.foreground", "#d0d0d0",20); cannam@86: $toplevel->optionAdd("$Xname.Panel.font", cannam@86: '-*-helvetica-bold-r-*-*-18-*-*-*-*-*-*-*',20); cannam@86: $toplevel->optionAdd("$Xname*Statuslabel.font", cannam@86: '-*-helvetica-bold-r-*-*-18-*-*-*-*-*-*-*',20); cannam@86: $toplevel->optionAdd("$Xname*Statuslabel.foreground", "#606060"); cannam@86: $toplevel->optionAdd("$Xname*Status.font", cannam@86: '-*-helvetica-bold-r-*-*-18-*-*-*-*-*-*-*',20); cannam@86: cannam@86: $toplevel->optionAdd("$Xname*AlertDetail.font", cannam@86: '-*-helvetica-medium-r-*-*-10-*-*-*-*-*-*-*',20); cannam@86: cannam@86: cannam@86: $toplevel->optionAdd("$Xname*background", "#d0d0d0",20); cannam@86: $toplevel->optionAdd("$Xname*foreground", '#000000',20); cannam@86: cannam@86: $toplevel->optionAdd("$Xname*Button*background", "#f0d0b0",20); cannam@86: $toplevel->optionAdd("$Xname*Button*foreground", '#000000',20); cannam@86: $toplevel->optionAdd("$Xname*Button*borderWidth", '2',20); cannam@86: $toplevel->optionAdd("$Xname*Button*relief", 'groove',20); cannam@86: $toplevel->optionAdd("$Xname*Button*padY", 1,20); cannam@86: cannam@86: #$toplevel->optionAdd("$Xname*Scale*background", "#f0d0b0",20); cannam@86: $toplevel->optionAdd("$Xname*Scale*foreground", '#000000',20); cannam@86: $toplevel->optionAdd("$Xname*Scale*borderWidth", '1',20); cannam@86: #$toplevel->optionAdd("$Xname*Scale*relief", 'groove',20); cannam@86: $toplevel->optionAdd("$Xname*Scale*padY", 1,20); cannam@86: cannam@86: $toplevel->optionAdd("$Xname*Checkbutton*background", "#f0d0b0",20); cannam@86: $toplevel->optionAdd("$Xname*Checkbutton*foreground", '#000000',20); cannam@86: $toplevel->optionAdd("$Xname*Checkbutton*borderWidth", '2',20); cannam@86: $toplevel->optionAdd("$Xname*Checkbutton*relief", 'groove',20); cannam@86: cannam@86: $toplevel->optionAdd("$Xname*activeBackground", "#ffffff",20); cannam@86: $toplevel->optionAdd("$Xname*activeForeground", '#0000a0',20); cannam@86: $toplevel->optionAdd("$Xname*borderWidth", 0,20); cannam@86: $toplevel->optionAdd("$Xname*relief", 'flat',20); cannam@86: $toplevel->optionAdd("$Xname*activeBorderWidth", 1,20); cannam@86: $toplevel->optionAdd("$Xname*highlightThickness", 0,20); cannam@86: $toplevel->optionAdd("$Xname*padX", 2,20); cannam@86: $toplevel->optionAdd("$Xname*padY", 2,20); cannam@86: $toplevel->optionAdd("$Xname*font", cannam@86: '-*-helvetica-bold-r-*-*-12-*-*-*-*-*-*-*',20); cannam@86: $toplevel->optionAdd("$Xname*Entry.font", cannam@86: '-*-helvetica-medium-r-*-*-12-*-*-*-*-*-*-*',20); cannam@86: $toplevel->optionAdd("$Xname*Exit.font", cannam@86: '-*-helvetica-bold-r-*-*-10-*-*-*-*-*-*-*',20); cannam@86: $toplevel->optionAdd("$Xname*Exit.relief", 'groove',20); cannam@86: $toplevel->optionAdd("$Xname*Exit.padX", 1,20); cannam@86: $toplevel->optionAdd("$Xname*Exit.padY", 1,20); cannam@86: $toplevel->optionAdd("$Xname*Exit.borderWidth", 2,20); cannam@86: $toplevel->optionAdd("$Xname*Exit*background", "#a0a0a0",20); cannam@86: $toplevel->optionAdd("$Xname*Exit*disabledForeground", "#ffffff",20); cannam@86: cannam@86: #$toplevel->optionAdd("$Xname*Canvas.background", "#c0c0c0",20); cannam@86: cannam@86: $toplevel->optionAdd("$Xname*Entry.background", "#ffffff",20); cannam@86: $toplevel->optionAdd("$Xname*Entry.disabledForeground", "#c0c0c0",20); cannam@86: $toplevel->optionAdd("$Xname*Entry.relief", "sunken",20); cannam@86: $toplevel->optionAdd("$Xname*Entry.borderWidth", 1,20); cannam@86: cannam@86: $toplevel->optionAdd("$Xname*Field.background", "#ffffff",20); cannam@86: $toplevel->optionAdd("$Xname*Field.disabledForeground", "#c0c0c0",20); cannam@86: $toplevel->optionAdd("$Xname*Field.relief", "flat",20); cannam@86: $toplevel->optionAdd("$Xname*Field.borderWidth", 1,20); cannam@86: cannam@86: $toplevel->optionAdd("$Xname*Label.disabledForeground", "#c0c0c0",20); cannam@86: $toplevel->optionAdd("$Xname*Label.borderWidth", 1,20); cannam@86: cannam@86: $toplevel->configure(-background=>$toplevel->optionGet("background","")); cannam@86: cannam@86: #$toplevel->resizable(FALSE,FALSE); cannam@86: cannam@86: my $panel=new MainWindow(-class=>'AnalyzerPanel'); cannam@86: my $X2name=$panel->Class; cannam@86: cannam@86: $panel->optionAdd("$X2name.background", "#353535",20); cannam@86: $panel->optionAdd("$X2name*highlightBackground", "#80c0d3",20); cannam@86: $panel->optionAdd("$X2name.Panel.background", "#353535",20); cannam@86: $panel->optionAdd("$X2name.Panel.foreground", "#4fc627",20); cannam@86: $panel->optionAdd("$X2name.Panel.font", cannam@86: '-*-helvetica-bold-o-*-*-18-*-*-*-*-*-*-*',20); cannam@86: $panel->optionAdd("$X2name*Statuslabel.font", cannam@86: '-*-helvetica-bold-r-*-*-18-*-*-*-*-*-*-*',20); cannam@86: $panel->optionAdd("$X2name*Statuslabel.foreground", "#4fc627",20); cannam@86: $panel->optionAdd("$X2name*Status.font", cannam@86: '-*-helvetica-bold-r-*-*-18-*-*-*-*-*-*-*',20); cannam@86: cannam@86: $panel->optionAdd("$X2name*AlertDetail.font", cannam@86: '-*-helvetica-medium-r-*-*-10-*-*-*-*-*-*-*',20); cannam@86: cannam@86: cannam@86: $panel->optionAdd("$X2name*background", "#d0d0d0",20); cannam@86: $panel->optionAdd("$X2name*foreground", '#000000',20); cannam@86: cannam@86: $panel->optionAdd("$X2name*Button*background", "#f0d0b0",20); cannam@86: $panel->optionAdd("$X2name*Button*foreground", '#000000',20); cannam@86: $panel->optionAdd("$X2name*Button*borderWidth", '2',20); cannam@86: $panel->optionAdd("$X2name*Button*relief", 'groove',20); cannam@86: $panel->optionAdd("$X2name*Button*padY", 1,20); cannam@86: cannam@86: $panel->optionAdd("$X2name*Checkbutton*background", "#f0d0b0",20); cannam@86: $panel->optionAdd("$X2name*Checkbutton*foreground", '#000000',20); cannam@86: $panel->optionAdd("$X2name*Checkbutton*borderWidth", '2',20); cannam@86: #$panel->optionAdd("$X2name*Checkbutton*padX", '0',20); cannam@86: #$panel->optionAdd("$X2name*Checkbutton*padY", '0',20); cannam@86: #$panel->optionAdd("$X2name*Checkbutton*relief", 'groove',20); cannam@86: cannam@86: $panel->optionAdd("$X2name*activeBackground", "#ffffff",20); cannam@86: $panel->optionAdd("$X2name*activeForeground", '#0000a0',20); cannam@86: $panel->optionAdd("$X2name*borderWidth", 0,20); cannam@86: $panel->optionAdd("$X2name*relief", 'flat',20); cannam@86: $panel->optionAdd("$X2name*activeBorderWidth", 1,20); cannam@86: $panel->optionAdd("$X2name*highlightThickness", 0,20); cannam@86: $panel->optionAdd("$X2name*padX", 2,20); cannam@86: $panel->optionAdd("$X2name*padY", 2,20); cannam@86: $panel->optionAdd("$X2name*font", cannam@86: '-*-helvetica-bold-r-*-*-12-*-*-*-*-*-*-*',20); cannam@86: $panel->optionAdd("$X2name*Entry.font", cannam@86: '-*-helvetica-medium-r-*-*-12-*-*-*-*-*-*-*',20); cannam@86: cannam@86: $panel->optionAdd("$X2name*Exit.font", cannam@86: '-*-helvetica-bold-r-*-*-10-*-*-*-*-*-*-*',20); cannam@86: $panel->optionAdd("$X2name*Exit.relief", 'groove',20); cannam@86: $panel->optionAdd("$X2name*Exit.padX", 1,20); cannam@86: $panel->optionAdd("$X2name*Exit.padY", 1,20); cannam@86: $panel->optionAdd("$X2name*Exit.borderWidth", 2,20); cannam@86: $panel->optionAdd("$X2name*Exit*background", "#a0a0a0",20); cannam@86: $panel->optionAdd("$X2name*Exit*disabledForeground", "#ffffff",20); cannam@86: cannam@86: $panel->optionAdd("$X2name*Entry.background", "#ffffff",20); cannam@86: $panel->optionAdd("$X2name*Entry.disabledForeground", "#c0c0c0",20); cannam@86: $panel->optionAdd("$X2name*Entry.relief", "sunken",20); cannam@86: $panel->optionAdd("$X2name*Entry.borderWidth", 1,20); cannam@86: cannam@86: $panel->optionAdd("$X2name*Field.background", "#ffffff",20); cannam@86: $panel->optionAdd("$X2name*Field.disabledForeground", "#c0c0c0",20); cannam@86: $panel->optionAdd("$X2name*Field.relief", "flat",20); cannam@86: $panel->optionAdd("$X2name*Field.borderWidth", 1,20); cannam@86: cannam@86: $panel->optionAdd("$X2name*Label.disabledForeground", "#c0c0c0",20); cannam@86: $panel->optionAdd("$X2name*Label.borderWidth", 1,20); cannam@86: cannam@86: $panel->configure(-background=>$panel->optionGet("background","")); cannam@86: cannam@86: #$panel->resizable("FALSE","FALSE"); cannam@86: cannam@86: my $panel_shell=$panel->Label(Name=>"shell",-borderwidth=>1,-relief=>'raised')-> cannam@86: place(-x=>10,-y=>36,-relwidth=>1.0,-relheight=>1.0, cannam@86: -width=>-20,-height=>-46,-anchor=>'nw'); cannam@86: cannam@86: my $panel_quit=$panel_shell->Button(-class=>"Exit",-text=>"quit",-command=>[sub{Shutdown()}])-> cannam@86: place(-x=>-1,-y=>-1,-relx=>1.0,-rely=>1.0,-anchor=>'se'); cannam@86: cannam@86: $panel->Label(Name=>"logo text",-class=>"Panel",-text=>$version)-> cannam@86: place(-x=>5,-y=>5,-anchor=>'nw'); cannam@86: cannam@86: cannam@86: my $graph_shell=$toplevel->Label(Name=>"shell",-borderwidth=>1,-relief=>'raised')-> cannam@86: place(-x=>10,-y=>36,-relwidth=>1.0,-relheight=>1.0, cannam@86: -width=>-20,-height=>-46,-anchor=>'nw'); cannam@86: cannam@86: my $graph_status=$toplevel->Label(Name=>"logo text",-class=>"Panel",-text=>"Starting up")-> cannam@86: place(-x=>5,-y=>5,-anchor=>'nw'); cannam@86: cannam@86: cannam@86: my $panely=5; cannam@86: my $panel_rescan=$panel_shell->Button(-text=>"rescan",-command=>[sub{scan_directory()}])-> cannam@86: place(-x=>-5,-relx=>1.,-y=>$panely,-anchor=>'ne'); cannam@86: $panely+=$panel_rescan->reqheight()+6; cannam@86: cannam@86: cannam@86: my$temp=$graph_shell->Button(-text=>"<<", cannam@86: -command=>[sub{$fileno-=10;$fileno=$first_file if($fileno<$first_file); cannam@86: load_graph();}])-> cannam@86: place(-x=>5,-y=>-5,-rely=>1.,-relwidth=>.2,-width=>-5,-anchor=>'sw'); cannam@86: $graph_shell->Button(-text=>">>", cannam@86: -command=>[sub{$fileno+=10;$fileno=$last_file if($fileno>$last_file); cannam@86: load_graph();}])-> cannam@86: place(-x=>-5,-y=>-5,-relwidth=>.2,-rely=>1.,-width=>-5,-relx=>1.,-anchor=>'se'); cannam@86: $graph_shell->Button(-text=>"<", cannam@86: -command=>[sub{$fileno-=1;$fileno=$first_file if($fileno<$first_file); cannam@86: load_graph();}])-> cannam@86: place(-x=>5,-y=>-5,-relwidth=>.3,-width=>-7,-rely=>1.,-relx=>.2,-anchor=>'sw'); cannam@86: $graph_shell->Button(-text=>">", cannam@86: -command=>[sub{$fileno+=1;$fileno=$last_file if($fileno>$last_file); cannam@86: load_graph();}])-> cannam@86: place(-x=>-5,-y=>-5,-relwidth=>.3,-width=>-7,-rely=>1.,-relx=>.8,-anchor=>'se'); cannam@86: my$graphy=-10-$temp->reqheight(); cannam@86: my$graph_slider=$temp=$graph_shell->Scale(-bigincrement=>1, cannam@86: -resolution=>1, cannam@86: -showvalue=>'TRUE',-variable=>\$fileno,-orient=>'horizontal')-> cannam@86: place(-x=>5,-y=>$graphy,-relwidth=>1.,-rely=>1.,-width=>-10,-anchor=>'sw'); cannam@86: $graphy-=$temp->reqheight()+5; cannam@86: cannam@86: my$onecrop; cannam@86: my$twocrop; cannam@86: cannam@86: my$oneresize=$temp=$graph_shell->Checkbutton(-text=>"rescale",-variable=>\$onecrop, cannam@86: -command=>[sub{draw_graph();}])-> cannam@86: place(-x=>5,-y=>5,-anchor=>'nw'); cannam@86: cannam@86: my$one=$graph_shell->Canvas()-> cannam@86: place(-relwidth=>1.,-width=>-10,-relheight=>.5,-height=>($graphy/2)-5-$temp->reqheight(), cannam@86: -x=>5,-y=>5+$temp->reqheight,-anchor=>'nw'); cannam@86: cannam@86: cannam@86: my$tworesize=$temp=$graph_shell->Checkbutton(-text=>"rescale",-variable=>\$twocrop, cannam@86: -command=>[sub{draw_graph();}])-> cannam@86: place(-rely=>1.,-y=>5,-anchor=>'nw',-in=>$one); cannam@86: my$two=$graph_shell->Canvas()-> cannam@86: place(-relwidth=>1.,-relheight=>1.,-rely=>1.,-y=>5+$temp->reqheight(),-anchor=>'nw',-in=>$one); cannam@86: cannam@86: scan_directory(); cannam@86: cannam@86: my%onestate; cannam@86: my%twostate; cannam@86: my @data; cannam@86: cannam@86: $onestate{"canvas"}=$one; cannam@86: $onestate{"vars"}=\@panel_onevars; cannam@86: $twostate{"canvas"}=$two; cannam@86: $twostate{"vars"}=\@panel_twovars; cannam@86: cannam@86: $graph_slider->configure(-command=>[sub{load_graph()}]); cannam@86: load_graph(); cannam@86: $toplevel->bind('MainWindow','',[sub{$toplevel->update(); cannam@86: draw_graph()}]); cannam@86: cannam@86: Tk::MainLoop(); cannam@86: cannam@86: sub load_graph{ cannam@86: cannam@86: scan_directory()if(!defined($panel_count)); cannam@86: cannam@86: @data=undef; cannam@86: cannam@86: for(my$i=0;$i<$panel_count;$i++){ cannam@86: my$filename=$panel_keys[$i]."_$fileno.m"; cannam@86: if(open F, "$filename"){ cannam@86: $data[$i]=[()]; cannam@86: close F; cannam@86: } cannam@86: } cannam@86: draw_graph(); cannam@86: } cannam@86: cannam@86: sub graphhelper{ cannam@86: my($graph)=@_; cannam@86: my$count=0; cannam@86: my@colors=("#ff0000","#00df00","#0000ff","#ffff00","#ff00ff","#00ffff","#ffffff", cannam@86: "#9f0000","#007f00","#00009f","#8f8f00","#8f008f","#008f8f","#000000"); cannam@86: cannam@86: my$w=$graph->{"canvas"}; cannam@86: my$rescale=0; cannam@86: cannam@86: Status("Plotting $fileno"); cannam@86: $w->delete('foo'); cannam@86: $w->delete('legend'); cannam@86: $w->delete('lines'); cannam@86: cannam@86: # count range cannam@86: for(my$i=0;$i<$panel_count;$i++){ cannam@86: if($graph->{"vars"}->[$i]){ cannam@86: if(defined($data[$i])){ cannam@86: if(!defined($graph->{"minx"})){ cannam@86: $data[$i]->[0]=~m/^\s*(-?[0-9\.]*)[ ,]+(-?[0-9\.]*)/; cannam@86: $graph->{"maxx"}=$1; cannam@86: $graph->{"minx"}=$1; cannam@86: $graph->{"maxy"}=$2; cannam@86: $graph->{"miny"}=$2; cannam@86: $rescale=1; cannam@86: } cannam@86: cannam@86: for(my$j=0;$j<=$#{$data[$i]};$j++){ cannam@86: $data[$i]->[$j]=~m/^\s*(-?[0-9\.]*)[ ,]+(-?[0-9\.]*)/; cannam@86: $rescale=1 if($1>$graph->{"maxx"}); cannam@86: $rescale=1 if($1<$graph->{"minx"}); cannam@86: $rescale=1 if($2>$graph->{"maxy"}); cannam@86: $rescale=1 if($2<$graph->{"miny"}); cannam@86: $graph->{"maxx"}=$1 if($1>$graph->{"maxx"}); cannam@86: $graph->{"minx"}=$1 if($1<$graph->{"minx"}); cannam@86: $graph->{"maxy"}=$2 if($2>$graph->{"maxy"}); cannam@86: $graph->{"miny"}=$2 if($2<$graph->{"miny"}); cannam@86: } cannam@86: } cannam@86: $count++; cannam@86: } cannam@86: } cannam@86: cannam@86: my$width=$w->width(); cannam@86: my$height=$w->height(); cannam@86: cannam@86: $rescale=1 if(!defined($graph->{"width"}) || cannam@86: $width!=$graph->{"width"} || cannam@86: $height!=$graph->{"height"}); cannam@86: cannam@86: $graph->{"width"}=$width; cannam@86: $graph->{"height"}=$height; cannam@86: cannam@86: if(defined($graph->{"maxx"})){ cannam@86: # draw axes, labels cannam@86: # look for appropriate axis scales cannam@86: cannam@86: if($rescale){ cannam@86: cannam@86: $w->delete('ylabel'); cannam@86: $w->delete('xlabel'); cannam@86: $w->delete('axes'); cannam@86: cannam@86: my$yscale=1.; cannam@86: my$xscale=1.; cannam@86: my$iyscale=1.; cannam@86: my$ixscale=1.; cannam@86: while(($graph->{"maxx"}-$graph->{"minx"})*$xscale>15){$xscale*=.1;$ixscale*=10.;} cannam@86: while(($graph->{"maxy"}-$graph->{"miny"})*$yscale>15){$yscale*=.1;$iyscale*=10.;} cannam@86: cannam@86: while(($graph->{"maxx"}-$graph->{"minx"})*$xscale<3){$xscale*=10.;$ixscale*=.1;} cannam@86: while(($graph->{"maxy"}-$graph->{"miny"})*$yscale<3){$yscale*=10.;$iyscale*=.1;} cannam@86: cannam@86: # how tall are the x axis labels? cannam@86: $w->createText(-1,-1,-anchor=>'se',-tags=>['foo'],-text=>"0123456789."); cannam@86: my($x1,$y1,$x2,$y2)=$w->bbox('foo'); cannam@86: $w->delete('foo'); cannam@86: my$maxlabelheight=$y2-$y1; cannam@86: my$useabley=$height-$maxlabelheight-3; cannam@86: my$pixelpery=$useabley/($graph->{"maxy"}-$graph->{"miny"}); cannam@86: cannam@86: # place y axis labels at proper spacing/height cannam@86: my$lasty=-$maxlabelheight/2; cannam@86: my$topyval=int($graph->{"maxy"}*$yscale+1.)*$iyscale; cannam@86: cannam@86: for(my$i=0;;$i++){ cannam@86: my$yval= $topyval-$i*$iyscale; cannam@86: my$y= ($graph->{"maxy"}-$yval)*$pixelpery; cannam@86: last if($y>$useabley); cannam@86: if($y-$maxlabelheight>=$lasty){ cannam@86: $w->createText(0,$y,-anchor=>'e',-tags=>['ylabel'],-text=>"$yval"); cannam@86: $lasty=$y; cannam@86: } cannam@86: } cannam@86: cannam@86: # get the max ylabel width and place them at proper x cannam@86: ($x1,$y1,$x2,$y2)=$w->bbox('ylabel'); cannam@86: my$maxylabelwidth=$x2-$x1; cannam@86: $w->move('ylabel',$maxylabelwidth,0); cannam@86: cannam@86: my$beginx=$maxylabelwidth+3; cannam@86: my$useablex=$width-$beginx; cannam@86: cannam@86: # draw basic axes cannam@86: $w->createLine($beginx,0,$beginx,$useabley,$width,$useabley, cannam@86: -tags=>['axes'],-width=>2); cannam@86: # draw y tix cannam@86: $lasty=-$maxlabelheight/2; cannam@86: for(my$i=0;;$i++){ cannam@86: my$yval= $topyval-$i*$iyscale; cannam@86: my$y= ($graph->{"maxy"}-$yval)*$pixelpery; cannam@86: last if($y>$useabley); cannam@86: if($yval==0){ cannam@86: $w->createLine($beginx,$y,$width,$y, cannam@86: -tags=>['axes'],-width=>1); cannam@86: }else{ cannam@86: if($y-$maxlabelheight>=$lasty){ cannam@86: $w->createLine($beginx,$y,$width,$y, cannam@86: -tags=>['axes'],-width=>1, cannam@86: -stipple=>'gray50'); cannam@86: cannam@86: $lasty=$y; cannam@86: } cannam@86: } cannam@86: } cannam@86: cannam@86: # place x axis labels at proper spacing cannam@86: my$topxval=int($graph->{"maxx"}*$xscale+1.)*$ixscale; cannam@86: my$pixelperx=$useablex/($graph->{"maxx"}-$graph->{"minx"}); cannam@86: cannam@86: for(my$i=0;;$i++){ cannam@86: my$xval= $topxval-$i*$ixscale; cannam@86: my$x= $width-($graph->{"maxx"}-$xval)*$pixelperx; cannam@86: cannam@86: last if($x<$beginx); cannam@86: # bounding boxen are hard. place temp labels. cannam@86: $w->createText(-1,-1,-anchor=>'e',-tags=>['foo'],-text=>"$xval"); cannam@86: } cannam@86: cannam@86: ($x1,$y1,$x2,$y2)=$w->bbox('foo'); cannam@86: my$maxxlabelwidth=$x2-$x1; cannam@86: $w->delete('foo'); cannam@86: my$lastx=$width; cannam@86: cannam@86: for(my$i=0;;$i++){ cannam@86: my$xval= $topxval-$i*$ixscale; cannam@86: my$x= $width-($graph->{"maxx"}-$xval)*$pixelperx; cannam@86: cannam@86: last if($x-$maxxlabelwidth/2<0 || $x<$beginx); cannam@86: if($xval==0 && $x<$width){ cannam@86: $w->createLine($x,0,$x,$useabley,-tags=>['axes'],-width=>1); cannam@86: } cannam@86: cannam@86: if($x+$maxxlabelwidth<=$lastx){ cannam@86: $w->createText($x,$height-1,-anchor=>'s',-tags=>['xlabel'],-text=>"$xval"); cannam@86: $w->createLine($x,0,$x,$useabley,-tags=>['axes'],-width=>1,-stipple=>"gray50"); cannam@86: $lastx=$x; cannam@86: } cannam@86: } cannam@86: $graph->{"labelheight"}=$maxlabelheight; cannam@86: $graph->{"xo"}=$beginx; cannam@86: $graph->{"ppx"}=$pixelperx; cannam@86: $graph->{"ppy"}=$pixelpery; cannam@86: } cannam@86: cannam@86: # plot the files cannam@86: $count=0; cannam@86: my$legendy=$graph->{"labelheight"}/2; cannam@86: for(my$i=0;$i<$panel_count;$i++){ cannam@86: if($graph->{"vars"}->[$i]){ cannam@86: $count++; # count here for legend color selection stability cannam@86: if(defined($data[$i])){ cannam@86: # place a legend placard; cannam@86: my$color=$colors[($count-1)%($#colors+1)]; cannam@86: $w->createText($width,$legendy,-anchor=>'e',-tags=>['legend'], cannam@86: -fill=>$color,-text=>$panel_keys[$i]); cannam@86: $legendy+=$graph->{"labelheight"}; cannam@86: cannam@86: # plot the lines cannam@86: my@pairs=map{if(/^\s*(-?[0-9\.]*)[ ,]+(-?[0-9\.]*)/){ cannam@86: (($1-$graph->{"minx"})*$graph->{"ppx"}+$graph->{"xo"}, cannam@86: (-$2+$graph->{"maxy"})*$graph->{"ppy"})}} (@{$data[$i]}); cannam@86: cannam@86: $w->createLine((@pairs),-fill=>$color,-tags=>['lines']); cannam@86: } cannam@86: } cannam@86: } cannam@86: } cannam@86: } cannam@86: cannam@86: sub draw_graph{ cannam@86: cannam@86: if($onecrop){ cannam@86: $onestate{"minx"}=undef; cannam@86: $onestate{"miny"}=undef; cannam@86: $onestate{"maxx"}=undef; cannam@86: $onestate{"maxy"}=undef; cannam@86: } cannam@86: if($twocrop){ cannam@86: $twostate{"minx"}=undef; cannam@86: $twostate{"miny"}=undef; cannam@86: $twostate{"maxx"}=undef; cannam@86: $twostate{"maxy"}=undef; cannam@86: } cannam@86: cannam@86: for(my$i=0;$i<$panel_count;$i++){ cannam@86: if($twostate{"vars"}->[$i]){ cannam@86: cannam@86: #re-place the canvases cannam@86: cannam@86: $oneresize->place(-x=>5,-y=>5,-anchor=>'nw'); cannam@86: cannam@86: $one->place(-relwidth=>1.,-width=>-10,-relheight=>.5, cannam@86: -height=>($graphy/2)-5-$oneresize->reqheight(), cannam@86: -x=>5,-y=>5+$oneresize->reqheight,-anchor=>'nw'); cannam@86: cannam@86: $tworesize->place(-rely=>1.,-y=>5,-anchor=>'nw',-in=>$one); cannam@86: $two->place(-relwidth=>1.,-relheight=>1.,-rely=>1., cannam@86: -y=>5+$tworesize->reqheight(),-anchor=>'nw',-in=>$one); cannam@86: cannam@86: graphhelper(\%onestate); cannam@86: graphhelper(\%twostate); cannam@86: return; cannam@86: } cannam@86: } cannam@86: cannam@86: $oneresize->place(-x=>5,-y=>5,-anchor=>'nw'); cannam@86: cannam@86: $one->place(-relwidth=>1.,-width=>-10,-relheight=>1., cannam@86: -height=>$graphy-5-$oneresize->reqheight(), cannam@86: -x=>5,-y=>5+$oneresize->reqheight,-anchor=>'nw'); cannam@86: cannam@86: $tworesize->placeForget(); cannam@86: $two->placeForget(); cannam@86: cannam@86: graphhelper(\%onestate); cannam@86: } cannam@86: cannam@86: sub depopulate_panel{ cannam@86: my $win; cannam@86: foreach $win (@panel_labels){ cannam@86: $win->destroy(); cannam@86: } cannam@86: @panel_labels=(); cannam@86: foreach $win (@panel_ones){ cannam@86: $win->destroy(); cannam@86: } cannam@86: @panel_ones=(); cannam@86: foreach $win (@panel_twos){ cannam@86: $win->destroy(); cannam@86: } cannam@86: @panel_twos=(); cannam@86: @panel_keys=(); cannam@86: } cannam@86: cannam@86: sub populate_panel{ cannam@86: my $localy=$panely; cannam@86: my $key; cannam@86: my $i=0; cannam@86: foreach $key (sort (keys %bases)){ cannam@86: $panel_keys[$i]=$key; cannam@86: if(!defined($panel_onevars[$i])){ cannam@86: $panel_onevars[$i]=0; cannam@86: $panel_twovars[$i]=0; cannam@86: } cannam@86: cannam@86: my $temp=$panel_twos[$i]=$panel_shell-> cannam@86: Checkbutton(-variable=>\$panel_twovars[$i],-command=>['main::draw_graph'],-text=>'2')-> cannam@86: place(-y=>$localy,-x=>-5,-anchor=>"ne",-relx=>1.); cannam@86: my $oney=$temp->reqheight(); cannam@86: my $onex=$temp->reqwidth()+15; cannam@86: cannam@86: $temp=$panel_ones[$i]=$panel_shell-> cannam@86: Checkbutton(-variable=>\$panel_onevars[$i],-command=>['main::draw_graph'],-text=>'1')-> cannam@86: place(-y=>0,-x=>0,-anchor=>"ne",-in=>$temp,-bordermode=>'outside'); cannam@86: $oney=$temp->reqheight() if ($oney<$temp->reqheight()); cannam@86: $onex+=$temp->reqwidth(); cannam@86: cannam@86: $temp=$panel_labels[$i]=$panel_shell->Label(-text=>$key,-class=>'Field',-justify=>'left')-> cannam@86: place(-y=>$localy,-x=>5,-anchor=>"nw",-relwidth=>1.,-width=>-$onex, cannam@86: -bordermode=>'outside'); cannam@86: $oney=$temp->reqheight() if ($oney<$temp->reqheight()); cannam@86: cannam@86: $localy+=$oney+2; cannam@86: $i++; cannam@86: } cannam@86: $panel_count=$i; cannam@86: cannam@86: $localy+=$panel_quit->reqheight()+50; cannam@86: my $geometry=$panel->geometry(); cannam@86: $geometry=~/^(\d+)/; cannam@86: cannam@86: $panel->configure(-height=>$localy); cannam@86: $panel->configure(-width=>$1); cannam@86: } cannam@86: cannam@86: sub Shutdown{ cannam@86: Tk::exit(); cannam@86: } cannam@86: cannam@86: sub Status{ cannam@86: my$text=shift @_; cannam@86: $graph_status->configure(-text=>"$text"); cannam@86: $toplevel->update(); cannam@86: } cannam@86: cannam@86: sub scan_directory{ cannam@86: cannam@86: %bases=(); cannam@86: my$count=0; cannam@86: cannam@86: $first_file=undef; cannam@86: $last_file=undef; cannam@86: cannam@86: if(opendir(D,".")){ cannam@86: my$file; cannam@86: while(defined($file=readdir(D))){ cannam@86: if($file=~m/^(\S*)_(\d+).m/){ cannam@86: $bases{"$1"}="0"; cannam@86: $first_file=$2 if(!defined($first_file) || $2<$first_file); cannam@86: $last_file=$2 if(!defined($last_file) || $2>$last_file); cannam@86: $count++; cannam@86: cannam@86: Status("Reading... $count")if($count%117==0); cannam@86: } cannam@86: } cannam@86: closedir(D); cannam@86: } cannam@86: Status("Done Reading: $count files"); cannam@86: depopulate_panel(); cannam@86: populate_panel(); cannam@86: cannam@86: $fileno=$first_file if($fileno<$first_file); cannam@86: $fileno=$last_file if($fileno>$last_file); cannam@86: cannam@86: $graph_slider->configure(-from=>$first_file,-to=>$last_file); cannam@86: cannam@86: } cannam@86: cannam@86: cannam@86: cannam@86: cannam@86: