PHP Classes

File: example/graph.php

Recommend this page to a friend!
  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: 10 years 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::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>