Ejemplo n.º 1
0
        /// <summary>
        /// Creates an image of a barchart which represents the data in <paramref name="barChartData"/>.  The image is saved at <paramref name="completeFileName"/>.
        /// </summary>
        /// <param name="completeFileName">The path at which to save the generated image.</param>
        /// <param name="barChartData">The &lt;year, value&gt; plots for the barchart.</param>
        /// <returns>True on success, false on fail.</returns>
        private bool CreateBarChartImageFile( string completeFileName, SortedDictionary<int, double> barChartData )
        {
            if( Thread.CurrentThread.GetApartmentState() != ApartmentState.STA )
            {
                return this.InvokeCreateBarChartImageFile( completeFileName, barChartData );
            }

            try
            {
                const string fontFamily = "Times New Roman";
                const float fontSize = 12f;

                ZedGraphControl chart = new ZedGraphControl();
                chart.Size = new Size( ( barChartData.Count + 2 ) * 45, 300 );

                GraphPane pane = chart.GraphPane;
                pane.IsFontsScaled = false;

                pane.BarSettings.Type = BarType.Stack;
                pane.Chart.Fill = new Fill( Color.Transparent );
                pane.Fill = new Fill( Color.LightBlue, Color.AliceBlue, 90F );

                pane.Title.FontSpec.Family = fontFamily;
                pane.Title.FontSpec.Size = fontSize;
                pane.Title.IsVisible = false;
                pane.Title.Text = string.Empty;

                pane.XAxis.MajorGrid.IsVisible = false;

                pane.XAxis.MajorTic.IsInside = false;

                pane.XAxis.Scale.FontSpec.Family = fontFamily;
                pane.XAxis.Scale.FontSpec.Size = fontSize;

                pane.XAxis.Title.FontSpec.Family = fontFamily;
                pane.XAxis.Title.FontSpec.Size = fontSize;
                pane.XAxis.Title.IsVisible = false;
                pane.XAxis.Title.Text = string.Empty;

                pane.X2Axis.IsVisible = false;
                pane.X2Axis.MajorGrid.IsVisible = false;
                pane.X2Axis.MinorGrid.IsVisible = false;
                pane.X2Axis.MajorTic.IsInside = false;
                pane.X2Axis.MajorTic.IsOutside = false;
                pane.X2Axis.MinorTic.IsInside = false;
                pane.X2Axis.MinorTic.IsOutside = false;

                pane.YAxis.MajorGrid.IsVisible = true;
                pane.YAxis.MajorGrid.Color = Color.LightSteelBlue;

                pane.YAxis.MajorTic.IsInside = false;

                pane.YAxis.MinorTic.IsInside = false;
                pane.YAxis.MinorTic.IsOutside = false;

                pane.YAxis.Scale.FontSpec.Family = fontFamily;
                pane.YAxis.Scale.FontSpec.Size = fontSize;

                pane.YAxis.Title.FontSpec.Family = fontFamily;
                pane.YAxis.Title.FontSpec.Size = fontSize;
                pane.YAxis.Title.IsVisible = false;
                pane.YAxis.Title.Text = string.Empty;

                pane.Y2Axis.IsVisible = false;
                pane.Y2Axis.MajorGrid.IsVisible = false;
                pane.Y2Axis.MinorGrid.IsVisible = false;
                pane.Y2Axis.MajorTic.IsInside = false;
                pane.Y2Axis.MajorTic.IsOutside = false;
                pane.Y2Axis.MinorTic.IsInside = false;
                pane.Y2Axis.MinorTic.IsOutside = false;

                int idx = 0;
                string[] labels = new string[ barChartData.Count ];

                PointPairList nPoints = new PointPairList();
                PointPairList pPoints = new PointPairList();
                foreach( KeyValuePair<int, double> yearValue in barChartData )
                {
                    int yr = yearValue.Key % 100;
                    labels[ idx ] = "'" + yr.ToString( "00" );

                    double value = yearValue.Value * 100;
                    if( yearValue.Value >= 0 )
                    {
                        nPoints.Add( yearValue.Key, 0.0 );
                        pPoints.Add( yearValue.Key, value );
                    }
                    else
                    {
                        nPoints.Add( yearValue.Key, value );
                        pPoints.Add( yearValue.Key, 0.0 );
                    }

                    idx++;
                }

                pane.XAxis.Scale.TextLabels = labels;
                pane.XAxis.Type = AxisType.Text;

                //negative values
                BarItem nBar = pane.AddBar( string.Empty, nPoints, Color.Empty );
                nBar.Bar.Fill = new Fill( Color.FromArgb( 227, 99, 52 ), Color.FromArgb( 255, 177, 126 ), Color.FromArgb( 227, 99, 52 ) );

                //positive values
                BarItem pBar = pane.AddBar( string.Empty, pPoints, Color.Empty );
                pBar.Bar.Fill = new Fill( Color.FromArgb( 81, 148, 157 ), Color.FromArgb( 107, 197, 222 ), Color.FromArgb( 81, 148, 157 ) );

                //1 - Update the chart with the series
                chart.AxisChange();

                //2 - Process the value labels for each point
                this.WriteValueLabels( pane, nBar, fontFamily, fontSize, true );
                this.WriteValueLabels( pane, pBar, fontFamily, fontSize, false );

                //3 - Update the chart again
                chart.AxisChange();

                using( Image img = chart.GetImage() )
                {
                    EncoderParameters parms = new EncoderParameters( 1 );
                    EncoderParameter parm = new EncoderParameter( System.Drawing.Imaging.Encoder.Quality, 80L );
                    parms.Param[ 0 ] = parm;

                    ImageCodecInfo jgpEncoder = GetEncoder( ImageFormat.Jpeg );
                    img.Save( completeFileName, jgpEncoder, parms );
                }

                try
                {
                    chart.Dispose();
                    chart = null;
                }
                catch { }

                return true;
            }
            catch { }

            return false;
        }