See changes

git-svn-id: https://fhem.svn.sourceforge.net/svnroot/fhem/trunk/fhem@212 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
rudolfkoenig
2008-07-24 07:39:15 +00:00
parent 7fba49364f
commit 7535aaf949
15 changed files with 134 additions and 166 deletions

View File

@@ -4,6 +4,9 @@ package main;
use strict;
use warnings;
use POSIX;
#use Devel::Size qw(size total_size);
sub SVG_render($$$$$$$);
sub time_to_sec($);
@@ -36,7 +39,7 @@ SVG_render($$$$$$$)
if($a[0] && $a[0] eq "set") { $conf{$a[1]} = $a[2]; } } @{$confp};
# Html Header
pO "<?xml version=\"1.0\" encoding=\"iso8859-1\"?>\n";
pO "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
pO "<?xml-stylesheet href=\"$__ME/svg_style.css\" type=\"text/css\"?>\n";
pO "<!DOCTYPE svg>\n";
pO "<svg version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">\n";
@@ -91,8 +94,18 @@ SVG_render($$$$$$$)
my (%hmin, %hmax, @hdx, @hdy);
my ($dxp, $dyp) = (\(), \());
my ($d, $v);
foreach my $l (split("\n", $$dp)) {
my ($d, $v, $ld, $lv) = ("","","","");
my ($dpl,$dpoff,$l) = (length($$dp), 0, "");
while($dpoff < $dpl) { # using split instead is memory hog
my $ndpoff = index($$dp, "\n", $dpoff);
if($ndpoff == -1) {
$l = substr($$dp, $dpoff);
} else {
$l = substr($$dp, $dpoff, $ndpoff-$dpoff);
}
$dpoff = $ndpoff+1;
if($l =~ m/^#/) {
my $a = $axes[$idx];
$hmin{$a} = $min if(!defined($hmin{$a}) || $hmin{$a} > $min);
@@ -104,15 +117,20 @@ SVG_render($$$$$$$)
} else {
($d, $v) = split(" ", $l);
push @{$dxp}, ($tmul ? int((time_to_sec($d)-$fromsec)*$tmul) : $d);
push @{$dyp}, $v;
$min = $v if($min > $v);
$max = $v if($max < $v);
$d = ($tmul ? int((time_to_sec($d)-$fromsec)*$tmul) : $d);
if($ld ne $d || $lv ne $v) { # Saves a lot on year zoomlevel
$ld = $d; $lv = $v;
push @{$dxp}, $d;
push @{$dyp}, $v;
$min = $v if($min > $v);
$max = $v if($max < $v);
}
}
last if($ndpoff == -1);
}
$dxp = $hdx[0];
if(int(@{$dxp}) < 2 && !$tosec) { # not enough data and no range...
if($dxp && int(@{$dxp}) < 2 && !$tosec) { # not enough data and no range...
pO "</svg>\n";
return;
}
@@ -261,11 +279,16 @@ SVG_render($$$$$$$)
my $hmul = $h/($hmax{$a}-$min);
my $ret = "";
my ($dxp, $dyp) = ($hdx[$idx], $hdy[$idx]);
next if(!defined($dxp));
my ($lx, $ly) = (-1,-1);
if($type[$idx] eq "points" ) {
foreach my $i (0..int(@{$dxp})-1) {
my ($x1, $y1) = ($x+$dxp->[$i], $y+$h-($dyp->[$i]-$min)*$hmul);
my ($x1, $y1) = (int($x+$dxp->[$i]),
int($y+$h-($dyp->[$i]-$min)*$hmul));
next if($x1 == $lx && $y1 == $ly);
$ly = $x1; $ly = $y1;
$ret = sprintf(" %d,%d %d,%d %d,%d %d,%d %d,%d",
$x1-3,$y1, $x1,$y1-3, $x1+3,$y1, $x1,$y1+3, $x1-3,$y1);
pO "<polyline points=\"$ret\" class=\"l$idx\"/>\n";
@@ -281,6 +304,8 @@ SVG_render($$$$$$$)
foreach my $i (1..int(@{$dxp})-1) {
my ($x1, $y1) = ($x+$dxp->[$i-1], $y+$h-($dyp->[$i-1]-$min)*$hmul);
my ($x2, $y2) = ($x+$dxp->[$i], $y+$h-($dyp->[$i] -$min)*$hmul);
next if(int($x2) == $lx && int($y1) == $ly);
$lx = int($x2); $ly = int($y2);
$ret .= sprintf(" %d,%d %d,%d %d,%d", $x1,$y1, $x2,$y1, $x2,$y2);
}
}
@@ -295,6 +320,8 @@ SVG_render($$$$$$$)
foreach my $i (1..int(@{$dxp})-1) {
my ($x1, $y1) = ($x+$dxp->[$i-1], $y+$h-($dyp->[$i-1]-$min)*$hmul);
my ($x2, $y2) = ($x+$dxp->[$i], $y+$h-($dyp->[$i] -$min)*$hmul);
next if(int($x2) == $lx && int($y1) == $ly);
$lx = int($x2); $ly = int($y2);
$ret .= sprintf(" %d,%d %d,%d %d,%d %d,%d",
$x1,$y1, ($x1+$x2)/2,$y1, ($x1+$x2)/2,$y2, $x2,$y2);
}
@@ -303,14 +330,16 @@ SVG_render($$$$$$$)
} else { # lines and everything else
foreach my $i (0..int(@{$dxp})-1) {
$ret .= sprintf(" %d,%d", $x + $dxp->[$i],
$y + $h-($dyp->[$i]-$min)*$hmul);
my ($x1, $y1) = (int($x+$dxp->[$i]),
int($y+$h-($dyp->[$i]-$min)*$hmul));
next if($x1 == $lx && $y1 == $ly);
$lx = $x1; $ly = $y1;
$ret .= sprintf(" %d,%d", $x1, $y1);
}
pO "<polyline points=\"$ret\" class=\"l$idx\"/>\n";
}
}
pO "</svg>\n";
}