<?php
/**
*
* Description: Default example, show some usefull functions / adding elements
*
* Blog: http://trialforce.nostaljia.eng.br
*
* Started at Mar 11, 2011
*
* @author Eduardo Bonfandini
*
* -----------------------------------------------------------------------
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Library General Public License as published
* by the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this program; if not, access
* http://www.fsf.org/licensing/licenses/lgpl.html or write to the
* Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
* ----------------------------------------------------------------------
*/
require_once "../svglib/svglib.php";
class SVGLineGraph extends SVGDocument
{
protected $startX = 0;
protected $startY = 0;
protected $maxY = 0;
protected $maxX = 0;
protected $data = 0;
/**
* Create a SVGLineGraph
*
* @param int $startX
* @param int $startY
* @param int $maxY
* @param int $maxX
* @return SVGLineGraph
*/
public static function getInstance( $startX = 30, $startY = 50, $maxY = NULL, $maxX = NULL )
{
$svg = parent::getInstance( null, 'SVGLineGraph' );
$svg->startX = $startX;
$svg->startY = $startY;
$svg->maxY = $maxY;
$svg->maxX = $maxX;
return $svg;
}
public function getStartX()
{
return $this->startX . '';
}
public function setStartX( $startX )
{
$this->startX = $startX;
}
public function getStartY()
{
return $this->startY . '';
}
public function setStartY( $startY )
{
$this->startY = $startY;
}
public function getMaxY()
{
return $this->maxY . '';
}
public function setMaxY( $maxY )
{
$this->maxY = $maxY;
}
public function getMaxX()
{
return $this->maxX . '';
}
public function setMaxX( $maxX )
{
$this->maxX = $maxX;
}
public function getData()
{
return unserialize( $this->data );
}
public function setData( $data )
{
$this->data = serialize( $data );
}
public function addData( $data, $style = null )
{
$dataAll = $this->getData();
$obj = new stdClass();
$obj->data = $data;
$obj->style = $style;
$dataAll[ ] = $obj;
$this->setData( $dataAll );
}
protected function findMaxY()
{
$maxHeight = 0;
$data = $this->getData();
if ( is_array( $data ) )
{
foreach ( $data as $obj )
{
foreach ( $obj->data as $line )
{
if ( $line[ 1 ] > $maxHeight )
{
$maxHeight = $line[ 1 ];
}
}
}
}
$this->maxY = $maxHeight;
}
protected function findMaxX()
{
$maxWidth = 0;
$data = $this->getData();
if ( is_array( $data ) )
{
foreach ( $data as $obj )
{
foreach ( $obj->data as $line )
{
if ( $line[ 0 ] > $maxWidth )
{
$maxWidth = $line[ 0 ];
}
}
}
}
$this->maxX = $maxWidth;
}
public function onCreate()
{
if ( !$this->getMaxY() )
{
$this->findMaxY();
}
if ( !$this->getMaxX() )
{
$this->findMaxX();
}
$this->setWidth( ($this->getMaxX() + 100) . 'px' );
$this->setHeight( ($this->getMaxY() + 100) . 'px' );
$this->setDefaultViewBox();
$clipPath = SVGClipPath::getInstance( 'clipPath' );
$clipRect = SVGRect::getInstance( 0, 0, null, $this->getWidth(), $this->getHeight() );
$clipPath->addShape( $clipRect );
$this->addDefs( $clipPath );
$backGroup = SVGGroup::getInstance( 'backGroup' );
$line1 = SVGLine::getInstance( $this->startX, $this->startY, $this->startX, $this->maxY + $this->startY, null, new SVGStyle( array( 'stroke' => 'black', 'stroke-width' => 1 ) ) );
$line2 = SVGLine::getInstance( $this->startX, $this->maxY + $this->startY, $this->maxX + $this->startX, $this->maxY + $this->startY, null, new SVGStyle( array( 'stroke' => 'black', 'stroke-width' => 1 ) ) );
$backGroup->addShape( $line1 );
$backGroup->addShape( $line2 );
#vertical counter
for ( $i = 0; $i <= $this->maxY; $i += 25 )
{
$text = SVGText::getInstance( $this->startX - 30, $this->startY + $i, null, $this->maxY - $i );
$text->setStyle( "font-family:Arial" );
$backGroup->addShape( $text );
}
#horizontal counter
for ( $i = 0; $i <= $this->maxX; $i += 50 )
{
$text = SVGText::getInstance( $this->startX + $i, $this->startY + $this->maxY + 20, null, $i );
$text->setStyle( "font-family:Arial" );
$backGroup->addShape( $text );
}
$data = $this->getData();
$mainGroup = SVGGroup::getInstance( 'mainGroup' );
$mainGroup->setStyle( new SVGStyle( array( 'clip-path' => 'url(#clipPath)' ) ) );
if ( is_array( $data ) )
{
foreach ( $data as $obj )
{
$itemData = $obj->data;
$style = $obj->style;
if ( !$style )
{
$style = new SVGStyle( array( 'stroke' => 'blue', 'fill' => 'blue', 'stroke-width' => 1 ) );
}
if ( is_array( $itemData ) )
{
foreach ( $itemData as $line => $info )
{
$previous = $this->normalizeLineData( @$itemData[ $line - 1 ] );
$info = $this->normalizeLineData( $info );
$line = SVGLine::getInstance( $previous[ 0 ], $previous[ 1 ], $info[ 0 ], $info[ 1 ], null, $style );
//$this->addShape( $line );
$mainGroup->addShape( $line );
$circle = SVGCircle::getInstance( $info[ 0 ], $info[ 1 ], 3, null, $style );
$circle->setTitle( $info[ 0 ] . ',' . $info[ 1 ] );
$circle->addAttribute( "onmouseover", "this.style.stroke = 'lightGray';" );
$circle->addAttribute( "onmouseout", "this.style.stroke = 'gray';" );
//$this->addShape( $circle );
$mainGroup->addShape( $circle );
}
}
}
}
$this->addShape( $backGroup );
$this->addShape( $mainGroup );
$this->addScript( "
var width = $('svg').attr('width').replace('px','');
$('svg #clippath rect').attr('width',0);
var anim = setInterval('slideRight()', 1);
function slideRight()
{
var currentWidth = parseInt( $('svg #clippath rect').attr('width') );
currentWidth += 1;
$('svg #clippath rect').attr('width',currentWidth );
if ( currentWidth >= width )
{
clearInterval(anim);
}
}
" );
/* $this->addScript( "
$('svg #mainGroup').hide();
setTimeout('showGraph()', 500);
function showGraph()
{
$('svg #mainGroup').hide();
$('svg #mainGroup').show('slow');
}" ); */
}
/**
* Normalize a line of data
*
* @param arrray $line the original line
* @return type normalized line
*/
protected function normalizeLineData( $line )
{
if ( !is_array( $line ) )
{
$line = array( 0, 0 );
}
$line[ 0 ] = $line[ 0 ] + $this->startX;
$line[ 1 ] = $this->maxY - $line[ 1 ] + $this->startY;
return $line;
}
public function asXML( $filename = NULL, $human = TRUE )
{
#clean fields that not has to be in svg
unset( $this->maxY );
unset( $this->maxX );
unset( $this->startX );
unset( $this->startY );
unset( $this->data );
return parent::asXML( $filename, $human );
}
}
$svg = SVGLineGraph::getInstance( 50, 30 );
$svg->setTitle( 'SVGLineGraph' );
$data[ ] = array( 12, 23 );
$data[ ] = array( 42, 65 );
$data[ ] = array( 117, 115 );
$data[ ] = array( 153, 224 );
$data[ ] = array( 200, 100 );
$data[ ] = array( 254, 142 );
$data[ ] = array( 367, 45 );
$data[ ] = array( 382, 87 );
$data[ ] = array( 422, 310 );
$data[ ] = array( 484, 67 );
$data[ ] = array( 600, 200 );
$svg->addData( $data );
unset( $data );
#create random data
for ( $i = 0; $i <= 10; $i++ )
{
$data[ ] = array( rand( $i * ( 540 / 10 ), $i * ( 600 / 10 ) ), rand( 0, 300 ) );
}
$svg->addData( $data, new SVGStyle( array( 'stroke' => 'red', 'fill' => 'red', 'stroke-width' => 1 ) ) );
unset( $data );
#create random data
for ( $i = 0; $i <= 10; $i++ )
{
$data[ ] = array( rand( $i * ( 540 / 10 ), $i * ( 600 / 10 ) ), rand( 0, 300 ) );
}
$svg->addData( $data, new SVGStyle( array( 'stroke' => 'green', 'fill' => 'green', 'stroke-width' => 3 ) ) );
$svg->onCreate();
?>
<html>
<head>
<title>Line graph</title>
<script src = "http://code.jquery.com/jquery-1.10.1.min.js"></script>
</head>
<body>
<div>
<?php
echo $svg->asXML();
?>
</div>
</body>
</html>
|