mirror of
https://github.com/fhem/fhem-mirror.git
synced 2025-05-04 22:19:38 +00:00
98_SVG.pm: rewrite the log scale version (Forum #112509)
git-svn-id: https://svn.fhem.de/fhem/trunk@22349 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
parent
2b91cc4245
commit
0b5da07c22
@ -959,7 +959,7 @@ RESCAN:
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
next if(!defined($val) || $val !~ m/^-?[.\d]+$/o);
|
next if(!defined($val) || $val !~ m/^-?[.0-9]+(e[-+0-9]+)?$/i);
|
||||||
if($val < $min[$i]) {
|
if($val < $min[$i]) {
|
||||||
$min[$i] = $val;
|
$min[$i] = $val;
|
||||||
$mind[$i] = $dte;
|
$mind[$i] = $dte;
|
||||||
|
@ -203,9 +203,15 @@ SVG_log10($)
|
|||||||
{
|
{
|
||||||
my ($n) = @_;
|
my ($n) = @_;
|
||||||
|
|
||||||
return 0.0000000001 if( $n <= 0 );
|
$n = 0.0000000001 if($n <= 0);
|
||||||
|
return log($n)/log(10);
|
||||||
|
}
|
||||||
|
|
||||||
return log(1+$n)/log(10);
|
sub
|
||||||
|
SVG_exp10($)
|
||||||
|
{
|
||||||
|
my ($n) = @_;
|
||||||
|
return 10**$n;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -766,7 +772,7 @@ SVG_readgplotfile($$$)
|
|||||||
{
|
{
|
||||||
return "%$_[0]%" if(!$pr);
|
return "%$_[0]%" if(!$pr);
|
||||||
my $v = $pr->{$_[0]};
|
my $v = $pr->{$_[0]};
|
||||||
return "%$_[0]%" if(!$v);
|
return "%$_[0]%" if(!defined($v));
|
||||||
if($v =~ m/^{.*}$/) {
|
if($v =~ m/^{.*}$/) {
|
||||||
$cmdFromAnalyze = $v;
|
$cmdFromAnalyze = $v;
|
||||||
return eval $v;
|
return eval $v;
|
||||||
@ -1760,6 +1766,12 @@ SVG_render($$$$$$$$$$)
|
|||||||
$htics{$a} = defined($conf{$yt}) ? $conf{$yt} : "";
|
$htics{$a} = defined($conf{$yt}) ? $conf{$yt} : "";
|
||||||
|
|
||||||
#-- Round values, compute a nice step
|
#-- Round values, compute a nice step
|
||||||
|
my $scale = $conf{"y".($idx ? $idx+1:"")."scale"};
|
||||||
|
$scale = "" if(!defined($scale));
|
||||||
|
if($scale eq "log") {
|
||||||
|
$hmax{$a} = SVG_log10($hmax{$a});
|
||||||
|
$hmin{$a} = SVG_log10($hmin{$a});
|
||||||
|
}
|
||||||
($hstep{$a}, $hmin{$a}, $hmax{$a}) =
|
($hstep{$a}, $hmin{$a}, $hmax{$a}) =
|
||||||
SVG_getSteps($conf{$yra},$hmin{$a},$hmax{$a});
|
SVG_getSteps($conf{$yra},$hmin{$a},$hmax{$a});
|
||||||
|
|
||||||
@ -1772,25 +1784,15 @@ SVG_render($$$$$$$$$$)
|
|||||||
|
|
||||||
next if(!defined($hmin{$a})); # Bogus case
|
next if(!defined($hmin{$a})); # Bogus case
|
||||||
|
|
||||||
#-- safeguarding against pathological data
|
my $axis = 1;
|
||||||
if( !$hstep{$a} ){
|
$axis = $1 if( $a =~ m/x\d+y(\d+)/ );
|
||||||
$hmax{$a} = $hmin{$a}+1;
|
my $scale = $conf{"y".($axis==1?"":$axis)."scale"};
|
||||||
$hstep{$a} = 1;
|
$scale = "" if(!defined($scale));
|
||||||
}
|
|
||||||
|
|
||||||
#-- Draw the y-axis values and grid
|
#-- Draw the y-axis values and grid
|
||||||
my $dh = $hmax{$a} - $hmin{$a};
|
my $dh = $hmax{$a} - $hmin{$a};
|
||||||
my $hmul = $dh>0 ? $h/$dh : $h;
|
my $hmul = $dh>0 ? $h/$dh : $h;
|
||||||
|
|
||||||
my $axis = 1;
|
|
||||||
$axis = $1 if( $a =~ m/x\d+y(\d+)/ );
|
|
||||||
|
|
||||||
my $scale = "y".($axis)."scale"; $scale = "yscale" if( $axis == 1 );
|
|
||||||
my $log = ""; $log = $conf{$scale} if( $conf{$scale} );
|
|
||||||
my $f_log = (int($hmax{$a}) && $dh > 0) ?
|
|
||||||
((SVG_log10($hmax{$a})-SVG_log10($hmin{$a})) / $dh) :
|
|
||||||
1;
|
|
||||||
|
|
||||||
# offsets
|
# offsets
|
||||||
my ($align,$display,$cll);
|
my ($align,$display,$cll);
|
||||||
if( $axis <= $use_left_axis ) {
|
if( $axis <= $use_left_axis ) {
|
||||||
@ -1827,23 +1829,18 @@ SVG_render($$$$$$$$$$)
|
|||||||
#-- tics handling
|
#-- tics handling
|
||||||
my $tic = $htics{$a};
|
my $tic = $htics{$a};
|
||||||
#-- tics as in the config-file
|
#-- tics as in the config-file
|
||||||
if($tic && $tic !~ m/mirror/) {
|
if($tic) {
|
||||||
$tic =~ s/^\((.*)\)$/$1/; # Strip ()
|
$tic =~ s/^\((.*)\)$/$1/; # Strip ()
|
||||||
for(my $decimal = 0;
|
|
||||||
$decimal <($log eq 'log'?SVG_log10($hmax{$a})-SVG_log10($hmin{$a}):1);
|
|
||||||
$decimal++) {
|
|
||||||
foreach my $onetic (split(",", $tic)) {
|
foreach my $onetic (split(",", $tic)) {
|
||||||
|
last if($onetic eq "nomirror");
|
||||||
$onetic =~ s/^ *(.*) *$/$1/;
|
$onetic =~ s/^ *(.*) *$/$1/;
|
||||||
my ($tlabel, $tvalue) = split(" ", $onetic);
|
my ($tlabel, $tvalue) = split(" ", $onetic);
|
||||||
$tlabel =~ s/^"(.*)"$/$1/;
|
$tlabel =~ s/^"(.*)"$/$1/;
|
||||||
$tvalue = 0 if( !$tvalue );
|
$tvalue = 0 if( !$tvalue );
|
||||||
$tvalue /= 10 ** $decimal;
|
|
||||||
$tlabel = $tvalue if( !$tlabel );
|
$tlabel = $tvalue if( !$tlabel );
|
||||||
|
$tvalue = SVG_log10($tvalue) if($scale eq "log");
|
||||||
|
|
||||||
$off2 = int($y+($hmax{$a}-$tvalue)*$hmul);
|
$off2 = int($y+($hmax{$a}-$tvalue)*$hmul);
|
||||||
$off2 = int($y+($hmax{$a}-
|
|
||||||
(SVG_log10($tvalue)-SVG_log10($hmin{$a}))/$f_log)*$hmul)
|
|
||||||
if( $log eq 'log' );
|
|
||||||
#-- tics
|
#-- tics
|
||||||
SVG_pO "<polyline points=\"$off3,$off2 $off4,$off2\" $cll/>";
|
SVG_pO "<polyline points=\"$off3,$off2 $off4,$off2\" $cll/>";
|
||||||
#--grids
|
#--grids
|
||||||
@ -1860,22 +1857,11 @@ SVG_render($$$$$$$$$$)
|
|||||||
SVG_pO
|
SVG_pO
|
||||||
"<text x=\"$off1\" y=\"$off2\" class=\"ylabel\"$align>$tlabel</text>";
|
"<text x=\"$off1\" y=\"$off2\" class=\"ylabel\"$align>$tlabel</text>";
|
||||||
}
|
}
|
||||||
}
|
|
||||||
#-- tics automatically
|
#-- tics automatically
|
||||||
} elsif( $hstep{$a}>0 ) {
|
} elsif( $hstep{$a}>0 ) {
|
||||||
for(my $decimal = 0;
|
for(my $i = $hmin{$a}; $i <= $hmax{$a}; $i += $hstep{$a}) {
|
||||||
$decimal <($log eq 'log'?SVG_log10($hmax{$a})-SVG_log10($hmin{$a}):1);
|
|
||||||
$decimal++) {
|
|
||||||
for(my $i = ($log eq 'log' ? 0 : $hmin{$a});
|
|
||||||
$i <= $hmax{$a}; $i += $hstep{$a}) {
|
|
||||||
my $i = $i / 10 ** $decimal;
|
|
||||||
if( $log eq 'log' ) {
|
|
||||||
next if( $i < $hmin{$a} );
|
|
||||||
$off2 = int($y + ($hmax{$a} -
|
|
||||||
(SVG_log10($i) - SVG_log10($hmin{$a})) / $f_log) * $hmul);
|
|
||||||
} else {
|
|
||||||
$off2 = int($y+($hmax{$a}-$i)*$hmul);
|
$off2 = int($y+($hmax{$a}-$i)*$hmul);
|
||||||
}
|
|
||||||
#-- tics
|
#-- tics
|
||||||
SVG_pO " <polyline points=\"$off3,$off2 $off4,$off2\" $cll/>";
|
SVG_pO " <polyline points=\"$off3,$off2 $off4,$off2\" $cll/>";
|
||||||
#--grids
|
#--grids
|
||||||
@ -1891,12 +1877,13 @@ SVG_render($$$$$$$$$$)
|
|||||||
$off2 += $th/4;
|
$off2 += $th/4;
|
||||||
#-- text
|
#-- text
|
||||||
my $name = ($axis==1 ? "y":"y$axis")."sprintf"; # Forum #88460
|
my $name = ($axis==1 ? "y":"y$axis")."sprintf"; # Forum #88460
|
||||||
my $txt = sprintf($conf{$name} ? $conf{$name} : "%g", $i);
|
my $txt = sprintf($conf{$name} ? $conf{$name} :
|
||||||
|
($scale eq "log" ? "%0.0e" : "%g"),
|
||||||
|
($scale eq "log" ? SVG_exp10($i) : $i));
|
||||||
SVG_pO
|
SVG_pO
|
||||||
"<text x=\"$off1\" y=\"$off2\" class=\"ylabel\"$align>$txt</text>";
|
"<text x=\"$off1\" y=\"$off2\" class=\"ylabel\"$align>$txt</text>";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
SVG_pO "</g>";
|
SVG_pO "</g>";
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -1911,8 +1898,8 @@ SVG_render($$$$$$$$$$)
|
|||||||
next if(!defined($a));
|
next if(!defined($a));
|
||||||
|
|
||||||
my $axis = 1; $axis = $1 if( $a =~ m/x\d+y(\d+)/ );
|
my $axis = 1; $axis = $1 if( $a =~ m/x\d+y(\d+)/ );
|
||||||
my $scale = "y".($axis)."scale"; $scale = "yscale" if( $axis == 1 );
|
my $scale = $conf{"y".($axis==1?"":$axis)."scale"};
|
||||||
my $log = ""; $log = $conf{$scale} if( $conf{$scale} );
|
$scale = "" if(!defined($scale));
|
||||||
|
|
||||||
$min = $hmin{$a};
|
$min = $hmin{$a};
|
||||||
$hmax{$a} += 1 if($min == $hmax{$a}); # Else division by 0 in the next line
|
$hmax{$a} += 1 if($min == $hmax{$a}); # Else division by 0 in the next line
|
||||||
@ -1925,11 +1912,9 @@ SVG_render($$$$$$$$$$)
|
|||||||
SVG_pO "<!-- Warning: No data item $idx defined -->" if(!defined($dxp));
|
SVG_pO "<!-- Warning: No data item $idx defined -->" if(!defined($dxp));
|
||||||
next if(!defined($dxp));
|
next if(!defined($dxp));
|
||||||
|
|
||||||
my $f_log = int($hmax{$a}) ? ((SVG_log10($hmax{$a}) -
|
if($scale eq 'log') {
|
||||||
SVG_log10($hmin{$a})) / ($hmax{$a}-$hmin{$a})) : 1;
|
|
||||||
if( $log eq 'log' ) {
|
|
||||||
foreach my $i (0..int(@{$dyp})-1) {
|
foreach my $i (0..int(@{$dyp})-1) {
|
||||||
$dyp->[$i] = (SVG_log10($dyp->[$i])-SVG_log10($hmin{$a})) / $f_log;
|
$dyp->[$i] = SVG_log10($dyp->[$i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1945,7 +1930,7 @@ SVG_render($$$$$$$$$$)
|
|||||||
($conf{xrange}?"x_off=\"$xmin\" ":"x_off=\"$fromsec\" ").
|
($conf{xrange}?"x_off=\"$xmin\" ":"x_off=\"$fromsec\" ").
|
||||||
($conf{xrange}?"x_mul=\"$xmul\" ":"t_mul=\"$tmul\" ").
|
($conf{xrange}?"x_mul=\"$xmul\" ":"t_mul=\"$tmul\" ").
|
||||||
"y_h=\"$yh\" y_min=\"$min\" y_mul=\"$hmul\" title=\"$tl\" ".
|
"y_h=\"$yh\" y_min=\"$min\" y_mul=\"$hmul\" title=\"$tl\" ".
|
||||||
($log eq 'log'?"log_scale=\"$f_log\" ":"").
|
"scale=\"$scale\" ".
|
||||||
"onclick=\"parent.svg_click(evt)\"";
|
"onclick=\"parent.svg_click(evt)\"";
|
||||||
my $lStyle = $conf{lStyle}[$idx];
|
my $lStyle = $conf{lStyle}[$idx];
|
||||||
my $isFill = ($conf{lStyle}[$idx] =~ m/fill/);
|
my $isFill = ($conf{lStyle}[$idx] =~ m/fill/);
|
||||||
|
@ -53,10 +53,12 @@ function
|
|||||||
svg_prepareHash(el)
|
svg_prepareHash(el)
|
||||||
{
|
{
|
||||||
var obj = { y_mul:0,y_h:0,y_min:0, decimals:0,
|
var obj = { y_mul:0,y_h:0,y_min:0, decimals:0,
|
||||||
t_mul:0,x_off:0,x_min:0, x_mul:0, log_scale:undefined };
|
t_mul:0,x_off:0,x_min:0, x_mul:0, scale:"" };
|
||||||
for(var name in obj) {
|
for(var name in obj) {
|
||||||
var n = $(el).attr(name);
|
var n = $(el).attr(name);
|
||||||
if(n)
|
if(name == "scale" && n)
|
||||||
|
obj[name] = n;
|
||||||
|
else if(n)
|
||||||
obj[name] = parseFloat(n);
|
obj[name] = parseFloat(n);
|
||||||
}
|
}
|
||||||
return obj;
|
return obj;
|
||||||
@ -76,7 +78,12 @@ svg_click(evt)
|
|||||||
y -= off.top;
|
y -= off.top;
|
||||||
}
|
}
|
||||||
|
|
||||||
var y_org = (((o.y_h-y)/o.y_mul)+o.y_min).toFixed(o.decimals);
|
var y_org = (((o.y_h-y)/o.y_mul)+o.y_min);
|
||||||
|
if(o.scale == "log")
|
||||||
|
y_org = Math.pow(10,y_org);
|
||||||
|
else
|
||||||
|
y_org = y_org.toFixed(o.decimals);
|
||||||
|
|
||||||
var d = new Date((((x-o.x_min)/o.t_mul)+o.x_off) * 1000);
|
var d = new Date((((x-o.x_min)/o.t_mul)+o.x_off) * 1000);
|
||||||
var ts = (d.getHours() < 10 ? '0' : '') + d.getHours() + ":"+
|
var ts = (d.getHours() < 10 ? '0' : '') + d.getHours() + ":"+
|
||||||
(d.getMinutes() < 10 ? '0' : '') + d.getMinutes();
|
(d.getMinutes() < 10 ? '0' : '') + d.getMinutes();
|
||||||
@ -120,6 +127,12 @@ sv_menu(evt, embed)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var embedOffsetY = 0;
|
||||||
|
if(embed) {
|
||||||
|
var name = $(evt.target).parent("svg").attr("id").substr(8);
|
||||||
|
embedOffsetY = $("div.SVGplot.SVG_"+name).offset().top;
|
||||||
|
}
|
||||||
|
|
||||||
function
|
function
|
||||||
showValOff() {
|
showValOff() {
|
||||||
$(svg).find("[id]").each(function(){delete($(this).get(0).showVal)});
|
$(svg).find("[id]").each(function(){delete($(this).get(0).showVal)});
|
||||||
@ -251,7 +264,6 @@ sv_menu(evt, embed)
|
|||||||
$(svg).append(par.circle);
|
$(svg).append(par.circle);
|
||||||
|
|
||||||
par.div = $('<div id="svgmarker">');
|
par.div = $('<div id="svgmarker">');
|
||||||
par.divoffY = -50;
|
|
||||||
var parent = (embed ? $(embed).parent() : $(svg).parent());
|
var parent = (embed ? $(embed).parent() : $(svg).parent());
|
||||||
$(parent).append(par.div);
|
$(parent).append(par.div);
|
||||||
|
|
||||||
@ -300,13 +312,9 @@ sv_menu(evt, embed)
|
|||||||
|
|
||||||
var y = (((par.y_h-yRaw)/par.y_mul)+par.y_min);
|
var y = (((par.y_h-yRaw)/par.y_mul)+par.y_min);
|
||||||
|
|
||||||
if( par.log_scale ) {
|
if(par.scale == "log")
|
||||||
y *= par.log_scale;
|
|
||||||
if( par.y_min )
|
|
||||||
y += Math.log(par.y_min)/Math.log(10);
|
|
||||||
y = Math.pow(10,y);
|
y = Math.pow(10,y);
|
||||||
}
|
else
|
||||||
|
|
||||||
y = y.toFixed(par.decimals);
|
y = y.toFixed(par.decimals);
|
||||||
|
|
||||||
if(selNode.isInt) {
|
if(selNode.isInt) {
|
||||||
@ -347,7 +355,13 @@ sv_menu(evt, embed)
|
|||||||
}
|
}
|
||||||
|
|
||||||
$(par.circle).attr("cx", xRaw).attr("cy", yRaw);
|
$(par.circle).attr("cx", xRaw).attr("cy", yRaw);
|
||||||
var yd = Math.floor((yRaw+par.divoffY) / 20)*20;
|
var yd = Math.floor(yRaw / 20)*20;
|
||||||
|
|
||||||
|
if(embed)
|
||||||
|
yd += embedOffsetY-90;
|
||||||
|
else
|
||||||
|
yd += $(svg).offset().top-90;
|
||||||
|
|
||||||
$(par.div).html(ts+" "+y)
|
$(par.div).html(ts+" "+y)
|
||||||
.css({ left:xRaw-20, top:yd });
|
.css({ left:xRaw-20, top:yd });
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user