using DevExpress.XtraCharts;
|
using DevExpress.XtraEditors;
|
using System;
|
using System.Collections.Generic;
|
using System.Drawing;
|
using System.Drawing.Drawing2D;
|
using System.Linq;
|
using System.Windows.Forms;
|
|
namespace IStation.WinFrmUI.Curve
|
{
|
/// <summary>
|
/// ChartContorl扩展类
|
/// </summary>
|
public static class ChartControlEx
|
{
|
#region 导出
|
public static void ExportPictByDlg(this ChartControl chart)
|
{
|
SaveFileDialog saveFileDlg = new SaveFileDialog();
|
saveFileDlg.Filter = "jpg 图片(*.jpg)|*.jpg|bmp 位图(*.bmp)|*.bmp|PDF 文件(*.pdf)|*.pdf|Execl 文件(*.xls)|*.xls";
|
|
//!曲线输出
|
if (saveFileDlg.ShowDialog() == DialogResult.OK)
|
{
|
string strFilter = saveFileDlg.FileName.Substring(saveFileDlg.FileName.Length - 3, 3);
|
switch (strFilter.ToUpper())
|
{
|
case "XLS":
|
chart.ExportToXls(saveFileDlg.FileName);
|
break;
|
case "PDF":
|
chart.ExportToPdf(saveFileDlg.FileName);
|
break;
|
case "JPG":
|
case "BMP":
|
chart.ExportToImage(saveFileDlg.FileName, System.Drawing.Imaging.ImageFormat.Jpeg);
|
break;
|
default:
|
//不支持的格式
|
XtraMessageBox.Show(saveFileDlg.FileName);
|
break;
|
}
|
}
|
}
|
public static void ExportChart2Xml(this ChartControl chart)
|
{
|
SaveFileDialog saveFileDlg = new SaveFileDialog();
|
saveFileDlg.Filter = "xml 图形(*.xml)|*.xml";
|
if (saveFileDlg.ShowDialog() == DialogResult.OK)
|
{
|
//string strFilter = saveFileDlg.strFilePath.Substring(saveFileDlg.strFilePath.Length - 3, 3);
|
chart.SaveToFile(saveFileDlg.FileName);
|
}
|
}
|
#endregion
|
|
#region 画型谱
|
/// <summary>
|
/// 画型谱 (coordinatePara为空表示不用坐标系计算LOG)
|
/// </summary>
|
public static void DrawLxpSpectrum
|
(this ChartControl chart, Graphics g, ViewModel.LxpSpectrumShape spectrumShape, Color boudaryColor, Color backColor, float curveWidth, ViewModel.eSpectrumDispStyle dispStyle, Model.CurveCoordinateParas coordinatePara = null)
|
{
|
if (spectrumShape == null)
|
return;
|
int iDispStyle = (int)dispStyle;
|
if (iDispStyle == 0 && coordinatePara == null)
|
{
|
DrawLxpSpectrum0(chart, g, spectrumShape, boudaryColor, curveWidth);
|
}
|
else if (iDispStyle == 1 && coordinatePara == null)
|
{
|
DrawLxpSpectrum1(chart, g, spectrumShape, backColor);
|
}
|
else if (iDispStyle == 2 && coordinatePara == null)
|
{
|
DrawLxpSpectrum2(chart, g, spectrumShape, boudaryColor, backColor, curveWidth);
|
}
|
}
|
|
/// <summary>
|
/// 画型谱
|
/// </summary>
|
public static void DrawLxpSpectrum
|
(this ChartControl chart, Graphics g, ViewModel.LxpSpectrumShapeEx spectrumShape, Color backColor, float curveWidth, ViewModel.eSpectrumDispStyle dispStyle, Model.CurveCoordinateParas coordinatePara = null)
|
{
|
if (spectrumShape == null)
|
return;
|
int iDispStyle = (int)dispStyle;
|
if (iDispStyle == 0 && coordinatePara == null)
|
{
|
DrawLxpSpectrum0(chart, g, spectrumShape, spectrumShape.BoudaryColor, curveWidth);
|
}
|
else if (iDispStyle == 1 && coordinatePara == null)
|
{
|
DrawLxpSpectrum1(chart, g, spectrumShape, backColor);
|
}
|
else if (iDispStyle == 2 && coordinatePara == null)
|
{
|
DrawLxpSpectrum2(chart, g, spectrumShape, spectrumShape.BoudaryColor, backColor, curveWidth);
|
}
|
}
|
|
/// <summary>
|
/// 画型谱 (只有边界(用坐标系进行计算LOG))
|
/// </summary>
|
private static List<Point> DrawLxpSpectrum0
|
(this ChartControl chart, Graphics g, ViewModel.LxpSpectrumShape spectrumShape, Color boudaryColor, float curveWidth)
|
{
|
XYDiagram mainDiagram = (XYDiagram)chart.Diagram;
|
if (mainDiagram == null)
|
return null;
|
using (Pen pen = new Pen(boudaryColor, curveWidth))
|
{
|
//如果点过密,投影到屏幕上,由于是整数可能会位置一样,取Distinct
|
List<Point> boundaryPoint = new List<Point>();
|
|
boundaryPoint.Clear();
|
var BasePoints = spectrumShape.BasePoints;//从流量小到大
|
for (int i = 0; i < BasePoints.Count; i++)
|
{
|
boundaryPoint.Add(mainDiagram.DiagramToPoint(BasePoints[i].X, BasePoints[i].Y).Point);
|
}
|
Point[] ptList = boundaryPoint.Distinct().ToArray();
|
if (ptList.Length > 2)
|
{
|
g.DrawCurve(pen, ptList);
|
}
|
else if (ptList.Length == 2)
|
{
|
g.DrawLine(pen, ptList[0], ptList[1]);
|
}
|
|
boundaryPoint.Clear();
|
var RightParabolaPoints = spectrumShape.RightParabolaPoints;//右边:大在上面 小在下面
|
for (int i = RightParabolaPoints.Count() - 1; i > -1; i--)
|
boundaryPoint.Add(mainDiagram.DiagramToPoint(RightParabolaPoints[i].X, RightParabolaPoints[i].Y).Point);
|
ptList = boundaryPoint.Distinct().ToArray();
|
if (ptList.Length > 2)
|
{
|
g.DrawCurve(pen, ptList);
|
}
|
else if (ptList.Length == 2)
|
{
|
g.DrawLine(pen, ptList[0], ptList[1]);
|
}
|
|
boundaryPoint.Clear();
|
var SimularPoints = spectrumShape.SimularPoints;
|
for (int i = SimularPoints.Count() - 1; i > -1; i--)
|
boundaryPoint.Add(mainDiagram.DiagramToPoint(SimularPoints[i].X, SimularPoints[i].Y).Point);
|
ptList = boundaryPoint.Distinct().ToArray();
|
if (ptList.Length > 2)
|
{
|
g.DrawCurve(pen, ptList);
|
}
|
else if (ptList.Length == 2)
|
{
|
g.DrawLine(pen, ptList[0], ptList[1]);
|
}
|
|
boundaryPoint.Clear();
|
var LeftParabolaPoints = spectrumShape.LeftParabolaPoints;
|
for (int i = 0; i < LeftParabolaPoints.Count; i++)
|
boundaryPoint.Add(mainDiagram.DiagramToPoint(LeftParabolaPoints[i].X, LeftParabolaPoints[i].Y).Point);
|
ptList = boundaryPoint.Distinct().ToArray();
|
if (ptList.Length > 2)
|
{
|
g.DrawCurve(pen, ptList);
|
}
|
else if (ptList.Length == 2)
|
{
|
g.DrawLine(pen, ptList[0], ptList[1]);
|
}
|
return boundaryPoint;
|
}
|
}
|
|
/// <summary>
|
/// 画型谱 (背景填充)
|
/// </summary>
|
private static void DrawLxpSpectrum1
|
(this ChartControl chart, Graphics g, ViewModel.LxpSpectrumShape spectrumShape, Color backColor)
|
{
|
if (spectrumShape == null)
|
return;
|
|
XYDiagram mainDiagram = (XYDiagram)chart.Diagram;
|
if (mainDiagram == null)
|
return;
|
//图形路径
|
GraphicsPath shapePath = new GraphicsPath();
|
|
|
//如果点过密,投影到屏幕上,由于是整数可能会位置一样,取Distinct
|
List<Point> boundaryPoint = new List<Point>();
|
|
boundaryPoint.Clear();
|
var BasePoints = spectrumShape.BasePoints;
|
for (int i = 0; i < BasePoints.Count; i++)
|
boundaryPoint.Add(mainDiagram.DiagramToPoint(BasePoints[i].X, BasePoints[i].Y).Point);
|
Point[] ptList = boundaryPoint.Distinct().ToArray();
|
if (ptList.Length < 3)
|
return;
|
shapePath.AddCurve(ptList);
|
|
boundaryPoint.Clear();
|
var RightParabolaPoints = spectrumShape.RightParabolaPoints;
|
for (int i = RightParabolaPoints.Count() - 1; i > -1; i--)
|
boundaryPoint.Add(mainDiagram.DiagramToPoint(RightParabolaPoints[i].X, RightParabolaPoints[i].Y).Point);
|
ptList = boundaryPoint.Distinct().ToArray();
|
if (ptList.Length < 3)
|
return;
|
shapePath.AddCurve(ptList);
|
|
|
boundaryPoint.Clear();
|
var SimularPoints = spectrumShape.SimularPoints;
|
for (int i = SimularPoints.Count() - 1; i > -1; i--)
|
boundaryPoint.Add(mainDiagram.DiagramToPoint(SimularPoints[i].X, SimularPoints[i].Y).Point);
|
ptList = boundaryPoint.Distinct().ToArray();
|
if (ptList.Length < 3)
|
return;
|
shapePath.AddCurve(ptList);
|
|
|
boundaryPoint.Clear();
|
var LeftParabolaPoints = spectrumShape.LeftParabolaPoints;
|
for (int i = 0; i < LeftParabolaPoints.Count; i++)
|
boundaryPoint.Add(mainDiagram.DiagramToPoint(LeftParabolaPoints[i].X, LeftParabolaPoints[i].Y).Point);
|
ptList = boundaryPoint.Distinct().ToArray();
|
if (ptList.Length < 3)
|
return;
|
shapePath.AddCurve(ptList);
|
|
//
|
using (SolidBrush brush = new SolidBrush(backColor))
|
{
|
System.Drawing.Region region = new Region(shapePath);
|
g.FillRegion(brush, region);
|
}
|
}
|
|
// /// <summary>
|
/// 画型谱 (需要设置背景色)
|
/// </summary>
|
private static void DrawLxpSpectrum2(this ChartControl chart, Graphics g, ViewModel.LxpSpectrumShape spectrumShape, Color boudaryColor, Color backColor, float boudaryWidth)
|
{
|
if (spectrumShape == null)
|
return;
|
|
XYDiagram mainDiagram = (XYDiagram)chart.Diagram;
|
if (mainDiagram == null)
|
return;
|
//图形路径
|
GraphicsPath shapePath = new GraphicsPath();
|
|
using (Pen pen = new Pen(boudaryColor, boudaryWidth))
|
{
|
//如果点过密,投影到屏幕上,由于是整数可能会位置一样,取Distinct
|
List<Point> boundaryPoint = new List<Point>();
|
|
boundaryPoint.Clear();
|
var BasePoints = spectrumShape.BasePoints;
|
for (int i = 0; i < BasePoints.Count; i++)
|
{
|
boundaryPoint.Add(mainDiagram.DiagramToPoint(BasePoints[i].X, BasePoints[i].Y).Point);
|
}
|
Point[] ptList = boundaryPoint.Distinct().ToArray();
|
if (ptList.Length > 2)
|
{
|
g.DrawCurve(pen, ptList);
|
shapePath.AddCurve(ptList);
|
}
|
else if (ptList.Length == 2)
|
{
|
g.DrawLine(pen, ptList[0], ptList[1]);
|
shapePath.AddLine(ptList[0], ptList[1]);
|
}
|
|
boundaryPoint.Clear();
|
var RightParabolaPoints = spectrumShape.RightParabolaPoints;
|
for (int i = RightParabolaPoints.Count() - 1; i > -1; i--)
|
boundaryPoint.Add(mainDiagram.DiagramToPoint(RightParabolaPoints[i].X, RightParabolaPoints[i].Y).Point);
|
ptList = boundaryPoint.Distinct().ToArray();
|
if (ptList.Length > 2)
|
{
|
g.DrawCurve(pen, ptList); shapePath.AddCurve(ptList);
|
}
|
else if (ptList.Length == 2)
|
{
|
g.DrawLine(pen, ptList[0], ptList[1]);
|
shapePath.AddLine(ptList[0], ptList[1]);
|
}
|
|
boundaryPoint.Clear();
|
var SimularPoints = spectrumShape.SimularPoints;
|
for (int i = SimularPoints.Count() - 1; i > -1; i--)
|
boundaryPoint.Add(mainDiagram.DiagramToPoint(SimularPoints[i].X, SimularPoints[i].Y).Point);
|
ptList = boundaryPoint.Distinct().ToArray();
|
if (ptList.Length > 2)
|
{
|
g.DrawCurve(pen, ptList); shapePath.AddCurve(ptList);
|
}
|
else if (ptList.Length == 2)
|
{
|
g.DrawLine(pen, ptList[0], ptList[1]);
|
shapePath.AddLine(ptList[0], ptList[1]);
|
}
|
|
boundaryPoint.Clear();
|
var LeftParabolaPoints = spectrumShape.LeftParabolaPoints;
|
for (int i = 0; i < LeftParabolaPoints.Count; i++)
|
boundaryPoint.Add(mainDiagram.DiagramToPoint(LeftParabolaPoints[i].X, LeftParabolaPoints[i].Y).Point);
|
ptList = boundaryPoint.Distinct().ToArray();
|
if (ptList.Length > 2)
|
{
|
g.DrawCurve(pen, ptList); shapePath.AddCurve(ptList);
|
}
|
else if (ptList.Length == 2)
|
{
|
g.DrawLine(pen, ptList[0], ptList[1]);
|
shapePath.AddLine(ptList[0], ptList[1]);
|
}
|
}
|
|
using (SolidBrush brush = new SolidBrush(backColor))
|
{
|
System.Drawing.Region region = new Region(shapePath);
|
g.FillRegion(brush, region);
|
}
|
}
|
|
#endregion
|
|
#region 绘制网格线
|
public static void DrawGridLineY
|
(this ChartControl chart, Graphics g, Model.CurveCoordinateParas coordinateParas, Color axisColor, float axisWidth = 0.2f, bool isFullGridLine = false)
|
{
|
if (coordinateParas == null)
|
return;
|
|
XYDiagram mainDiagram = (XYDiagram)chart.Diagram;
|
if (mainDiagram == null)
|
return;
|
|
using (Pen pen = new Pen(axisColor, axisWidth))
|
{
|
var maxQ = coordinateParas.CoordMinQ + coordinateParas.GridNumberX * coordinateParas.CoordSpaceQ;
|
|
int iCurveNum = 1;//至少有1条QH
|
if (coordinateParas.DispPanelQE == 0)
|
iCurveNum++;
|
if (coordinateParas.DispPanelQP == 0)
|
iCurveNum++;
|
|
if (iCurveNum > 1 || isFullGridLine)
|
{
|
for (int i = 1; i < coordinateParas.GridNumberY; i++)
|
{
|
var h = coordinateParas.CoordMinH + i * coordinateParas.CoordSpaceH;
|
|
ControlCoordinates coorStart = mainDiagram.DiagramToPoint(coordinateParas.CoordMinQ, h);
|
ControlCoordinates coorEnd = mainDiagram.DiagramToPoint(maxQ, h);
|
g.DrawLine(pen, coorStart.Point, coorEnd.Point);
|
}
|
}
|
else
|
{
|
for (int i = coordinateParas.StartLineNoH + 1; i < coordinateParas.EndLineNoH; i++)
|
{
|
var h = coordinateParas.CoordMinH + i * coordinateParas.CoordSpaceH;
|
|
ControlCoordinates coorStart = mainDiagram.DiagramToPoint(coordinateParas.CoordMinQ, h);
|
ControlCoordinates coorEnd = mainDiagram.DiagramToPoint(maxQ, h);
|
g.DrawLine(pen, coorStart.Point, coorEnd.Point);
|
}
|
}
|
}
|
}
|
|
public static void DrawGridLineY
|
(this ChartControl chart, DXCustomPaintEventArgs dxArgs, Model.CurveCoordinateParas coordinateParas, Color axisColor, float axisWidth = 0.2f, bool isFullGridLine = false)
|
{
|
if (coordinateParas == null)
|
return;
|
|
XYDiagram mainDiagram = (XYDiagram)chart.Diagram;
|
if (mainDiagram == null)
|
return;
|
{
|
var maxQ = coordinateParas.CoordMinQ + coordinateParas.GridNumberX * coordinateParas.CoordSpaceQ;
|
|
int iCurveNum = 1;//至少有1条QH
|
if (coordinateParas.DispPanelQE == 0)
|
iCurveNum++;
|
if (coordinateParas.DispPanelQP == 0)
|
iCurveNum++;
|
|
if (iCurveNum > 1 || isFullGridLine)
|
{
|
for (int i = 1; i < coordinateParas.GridNumberY; i++)
|
{
|
var h = coordinateParas.CoordMinH + i * coordinateParas.CoordSpaceH;
|
|
ControlCoordinates coorStart = mainDiagram.DiagramToPoint(coordinateParas.CoordMinQ, h);
|
ControlCoordinates coorEnd = mainDiagram.DiagramToPoint(maxQ, h);
|
dxArgs.Cache.DrawLine(coorStart.Point, coorEnd.Point, axisColor, 1);
|
}
|
}
|
else
|
{
|
for (int i = coordinateParas.StartLineNoH + 1; i < coordinateParas.EndLineNoH; i++)
|
{
|
var h = coordinateParas.CoordMinH + i * coordinateParas.CoordSpaceH;
|
|
ControlCoordinates coorStart = mainDiagram.DiagramToPoint(coordinateParas.CoordMinQ, h);
|
ControlCoordinates coorEnd = mainDiagram.DiagramToPoint(maxQ, h);
|
dxArgs.Cache.DrawLine(coorStart.Point, coorEnd.Point, axisColor, 1);
|
}
|
}
|
}
|
}
|
#endregion
|
|
#region 绘制曲线公差范围
|
/// <summary>
|
/// 绘制曲线公差范围(背景填充)
|
/// </summary>
|
/// <param name="chart"></param>
|
/// <param name="g"></param>
|
/// <param name="toleranceCurveParas"></param>
|
/// <param name="backColor"></param>
|
public static void DrawToleranceCurveParas
|
(this ChartControl chart, Graphics g, ViewModel.ToleranceCurveParas toleranceCurveParas, Color backColor)
|
{
|
if (toleranceCurveParas == null)
|
return;
|
|
XYDiagram mainDiagram = (XYDiagram)chart.Diagram;
|
if (mainDiagram == null)
|
return;
|
//图形路径
|
GraphicsPath shapePath = new GraphicsPath();
|
|
|
//如果点过密,投影到屏幕上,由于是整数可能会位置一样,取Distinct
|
List<Point> boundaryPoint = new List<Point>();
|
|
boundaryPoint.Clear();
|
var BasePoints = toleranceCurveParas.UpPoints;
|
for (int i = 0; i < BasePoints.Count; i++)
|
boundaryPoint.Add(mainDiagram.DiagramToPoint(BasePoints[i].X, BasePoints[i].Y).Point);
|
Point[] ptList = boundaryPoint.Distinct().ToArray();
|
if (ptList.Length < 3)
|
return;
|
shapePath.AddCurve(ptList);
|
|
boundaryPoint.Clear();
|
var RightParabolaPoints = toleranceCurveParas.DownPoints;
|
for (int i = RightParabolaPoints.Count() - 1; i > -1; i--)
|
boundaryPoint.Add(mainDiagram.DiagramToPoint(RightParabolaPoints[i].X, RightParabolaPoints[i].Y).Point);
|
ptList = boundaryPoint.Distinct().ToArray();
|
if (ptList.Length < 3)
|
return;
|
shapePath.AddCurve(ptList);
|
|
using (SolidBrush brush = new SolidBrush(backColor))
|
{
|
System.Drawing.Region region = new Region(shapePath);
|
g.FillRegion(brush, region);
|
}
|
}
|
|
#endregion
|
|
#region 画工作点
|
|
public static void DrawDesignPoints4Cross
|
(this ChartControl chart, Graphics g, List<Model.CurvePoint> designPoints, Color pointColor, float curveWidth = 2f, ViewModel.eDesignPointDispType dispType = ViewModel.eDesignPointDispType.LeftDownHalfCross, ViewModel.PointToleranceParas crossPoint = null)
|
{
|
if (designPoints == null)
|
return;
|
foreach (var pt in designPoints)
|
DrawDesignPoint4Cross(chart, g, pt, pointColor, curveWidth, dispType, crossPoint);
|
}
|
|
public static void DrawDesignPoint4Triangle
|
(this ChartControl chart, Graphics g, List<Model.CurvePoint> designPoints, Model.CurveCoordinateParas coordinate, Color pointColor, float curveWidth = 2f)
|
{
|
if (designPoints == null)
|
return;
|
foreach (var pt in designPoints)
|
DrawDesignPoint4Triangle(chart, g, pt, coordinate, pointColor, curveWidth);
|
}
|
|
public static void DrawDesignPoint4Cross
|
(this ChartControl chart, Graphics g, Model.CurvePoint designPoint, Color pointColor, float curveWidth = 2f, ViewModel.eDesignPointDispType dispType = ViewModel.eDesignPointDispType.LeftDownHalfCross, ViewModel.PointToleranceParas crossPoint = null)
|
{
|
if (designPoint == null)
|
return;
|
|
XYDiagram mainDiagram = (XYDiagram)chart.Diagram;
|
if (mainDiagram == null)
|
return;
|
|
using (System.Drawing.Pen pen = new System.Drawing.Pen(pointColor, curveWidth))
|
{
|
if (dispType == ViewModel.eDesignPointDispType.LeftDownHalfCross)
|
{//
|
System.Drawing.Point dpPoint = mainDiagram.DiagramToPoint(designPoint.X, designPoint.Y).Point;
|
//一级4.5% 二级是8%
|
Model.CurvePoint dpFeatPointX = new Model.CurvePoint() { X = designPoint.X * 0.92, Y = designPoint.Y };
|
System.Drawing.Point dpPointX = mainDiagram.DiagramToPoint(dpFeatPointX.X, dpFeatPointX.Y).Point;
|
//一级3.0% 二级是5%
|
Model.CurvePoint dpFeatPointY = new Model.CurvePoint() { X = designPoint.X, Y = designPoint.Y * 0.95 };
|
System.Drawing.Point dpPointY = mainDiagram.DiagramToPoint(dpFeatPointY.X, dpFeatPointY.Y).Point;
|
|
g.DrawLine(pen, dpPointX, dpPoint);
|
g.DrawLine(pen, dpPointY, dpPoint);
|
|
}
|
else if (dispType == ViewModel.eDesignPointDispType.Cross)
|
{
|
if (crossPoint == null)
|
{
|
//一级4.5% 二级是8%
|
Model.CurvePoint dpFeatPointX1 = new Model.CurvePoint() { X = designPoint.X * 0.92, Y = designPoint.Y };
|
System.Drawing.Point dpPointX1 = mainDiagram.DiagramToPoint(dpFeatPointX1.X, dpFeatPointX1.Y).Point;
|
|
Model.CurvePoint dpFeatPointX2 = new Model.CurvePoint() { X = designPoint.X * 1.08, Y = designPoint.Y };
|
System.Drawing.Point dpPointX2 = mainDiagram.DiagramToPoint(dpFeatPointX2.X, dpFeatPointX2.Y).Point;
|
|
//一级3% 二级是5%
|
Model.CurvePoint dpFeatPointY1 = new Model.CurvePoint() { X = designPoint.X, Y = designPoint.Y * 0.95 };
|
System.Drawing.Point dpPointY1 = mainDiagram.DiagramToPoint(dpFeatPointY1.X, dpFeatPointY1.Y).Point;
|
|
Model.CurvePoint dpFeatPointY2 = new Model.CurvePoint() { X = designPoint.X, Y = designPoint.Y * 1.05 };
|
System.Drawing.Point dpPointY2 = mainDiagram.DiagramToPoint(dpFeatPointY2.X, dpFeatPointY2.Y).Point;
|
|
g.DrawLine(pen, dpPointX1, dpPointX2);
|
g.DrawLine(pen, dpPointY1, dpPointY2);
|
}
|
else
|
{
|
Model.CurvePoint dpFeatPointX1 = new Model.CurvePoint() { X = designPoint.X * crossPoint.TolRatioMinQ, Y = designPoint.Y };
|
System.Drawing.Point dpPointX1 = mainDiagram.DiagramToPoint(dpFeatPointX1.X, dpFeatPointX1.Y).Point;
|
|
Model.CurvePoint dpFeatPointX2 = new Model.CurvePoint() { X = designPoint.X * crossPoint.TolRatioMaxQ, Y = designPoint.Y };
|
System.Drawing.Point dpPointX2 = mainDiagram.DiagramToPoint(dpFeatPointX2.X, dpFeatPointX2.Y).Point;
|
|
//一级3% 二级是5%
|
Model.CurvePoint dpFeatPointY1 = new Model.CurvePoint() { X = designPoint.X, Y = designPoint.Y * crossPoint.TolRatioMinH };
|
System.Drawing.Point dpPointY1 = mainDiagram.DiagramToPoint(dpFeatPointY1.X, dpFeatPointY1.Y).Point;
|
|
Model.CurvePoint dpFeatPointY2 = new Model.CurvePoint() { X = designPoint.X, Y = designPoint.Y * crossPoint.TolRatioMaxH };
|
System.Drawing.Point dpPointY2 = mainDiagram.DiagramToPoint(dpFeatPointY2.X, dpFeatPointY2.Y).Point;
|
|
g.DrawLine(pen, dpPointX1, dpPointX2);
|
g.DrawLine(pen, dpPointY1, dpPointY2);
|
}
|
}
|
}
|
}
|
|
public static void DrawDesignPoint4Triangle
|
(this ChartControl chart, Graphics g, Model.CurvePoint designPoint, Model.CurveCoordinateParas coordinate, Color pointColor, float curveWidth = 2f)
|
{
|
if (designPoint == null || coordinate == null)
|
return;
|
|
XYDiagram mainDiagram = (XYDiagram)chart.Diagram;
|
if (mainDiagram == null)
|
return;
|
|
using (System.Drawing.Pen pen = new System.Drawing.Pen(pointColor, curveWidth))
|
{
|
|
System.Drawing.Point dpPoint = mainDiagram.DiagramToPoint(designPoint.X, designPoint.Y).Point;
|
|
Model.CurvePoint dpFeatPointX = new Model.CurvePoint() { X = designPoint.X - coordinate.CoordSpaceQ / 2, Y = designPoint.Y };
|
System.Drawing.Point dpPointX = mainDiagram.DiagramToPoint(dpFeatPointX.X, dpFeatPointX.Y).Point;
|
|
Model.CurvePoint dpFeatPointY = new Model.CurvePoint() { X = designPoint.X, Y = designPoint.Y - coordinate.CoordSpaceH / 2 };
|
System.Drawing.Point dpPointY = mainDiagram.DiagramToPoint(dpFeatPointY.X, dpFeatPointY.Y).Point;
|
|
|
|
g.DrawLine(pen, dpPointX, dpPoint);
|
g.DrawLine(pen, dpPointY, dpPoint);
|
g.DrawLine(pen, dpPointX, dpPointY);
|
|
}
|
}
|
|
public static void DrawDesignPointsLog10
|
(this ChartControl chart, Graphics g, List<Model.CurvePoint> designPoints, Color pointColor, float curveWidth = 2f, ViewModel.eDesignPointDispType dispType = ViewModel.eDesignPointDispType.LeftDownHalfCross)
|
{
|
if (designPoints == null || designPoints.Count() == 0)
|
return;
|
|
XYDiagram mainDiagram = (XYDiagram)chart.Diagram;
|
using (System.Drawing.Pen pen = new System.Drawing.Pen(pointColor, curveWidth))
|
{
|
foreach (var designPoint in designPoints)
|
{
|
System.Drawing.Point dpPoint = mainDiagram.DiagramToPoint(Math.Log10(designPoint.X), Math.Log10(designPoint.Y)).Point;
|
//一级4.5% 二级是8%
|
Model.CurvePoint dpFeatPointX = new Model.CurvePoint() { X = Math.Log10(designPoint.X * 0.92), Y = Math.Log10(designPoint.Y) };
|
System.Drawing.Point dpPointX = mainDiagram.DiagramToPoint(dpFeatPointX.X, dpFeatPointX.Y).Point;
|
//一级3% 二级是5%
|
Model.CurvePoint dpFeatPointY = new Model.CurvePoint() { X = Math.Log10(designPoint.X), Y = Math.Log10(designPoint.Y * 0.95) };
|
System.Drawing.Point dpPointY = mainDiagram.DiagramToPoint(dpFeatPointY.X, dpFeatPointY.Y).Point;
|
|
g.DrawLine(pen, dpPointX, dpPoint);
|
g.DrawLine(pen, dpPointY, dpPoint);
|
}
|
}
|
}
|
|
#endregion
|
|
#region 画装置曲线
|
/// <summary>
|
/// 在Chart上画型谱(填充)
|
/// </summary>
|
public static void DrawEquipmentCurve(this ChartControl chart, Graphics g, List<Model.CurvePoint> curve, bool isMonoColor = false)
|
{
|
if (curve == null || curve.Count() < 3)
|
return;
|
|
XYDiagram mainDiagram = (XYDiagram)chart.Diagram;
|
if (mainDiagram == null)
|
return;
|
//得到屏幕上的点坐标
|
List<Point> chartPoint = new List<Point>();
|
int i = 0;
|
for (i = 0; i < curve.Count; i++)
|
{
|
System.Drawing.Point dpPoint = mainDiagram.DiagramToPoint(curve[i].X, curve[i].Y).Point;
|
|
chartPoint.Add(dpPoint);
|
}
|
|
//画曲线
|
//Color curveColor = IStation.WinFrmUI.Curve.XPump.Properties.Settings.Speed.CurveColorEquipCurve;
|
Point[] pointArray = chartPoint.Distinct().ToArray();//如果点过密,投影到屏幕上,由于是整数可能会位置一样,取Distinct
|
if (pointArray.Length < 3)
|
return;
|
using (Pen pen = new Pen(IStation.WinFrmUI.Curve.XtraChartHelper.CurveColorEquipCurve, IStation.WinFrmUI.Curve.XtraChartHelper.CurveWidthEquipCurve))
|
{
|
g.DrawCurve(pen, pointArray);
|
}
|
}
|
#endregion
|
|
#region 绘制水印
|
|
public static void DrawCorpLogo(this ChartControl chart, Graphics g)
|
{
|
|
var waterMarkText = "义维科技";
|
if (string.IsNullOrEmpty(waterMarkText))
|
return;
|
|
GraphicsState gs = g.Save();
|
using (Font fontText = new Font("楷体", 14, FontStyle.Bold))
|
using (SolidBrush drawBrush = new SolidBrush(Color.Gray))
|
{
|
g.ResetTransform();
|
g.TranslateTransform(80, 80); //设置旋转中心为文字中心
|
g.RotateTransform(25);
|
g.DrawString(waterMarkText, fontText, drawBrush, 0, 0);
|
|
g.ResetTransform();
|
g.TranslateTransform(chart.Width - 200, chart.Height - 195);
|
g.RotateTransform(25);
|
g.DrawString(waterMarkText, fontText, drawBrush, 0, 0);
|
|
g.ResetTransform();
|
g.TranslateTransform(chart.Width - 200, 105);
|
g.RotateTransform(25);
|
g.DrawString(waterMarkText, fontText, drawBrush, 0, 0);
|
|
g.ResetTransform();
|
g.TranslateTransform(80, chart.Height - 200);
|
g.RotateTransform(25);
|
g.DrawString(waterMarkText, fontText, drawBrush, 0, 0);
|
}
|
|
g.Restore(gs);
|
|
}
|
|
public static void DrawWaterMark(this ChartControl chart, Graphics g, string waterMarkText)
|
{
|
if (string.IsNullOrEmpty(waterMarkText))
|
return;
|
GraphicsState gs = g.Save();
|
|
using (Font fontText = new Font("Arial", 16, FontStyle.Bold))
|
using (SolidBrush drawBrush = new SolidBrush(Color.Gray))
|
{
|
g.ResetTransform();
|
g.TranslateTransform(chart.Width / 2 - 170, chart.Height / 2 - 225); //设置旋转中心为文字中心
|
g.RotateTransform(25);
|
g.DrawString(waterMarkText, fontText, drawBrush, 0, 0);
|
|
g.ResetTransform();
|
g.TranslateTransform(chart.Width / 2 - 170, chart.Height / 2); //设置旋转中心为文字中心
|
g.RotateTransform(25);
|
g.DrawString(waterMarkText, fontText, drawBrush, 0, 0);
|
}
|
|
g.Restore(gs);
|
}
|
|
#endregion
|
|
}
|
}
|