#=============================================== # TkTest #=============================================== package TkTest; # TkPlotModuleの継承クラスとする use TkPlotModule; @ISA = qw(TkPlotModule); use strict; use Utils; use MyTk::GraphFrameArray; use GraphData; #============================================================ # コンストラクタ、デストラクタ(お約束) #============================================================ sub new { my ($module, $app) = @_; my $this = {}; bless $this; $this->SetApplication($app); return $this; } sub DESTROY { my $this = shift; $this->SUPER::DESTROY(@_); } #============================================================ # 継承クラスで定義しなおす静的メンバー関数 #============================================================ sub CheckFileType { my ($path) = @_; # パス名をドライブ、ディレクトリィ、拡張子つきファイル名、拡張子、最後のディレクトリィ名、 # 拡張子なしのファイル名に分解する my ($drive, $dir, $filename, $ext, $lastdir, $filebody) = Deps::SplitFilePath($path); # ファイル名、拡張子名、ファイルの内容などからファイルタイプを判断し、 # 対応するファイルタイプであれば、ファイルタイプを文字列で返す if($ext =~ /^\.test$/i) { return "Test data file"; } # 対応しないファイルタイプであれば、undefを返す return undef; } #============================================================ # 継承クラスで定義しなおすメンバー関数 #============================================================ sub Read($) { # Readはファイル名$filenameのみを引数として受け取る($thisは自分自身のクラスへのリファレンス) my ($this, $filename) = @_; # 初期化(お約束) $this->ClearAll(); # CheckFileTypeを呼び出し、ファイルタイプをチェックし、$this->{'FileType'}に格納する my $FileType = $this->SetFileType(CheckFileType($filename)); # 対応するファイルタイプでなければ、undefを返す return undef unless($FileType eq "Test data file"); #ファイルを読み込み用にオープンする my $infile = new JFile($filename, "r"); #オープンに失敗したらundefを返す return undef unless($infile); #ファイル名を格納 $this->SetFileName($filename); #1行スキップ my $line = $infile->ReadLine(); #X,Yデータ用の配列 my (@X, @Y); for(my $i = 0 ; ; $i++) { my $line = $infile->ReadLine(); last unless(defined $line); #print "line: $line\n"; #X,Yデータを読み込み、配列に格納する my ($x, $y) = ($line =~ /(\S+)\s+(\S+)/); #print "i=$i x,y=$x, $y\n"; $X[$i] = $x; $Y[$i] = $y; } $infile->Close(); #データはGraphDataArrayオブジェクトのGraphDataオブジェクトとして格納する(お約束) $this->SetDataArray(new GraphDataArray); #GraphDataオブジェクトを作る(お約束) my $Data = new GraphData; #GraphDataオブジェクトをGraphDataArrayオブジェクトに追加する(お約束) $this->DataArray()->AddGraphData($Data); #GraphDataオブジェクトにデータを設定 #(これらはAssignDataメンバー関数で、グラフ枠のキャプションや # データ上のバルーンヘルプの表示に利用される $Data->SetTitle("Test Data"); $Data->SetXCaption("X Axis"); $Data->SetYCaption("Y Axis"); $Data->SetXName(0, "X0 Data"); $Data->SetYName(0, "Y0 Data"); #GraphDataオブジェクトにX,Yデータの配列を設定する。 #SetXDataArray, SetYDataArrayで 0 から連番の値を指定してデータの配列を設定すると、 #AssignDataメンバー関数で自動的にグラフ表示用のX,YデータにAssignされる。 #データの配列はリファレンスで渡す $Data->SetXDataArray(0, \@X); $Data->SetYDataArray(0, \@Y); # 参考:AssignData関数を自分で作る場合、要素名は自由に決めて構わない # $Data->{'PeakArray'} = \@Peak; など #GraphDataのデータ("x?","y?")の最大値、最小値を計算する $Data->CalMinMax(); return 1; } 1;