Files

787 lines
35 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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;
/// <summary>
///DrawChart 的摘要说明
/// </summary>
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);
}
/// <summary>
/// SPC分析正态分布图
/// </summary>
/// <param name="X"></param>
/// <param name="n"></param>
/// <param name="chart1"></param>
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);
}
/// <summary>
/// SPC分析工序能力图
/// 在均值级差图中
/// </summary>
/// <param name="X"></param>
/// <param name="n"></param>
/// <param name="chart1"></param>
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);
}
/// <summary>
/// SPC分析工序能力图
/// 在均值标准差图中
/// </summary>
/// <param name="X"></param>
/// <param name="n"></param>
/// <param name="chart1"></param>
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);
}
/// <summary>
/// SPC分析工序能力图
/// </summary>
/// <param name="X"></param>
/// <param name="n"></param>
/// <param name="chart1"></param>
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);
}
/// <summary>
/// 机床报警频次分析
/// </summary>
/// <param name="dt"></param>
/// <param name="chart1"></param>
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();
}
///// <summary>
///// 机床状态频次分析
///// </summary>
///// <param name="dt"></param>
///// <param name="chart1"></param>
//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);
// }
// }
//}
///// <summary>
///// 成海 2012-04-05
///// </summary>
///// <param name="dt"></param>
///// <param name="chart1"></param>
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);
}
}
/// <summary>
/// SPC分析基本趋势图
/// </summary>
/// <param name="dt"></param>
/// <param name="chart1"></param>
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();
}
/// <summary>
/// 子组平均值的平均值
/// n 子组大小。单个子组观测值的个数
/// </summary>
/// <param name="X">全部测量数据数组</param>
/// <param name="n">子组大小。单个子组观测值的个数</param>
/// <param name="Xk">子组平均值的数组</param>
/// <returns></returns>
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);
}
/// <summary>
/// 一组观测值的均值
/// </summary>
/// <param name="Xn">子组观测值</param>
/// <returns></returns>
static private double Average(double[] Xn)
{
if (Xn.Length < 1) return 0;
return Sum(Xn) / (double)Xn.Length;
}
/// <summary>
/// 观测值和
/// </summary>
/// <param name="Xn">子组观测值</param>
/// <returns></returns>
static private double Sum(double[] Xn)
{
double temp;
temp = 0;
for (int i = 0; i < Xn.Length; i++)
{
temp = temp + Xn[i];
}
return temp;
}
/// <summary>
/// 观测值最大值
/// </summary>
/// <param name="Xn">子组观测值</param>
/// <returns></returns>
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;
}
/// <summary>
/// 观测值最小值
/// </summary>
/// <param name="Xn">子组观测值</param>
/// <returns></returns>
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;
}
/// <summary>
/// 均值极差图
/// </summary>
/// <param name="X"></param>
/// <param name="n"></param>
/// <param name="chart1"></param>
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");
}
/// <summary>
/// 均值标准差图
/// </summary>
/// <param name="X"></param>
/// <param name="n"></param>
/// <param name="chart1"></param>
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");
}
///// <summary>
///// 故障率 lvzhen
///// </summary>
///// <param name="dt"></param>
///// <param name="chart1"></param>
//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();
// }
//}
///// <summary>
///// 故障率 lvzhen
///// </summary>
///// <param name="dt"></param>
///// <param name="chart1"></param>
//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();
// }
//}
///// <summary>
///// 开机率 lvzhen
///// </summary>
///// <param name="dt"></param>
///// <param name="chart1"></param>
//public static void ChartKaijiProportion(DataTable dt, Chart chart1)
//{
// chart1.Series[0].Points.DataBind(dt.DefaultView, "操作日期", "开机率", "Tooltip=ToolTip");
//}
}