App-Widget-ChartDirector

 view release on metacpan or  search on metacpan

lib/App/Widget/ChartDirector.pm  view on Meta::CPAN

        $spec->{stacked} = 0;  # stacking is done for us in the area layer
    }
    else {
        $layer = $c->addLineLayer2();
        $layer->setLineWidth(2);
    }
    $layer->set3D(5) if ($spec->{"3D"});
    if ($#$yn > 0) {
        my ($stacked_y, $y, $dataset);
        if ($spec->{stacked}) {
            $stacked_y = [ ];  # make a copy
        }
        my $y_labels = $spec->{y_labels} || [];
        for (my $i = 0; $i <= $#$yn; $i++) {
            $y = $yn->[$i];
            if ($spec->{stacked}) {
                for (my $j = 0; $j <= $#$y; $j++) {
                    $stacked_y->[$j] += $y->[$j];
                }
                $y = $stacked_y;
            }
            #$dataset = $layer->addDataSet($y, -1, $y_labels->[$i]);
################            
            #we choose colors from @color_set
            if($i <= 18) {                    # RNS 070831-000229 
                if ($#$data_set_colors != -1) {
                    $dataset = $layer->addDataSet($y, $data_set_colors->[$i], $y_labels->[$i]);
                } else {
                    $dataset = $layer->addDataSet($y, hex($color_set[$i]), $y_labels->[$i]);
                }
            }
            else {
                #if number of y_labels is greater than 20, colors will be repeated
                #we have declared only 20 colors
                $dataset = $layer->addDataSet($y, hex($color_set[($i-19)]), $y_labels->[$i]);   # RNS 070831-000229
            }
###############            
            $dataset->setDataSymbol($self->sym($i, \@symbols)) if ($spec->{points});
        }
    }
    elsif ($#$yn > -1) {
        $layer = $c->addLineLayer($yn->[0]);
        $layer->setLineWidth(2);
    }
    if ($spec->{point_labels}) {
        my $label_format = $spec->{point_labels};
        $label_format = "{value|0}" if ($label_format eq "1");
        $layer->setDataLabelFormat($label_format);
    }

    $self->set_x_axis($spec, $c, $layer, $x);

    $c->makeChart($spec->{image_path});
    &App::sub_exit() if ($App::trace);
}

sub sym {
    &App::sub_entry if ($App::trace);
    my ($self, $series, $symbols) = @_;
    my $idx = $series % ($#$symbols + 1);
    my $symboldef = $symbols->[$idx];
    &App::sub_exit($symboldef->{symbol}, $symboldef->{size}) if ($App::trace);
    return($symboldef->{symbol}, $symboldef->{size});
}

##Add a legend box at (400, 100)
#$c->addLegend(400, 100);
##Add a stacked bar layer and set the layer 3D depth to 8 pixels
#my $layer = $c->addBarLayer2($perlchartdir::Stack, 8);
##Add the three data sets to the bar layer
#$layer->addDataSet($data0, 0xff8080, "Server # 1");
#$layer->addDataSet($data1, 0x80ff80, "Server # 2");
#$layer->addDataSet($data2, 0x8080ff, "Server # 3");

# TODO: this needs more work before it really works
sub write_meter_graph_image {
    &App::sub_entry if ($App::trace);
    my ($self, $spec) = @_;
    my $c = $self->new_meter_chart($spec);
    my $x = $self->get_x($spec);
    my $yn = $self->get_y($spec) || [[]];

    my $value = $yn->[0][0];

    my $radius   = $spec->{radius};
    my $center_x = $spec->{center_x};
    my $center_y = $spec->{center_y};

    #my $y_max = $spec->{y_max} || 100;
    my $y_max = $value || 100;

    my ($major_tick, $minor_tick, $micro_tick);
    {
        my $y_mantissa = $y_max;
        my $y_scale = 1;
        while ($y_mantissa > 1.0) {
            $y_mantissa /= 10;
            $y_scale    *= 10;
        }
        if ($y_mantissa > 0.5) {
            $y_max = $y_scale;
            $minor_tick = $y_max/10;
            $micro_tick = $y_max/20;
        }
        elsif ($y_mantissa > 0.2) {
            $y_max = 0.5 * $y_scale;
            $minor_tick = $y_max/25;
            $micro_tick = undef;
        }
        else {
            $y_max = 0.2 * $y_scale;
            $minor_tick = $y_max/10;
            $micro_tick = $y_max/20;
        }
        $major_tick = $y_max/5;
    }

    my $y_red    = $spec->{y_red} || ($y_max * 0.80);
    my $y_yellow = $spec->{y_yellow} || ($y_max * 0.60);

    #Meter scale is 0 - 100, with major tick every 20 units, minor tick every 10
    #units, and micro tick every 5 units
    $c->setScale(0, $y_max, $major_tick, $minor_tick, $micro_tick);



( run in 2.017 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )