using System;
using System.Drawing;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data;
using System.Web.UI.DataVisualization.Charting;
using System.Data.SqlClient;
///
///DrawChart 的摘要说明
///
public partial class DrawChart
{
public static void ChartQualityData_Pareto(DataTable dt,int n, Chart chart1)
{
chart1.Series["RawData"].Points.DataBindY(dt.Rows, "测量值");
DrawPareto drawPareto = new DrawPareto();
drawPareto.SegmentIntervalNumber = n;
drawPareto.ShowPercentOnSecondaryYAxis = false;
drawPareto.CreatePareto(chart1, "RawData", "Histogram");
drawPareto.MakeParetoChart(chart1, "Histogram", "Pareto");
// Set chart types for output data
chart1.Series["Pareto"].ChartType = SeriesChartType.Line;
// set the markers for each point of the Pareto Line
chart1.Series["Pareto"].IsValueShownAsLabel = true;
chart1.Series["Pareto"].MarkerColor = Color.Red;
chart1.Series["Pareto"].MarkerBorderColor = Color.MidnightBlue;
chart1.Series["Pareto"].MarkerStyle = MarkerStyle.Circle;
chart1.Series["Pareto"].MarkerSize = 6;
chart1.Series["Pareto"].LabelFormat = "0.#"; // format with one decimal and leading zero
// Set Color of line Pareto chart
chart1.Series["Pareto"].Color = Color.FromArgb(252, 180, 65);
}
///
/// SPC分析正态分布图
///
///
///
///
public static void ChartQualityData_NormalDistribution(double[] X, int n, Chart chart1)
{
double ValueUp = Max(X);
double ValueDown = Min(X);
//绘图数据
ASPNet_Drawing.CSpc_Data_Cpk Spc_Data_Cpk = ASPNet_Drawing.Spc_Data.Cpk(X, n, ValueUp, ValueDown);
//坐标轴
double ValueUpX = Convert.ToDouble(Max(Spc_Data_Cpk.NormalDistributionX).ToString("F2"));
double ValueDownX = Convert.ToDouble(Min(Spc_Data_Cpk.NormalDistributionX).ToString("F2"));
double ValueUpY = Convert.ToDouble(Max(Spc_Data_Cpk.NormalDistributionY).ToString("F2"));
double X1 = (ValueUpX - ValueDownX) / 10;
chart1.ChartAreas["ChartArea1"].AxisX.Minimum = Math.Round(ValueDownX - X1, 2);
chart1.ChartAreas["ChartArea1"].AxisX.Maximum = Math.Round(ValueUpX + X1, 2);
chart1.ChartAreas["ChartArea1"].AxisY.Minimum = 0;
chart1.ChartAreas["ChartArea1"].AxisY.Maximum = Math.Round(ValueUpY + ValueUpY / 10, 2);
//绘图
for (int i = 0; i < Spc_Data_Cpk.NormalDistributionX.Length; i++)
{
chart1.Series[0].Points.AddXY(Math.Round(Spc_Data_Cpk.NormalDistributionX[i], 2), Math.Round(Spc_Data_Cpk.NormalDistributionY[i], 2));
}
// Set Strip line item
//chart1.ChartAreas["ChartArea1"].AxisX.StripLines[0].IntervalOffset = Spc_Data_Cpk.LSL;
//chart1.ChartAreas["ChartArea1"].AxisX.StripLines[0].StripWidth = Spc_Data_Cpk.USL - Spc_Data_Cpk.LSL;
// Set Strip line item
//double SL = (ValueUpX + ValueDownX) / 2;
//double USL = SL + 3 * Spc_Data_Cpk.Singma;
//double LSL = SL - 3 * Spc_Data_Cpk.Singma;
chart1.ChartAreas["ChartArea1"].AxisX.StripLines[1].IntervalOffset = Spc_Data_Cpk.NormalDistributionX[4];
chart1.ChartAreas["ChartArea1"].AxisX.StripLines[1].Text = "SL=" + Spc_Data_Cpk.NormalDistributionX[4].ToString("F2");
chart1.ChartAreas["ChartArea1"].AxisX.StripLines[2].IntervalOffset = Spc_Data_Cpk.NormalDistributionX[1];
chart1.ChartAreas["ChartArea1"].AxisX.StripLines[2].Text = "USL=" + Spc_Data_Cpk.NormalDistributionX[1].ToString("F2");
chart1.ChartAreas["ChartArea1"].AxisX.StripLines[3].IntervalOffset = Spc_Data_Cpk.NormalDistributionX[7];
chart1.ChartAreas["ChartArea1"].AxisX.StripLines[3].Text = "LSL=" + Spc_Data_Cpk.NormalDistributionX[7].ToString("F2");
//TextAnnotation annotation1 = new TextAnnotation();
//annotation1.Text = "Cpk=" + Spc_Data_Cpk.Cpk.ToString("F2");
//annotation1.ForeColor = Color.Black;
//annotation1.Font = new Font("Arial", 11); ;
//annotation1.X = 80;
//annotation1.Y = 8;
//chart1.Annotations.Add(annotation1);
//TextAnnotation annotation2 = new TextAnnotation();
//annotation2.Text = "CPL=" + Spc_Data_Cpk.CPL.ToString("F2");
//annotation2.ForeColor = Color.Black;
//annotation2.Font = new Font("Arial", 11); ;
//annotation2.X = 80;
//annotation2.Y = 13;
//chart1.Annotations.Add(annotation2);
//TextAnnotation annotation3 = new TextAnnotation();
//annotation3.Text = "CPU=" + Spc_Data_Cpk.CPU.ToString("F2");
//annotation3.ForeColor = Color.Black;
//annotation3.Font = new Font("Arial", 11); ;
//annotation3.X = 80;
//annotation3.Y = 18;
//chart1.Annotations.Add(annotation3);
}
///
/// SPC分析工序能力图
/// 在均值级差图中
///
///
///
///
public static void ChartQualityData_Cpk_XR(double[] X, int n, Chart chart1)
{
double ValueUp = Max(X);
double ValueDown = Min(X);
//绘图数据
ASPNet_Drawing.CSpc_Data_Cpk Spc_Data_Cpk = ASPNet_Drawing.Spc_Data.Cpk(X, n, ValueUp, ValueDown);
//坐标轴
double ValueUpX = Convert.ToDouble(Max(Spc_Data_Cpk.NormalDistributionX).ToString("F2"));
double ValueDownX = Convert.ToDouble(Min(Spc_Data_Cpk.NormalDistributionX).ToString("F2"));
double ValueUpY = Convert.ToDouble(Max(Spc_Data_Cpk.NormalDistributionY).ToString("F2"));
double X1 = (ValueUpX - ValueDownX) / 10;
chart1.ChartAreas["ChartArea_Cpk"].AxisX.Minimum = Math.Round(ValueDownX - X1, 2);
chart1.ChartAreas["ChartArea_Cpk"].AxisX.Maximum = Math.Round(ValueUpX + X1, 2);
chart1.ChartAreas["ChartArea_Cpk"].AxisY.Minimum = 0;
chart1.ChartAreas["ChartArea_Cpk"].AxisY.Maximum = Math.Round(ValueUpY + ValueUpY / 10, 2);
//绘图
for (int i = 0; i < Spc_Data_Cpk.NormalDistributionX.Length; i++)
{
chart1.Series["Series_Cpk"].Points.AddXY(Math.Round(Spc_Data_Cpk.NormalDistributionX[i], 2), Math.Round(Spc_Data_Cpk.NormalDistributionY[i], 2));
}
ASPNet_Drawing.CSpc_Data_XR Spc_Data_XR = ASPNet_Drawing.Spc_Data.XR(X, n);
chart1.ChartAreas["ChartArea_Cpk"].AxisX.StripLines[1].IntervalOffset = Spc_Data_Cpk.NormalDistributionX[4];
chart1.ChartAreas["ChartArea_Cpk"].AxisX.StripLines[1].Text = "SL=" + Spc_Data_XR.CL_X.ToString("F2");
chart1.ChartAreas["ChartArea_Cpk"].AxisX.StripLines[2].IntervalOffset = Spc_Data_Cpk.NormalDistributionX[1];
chart1.ChartAreas["ChartArea_Cpk"].AxisX.StripLines[2].Text = "USL=" + Spc_Data_XR.UCL_X.ToString("F2");
chart1.ChartAreas["ChartArea_Cpk"].AxisX.StripLines[3].IntervalOffset = Spc_Data_Cpk.NormalDistributionX[7];
chart1.ChartAreas["ChartArea_Cpk"].AxisX.StripLines[3].Text = "LSL=" + Spc_Data_XR.LCL_X.ToString("F2");
TextAnnotation annotation1 = new TextAnnotation();
annotation1.Text = "Cpk=" + Spc_Data_Cpk.Cpk.ToString("F2");
annotation1.ForeColor = Color.Black;
annotation1.Font = new Font("Arial", 6); ;
annotation1.X = 27;
annotation1.Y = 3.5;
chart1.Annotations.Add(annotation1);
TextAnnotation annotation2 = new TextAnnotation();
annotation2.Text = "CPL=" + Spc_Data_Cpk.CPL.ToString("F2");
annotation2.ForeColor = Color.Black;
annotation2.Font = new Font("Arial", 6); ;
annotation2.X = 27;
annotation2.Y = 5;
chart1.Annotations.Add(annotation2);
TextAnnotation annotation3 = new TextAnnotation();
annotation3.Text = "CPU=" + Spc_Data_Cpk.CPU.ToString("F2");
annotation3.ForeColor = Color.Black;
annotation3.Font = new Font("Arial", 6); ;
annotation3.X = 27;
annotation3.Y = 6.5;
chart1.Annotations.Add(annotation3);
}
///
/// SPC分析工序能力图
/// 在均值标准差图中
///
///
///
///
public static void ChartQualityData_Cpk_XS(double[] X, int n, Chart chart1)
{
double ValueUp = Max(X);
double ValueDown = Min(X);
//绘图数据
ASPNet_Drawing.CSpc_Data_Cpk Spc_Data_Cpk = ASPNet_Drawing.Spc_Data.Cpk(X, n, ValueUp, ValueDown);
//坐标轴
double ValueUpX = Convert.ToDouble(Max(Spc_Data_Cpk.NormalDistributionX).ToString("F2"));
double ValueDownX = Convert.ToDouble(Min(Spc_Data_Cpk.NormalDistributionX).ToString("F2"));
double ValueUpY = Convert.ToDouble(Max(Spc_Data_Cpk.NormalDistributionY).ToString("F2"));
double X1 = (ValueUpX - ValueDownX) / 10;
chart1.ChartAreas["ChartArea_Cpk"].AxisX.Minimum = Math.Round(ValueDownX - X1, 2);
chart1.ChartAreas["ChartArea_Cpk"].AxisX.Maximum = Math.Round(ValueUpX + X1, 2);
chart1.ChartAreas["ChartArea_Cpk"].AxisY.Minimum = 0;
chart1.ChartAreas["ChartArea_Cpk"].AxisY.Maximum = Math.Round(ValueUpY + ValueUpY / 10, 2);
//绘图
for (int i = 0; i < Spc_Data_Cpk.NormalDistributionX.Length; i++)
{
chart1.Series["Series_Cpk"].Points.AddXY(Math.Round(Spc_Data_Cpk.NormalDistributionX[i], 2), Math.Round(Spc_Data_Cpk.NormalDistributionY[i], 2));
}
ASPNet_Drawing.CSpc_Data_XR Spc_Data_XR = ASPNet_Drawing.Spc_Data.XR(X, n);
chart1.ChartAreas["ChartArea_Cpk"].AxisX.StripLines[1].IntervalOffset = Spc_Data_Cpk.NormalDistributionX[4];
chart1.ChartAreas["ChartArea_Cpk"].AxisX.StripLines[1].Text = "SL=" + Spc_Data_XR.CL_X.ToString("F2");
chart1.ChartAreas["ChartArea_Cpk"].AxisX.StripLines[2].IntervalOffset = Spc_Data_Cpk.NormalDistributionX[1];
chart1.ChartAreas["ChartArea_Cpk"].AxisX.StripLines[2].Text = "USL=" + Spc_Data_XR.UCL_X.ToString("F2");
chart1.ChartAreas["ChartArea_Cpk"].AxisX.StripLines[3].IntervalOffset = Spc_Data_Cpk.NormalDistributionX[7];
chart1.ChartAreas["ChartArea_Cpk"].AxisX.StripLines[3].Text = "LSL=" + Spc_Data_XR.LCL_X.ToString("F2");
TextAnnotation annotation1 = new TextAnnotation();
annotation1.Text = "Cpk=" + Spc_Data_Cpk.Cpk.ToString("F2");
annotation1.ForeColor = Color.Black;
annotation1.Font = new Font("Arial", 6); ;
annotation1.X = 27;
annotation1.Y = 3.5;
chart1.Annotations.Add(annotation1);
TextAnnotation annotation2 = new TextAnnotation();
annotation2.Text = "CPL=" + Spc_Data_Cpk.CPL.ToString("F2");
annotation2.ForeColor = Color.Black;
annotation2.Font = new Font("Arial", 6); ;
annotation2.X = 27;
annotation2.Y = 5;
chart1.Annotations.Add(annotation2);
TextAnnotation annotation3 = new TextAnnotation();
annotation3.Text = "CPU=" + Spc_Data_Cpk.CPU.ToString("F2");
annotation3.ForeColor = Color.Black;
annotation3.Font = new Font("Arial", 6); ;
annotation3.X = 27;
annotation3.Y = 6.5;
chart1.Annotations.Add(annotation3);
}
///
/// SPC分析工序能力图
///
///
///
///
public static void ChartQualityData_Cpk(double[] X, int n, Chart chart1)
{
double ValueUp = Max(X);
double ValueDown = Min(X);
//绘图数据
ASPNet_Drawing.CSpc_Data_Cpk Spc_Data_Cpk = ASPNet_Drawing.Spc_Data.Cpk(X, n, ValueUp, ValueDown);
//坐标轴
double ValueUpX = Convert.ToDouble(Max(Spc_Data_Cpk.NormalDistributionX).ToString("F2"));
double ValueDownX = Convert.ToDouble(Min(Spc_Data_Cpk.NormalDistributionX).ToString("F2"));
double ValueUpY = Convert.ToDouble(Max(Spc_Data_Cpk.NormalDistributionY).ToString("F2"));
double X1 = (ValueUpX - ValueDownX) / 10;
chart1.ChartAreas["ChartArea_Cpk"].AxisX.Minimum = Math.Round(ValueDownX - X1, 2);
chart1.ChartAreas["ChartArea_Cpk"].AxisX.Maximum = Math.Round(ValueUpX + X1, 2);
chart1.ChartAreas["ChartArea_Cpk"].AxisY.Minimum = 0;
chart1.ChartAreas["ChartArea_Cpk"].AxisY.Maximum = Math.Round(ValueUpY + ValueUpY / 10, 2);
//绘图
for (int i = 0; i < Spc_Data_Cpk.NormalDistributionX.Length; i++)
{
chart1.Series["Series_Cpk"].Points.AddXY(Math.Round(Spc_Data_Cpk.NormalDistributionX[i], 2), Math.Round(Spc_Data_Cpk.NormalDistributionY[i], 2));
}
// Set Strip line item
//chart1.ChartAreas["ChartArea1"].AxisX.StripLines[0].IntervalOffset = Spc_Data_Cpk.LSL;
//chart1.ChartAreas["ChartArea1"].AxisX.StripLines[0].StripWidth = Spc_Data_Cpk.USL - Spc_Data_Cpk.LSL;
// Set Strip line item
//double SL = (ValueUpX + ValueDownX) / 2;
//double USL = SL + 3 * Spc_Data_Cpk.Singma;
//double LSL = SL - 3 * Spc_Data_Cpk.Singma;
chart1.ChartAreas["ChartArea_Cpk"].AxisX.StripLines[1].IntervalOffset = Spc_Data_Cpk.NormalDistributionX[4];
chart1.ChartAreas["ChartArea_Cpk"].AxisX.StripLines[1].Text = "SL=" + Spc_Data_Cpk.NormalDistributionX[4].ToString("F2");
chart1.ChartAreas["ChartArea_Cpk"].AxisX.StripLines[2].IntervalOffset = Spc_Data_Cpk.NormalDistributionX[1];
chart1.ChartAreas["ChartArea_Cpk"].AxisX.StripLines[2].Text = "USL=" + Spc_Data_Cpk.NormalDistributionX[1].ToString("F2");
chart1.ChartAreas["ChartArea_Cpk"].AxisX.StripLines[3].IntervalOffset = Spc_Data_Cpk.NormalDistributionX[7];
chart1.ChartAreas["ChartArea_Cpk"].AxisX.StripLines[3].Text = "LSL=" + Spc_Data_Cpk.NormalDistributionX[7].ToString("F2");
TextAnnotation annotation1 = new TextAnnotation();
annotation1.Text = "Cpk=" + Spc_Data_Cpk.Cpk.ToString("F2");
annotation1.ForeColor = Color.Black;
annotation1.Font = new Font("Arial", 11); ;
annotation1.X = 80;
annotation1.Y = 8;
chart1.Annotations.Add(annotation1);
TextAnnotation annotation2 = new TextAnnotation();
annotation2.Text = "CPL=" + Spc_Data_Cpk.CPL.ToString("F2");
annotation2.ForeColor = Color.Black;
annotation2.Font = new Font("Arial", 11); ;
annotation2.X = 80;
annotation2.Y = 13;
chart1.Annotations.Add(annotation2);
TextAnnotation annotation3 = new TextAnnotation();
annotation3.Text = "CPU=" + Spc_Data_Cpk.CPU.ToString("F2");
annotation3.ForeColor = Color.Black;
annotation3.Font = new Font("Arial", 11); ;
annotation3.X = 80;
annotation3.Y = 18;
chart1.Annotations.Add(annotation3);
}
///
/// 机床报警频次分析
///
///
///
public static void ChartMachineAlarm(DataTable dt, Chart chart1)
{
if (dt.Rows.Count == 0)
return;
string seriesName = dt.Rows[0]["工位号"].ToString();
chart1.Series.Add(seriesName);
chart1.Series[seriesName].ChartType = SeriesChartType.Column;
chart1.Series[seriesName].BorderWidth = 2;
chart1.Series[seriesName].ToolTip = "报警文本:#VALX \n报警数量:#VALY";
chart1.Series[seriesName].Points.DataBindXY(dt.Rows, "报警文本", dt.Rows, "报警数量");
//for (int i = 0; i < 10; i++)
//{
// chart1.Series[seriesName].Points.AddXY(dt.Rows[i]["报警编号"], dt.Rows[i]["报警数量"]);
//}
//chart1.DataBind();
}
/////
///// 机床状态频次分析
/////
/////
/////
//public static void ChartMachineStatus(DataTable dt, Chart chart1)
//{
// foreach (DataRow row in dt.Rows)
// {
// // For each Row add a new series
// string seriesName = row["工位号"].ToString();
// chart1.Series.Add(seriesName);
// chart1.Series[seriesName].ChartType = SeriesChartType.StackedBar;
// chart1.Series[seriesName].BorderWidth = 2;
// chart1.Series[seriesName].ToolTip = "工位号:" + seriesName + "\n 频次:= #VALY";
// for (int colIndex = 2; colIndex < dt.Columns.Count; colIndex++)
// {
// // For each column (column 1 and onward) add the value as a point
// string columnName = dt.Columns[colIndex].ColumnName;
// int YVal = (int)row[columnName];
// chart1.Series[seriesName].Points.AddXY(columnName, YVal);
// }
// }
//}
/////
///// 成海 2012-04-05
/////
/////
/////
public static void ChartMachineStatus(DataTable dt, Chart chart1)
{
string seriesNameA = "机床上电";
chart1.Series.Add(seriesNameA);
chart1.Series[seriesNameA].ChartType = SeriesChartType.StackedColumn;
chart1.Series[seriesNameA].BorderWidth = 2;
chart1.Series[seriesNameA].ToolTip = "机床状态:" + seriesNameA + "\n 频次:= #VALY";
chart1.Series[seriesNameA].Color = System.Drawing.Color.DeepPink;
string seriesNameB = "循环开始";
chart1.Series.Add(seriesNameB);
chart1.Series[seriesNameB].ChartType = SeriesChartType.StackedColumn;
chart1.Series[seriesNameB].BorderWidth = 2;
chart1.Series[seriesNameB].ToolTip = "机床状态:" + seriesNameB + "\n 频次:= #VALY";
chart1.Series[seriesNameB].Color = System.Drawing.Color.Green;
string seriesNameC = "机床故障";
chart1.Series.Add(seriesNameC);
chart1.Series[seriesNameC].ChartType = SeriesChartType.StackedColumn;
chart1.Series[seriesNameC].BorderWidth = 2;
chart1.Series[seriesNameC].ToolTip = "机床状态:" + seriesNameC + "\n 频次:= #VALY";
chart1.Series[seriesNameC].Color = System.Drawing.Color.Red;
string seriesNameD = "上料无件";
chart1.Series.Add(seriesNameD);
chart1.Series[seriesNameD].ChartType = SeriesChartType.StackedColumn;
chart1.Series[seriesNameD].BorderWidth = 2;
chart1.Series[seriesNameD].ToolTip = "机床状态:" + seriesNameD + "\n 频次:= #VALY";
chart1.Series[seriesNameD].Color = System.Drawing.Color.Blue;
string seriesNameE = "下料堵塞";
chart1.Series.Add(seriesNameE);
chart1.Series[seriesNameE].ChartType = SeriesChartType.StackedColumn;
chart1.Series[seriesNameE].BorderWidth = 2;
chart1.Series[seriesNameE].ToolTip = "机床状态:" + seriesNameE + "\n 频次:= #VALY";
chart1.Series[seriesNameE].Color = System.Drawing.Color.Yellow;
foreach (DataRow row in dt.Rows)
{
string opName = row["工位号"].ToString();
int YValA = (int)row["机床上电"];
chart1.Series[seriesNameA].Points.AddXY(opName, YValA);
int YValB = (int)row["循环开始"];
chart1.Series[seriesNameB].Points.AddXY(opName, YValB);
int YValC = (int)row["机床故障"];
chart1.Series[seriesNameC].Points.AddXY(opName, YValC);
int YValD = (int)row["上料无件"];
chart1.Series[seriesNameD].Points.AddXY(opName, YValD);
int YValE = (int)row["下料堵塞"];
chart1.Series[seriesNameE].Points.AddXY(opName, YValE);
}
}
///
/// SPC分析基本趋势图
///
///
///
public static void ChartQualityData_TrendPictureBasic(DataTable dt, Chart chart1)
{
//string seriesName = "series1";
//chart1.Series.Add(seriesName);
//chart1.Series[seriesName].MarkerStyle = MarkerStyle.Circle;
//chart1.Series[seriesName].MarkerSize = 5;
//chart1.Series[seriesName].MasrkerColor = Color.Magenta;
//chart1.Series[seriesName].ChartType = SeriesChartType.Line;
//chart1.Series[seriesName].BorderWidth = 1;
chart1.Series[0].Points.DataBind(dt.DefaultView, "", "测量值", "Tooltip=ToolTip");
//chart1.DataBinds();
}
///
/// 子组平均值的平均值
/// n 子组大小。单个子组观测值的个数
///
/// 全部测量数据数组
/// 子组大小。单个子组观测值的个数
/// 子组平均值的数组
///
static private double Average(double[] X, int n)
{
//k 子组个数
int k;
k = X.Length / n;
double[] Xi = new double[n];
double[] Xk = new double[k];
for (int j = 0; j < k; j++)
{
for (int i = 0; i < n; i++)
{
Xi[i] = X[j * n + i];
}
//子组平均值
Xk[j] = Average(Xi);
}
//子组平均值的平均值
return Average(Xk);
}
///
/// 一组观测值的均值
///
/// 子组观测值
///
static private double Average(double[] Xn)
{
if (Xn.Length < 1) return 0;
return Sum(Xn) / (double)Xn.Length;
}
///
/// 观测值和
///
/// 子组观测值
///
static private double Sum(double[] Xn)
{
double temp;
temp = 0;
for (int i = 0; i < Xn.Length; i++)
{
temp = temp + Xn[i];
}
return temp;
}
///
/// 观测值最大值
///
/// 子组观测值
///
static private double Max(double[] Xn)
{
double temp;
temp = Xn[0];
for (int i = 0; i < Xn.Length; i++)
{
temp = (Xn[i] > temp) ? Xn[i] : temp;
}
return temp;
}
///
/// 观测值最小值
///
/// 子组观测值
///
static private double Min(double[] Xn)
{
double temp;
temp = Xn[0];
for (int i = 0; i < Xn.Length; i++)
{
temp = (Xn[i] < temp) ? Xn[i] : temp;
}
return temp;
}
///
/// 均值极差图
///
///
///
///
public static void ChartQualityData_XR(double[] X, int n, Chart chart1)
{
//计算XR控制图的数据
ASPNet_Drawing.CSpc_Data_XR Spc_Data_XR = ASPNet_Drawing.Spc_Data.XR(X, n);
for (int i = 0; i < Spc_Data_XR.CL_Xk.Length; i++)
{
//X
chart1.Series["Series_X"].Points.AddXY(i + 1, Spc_Data_XR.CL_Xk[i]);
//R
chart1.Series["Series_R"].Points.AddXY(i + 1, Spc_Data_XR.CL_Rk[i]);
}
chart1.Series["Series_X"].ToolTip = "测量值:= #VALY";
chart1.Series["Series_R"].ToolTip = "测量值:= #VALY";
////均值图Y轴范围
double gapAxis_X = Spc_Data_XR.UCL_X - Spc_Data_XR.LCL_X;
//均值的最大值
double maxXk = Max(Spc_Data_XR.CL_Xk);
//均值的最小值
double minXk = Min(Spc_Data_XR.CL_Xk);
if (maxXk > Spc_Data_XR.UCL_X)
{
chart1.ChartAreas["ChartArea_X"].AxisY.Maximum = Convert.ToDouble((maxXk + gapAxis_X / 8).ToString("F2"));
}
else
{
chart1.ChartAreas["ChartArea_X"].AxisY.Maximum = Convert.ToDouble((Spc_Data_XR.UCL_X + gapAxis_X / 8).ToString("F2"));
}
if (minXk < Spc_Data_XR.LCL_X)
{
chart1.ChartAreas["ChartArea_X"].AxisY.Minimum = Convert.ToDouble((minXk - gapAxis_X / 8).ToString("F2"));
}
else
{
chart1.ChartAreas["ChartArea_X"].AxisY.Minimum = Convert.ToDouble((Spc_Data_XR.LCL_X - gapAxis_X / 8).ToString("F2"));
}
////极差图Y轴范围
double gapAxis_R = Spc_Data_XR.UCL_R - Spc_Data_XR.LCL_R;
//极差最大值
double maxRk = Max(Spc_Data_XR.CL_Rk);
//极差最小值
double minRk = Min(Spc_Data_XR.CL_Rk);
if (maxRk > Spc_Data_XR.UCL_R)
{
chart1.ChartAreas["ChartArea_R"].AxisY.Maximum = Convert.ToDouble((maxRk + gapAxis_R / 8).ToString("F2"));
}
else
{
chart1.ChartAreas["ChartArea_R"].AxisY.Maximum = Convert.ToDouble((Spc_Data_XR.UCL_R + gapAxis_R / 8).ToString("F2"));
}
if (minRk < Spc_Data_XR.LCL_R)
{
chart1.ChartAreas["ChartArea_R"].AxisY.Minimum = Convert.ToDouble((minRk - gapAxis_R / 8).ToString("F2"));
}
else
{
chart1.ChartAreas["ChartArea_R"].AxisY.Minimum = Convert.ToDouble((Spc_Data_XR.LCL_R - gapAxis_R / 8).ToString("F2"));
}
// Set axis title
chart1.ChartAreas["ChartArea_X"].AxisY.Title = "均值图";
chart1.ChartAreas["ChartArea_R"].AxisY.Title = "极差图";
chart1.ChartAreas["ChartArea_X"].AxisY.TitleFont = new Font("Microsoft Sans Serif", 8);
chart1.ChartAreas["ChartArea_R"].AxisY.TitleFont = new Font("Microsoft Sans Serif", 8);
// Set Strip line item
chart1.ChartAreas["ChartArea_X"].AxisY.StripLines[0].IntervalOffset = Spc_Data_XR.LCL_X;
chart1.ChartAreas["ChartArea_X"].AxisY.StripLines[0].StripWidth = Spc_Data_XR.UCL_X - Spc_Data_XR.LCL_X;
// Set Strip line item
chart1.ChartAreas["ChartArea_X"].AxisY.StripLines[1].IntervalOffset = Spc_Data_XR.CL_X;
chart1.ChartAreas["ChartArea_X"].AxisY.StripLines[1].Text = "CL=" + Spc_Data_XR.CL_X.ToString("F2");
chart1.ChartAreas["ChartArea_X"].AxisY.StripLines[2].IntervalOffset = Spc_Data_XR.UCL_X;
chart1.ChartAreas["ChartArea_X"].AxisY.StripLines[2].Text = "UCL=" + Spc_Data_XR.UCL_X.ToString("F2");
chart1.ChartAreas["ChartArea_X"].AxisY.StripLines[3].IntervalOffset = Spc_Data_XR.LCL_X;
chart1.ChartAreas["ChartArea_X"].AxisY.StripLines[3].Text = "LCL=" + Spc_Data_XR.LCL_X.ToString("F2");
// Set Strip line item
chart1.ChartAreas["ChartArea_R"].AxisY.StripLines[0].IntervalOffset = Spc_Data_XR.LCL_R;
chart1.ChartAreas["ChartArea_R"].AxisY.StripLines[0].StripWidth = Spc_Data_XR.UCL_R - Spc_Data_XR.LCL_R;
// Set Strip line item
chart1.ChartAreas["ChartArea_R"].AxisY.StripLines[1].IntervalOffset = Spc_Data_XR.CL_R;
chart1.ChartAreas["ChartArea_R"].AxisY.StripLines[1].Text = "CL=" + Spc_Data_XR.CL_R.ToString("F2");
chart1.ChartAreas["ChartArea_R"].AxisY.StripLines[2].IntervalOffset = Spc_Data_XR.UCL_R;
chart1.ChartAreas["ChartArea_R"].AxisY.StripLines[2].Text = "UCL=" + Spc_Data_XR.UCL_R.ToString("F2");
chart1.ChartAreas["ChartArea_R"].AxisY.StripLines[3].IntervalOffset = Spc_Data_XR.LCL_R;
chart1.ChartAreas["ChartArea_R"].AxisY.StripLines[3].Text = "LCL=" + Spc_Data_XR.LCL_R.ToString("F2");
}
///
/// 均值标准差图
///
///
///
///
public static void ChartQualityData_XS(double[] X, int n, Chart chart1)
{
//计算XS控制图的数据
ASPNet_Drawing.CSpc_Data_XS Spc_Data_XS = ASPNet_Drawing.Spc_Data.XS(X, n);
for (int i = 0; i < Spc_Data_XS.CL_Xk.Length; i++)
{
//X
chart1.Series["Series_X"].Points.AddXY(i + 1, Spc_Data_XS.CL_Xk[i]);
//S
chart1.Series["Series_S"].Points.AddXY(i + 1, Spc_Data_XS.CL_Sk[i]);
}
chart1.Series["Series_X"].ToolTip = "测量值:= #VALY";
chart1.Series["Series_S"].ToolTip = "测量值:= #VALY";
////均值图Y轴范围
double gapAxis_X = Spc_Data_XS.UCL_X - Spc_Data_XS.LCL_X;
//均值的最大值
double maxXk = Max(Spc_Data_XS.CL_Xk);
//均值的最小值
double minXk = Min(Spc_Data_XS.CL_Xk);
if (maxXk > Spc_Data_XS.UCL_X)
{
chart1.ChartAreas["ChartArea_X"].AxisY.Maximum = Convert.ToDouble((maxXk + gapAxis_X / 8).ToString("F2"));
}
else
{
chart1.ChartAreas["ChartArea_X"].AxisY.Maximum = Convert.ToDouble((Spc_Data_XS.UCL_X + gapAxis_X / 8).ToString("F2"));
}
if (minXk < Spc_Data_XS.LCL_X)
{
chart1.ChartAreas["ChartArea_X"].AxisY.Minimum = Convert.ToDouble((minXk - gapAxis_X / 8).ToString("F2"));
}
else
{
chart1.ChartAreas["ChartArea_X"].AxisY.Minimum = Convert.ToDouble((Spc_Data_XS.LCL_X - gapAxis_X / 8).ToString("F2"));
}
////标准差图Y轴范围
double gapAxis_R = Spc_Data_XS.UCL_S - Spc_Data_XS.LCL_S;
//标准差最大值
double maxRk = Max(Spc_Data_XS.CL_Sk);
//标准差最小值
double minRk = Min(Spc_Data_XS.CL_Sk);
if (maxRk > Spc_Data_XS.UCL_S)
{
chart1.ChartAreas["ChartArea_S"].AxisY.Maximum = Convert.ToDouble((maxRk + gapAxis_R / 8).ToString("F2"));
}
else
{
chart1.ChartAreas["ChartArea_S"].AxisY.Maximum = Convert.ToDouble((Spc_Data_XS.UCL_S + gapAxis_R / 8).ToString("F2"));
}
if (minRk < Spc_Data_XS.LCL_S)
{
chart1.ChartAreas["ChartArea_S"].AxisY.Minimum = Convert.ToDouble((minRk - gapAxis_R / 8).ToString("F2"));
}
else
{
chart1.ChartAreas["ChartArea_S"].AxisY.Minimum = Convert.ToDouble((Spc_Data_XS.LCL_S - gapAxis_R / 8).ToString("F2"));
}
// Set axis title
chart1.ChartAreas["ChartArea_X"].AxisY.Title = "均值图";
chart1.ChartAreas["ChartArea_S"].AxisY.Title = "标准差图";
chart1.ChartAreas["ChartArea_X"].AxisY.TitleFont = new Font("Microsoft Sans Serif", 8);
chart1.ChartAreas["ChartArea_S"].AxisY.TitleFont = new Font("Microsoft Sans Serif", 8);
// Set Strip line item
chart1.ChartAreas["ChartArea_X"].AxisY.StripLines[0].IntervalOffset = Spc_Data_XS.LCL_X;
chart1.ChartAreas["ChartArea_X"].AxisY.StripLines[0].StripWidth = Spc_Data_XS.UCL_X - Spc_Data_XS.LCL_X;
// Set Strip line item
chart1.ChartAreas["ChartArea_X"].AxisY.StripLines[1].IntervalOffset = Spc_Data_XS.CL_X;
chart1.ChartAreas["ChartArea_X"].AxisY.StripLines[1].Text = "CL=" + Spc_Data_XS.CL_X.ToString("F2");
chart1.ChartAreas["ChartArea_X"].AxisY.StripLines[2].IntervalOffset = Spc_Data_XS.UCL_X;
chart1.ChartAreas["ChartArea_X"].AxisY.StripLines[2].Text = "UCL=" + Spc_Data_XS.UCL_X.ToString("F2");
chart1.ChartAreas["ChartArea_X"].AxisY.StripLines[3].IntervalOffset = Spc_Data_XS.LCL_X;
chart1.ChartAreas["ChartArea_X"].AxisY.StripLines[3].Text = "LCL=" + Spc_Data_XS.LCL_X.ToString("F2");
// Set Strip line item
chart1.ChartAreas["ChartArea_S"].AxisY.StripLines[0].IntervalOffset = Spc_Data_XS.LCL_S;
chart1.ChartAreas["ChartArea_S"].AxisY.StripLines[0].StripWidth = Spc_Data_XS.UCL_S - Spc_Data_XS.LCL_S;
// Set Strip line item
chart1.ChartAreas["ChartArea_S"].AxisY.StripLines[1].IntervalOffset = Spc_Data_XS.CL_S;
chart1.ChartAreas["ChartArea_S"].AxisY.StripLines[1].Text = "CL=" + Spc_Data_XS.CL_S.ToString("F2");
chart1.ChartAreas["ChartArea_S"].AxisY.StripLines[2].IntervalOffset = Spc_Data_XS.UCL_S;
chart1.ChartAreas["ChartArea_S"].AxisY.StripLines[2].Text = "UCL=" + Spc_Data_XS.UCL_S.ToString("F2");
chart1.ChartAreas["ChartArea_S"].AxisY.StripLines[3].IntervalOffset = Spc_Data_XS.LCL_S;
chart1.ChartAreas["ChartArea_S"].AxisY.StripLines[3].Text = "LCL=" + Spc_Data_XS.LCL_S.ToString("F2");
}
/////
///// 故障率 lvzhen
/////
/////
/////
//public static void ChartFaultPercent(DataTable dt, Chart chart1)
//{
// if (dt.Rows.Count == 0)
// return;
// foreach (DataRow row in dt.Rows)
// {
// string seriesName = row["工位号"].ToString();
// chart1.Series.Add(seriesName);
// chart1.Series[seriesName].ChartType = SeriesChartType.Column;
// chart1.Series[seriesName].BorderWidth = 2;
// chart1.Series[seriesName].ToolTip = "工位号:" + row["工位号"].ToString() + "\n运行时间: " + row["运行时间"].ToString() + "\n故障时间: " + row["故障时间"].ToString() + "\n故障率:#VALY";
// for (int colIndex = 3; colIndex < dt.Columns.Count; colIndex++)
// {
// // For each column (column 1 and onward) add the value as a point
// string columnName = dt.Columns[colIndex].ColumnName;
// string YVal = row[columnName].ToString();
// chart1.Series[seriesName].Points.AddXY(columnName, YVal);
// }
// //for (int i = 0; i < 10; i++)
// //{
// // chart1.Series[seriesName].Points.AddXY(dt.Rows[i]["报警编号"], dt.Rows[i]["报警数量"]);
// //}
// //chart1.DataBind();
// }
//}
/////
///// 故障率 lvzhen
/////
/////
/////
//public static void ChartFaultPercentTrue(DataTable dt, Chart chart1)
//{
// if (dt.Rows.Count == 0)
// return;
// foreach (DataRow row in dt.Rows)
// {
// string seriesName = row["工位号"].ToString();
// chart1.Series.Add(seriesName);
// chart1.Series[seriesName].ChartType = SeriesChartType.Column;
// chart1.Series[seriesName].BorderWidth = 2;
// chart1.Series[seriesName].ToolTip = "工位号:" + row["工位号"].ToString() + " \n故障率:#VALY";
// for (int colIndex = 3; colIndex < dt.Columns.Count; colIndex++)
// {
// // For each column (column 1 and onward) add the value as a point
// string columnName = dt.Columns[colIndex].ColumnName;
// string YVal = row[columnName].ToString();
// chart1.Series[seriesName].Points.AddXY(columnName, YVal);
// }
// //for (int i = 0; i < 10; i++)
// //{
// // chart1.Series[seriesName].Points.AddXY(dt.Rows[i]["报警编号"], dt.Rows[i]["报警数量"]);
// //}
// //chart1.DataBind();
// }
//}
/////
///// 开机率 lvzhen
/////
/////
/////
//public static void ChartKaijiProportion(DataTable dt, Chart chart1)
//{
// chart1.Series[0].Points.DataBind(dt.DefaultView, "操作日期", "开机率", "Tooltip=ToolTip");
//}
}