204 lines
6.7 KiB
C#

using System.Collections.Generic;
using ceTe.DynamicPDF;
using Dundas.Charting.WebControl;
using Consulenza.ReportCommon;
using Consulenza.ReportWriter.Business.Entity;
using System.Drawing;
using Color = System.Drawing.Color;
using Font = System.Drawing.Font;
namespace Consulenza.ReportWriter.Business.CHART_PDF
{
public class PiePDF : ChartPDF
{
#region Field
public float FontLabelSize { get; set; }
/// <summary>
/// Imposta o recupera l'angolo di separazione della torta.
/// Di default = 0 (Orizzontale). 90(Verticale)
/// </summary>
public int StartAngle { get; set; }
/// <summary>
/// Imposta o recupera un bool che indica se disegnare il grafico in 3D.
/// Di default = false.
/// </summary>
public bool Style3DEnabled { get; set; }
public bool UseCustomPlotting { get; set; }
public float CustomPlottingWidth { get; set; }
public float CustomPlottingHeight { get; set; }
public float CustomPlottingX { get; set; }
public float CustomPlottingY { get; set; }
/// <summary>
/// Ottiene o imposta l'angolo di rotazione intorno all'asse X.
/// Aumentando si ottiene l'effetto 3D più accentuato.
/// Di default = 5. Massimo valore consentito = 90.
/// </summary>
public int Style3DXAngle { get; set; }
#endregion
#region Costruttori
/// <summary>
/// Costruttore
/// </summary>
public PiePDF()
{
ObjectType = ObjectTypePdf.CHART;
ChartType = ChartTypePdf.PIE;
ChartBase.ChartAreas.Add("Default");
FontLabelSize = 6;
StartAngle = 0;
Style3DEnabled = false;
Style3DXAngle = 5;
}
public PiePDF(float x)
: this()
{
X = x;
}
public PiePDF(float x, float scale)
: this(x)
{
Scale = scale;
}
public PiePDF(float x, float scale, float y)
: this(x, scale)
{
Y = y;
}
public int LabelDecimalDigitsCount = 2;
#endregion
#region Metodi
/// <summary>
/// Ritorna l'oggetto che sarà stampato sulla pagina del documento.
/// </summary>
/// <returns></returns>
public override PageElement ToElement()
{
var listReturn = new List<ObjectPDF>();
#region Creo il grafico
CreateChart();
#endregion
#region Ritorno l'immagine contenente il grafico
listReturn.Add(ToImage());
TotalHeight += Height;
#endregion
Elements.AddRange(listReturn);
return this;
}
/// <summary>
/// Crea il grafico di tipo Pie
/// </summary>
private void CreateChart()
{
// Imposto tutte le serie aggiunte al chart come Pie.
base.SeriesCollection.ForEach(o => o.Type = SeriesChartType.Pie);
ChartBase.AntiAliasing = AntiAliasing.All; // AntiAliasing.Graphics and AntiAliasing.Text
ChartBase.TextAntiAliasingQuality = TextAntiAliasingQuality.High;
ChartBase.ChartAreas[0].BackColor = Color.White;
ChartBase.ChartAreas[0].BorderColor = Color.Empty;
ChartBase.ChartAreas[0].BorderWidth = 0;
ChartBase.ChartAreas[0].Position.Auto = false;
ChartBase.ChartAreas[0].Position.X = 0;
ChartBase.ChartAreas[0].Position.Y = 0;
ChartBase.ChartAreas[0].Position.Width = 100;
ChartBase.ChartAreas[0].Position.Height = 100;
// Imposto il 3D
ChartBase.ChartAreas[0].Area3DStyle.Enable3D = Style3DEnabled;
ChartBase.ChartAreas[0].Area3DStyle.XAngle = Style3DXAngle;
foreach (var item in SeriesCollection)
{
ChartBase.Series.Add(item.Name);
// Imposto il tipo di grafico
ChartBase.Series[item.Name].Type = item.Type;
// Imposto lo stile delle etichette delle barre (utilizzati se _showlabelpoints = true)
ChartBase.Series[item.Name]["PieLabelStyle"] = "Outside";
ChartBase.Series[item.Name]["PieStartAngle"] = StartAngle.ToString();
// Imposto il tipo di linea dei Points. Visibile solo se ShowLabelPoints = true e PieLabelStyle="Outside"
ChartBase.Series[item.Name]["PieLineColor"] = "Black";
ChartBase.Series[item.Name]["PieLineArrowType"] = "None";
ChartBase.Series[item.Name]["PieLineArrowSize"] = "1";
// Points
ChartBase.Series[item.Name].YValueType = ChartValueTypes.Double;
ChartBase.Series[item.Name].Font = new Font("Verdana", FontLabelSize, FontStyle.Bold);
var i = 0;
foreach (var point in item.Points)
{
ChartBase.Series[item.Name].Points.AddY(point.Value);
if (point.Value != 0.00 && ShowLabelPoints)
ChartBase.Series[item.Name].Points[i].Label = Helper.FormatPercentage(point.Value, LabelDecimalDigitsCount);
if (point.Value < 1.00 && ShowLabelPoints)
ChartBase.Series[item.Name].Points[i]["PieLabelStyle"] = "Ellipse";
else
ChartBase.Series[item.Name].Points[i]["PieLabelStyle"] = "Outside";
var r = point.Color.Red;
var g = point.Color.Green;
var b = point.Color.Blue;
ChartBase.Series[item.Name].Points[i].Color = Color.FromArgb(r, g, b);
i++;
}
}
// Legenda disabilitata
ChartBase.Legend.Enabled = false;
if (UseCustomPlotting)
{
ChartBase.ChartAreas[0].InnerPlotPosition.Auto = false;
ChartBase.ChartAreas[0].InnerPlotPosition.Height = CustomPlottingHeight;
ChartBase.ChartAreas[0].InnerPlotPosition.Width = CustomPlottingWidth;
ChartBase.ChartAreas[0].InnerPlotPosition.X = CustomPlottingX;
ChartBase.ChartAreas[0].InnerPlotPosition.Y = CustomPlottingY;
}
else
{
// Set the plotting area position. Coordinates of a plotting
// area are relative to a chart area position.
ChartBase.ChartAreas[0].InnerPlotPosition.Auto = true;
}
}
#endregion
}
}