Beispiel #1
0
 private function drawSides()
 {
     if (isset($this->axis_valuetype[GRAPH_YAXIS_SIDE_RIGHT]) && ($this->yaxisright != 0 || $this->skipRightScale != 1)) {
         $sides[] = GRAPH_YAXIS_SIDE_RIGHT;
     }
     if (isset($this->axis_valuetype[GRAPH_YAXIS_SIDE_LEFT]) && ($this->yaxisleft != 0 || $this->skipLeftScale != 1) || !isset($sides)) {
         $sides[] = GRAPH_YAXIS_SIDE_LEFT;
     }
     foreach ($sides as $side) {
         $minY = $this->m_minY[$side];
         $maxY = $this->m_maxY[$side];
         $units = null;
         $unitsLong = null;
         $byteStep = false;
         for ($item = 0; $item < $this->num; $item++) {
             if ($this->items[$item]['axisside'] == $side) {
                 // check if items use B or Bps units
                 if ($this->items[$item]['units'] == 'B' || $this->items[$item]['units'] == 'Bps') {
                     $byteStep = true;
                 }
                 if (is_null($units)) {
                     $units = $this->items[$item]['units'];
                 } elseif ($this->items[$item]['units'] != $units) {
                     $units = '';
                 }
             }
         }
         if (is_null($units) || $units === false) {
             $units = '';
         } else {
             for ($item = 0; $item < $this->num; $item++) {
                 if ($this->items[$item]['axisside'] == $side && !empty($this->items[$item]['unitsLong'])) {
                     $unitsLong = $this->items[$item]['unitsLong'];
                     break;
                 }
             }
         }
         if (!empty($unitsLong)) {
             $dims = imageTextSize(9, 90, $unitsLong);
             $tmpY = $this->sizeY / 2 + $this->shiftY + $dims['height'] / 2;
             if ($tmpY < $dims['height']) {
                 $tmpY = $dims['height'] + 6;
             }
             $tmpX = $side == GRAPH_YAXIS_SIDE_LEFT ? $dims['width'] + 8 : $this->fullSizeX - $dims['width'];
             imageText($this->im, 9, 90, $tmpX, $tmpY, $this->getColor($this->graphtheme['textcolor'], 0), $unitsLong);
         }
         $step = $this->gridStep[$side];
         $hstr_count = $this->gridLinesCount[$side];
         // ignore milliseconds if  -1 <= maxY => 1 or -1 <= minY => 1
         $ignoreMillisec = bccomp($maxY, -1) <= 0 || bccomp($maxY, 1) >= 0 || bccomp($minY, -1) <= 0 || bccomp($minY, 1) >= 0;
         $newPow = false;
         if ($byteStep) {
             $maxYPow = convertToBase1024($maxY, 1024);
             $minYPow = convertToBase1024($minY, 1024);
             $powStep = 1024;
         } else {
             $maxYPow = convertToBase1024($maxY);
             $minYPow = convertToBase1024($minY);
             $powStep = 1000;
         }
         if (abs($maxYPow['pow']) > abs($minYPow['pow']) && $maxYPow['value'] != 0) {
             $newPow = $maxYPow['pow'];
             if (abs(bcdiv($minYPow['value'], bcpow($powStep, $maxYPow['pow']))) > 1000) {
                 $newPow = $minYPow['pow'];
             }
         }
         if (abs($maxYPow['pow']) < abs($minYPow['pow']) && $minYPow['value'] != 0) {
             $newPow = $minYPow['pow'];
             if (abs(bcdiv($maxYPow['value'], bcpow($powStep, $minYPow['pow']))) > 1000) {
                 $newPow = $maxYPow['pow'];
             }
         }
         if ($maxYPow['pow'] == $minYPow['pow']) {
             $newPow = $maxYPow['pow'];
         }
         $maxLength = false;
         // get all values in y-axis if units != 's'
         if ($units != 's') {
             $calcValues = array();
             for ($i = 0; $i <= $hstr_count; $i++) {
                 $hstr_count = $hstr_count == 0 ? 1 : $hstr_count;
                 $val = bcadd(bcmul($i, $step), $minY);
                 if (bccomp(bcadd($val, bcdiv($step, 2)), $maxY) == 1) {
                     continue;
                 }
                 $calcValues[] = convert_units(array('value' => $val, 'convert' => ITEM_CONVERT_NO_UNITS, 'byteStep' => $byteStep, 'pow' => $newPow));
             }
             $calcValues[] = convert_units(array('value' => $maxY, 'convert' => ITEM_CONVERT_NO_UNITS, 'byteStep' => $byteStep, 'pow' => $newPow));
             $maxLength = calcMaxLengthAfterDot($calcValues);
         }
         for ($i = 0; $i <= $hstr_count; $i++) {
             $hstr_count = $hstr_count == 0 ? 1 : $hstr_count;
             $val = bcadd(bcmul($i, $step), $minY);
             if (bccomp(bcadd($val, bcdiv($step, 2)), $maxY) == 1) {
                 continue;
             }
             $str = convert_units(array('value' => $val, 'units' => $units, 'convert' => ITEM_CONVERT_NO_UNITS, 'byteStep' => $byteStep, 'pow' => $newPow, 'ignoreMillisec' => $ignoreMillisec, 'length' => $maxLength));
             if ($side == GRAPH_YAXIS_SIDE_LEFT) {
                 $dims = imageTextSize(8, 0, $str);
                 $posX = $this->shiftXleft - $dims['width'] - 9;
             } else {
                 $posX = $this->sizeX + $this->shiftXleft + 12;
             }
             // marker Y coordinate
             $posY = $this->sizeY + $this->shiftY - $this->gridStepX[$side] * $i + 4;
             imageText($this->im, 8, 0, $posX, $posY, $this->getColor($this->graphtheme['textcolor'], 0), $str);
         }
         $str = convert_units(array('value' => $maxY, 'units' => $units, 'convert' => ITEM_CONVERT_NO_UNITS, 'byteStep' => $byteStep, 'pow' => $newPow, 'ignoreMillisec' => $ignoreMillisec, 'length' => $maxLength));
         if ($side == GRAPH_YAXIS_SIDE_LEFT) {
             $dims = imageTextSize(8, 0, $str);
             $posX = $this->shiftXleft - $dims['width'] - 9;
             $color = $this->getColor(GRAPH_ZERO_LINE_COLOR_LEFT);
         } else {
             $posX = $this->sizeX + $this->shiftXleft + 12;
             $color = $this->getColor(GRAPH_ZERO_LINE_COLOR_RIGHT);
         }
         imageText($this->im, 8, 0, $posX, $this->shiftY + 4, $this->getColor($this->graphtheme['textcolor'], 0), $str);
         if ($this->zero[$side] != $this->sizeY + $this->shiftY && $this->zero[$side] != $this->shiftY) {
             zbx_imageline($this->im, $this->shiftXleft, $this->zero[$side], $this->shiftXleft + $this->sizeX, $this->zero[$side], $color);
         }
     }
 }
