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.  
  36.  
  37.   /**
  38.    * A colored theme for pies
  39.    *
  40.    * @var int 
  41.    */
  42.  
  43.  
  44.   /**
  45.    * A water theme for pies
  46.    *
  47.    * @var int 
  48.    */
  49.  
  50.  
  51.   /**
  52.    * A earth theme for pies
  53.    *
  54.    * @var int 
  55.    */
  56.  
  57.  
  58.   /**
  59.    * Pie values
  60.    *
  61.    * @var array 
  62.    */
  63.   var $values;
  64.  
  65.   /**
  66.    * Pie colors
  67.    *
  68.    * @var array 
  69.    */
  70.   var $colors;
  71.  
  72.   /**
  73.    * Pie legend
  74.    *
  75.    * @var array 
  76.    */
  77.   var $legendValues = array();
  78.  
  79.   /**
  80.    * Intensity of the 3D effect
  81.    *
  82.    * @var int 
  83.    */
  84.   var $size;
  85.  
  86.   /**
  87.    * Border color
  88.    *
  89.    * @var Color 
  90.    */
  91.   var $border;
  92.  
  93.   /**
  94.    * Pie explode
  95.    *
  96.    * @var array 
  97.    */
  98.   var $explode = array();
  99.  
  100.   /**
  101.    * Initial angle
  102.    *
  103.    * @var int 
  104.    */
  105.   var $angle = 0;
  106.  
  107.   /**
  108.    * Labels precision
  109.    *
  110.    * @var int 
  111.    */
  112.   var $precision;
  113.  
  114.   /**
  115.    * Labels number
  116.    *
  117.    * @var int 
  118.    */
  119.   var $number;
  120.  
  121.   /**
  122.    * Labels minimum
  123.    *
  124.    * @var int 
  125.    */
  126.   var $minimum;
  127.  
  128.   /**
  129.    * Labels position
  130.    *
  131.    * @var int 
  132.    */
  133.   var $position = 15;
  134.  
  135.   /**
  136.    * Labels of your pie
  137.    *
  138.    * @var Label 
  139.    */
  140.   var $label;
  141.  
  142.   /**
  143.    * Build the plot
  144.    *
  145.    * @param array $values Pie values
  146.    */
  147.   function awPie($values$colors PIE_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 PIE_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 PIE_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 PIE_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::awComponent();
  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.   function setLegend($legend{
  224.  
  225.     $this->legendValues = (array)$legend;
  226.  
  227.   }
  228.  
  229.   /**
  230.    * Set a border all around the pie
  231.    *
  232.    * @param $color A color for the border
  233.    */
  234.   function setBorderColor($color{
  235.     $this->border = $color;
  236.   }
  237.  
  238.   /**
  239.    * Set a border all around the pie
  240.    *
  241.    * @param $color A color for the border
  242.    */
  243.   function setBorder($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.   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.   function setStartAngle($angle{
  266.     $this->angle = (int)$angle;
  267.   }
  268.  
  269.   /**
  270.    * Change label precision
  271.    *
  272.    * @param int $precision New precision
  273.    */
  274.   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.   function setLabelPosition($position{
  284.     $this->position = (int)$position;
  285.   }
  286.  
  287.   /**
  288.    * Change label number
  289.    *
  290.    * @param int $number New number
  291.    */
  292.   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.   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.   function explode($explode{
  311.     $this->explode = (array)$explode;
  312.   }
  313.  
  314.   function drawEnvelope($driver{
  315.  
  316.   }
  317.  
  318.   function drawComponent($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]$legendLEGEND_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(is_a($background'awColor')) {
  412.         $image->setBackgroundColor($background);
  413.       }
  414.       //            elseif(is_a($background, '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 $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(is_a($this->border'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(is_a($this->border'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(LABEL_CENTERLABEL_BOTTOM);
  549.       else if($angle >= 135 and $angle 225{
  550.         $this->label->setAlign(LABEL_RIGHTLABEL_MIDDLE);
  551.       else if($angle >= 225 and $angle 315{
  552.         $this->label->setAlign(LABEL_CENTERLABEL_TOP);
  553.       else {
  554.         $this->label->setAlign(LABEL_LEFTLABEL_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.   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.   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.   function getValues({
  606.     return $this->values;
  607.   }
  608.  
  609.   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 {
  637.  
  638.   /**
  639.    * Pie part color
  640.    *
  641.    * @var Color 
  642.    */
  643.   var $color;
  644.  
  645.   /**
  646.    * Build a new awPiePart
  647.    *
  648.    * @param $color Pie part color
  649.    */
  650.   function awPiePart($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.   function getLegendBackground({
  662.     return $this->color;
  663.   }
  664.  
  665.   /**
  666.    * Get the line thickness
  667.    *
  668.    * @return NULL 
  669.    */
  670.   function getLegendLineThickness({
  671.   }
  672.  
  673.   /**
  674.    * Get the line type
  675.    *
  676.    * @return NULL 
  677.    */
  678.   function getLegendLineStyle({
  679.   }
  680.  
  681.   /**
  682.    * Get the color of line
  683.    *
  684.    * @return NULL 
  685.    */
  686.   function getLegendLineColor({
  687.   }
  688.  
  689.   /**
  690.    * Get a mark object
  691.    *
  692.    * @return NULL 
  693.    */
  694.   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:12 +0200 by phpDocumentor 1.4.1