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); } } }
/** * 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; }