Beispiel #2
0
/**
 * Calculate interval for base 1024 values.
 * Example:
 * 	Convert 1000 to 1024
 *
 * @param $interval
 * @param $minY
 * @param $maxY
 *
 * @return float|int
 */
function getBase1024Interval($interval, $minY, $maxY)
{
    $intervalData = convertToBase1024($interval);
    $interval = $intervalData['value'];
    if ($maxY > 0) {
        $absMaxY = $maxY;
    } else {
        $absMaxY = bcmul($maxY, '-1');
    }
    if ($minY > 0) {
        $absMinY = $minY;
    } else {
        $absMinY = bcmul($minY, '-1');
    }
    if ($absMaxY > $absMinY) {
        $sideMaxData = convertToBase1024($maxY);
    } else {
        $sideMaxData = convertToBase1024($minY);
    }
    if ($sideMaxData['pow'] != $intervalData['pow']) {
        // interval correction, if Max Y have other unit, then interval unit = Max Y unit
        if ($intervalData['pow'] < 0) {
            $interval = sprintf('%.10f', bcmul($interval, 1.024, 10));
        } else {
            $interval = sprintf('%.6f', round(bcmul($interval, 1.024), ZBX_UNITS_ROUNDOFF_UPPER_LIMIT));
        }
    }
    return $interval;
}