







This example demonstrates circular bar meters in segmented style.
This example is similar to the Circular Bar Meter example except that the ring sectors are segmented.
ChartDirector 7.0 (Perl Edition)
Circular Bar Meter (2)
Source Code Listing
#!/usr/bin/perl
# The ChartDirector for Perl module is assumed to be in "../lib"
use File::Basename;
use lib (dirname($0)."/../lib") =~ /(.*)/;
use perlchartdir;
sub createChart
{
my $chartIndex = shift;
# The value to display on the meter
my $value = 85;
# The meter radius and angle
my $radius = 50;
my $angle = $value * 360.0 / 100;
# Create an AngularMeter with transparent background
my $m = new AngularMeter($radius * 2 + 10, $radius * 2 + 10, $perlchartdir::Transparent);
# Set the center, radius and angular range of the meter
$m->setMeter(int($m->getWidth() / 2), int($m->getHeight() / 2), $radius, 0, 360);
# For circular bar meters, we do not need pointer or graduation, so we hide them.
$m->setMeterColors($perlchartdir::Transparent, $perlchartdir::Transparent,
$perlchartdir::Transparent);
$m->setCap(0, $perlchartdir::Transparent);
# In this example, the circular bar has 20 segments
my $segmentCount = 20;
# The angular step
my $angleStep = 360.0 / $segmentCount;
# The gap between segments is 4.5 degrees
my $angleGap = 4.5;
#
# This example demonstrates several coloring styles
#
# Thd default fill and blank colors
my $fillColor = 0x336699;
my $blankColor = 0xeeeeee;
if ($chartIndex >= 4) {
# Use dark background style
$m->setColors($perlchartdir::whiteOnBlackPalette);
$fillColor = 0x6699ff;
$blankColor = 0x222222;
}
if ($chartIndex % 4 == 1) {
# Alternative fill color
$fillColor = 0x00ee33;
} elsif ($chartIndex % 4 == 2) {
# Use a smooth color scale as the fill color
my $smoothColorScale = [0, 0x0022ff, 15, 0x0088ff, 30, 0x00ff00, 55, 0xffff00, 80, 0xff0000,
100, 0xff0000];
$fillColor = $m->getDrawArea()->angleGradientColor(int($m->getWidth() / 2), int(
$m->getHeight() / 2), 0, 360, $radius, $radius - 20, $smoothColorScale);
} elsif ($chartIndex % 4 == 3) {
# Use a step color scale as the fill color
my $stepColorScale = [0, 0x0044ff, 20, 0x00ee00, 50, 0xeeee00, 70, 0xee0000, 100];
$fillColor = $m->getDrawArea()->angleGradientColor(int($m->getWidth() / 2), int(
$m->getHeight() / 2), -$angleGap / 2, 360 - $angleGap / 2, $radius, $radius - 20,
$stepColorScale);
}
#
# Now we draw the segments of the bar meter
#
# The segment that contains the value
my $currentSegment = int($angle / $angleStep);
# Segments after the current segment is colored with the blank color
for(my $i = $currentSegment + 1; $i < $segmentCount; ++$i) {
$m->addRingSector($radius, $radius - 20, $i * $angleStep, ($i + 1) * $angleStep - $angleGap,
$blankColor);
}
# Segments before the current segment is colored with the fill color
for(my $i = 0; $i < $currentSegment; ++$i) {
$m->addRingSector($radius, $radius - 20, $i * $angleStep, ($i + 1) * $angleStep - $angleGap,
$fillColor);
}
# Segment that contains the angle will be partially filled and partially blank. We need to
# adjust the angle to compensated for the angle gap.
my $adjustedAngle = $currentSegment * $angleStep + ($angle - $currentSegment * $angleStep) * (1
- $angleGap / $angleStep);
# The blank part of the segment
if (($currentSegment + 1) * $angleStep > $angle) {
$m->addRingSector($radius, $radius - 20, $adjustedAngle, ($currentSegment + 1) * $angleStep
- $angleGap, $blankColor);
}
# The filled part of the segment.
if ($angle > $currentSegment * $angleStep) {
$m->addRingSector($radius, $radius - 20, $currentSegment * $angleStep, $adjustedAngle,
$fillColor);
}
# Add a label at the center to display the value
$m->addText(int($m->getWidth() / 2), int($m->getHeight() / 2), $m->formatValue($value, "{value}"
), "Arial", 25, $perlchartdir::TextColor, $perlchartdir::Center)->setMargin(0);
# Output the chart
$m->makeChart("circularbarmeter2$chartIndex.png");
}
createChart(0);
createChart(1);
createChart(2);
createChart(3);
createChart(4);
createChart(5);
createChart(6);
createChart(7);