Login   Register  
PHP Classes
elePHPant
Icontem

File: example/graph.php

Recommend this page to a friend!
Stumble It! Stumble It! Bookmark in del.icio.us Bookmark in del.icio.us
  Classes of Eduardo "Trial Force" Bonfandini  >  phpSVG  >  example/graph.php  >  Download  
File: example/graph.php
Role: Example script
Content type: text/plain
Description: Example script
Class: phpSVG
Create and edit vectorial graphics in SVG files
Author: By
Last change:
Date: 7 months ago
Size: 10,180 bytes
 

Contents

Class file image Download
<?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::getInstancenull'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] > $maxHeight )
                    {
                        
$maxHeight $line];
                    }
                }
            }
        }

        
$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] > $maxWidth )
                    {
                        
$maxWidth $line];
                    }
                }
            }
        }

        
$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::getInstance00null$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->startYnull, new SVGStyle( array( 'stroke'       => 'black''stroke-width' => ) ) );
        
$line2 SVGLine::getInstance$this->startX$this->maxY $this->startY$this->maxX $this->startX$this->maxY $this->startYnull, new SVGStyle( array( 'stroke'       => 'black''stroke-width' => ) ) );

        
$backGroup->addShape$line1 );
        
$backGroup->addShape$line2 );

        
#vertical counter
        
for ( $i 0$i <= $this->maxY$i += 25 )
        {
            
$text SVGText::getInstance$this->startX 30$this->startY $inull$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 20null$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' => ) );
                }

                if ( 
is_array$itemData ) )
                {
                    foreach ( 
$itemData as $line => $info )
                    {
                        
$previous $this->normalizeLineData( @$itemData$line ] );
                        
$info $this->normalizeLineData$info );

                        
$line SVGLine::getInstance$previous], $previous], $info], $info], null$style );
                        
//$this->addShape( $line );
                        
$mainGroup->addShape$line );

                        
$circle SVGCircle::getInstance$info], $info], 3null$style );
                        
$circle->setTitle$info] . ',' $info] );
                        
$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);
        }

        
$line] = $line] + $this->startX;
        
$line] = $this->maxY $line] + $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::getInstance5030 );
$svg->setTitle'SVGLineGraph' );

$data[ ] = array( 1223 );
$data[ ] = array( 4265 );
$data[ ] = array( 117115 );
$data[ ] = array( 153224 );
$data[ ] = array( 200100 );
$data[ ] = array( 254142 );
$data[ ] = array( 36745 );
$data[ ] = array( 38287 );
$data[ ] = array( 422310 );
$data[ ] = array( 48467 );
$data[ ] = array( 600200 );

$svg->addData$data );

unset( 
$data );

#create random data
for ( $i 0$i <= 10$i++ )
{
    
$data[ ] = array( rand$i * ( 540 10 ), $i * ( 600 10 ) ), rand0300 ) );
}

$svg->addData$data, new SVGStyle( array( 'stroke'       => 'red''fill'         => 'red''stroke-width' => ) ) );

unset( 
$data );

#create random data
for ( $i 0$i <= 10$i++ )
{
    
$data[ ] = array( rand$i * ( 540 10 ), $i * ( 600 10 ) ), rand0300 ) );
}

$svg->addData$data, new SVGStyle( array( 'stroke'       => 'green''fill'         => 'green''stroke-width' => ) ) );
$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>