linea21-externals
[ class tree: linea21-externals ] [ index: linea21-externals ] [ all elements ]

Source for file Pie.class.php

Documentation is available at Pie.class.php

  1. <?php
  2. /*
  3.  * This work is hereby released into the Public Domain.
  4.  * To view a copy of the public domain dedication,
  5.  * visit http://creativecommons.org/licenses/publicdomain/ or send a letter to
  6.  * Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.
  7.  *
  8.  */
  9.  
  10. require_once dirname(__FILE__)."/Component.class.php";
  11.  
  12. /* <php4> */
  13.  
  14. define("PIE_DARK"1);
  15. define("PIE_COLORED"2);
  16. define("PIE_AQUA"3);
  17. define("PIE_EARTH"4);
  18.  
  19. /* </php4> */
  20.  
  21. /**
  22.  * Pie
  23.  *
  24.  * @package linea21.externals
  25.  * @subpackage artichow
  26.  */
  27. class awPie extends awComponent {
  28.  
  29.   /**
  30.    * A dark theme for pies
  31.    *
  32.    *
  33.    * @var int 
  34.    */
  35.   const DARK = 1;
  36.  
  37.   /**
  38.    * A colored theme for pies
  39.    *
  40.    * @var int 
  41.    */
  42.   const COLORED = 2;
  43.  
  44.   /**
  45.    * A water theme for pies
  46.    *
  47.    * @var int 
  48.    */
  49.   const AQUA = 3;
  50.  
  51.   /**
  52.    * A earth theme for pies
  53.    *
  54.    * @var int 
  55.    */
  56.   const EARTH = 4;
  57.  
  58.   /**
  59.    * Pie values
  60.    *
  61.    * @var array 
  62.    */
  63.   protected $values;
  64.  
  65.   /**
  66.    * Pie colors
  67.    *
  68.    * @var array 
  69.    */
  70.   protected $colors;
  71.  
  72.   /**
  73.    * Pie legend
  74.    *
  75.    * @var array 
  76.    */
  77.   protected $legendValues = array();
  78.  
  79.   /**
  80.    * Intensity of the 3D effect
  81.    *
  82.    * @var int 
  83.    */
  84.   protected $size;
  85.  
  86.   /**
  87.    * Border color
  88.    *
  89.    * @var Color 
  90.    */
  91.   protected $border;
  92.  
  93.   /**
  94.    * Pie explode
  95.    *
  96.    * @var array 
  97.    */
  98.   protected $explode = array();
  99.  
  100.   /**
  101.    * Initial angle
  102.    *
  103.    * @var int 
  104.    */
  105.   protected $angle = 0;
  106.  
  107.   /**
  108.    * Labels precision
  109.    *
  110.    * @var int 
  111.    */
  112.   protected $precision;
  113.  
  114.   /**
  115.    * Labels number
  116.    *
  117.    * @var int 
  118.    */
  119.   protected $number;
  120.  
  121.   /**
  122.    * Labels minimum
  123.    *
  124.    * @var int 
  125.    */
  126.   protected $minimum;
  127.  
  128.   /**
  129.    * Labels position
  130.    *
  131.    * @var int 
  132.    */
  133.   protected $position = 15;
  134.  
  135.   /**
  136.    * Labels of your pie
  137.    *
  138.    * @var Label 
  139.    */
  140.   public $label;
  141.  
  142.   /**
  143.    * Build the plot
  144.    *
  145.    * @param array $values Pie values
  146.    */
  147.   public function __construct($values$colors awPie::COLORED{
  148.  
  149.     $this->setValues($values);
  150.  
  151.     if(is_array($colors)) {
  152.       $this->colors = $colors;
  153.     else {
  154.  
  155.       switch($colors{
  156.             
  157.         case awPie::AQUA :
  158.           $this->colors = array(
  159.           new awColor(131220215),
  160.           new awColor(131190215),
  161.           new awColor(131160215),
  162.           new awColor(160140215),
  163.           new awColor(190131215),
  164.           new awColor(220131215)
  165.           );
  166.           break;
  167.               
  168.         case awPie::EARTH :
  169.           $this->colors = array(
  170.           new awColor(97179110),
  171.           new awColor(13017997),
  172.           new awColor(16817997),
  173.           new awColor(17914797),
  174.           new awColor(17910897),
  175.           new awColor(99107189),
  176.           new awColor(99165189)
  177.           );
  178.           break;
  179.               
  180.         case awPie::DARK :
  181.           $this->colors = array(
  182.           new awColor(140100170),
  183.           new awColor(130170100),
  184.           new awColor(160160120),
  185.           new awColor(150110140),
  186.           new awColor(130150160),
  187.           new awColor(90170140)
  188.           );
  189.           break;
  190.               
  191.         default :
  192.           $this->colors = array(
  193.           new awColor(187213151),
  194.           new awColor(223177151),
  195.           new awColor(111186132),
  196.           new awColor(197160230),
  197.           new awColor(16516963),
  198.           new awColor(21817789),
  199.           new awColor(116205121),
  200.           new awColor(20020178),
  201.           new awColor(127205177),
  202.           new awColor(205160160),
  203.           new awColor(190190190)
  204.           );
  205.           break;
  206.               
  207.       }
  208.  
  209.     }
  210.  
  211.     parent::__construct();
  212.  
  213.     $this->label = new awLabel;
  214.     $this->label->setCallbackFunction('callbackPerCent');
  215.  
  216.   }
  217.  
  218.   /**
  219.    * Change legend values
  220.    *
  221.    * @param array $legend An array of values for each part of the pie
  222.    */
  223.   public function setLegend($legend{
  224.  
  225.     $this->legendValues = (array)$legend;
  226.  
  227.   }
  228.  
  229.   /**
  230.    * Set a border all around the pie
  231.    *
  232.    * @param awColor $color A color for the border
  233.    */
  234.   public function setBorderColor(awColor $color{
  235.     $this->border = $color;
  236.   }
  237.  
  238.   /**
  239.    * Set a border all around the pie
  240.    *
  241.    * @param awColor $color A color for the border
  242.    */
  243.   public function setBorder(awColor $color{
  244.     if(ARTICHOW_DEPRECATED === TRUE{
  245.       awImage::drawError('Class Pie: Method setBorder() has been deprecated since Artichow 1.0.9. Please use setBorderColor() instead.');
  246.     else {
  247.       $this->setBorderColor($color);
  248.     }
  249.   }
  250.  
  251.   /**
  252.    * Change 3D effect intensity
  253.    *
  254.    * @param int $size Effect size
  255.    */
  256.   public function set3D($size{
  257.     $this->size = (int)$size;
  258.   }
  259.  
  260.   /**
  261.    * Change initial angle
  262.    *
  263.    * @param int $angle New angle in degrees
  264.    */
  265.   public function setStartAngle($angle{
  266.     $this->angle = (int)$angle;
  267.   }
  268.  
  269.   /**
  270.    * Change label precision
  271.    *
  272.    * @param int $precision New precision
  273.    */
  274.   public function setLabelPrecision($precision{
  275.     $this->precision = (int)$precision;
  276.   }
  277.  
  278.   /**
  279.    * Change label position
  280.    *
  281.    * @param int $position New position in pixels
  282.    */
  283.   public function setLabelPosition($position{
  284.     $this->position = (int)$position;
  285.   }
  286.  
  287.   /**
  288.    * Change label number
  289.    *
  290.    * @param int $number New number
  291.    */
  292.   public function setLabelNumber($number{
  293.     $this->number = is_null($number$number : (int)$number;
  294.   }
  295.  
  296.   /**
  297.    * Change label minimum
  298.    *
  299.    * @param int $minimum New minimum
  300.    */
  301.   public function setLabelMinimum($minimum{
  302.     $this->minimum = is_null($minimum$minimum : (int)$minimum;
  303.   }
  304.  
  305.   /**
  306.    * Change Pie explode
  307.    *
  308.    * @param array $explode 
  309.    */
  310.   public function explode($explode{
  311.     $this->explode = (array)$explode;
  312.   }
  313.  
  314.   public function drawEnvelope(awDriver $driver{
  315.  
  316.   }
  317.  
  318.   public function drawComponent(awDriver $driver$x1$y1$x2$y2$aliasing{
  319.  
  320.     $count count($this->values);
  321.     $sum array_sum($this->values);
  322.  
  323.     $width $x2 $x1;
  324.     $height $y2 $y1;
  325.  
  326.     if($aliasing{
  327.       $x $width 2;
  328.       $y $height 2;
  329.     else {
  330.       $x $width $x1;
  331.       $y $height $y1;
  332.     }
  333.  
  334.     $position $this->angle;
  335.     $values array();
  336.     $parts array();
  337.     $angles 0;
  338.  
  339.     if($aliasing{
  340.       $side new awSide(0000);
  341.     }
  342.  
  343.     foreach($this->values as $key => $value{
  344.  
  345.       $angle ($value $sum 360);
  346.           
  347.       if($key === $count 1{
  348.         $angle 360 $angles;
  349.       }
  350.           
  351.       $angles += $angle;
  352.           
  353.       if(array_key_exists($key$this->explode)) {
  354.         $middle 360 ($position $angle 2);
  355.         $posX $this->explode[$keycos($middle M_PI 180);
  356.         $posY $this->explode[$keysin($middle M_PI 180* -1;
  357.  
  358.         if($aliasing{
  359.           $explode new awPoint(
  360.           $posX 2,
  361.           $posY 2
  362.           );
  363.           $side->set(
  364.           max($side->left$posX * -2),
  365.           max($side->right$posX 2),
  366.           max($side->top$posY * -2),
  367.           max($side->bottom$posY 2)
  368.           );
  369.         else {
  370.           $explode new awPoint(
  371.           $posX,
  372.           $posY
  373.           );
  374.         }
  375.  
  376.       else {
  377.         $explode new awPoint(00);
  378.       }
  379.           
  380.       $values[$keyarray(
  381.       $position($position $angle)$explode
  382.       );
  383.           
  384.       $color $this->colors[$key count($this->colors)];
  385.       $parts[$keynew awPiePart($color);
  386.           
  387.       // Add part to the legend
  388.       $legend array_key_exists($key$this->legendValues$this->legendValues[$key$key;
  389.       $this->legend->add($parts[$key]$legendawLegend::BACKGROUND);
  390.           
  391.       $position += $angle;
  392.  
  393.     }
  394.  
  395.     if($aliasing{
  396.  
  397.       $mainDriver $driver;
  398.           
  399.       $x *= 2;
  400.       $y *= 2;
  401.       $width *= 2;
  402.       $height *= 2;
  403.       $this->size *= 2;
  404.           
  405.       $image new awImage;
  406.       $image->border->hide();
  407.           
  408.       // Adds support for antialiased pies on non-white background
  409.       $background $this->getBackground();
  410.           
  411.       if($background instanceof awColor{
  412.         $image->setBackgroundColor($background);
  413.       }
  414.       //            elseif($background instanceof awGradient) {
  415.       //                $image->setBackgroundColor(new White(100));
  416.       //            }
  417.           
  418.       $image->setSize(
  419.       $width $side->left $side->right,
  420.       $height $side->top $side->bottom $this->size + /* bugs.php.net ! */
  421.       );
  422.           
  423.       $driver $image->getDriver(
  424.       $width $image->width,
  425.       $height $image->height,
  426.       ($width $side->left$image->width,
  427.       ($height $side->top$image->height
  428.       );
  429.           
  430.     }
  431.  
  432.     // Draw 3D effect
  433.     for($i $this->size$i 0$i--{
  434.  
  435.       foreach($values as $key => $value{
  436.             
  437.         $color clone $this->colors[$key count($this->colors)];
  438.         $color->brightness(-50);
  439.  
  440.         list($from$to$explode$value;
  441.  
  442.         $driver->filledArc($color$explode->move($x$y $i)$width$height$from$to);
  443.  
  444.         unset($color);
  445.  
  446.         if($this->border instanceof awColor{
  447.  
  448.           $point $explode->move($x$y);
  449.               
  450.           if($i === $this->size{
  451.  
  452.             $driver->arc($this->border$point->move(0$this->size)$width$height$from$to);
  453.  
  454.           }
  455.  
  456.         }
  457.             
  458.       }
  459.           
  460.     }
  461.  
  462.     foreach($values as $key => $value{
  463.           
  464.       $color $this->colors[$key count($this->colors)];
  465.           
  466.       list($from$to$explode$value;
  467.           
  468.       $driver->filledArc($color$explode->move($x$y)$width$height$from$to);
  469.           
  470.       if($this->border instanceof awColor{
  471.             
  472.         $point $explode->move($x$y);
  473.         $driver->arc($this->border$point$width$height$from$to);
  474.       }
  475.  
  476.     }
  477.  
  478.     if($aliasing{
  479.  
  480.       $x $x $x1;
  481.       $y $y $y1;
  482.       $width /= 2;
  483.       $height /= 2;
  484.       $this->size /= 2;
  485.           
  486.       foreach($values as $key => $value{
  487.         $old $values[$key][2];
  488.         $values[$key][2new awPoint(
  489.         $old->2$old->2
  490.         );
  491.       }
  492.           
  493.       $mainDriver->copyResizeImage(
  494.       $image,
  495.       new awPoint($x1 $side->left 2$y1 $side->top 2),
  496.       new awPoint($x1 $side->left $image->width 2$y1 $side->top $image->height2),
  497.       new awPoint(00),
  498.       new awPoint($image->width$image->height),
  499.       TRUE
  500.       );
  501.           
  502.       $driver $mainDriver;
  503.  
  504.     }
  505.  
  506.     // Get labels values
  507.     $pc array();
  508.     foreach($this->values as $key => $value{
  509.       $pc[$keyround($value $sum 100$this->precision);
  510.     }
  511.     if($this->label->count(=== 0// Check that there is no user defined values
  512.       $this->label->set($pc);
  513.     }
  514.  
  515.     $position 0;
  516.  
  517.     foreach($pc as $key => $value{
  518.  
  519.       // Limit number of labels to display
  520.       if($position === $this->number{
  521.         break;
  522.       }
  523.           
  524.       if(is_null($this->minimum=== FALSE and $value $this->minimum{
  525.         continue;
  526.       }
  527.           
  528.       $position++;
  529.           
  530.       list($from$to$explode$values[$key];
  531.           
  532.       $angle $from ($to $from2;
  533.       $angleRad (360 $angleM_PI 180;
  534.           
  535.       $point new awPoint(
  536.       $x $explode->cos($angleRad($width $this->position),
  537.       $y $explode->sin($angleRad($height $this->position)
  538.       );
  539.           
  540.       $angle %= 360;
  541.           
  542.       // We don't display labels on the 3D effect
  543.       if($angle and $angle 180{
  544.         $point $point->move(0-sin($angleRad$this->size);
  545.       }
  546.           
  547.       if($angle >= 45 and $angle 135{
  548.         $this->label->setAlign(awLabel::CENTERawLabel::BOTTOM);
  549.       else if($angle >= 135 and $angle 225{
  550.         $this->label->setAlign(awLabel::RIGHTawLabel::MIDDLE);
  551.       else if($angle >= 225 and $angle 315{
  552.         $this->label->setAlign(awLabel::CENTERawLabel::TOP);
  553.       else {
  554.         $this->label->setAlign(awLabel::LEFTawLabel::MIDDLE);
  555.       }
  556.           
  557.       $this->label->draw(
  558.       $driver,
  559.       $point,
  560.       $key
  561.       );
  562.           
  563.     }
  564.  
  565.   }
  566.  
  567.   /**
  568.    * Return margins around the component
  569.    *
  570.    * @return array Left, right, top and bottom margins
  571.    */
  572.   public function getMargin({
  573.  
  574.     // Get axis informations
  575.  
  576.     $leftAxis $this->padding->left;
  577.     $rightAxis $this->padding->right;
  578.     $topAxis $this->padding->top;
  579.     $bottomAxis $this->padding->bottom;
  580.  
  581.     return array($leftAxis$rightAxis$topAxis$bottomAxis);
  582.  
  583.   }
  584.  
  585.  
  586.   /**
  587.    * Change values of Y axis
  588.    * This method ignores not numeric values
  589.    *
  590.    * @param array $values 
  591.    */
  592.   public function setValues($values{
  593.  
  594.     $this->checkArray($values);
  595.     $this->values = $values;
  596.  
  597.   }
  598.  
  599.  
  600.   /**
  601.    * Return values of Y axis
  602.    *
  603.    * @return array 
  604.    */
  605.   public function getValues({
  606.     return $this->values;
  607.   }
  608.  
  609.   private function checkArray(&$array{
  610.  
  611.     if(is_array($array=== FALSE{
  612.       awImage::drawError("Class Pie: You tried to set values that are not an array.");
  613.     }
  614.  
  615.     foreach($array as $key => $value{
  616.       if(is_numeric($value=== FALSE{
  617.         unset($array[$key]);
  618.       }
  619.     }
  620.  
  621.     if(count($array1{
  622.       awImage::drawError("Class Pie: Your graph must have at least 1 value.");
  623.     }
  624.  
  625.   }
  626.  
  627. }
  628.  
  629.  
  630. /**
  631.  * Pie
  632.  *
  633.  * @package linea21.externals
  634.  * @subpackage artichow
  635.  */
  636. class awPiePart implements awLegendable {
  637.  
  638.   /**
  639.    * Pie part color
  640.    *
  641.    * @var Color 
  642.    */
  643.   protected $color;
  644.  
  645.   /**
  646.    * Build a new awPiePart
  647.    *
  648.    * @param awColor $color Pie part color
  649.    */
  650.   public function __construct(awColor $color{
  651.  
  652.     $this->color = $color;
  653.  
  654.   }
  655.  
  656.   /**
  657.    * Get the background color or gradient of an element of the component
  658.    *
  659.    * @return Color, Gradient
  660.    */
  661.   public function getLegendBackground({
  662.     return $this->color;
  663.   }
  664.  
  665.   /**
  666.    * Get the line thickness
  667.    *
  668.    * @return NULL 
  669.    */
  670.   public function getLegendLineThickness({
  671.   }
  672.  
  673.   /**
  674.    * Get the line type
  675.    *
  676.    * @return NULL 
  677.    */
  678.   public function getLegendLineStyle({
  679.   }
  680.  
  681.   /**
  682.    * Get the color of line
  683.    *
  684.    * @return NULL 
  685.    */
  686.   public function getLegendLineColor({
  687.   }
  688.  
  689.   /**
  690.    * Get a mark object
  691.    *
  692.    * @return NULL 
  693.    */
  694.   public function getLegendMark({
  695.   }
  696.  
  697. }
  698.  
  699. registerClass('PiePart');
  700.  
  701. function callbackPerCent($value{
  702.   return $value.'%';
  703. }
  704. ?>

Documentation generated on Thu, 03 May 2012 15:07:10 +0200 by phpDocumentor 1.4.1