#=============================================== # TkRietan #=============================================== package TkRietan; use Crystal::Rietan; use MyTk::TkCommon; @ISA = qw(Rietan TkCommon); #公開したいサブルーチン #@EXPORT = qw(DelSpace Reduce01 MakePath RegExpQuote); use strict; use Utils; BEGIN { } sub new { my ($module, $app, $canvas) = @_; my $this = {}; bless $this; $this->SetApplication($app); $this->SetCanvas($canvas); return $this; } sub DESTROY { my $this = shift; $this->SUPER::DESTROY(@_); } sub SetCanvas { my($this,$can)=@_; return $this->{'Canvas'} = $can; } sub Canvas { return shift->{'Canvas'}; } sub GetGraphFrameArray { return shift->{'GraphFrameArray'}; } sub CreateGraphFrame { my ($this, $canvas) = @_; $this->SetCanvas($canvas) if($canvas); $canvas = $this->Canvas() unless($canvas); my $App = $this->App(); my $font = $App->{'GraphFrameFont'}; my @font = split(/,/, $font) if($font); my $w = $canvas->width(); my $h = $canvas->height(); # Canvas, GraphFrameの初期化 my $GraphFrameArray = $this->{'GraphFrameArray'} = new GraphFrameArray($this->mw(), $canvas); $GraphFrameArray->AddGraphFrame(); my $GraphFrame0 = $GraphFrameArray->GetGraphFrame(0); my $GraphFrame1 = ''; my $GraphFrame2 = ''; my $FileType = $this->FileType(); #print "FileType:$FileType\n"; if($FileType =~ /Fitting/i) { $GraphFrameArray->AddGraphFrame(); $GraphFrame1 = $GraphFrameArray->GetGraphFrame(1); $GraphFrameArray->AddGraphFrame(); $GraphFrame2 = $GraphFrameArray->GetGraphFrame(2); } $GraphFrameArray->SetFont(\@font) if($font); $GraphFrameArray->SetXCaption(''); $GraphFrameArray->SetYCaption(''); $GraphFrameArray->SetCanvasSize($w, $h); my $FramePosStr0 = $App->{"GraphFrame0Position"}; $GraphFrame0->SetPositionByStr($FramePosStr0); my $XScale0 = $GraphFrame0->GetXScale(0); my $YScale0 = $GraphFrame0->GetYScale(0); if($FileType =~ /Fitting/i) { $XScale0->SetScaleStringVisible(0); $XScale0->SetCaptionVisible(0); } else { $GraphFrame0->SetXCaption('2Theta'); $XScale0->SetScaleStringVisible(1); $XScale0->SetCaptionVisible(1); } # $YScale0->SetScaleFormat("%5.2f"); $GraphFrame0->SetYCaption('Intensity / cps'); $GraphFrame0->SetViewRange(0, 0, 1, 1); if($FileType =~ /Fitting/i) { my $FramePosStr1 = $App->{"GraphFrame1Position"}; $GraphFrame1->SetPositionByStr($FramePosStr1); my $XScale1 = $GraphFrame1->GetXScale(0); my $YScale1 = $GraphFrame1->GetYScale(0); $XScale1->SetScaleStringVisible(0); $XScale1->SetCaptionVisible(0); # $YScale1->SetScaleFormat("%5.2f"); $GraphFrame1->SetViewRange(0, 0, 1, 1); $YScale1->SetnMaxScale(5); $YScale1->CalScale(); my $FramePosStr2 = $App->{"GraphFrame2Position"}; $GraphFrame2->SetPositionByStr($FramePosStr2); $GraphFrame2->SetXCaption('2Theta'); my $XScale2 = $GraphFrame2->GetXScale(0); my $YScale2 = $GraphFrame2->GetYScale(0); $YScale2->SetScaleVisible(0); $YScale2->SetScaleStringVisible(0); $YScale2->SetCaptionVisible(0); # $XScale2->SetScaleFormat("%5.2f"); # $YScale2->SetScaleFormat("%5.2f"); $GraphFrame2->SetViewRange(0, 0, 1, 1); $YScale2->SetnMaxScale(5); $YScale2->CalScale(); $GraphFrame0->AddSynchronousFrame('x', $GraphFrame1); $GraphFrame0->AddSynchronousFrame('x', $GraphFrame2); $GraphFrame1->AddSynchronousFrame('x', $GraphFrame0); $GraphFrame1->AddSynchronousFrame('x', $GraphFrame2); $GraphFrame2->AddSynchronousFrame('x', $GraphFrame0); $GraphFrame2->AddSynchronousFrame('x', $GraphFrame1); } } sub AssignGraphData { my ($this) = @_; my $GraphFrameArray = $this->GetGraphFrameArray(); my $GraphFrame0 = $GraphFrameArray->GetGraphFrame(0); my $GraphFrame1 = $GraphFrameArray->GetGraphFrame(1); my $GraphFrame2 = $GraphFrameArray->GetGraphFrame(2); my $pDataArray = $this->DataArray(); my $IntData = $pDataArray->GetGraphData(0); my $nData = $IntData->nData(); my $title = $IntData->Title(); my $p2QData = $IntData->GetDataArray('x0'); my $pObsIntensityData = $IntData->GetDataArray('y0'); my $pCalIntensityData = $IntData->GetDataArray('y1'); my $pBGIntensityData = $IntData->GetDataArray('y2'); my $pDiffIntensityData = $IntData->GetDataArray('y3'); $GraphFrame0->AddGraphData($p2QData, $pCalIntensityData, 1, "black", "", 6, "red", 0, "red", "XAutoSkip") if($pCalIntensityData); if($pObsIntensityData and $pCalIntensityData) { $GraphFrame0->AddGraphData($p2QData, $pObsIntensityData, 0, "black", "cross", 6, "white", 0, "red", "XAutoSkip") } elsif($pObsIntensityData and !$pCalIntensityData) { $GraphFrame0->AddGraphData($p2QData, $pObsIntensityData, 1, "black", "", 4, "", 0, "black", "XAutoSkip"); } if($pBGIntensityData) { $GraphFrame0->AddGraphData($p2QData, $pBGIntensityData, 1, "blue", "", 6, "blue", 0, "blue", "XAutoSkip") } $GraphFrame0->CalMinMax(); $GraphFrame0->AdjustViewRange(0.05, 0.05, 0.05, 0.05); if($GraphFrame1) { $GraphFrame1->AddGraphData($p2QData, $pDiffIntensityData, 1, "black", "", 6, "black", 0, "black", "XAutoSkip") if($pDiffIntensityData); $GraphFrame1->CalMinMax(); $GraphFrame1->AdjustViewRange(0.05, 0.05, 0.05, 0.05); my ($vy00, $vy01) = $GraphFrame0->GetViewYRange(); my ($x00, $y00, $x01, $y01) = $GraphFrame0->GetPosition(); my ($vy10, $vy11) = $GraphFrame1->GetViewYRange(); my ($x10, $y10, $x11, $y11) = $GraphFrame1->GetPosition(); $y01 = $y00 + 1.0 if($y00 == $y01); $y11 = $y10 + 1.0 if($y10 == $y11); my $r1 = ($vy01 - $vy00) / ($y01 - $y00); my $r2 = ($vy11 - $vy10) / ($y11 - $y10); my $k = $r1 / $r2; $GraphFrame1->SetViewYRange($vy10*$k, $vy11*$k); } if($GraphFrame2) { } $this->AdjustViewRange(); } sub AdjustViewRange { my ($this) = @_; my $GraphFrameArray = $this->GetGraphFrameArray(); my $pGraphFrame = $GraphFrameArray->GetpGraphFrameArray(); my ($xmin, $xmax) = $pGraphFrame->[0]->GetViewXRange(); my $nGraphFrame = 2; for(my $i = 1 ; $i < $nGraphFrame ; $i++) { next unless($pGraphFrame->[$i]); my ($xmin0, $xmax0) = $pGraphFrame->[$i]->GetViewXRange(); $xmin = $xmin0 if($xmin0 < $xmin); $xmax = $xmax0 if($xmax < $xmax0); } for(my $i = 0 ; $i < @$pGraphFrame ; $i++) { next unless($pGraphFrame->[$i]); $pGraphFrame->[$i]->SetViewXRange($xmin, $xmax); # $pGraphFrame->[$i]->RecalcScale(); } } sub Draw { my ($this, $canvas) = @_; my $mw = $this->mw(); my $GraphFrameArray = $this->GetGraphFrameArray(); my $pGraphFrame = $GraphFrameArray->GetpGraphFrameArray(); my @GraphFrame = @$pGraphFrame; $canvas = $this->Canvas() unless($canvas); my $App = $this->App(); my $font = $App->{'GraphFrameFont'}; my @font = split(/,/, $font) if($font); my $w = $canvas->width(); my $h = $canvas->height(); $canvas->SetFont(\@font) if($font);; $GraphFrameArray->SetCanvasSize($w, $h); $GraphFrameArray->Draw($canvas); #ピーク位置をプロット my $pPeakArray = $this->GetpDiffractionPeakArray(); return unless($pPeakArray); my ($x0, $y0, $x1, $y1) = $pGraphFrame->[2]->GetPosition(); # my ($vx0, $vx1) = $pGraphFrame->[2]->GetViewXRange(); my $nPeakArray = $this->GetnDiffractionPeakArray(); my $BarBoxHeight = int(abs($y1 - $y0) / $nPeakArray); my $BarLength = int($BarBoxHeight / 2.0 * 0.7); for(my $id = 0 ; $id < $nPeakArray ; $id++) { my $peak = $pPeakArray->[$id]; next unless($peak); my $nPeak = $peak->nPeaks(); my $ybase = $y1 + $id*$BarBoxHeight; for(my $i = 0 ; $i < $nPeak ; $i++) { my $hkl = $peak->hkl($i); my $Q2Obs = $peak->Q2Obs($i); my $Q2Cal = $peak->Q2Cal($i); #print "id=$id i=$i hkl=$hkl at $Q2a / $Q2b\n"; my ($xa, $ya) = $pGraphFrame->[2]->ValueToPosition($Q2Obs, 0); my ($xb, $yb) = $pGraphFrame->[2]->ValueToPosition($Q2Cal, 0); my $ybasea = $ybase + $BarBoxHeight * 0.5 * 0.8; my $ybaseb = $ybasea + $BarBoxHeight * 0.5; #print "x: $xa, $ybasea / $xb, $ybaseb ($BarBoxHeight/$BarLength)\n"; my $taga = "$hkl(Obs) 2Q=$Q2Obs"; $taga =~ s/\s/-/g; $canvas->DrawLine($xa, $ybasea, $xa, $ybasea-$BarLength, 1, "red", $taga) if($x0 < $xa and $xa < $x1); $canvas->bind($taga, "", [\&HoverItem, $this, "Enter", $taga]); $canvas->bind($taga, "", [\&HoverItem, $this, "Leave", $taga]); my $tagb = "$hkl(Cal) 2Q=$Q2Obs"; $tagb =~ s/\s/-/g; $canvas->DrawLine($xb, $ybaseb, $xb, $ybaseb-$BarLength, 1, "blue", $tagb) if($x0 < $xb and $xb < $x1); $canvas->bind($tagb, "", [\&HoverItem, $this, "Enter", $tagb]); $canvas->bind($tagb, "", [\&HoverItem, $this, "Leave", $tagb]); } } } sub HoverItem { my ($canvas, $this, $event, $tag) = @_; if($event eq 'Enter') { $tag =~ s/-/ /g; $this->mw()->WriteStausBar($tag); } elsif($event eq 'Leave') { $this->mw()->WriteStausBar(''); } } 1;