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.Basic { //拓展XtraChart DevExpress.XtraReports.UI.XRChart static public class ExtendXtraChart { #region 导出 public static void ExportPictByDlg(this DevExpress.XtraCharts.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 DevExpress.XtraCharts.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 绘制网格线 //不进行坐标转化 public static void DrawGridLineY(this DevExpress.XtraCharts.ChartControl chart, Graphics g, Eventech.Model.LxpCoordinateParas 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 (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 DrawGridLineX(this DevExpress.XtraCharts.ChartControl chart, Graphics g, Eventech.Model.QhCoordinateParas coordinateParas) { if (coordinateParas == null) return; double yMin = coordinateParas.ToChartValueH(coordinateParas.AxisLabelH.First()); double yMax = coordinateParas.ToChartValueH(coordinateParas.AxisLabelH.Last()); XYDiagram mainDiagram = (XYDiagram)chart.Diagram; if (mainDiagram == null) return; using (Pen pen = new Pen(IStation.WinFrmUI.Basic.ChartDisp.Settings.Default.GridLinesColorX, 0.2f)) { for (int i = 1; i < coordinateParas.AxisLabelQ.Count() - 1; i++) { var q = coordinateParas.ToChartValueQ(coordinateParas.AxisLabelQ[i]); ControlCoordinates coorStart = mainDiagram.DiagramToPoint(q, yMin); ControlCoordinates coorEnd = mainDiagram.DiagramToPoint(q, yMax); g.DrawLine(pen, coorStart.Point, coorEnd.Point); } } } public static void DrawGridLineY(this DevExpress.XtraCharts.ChartControl chart, Graphics g, Eventech.Model.QhCoordinateParas coordinateParas) { if (coordinateParas == null) return; double xMin = coordinateParas.ToChartValueQ(coordinateParas.AxisLabelQ.First()); double xMax = coordinateParas.ToChartValueQ(coordinateParas.AxisLabelQ.Last()); XYDiagram mainDiagram = (XYDiagram)chart.Diagram; if (mainDiagram == null) return; using (Pen pen = new Pen(IStation.WinFrmUI.Basic.ChartDisp.Settings.Default.GridLinesColorY, 0.2f)) { for (int i = 1; i < coordinateParas.AxisLabelH.Count() - 1; i++) { var h = coordinateParas.ToChartValueH(coordinateParas.AxisLabelH[i]); ControlCoordinates coorStart = mainDiagram.DiagramToPoint(xMin, h); ControlCoordinates coorEnd = mainDiagram.DiagramToPoint(xMax, h); g.DrawLine(pen, coorStart.Point, coorEnd.Point); } } } //直接用原始值即可 public static void DrawGridLineX0(this DevExpress.XtraCharts.ChartControl chart, Graphics g, Eventech.Model.QhCoordinateParas coordinateParas) { if (coordinateParas == null) return; double yMin = coordinateParas.AxisLabelH.First(); double yMax = coordinateParas.AxisLabelH.Last(); XYDiagram mainDiagram = (XYDiagram)chart.Diagram; if (mainDiagram == null) return; using (Pen pen = new Pen(IStation.WinFrmUI.Basic.ChartDisp.Settings.Default.GridLinesColorX, 0.2f)) { for (int i = 1; i < coordinateParas.AxisLabelQ.Count() - 1; i++) { var q = coordinateParas.AxisLabelQ[i]; ControlCoordinates coorStart = mainDiagram.DiagramToPoint(q, yMin); ControlCoordinates coorEnd = mainDiagram.DiagramToPoint(q, yMax); g.DrawLine(pen, coorStart.Point, coorEnd.Point); } } } public static void DrawGridLineY0(this DevExpress.XtraCharts.ChartControl chart, Graphics g, Eventech.Model.QhCoordinateParas coordinateParas) { if (coordinateParas == null) return; double xMin = coordinateParas.AxisLabelQ.First(); double xMax = coordinateParas.AxisLabelQ.Last(); XYDiagram mainDiagram = (XYDiagram)chart.Diagram; if (mainDiagram == null) return; using (Pen pen = new Pen(IStation.WinFrmUI.Basic.ChartDisp.Settings.Default.GridLinesColorY, 0.2f)) { for (int i = 1; i < coordinateParas.AxisLabelH.Count() - 1; i++) { var h = coordinateParas.AxisLabelH[i]; ControlCoordinates coorStart = mainDiagram.DiagramToPoint(xMin, h); ControlCoordinates coorEnd = mainDiagram.DiagramToPoint(xMax, h); g.DrawLine(pen, coorStart.Point, coorEnd.Point); } } } #endregion #region 画工作点 public static void DrawDesignPoints4Cross(this DevExpress.XtraCharts.ChartControl chart, Graphics g, List designPoints, Color pointColor, float curveWidth = 2f, Eventech.Model.eDesignPointDispType dispType = Eventech.Model.eDesignPointDispType.LeftDownHalfCross, Eventech.Model.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 DevExpress.XtraCharts.ChartControl chart, Graphics g, List designPoints, Eventech.Model.LxpCoordinateParas 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 DevExpress.XtraCharts.ChartControl chart, Graphics g, Eventech.Model.FeatPoint designPoint, Color pointColor, float curveWidth = 2f, Eventech.Model.eDesignPointDispType dispType = Eventech.Model.eDesignPointDispType.LeftDownHalfCross, Eventech.Model.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 == Eventech.Model.eDesignPointDispType.LeftDownHalfCross) {// System.Drawing.Point dpPoint = mainDiagram.DiagramToPoint(designPoint.X, designPoint.Y).Point; //一级4.5% 二级是8% Eventech.Model.FeatPoint dpFeatPointX = new Eventech.Model.FeatPoint() { X = designPoint.X * 0.92, Y = designPoint.Y }; System.Drawing.Point dpPointX = mainDiagram.DiagramToPoint(dpFeatPointX.X, dpFeatPointX.Y).Point; //一级3.0% 二级是5% Eventech.Model.FeatPoint dpFeatPointY = new Eventech.Model.FeatPoint() { 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 == Eventech.Model.eDesignPointDispType.Cross) { if (crossPoint == null) { Eventech.Model.FeatPoint dpFeatPointX1 = new Eventech.Model.FeatPoint() { X = designPoint.X * 0.92, Y = designPoint.Y }; System.Drawing.Point dpPointX1 = mainDiagram.DiagramToPoint(dpFeatPointX1.X, dpFeatPointX1.Y).Point; Eventech.Model.FeatPoint dpFeatPointX2 = new Eventech.Model.FeatPoint() { X = designPoint.X * 1.08, Y = designPoint.Y }; System.Drawing.Point dpPointX2 = mainDiagram.DiagramToPoint(dpFeatPointX2.X, dpFeatPointX2.Y).Point; Eventech.Model.FeatPoint dpFeatPointY1 = new Eventech.Model.FeatPoint() { X = designPoint.X, Y = designPoint.Y * 0.95 }; System.Drawing.Point dpPointY1 = mainDiagram.DiagramToPoint(dpFeatPointY1.X, dpFeatPointY1.Y).Point; Eventech.Model.FeatPoint dpFeatPointY2 = new Eventech.Model.FeatPoint() { 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 { Eventech.Model.FeatPoint dpFeatPointX1 = new Eventech.Model.FeatPoint() { X = designPoint.X * crossPoint.TolRatioMinQ, Y = designPoint.Y }; System.Drawing.Point dpPointX1 = mainDiagram.DiagramToPoint(dpFeatPointX1.X, dpFeatPointX1.Y).Point; Eventech.Model.FeatPoint dpFeatPointX2 = new Eventech.Model.FeatPoint() { X = designPoint.X * crossPoint.TolRatioMaxQ, Y = designPoint.Y }; System.Drawing.Point dpPointX2 = mainDiagram.DiagramToPoint(dpFeatPointX2.X, dpFeatPointX2.Y).Point; Eventech.Model.FeatPoint dpFeatPointY1 = new Eventech.Model.FeatPoint() { X = designPoint.X, Y = designPoint.Y * crossPoint.TolRatioMinH }; System.Drawing.Point dpPointY1 = mainDiagram.DiagramToPoint(dpFeatPointY1.X, dpFeatPointY1.Y).Point; Eventech.Model.FeatPoint dpFeatPointY2 = new Eventech.Model.FeatPoint() { 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); } } else if (dispType == Eventech.Model.eDesignPointDispType.CrossAnPointCircle) { if (crossPoint == null) { Eventech.Model.FeatPoint dpFeatPointX1 = new Eventech.Model.FeatPoint() { X = designPoint.X * 0.92, Y = designPoint.Y }; System.Drawing.Point dpPointX1 = mainDiagram.DiagramToPoint(dpFeatPointX1.X, dpFeatPointX1.Y).Point; Eventech.Model.FeatPoint dpFeatPointX2 = new Eventech.Model.FeatPoint() { X = designPoint.X * 1.08, Y = designPoint.Y }; System.Drawing.Point dpPointX2 = mainDiagram.DiagramToPoint(dpFeatPointX2.X, dpFeatPointX2.Y).Point; Eventech.Model.FeatPoint dpFeatPointY1 = new Eventech.Model.FeatPoint() { X = designPoint.X, Y = designPoint.Y * 0.95 }; System.Drawing.Point dpPointY1 = mainDiagram.DiagramToPoint(dpFeatPointY1.X, dpFeatPointY1.Y).Point; Eventech.Model.FeatPoint dpFeatPointY2 = new Eventech.Model.FeatPoint() { 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); var x = Math.Abs(dpPointX1.X - dpPointX2.X) / 4; var y = Math.Abs(dpPointY1.Y - dpPointY2.Y) / 5; var r = Math.Min(x, y); Eventech.Model.FeatPoint dpFeatPoint = new Eventech.Model.FeatPoint() { X = designPoint.X, Y = designPoint.Y }; System.Drawing.Point dpPoint = mainDiagram.DiagramToPoint(dpFeatPoint.X, dpFeatPoint.Y).Point; using (Brush b = new SolidBrush(pointColor)) g.FillEllipse(b, dpPoint.X - r / 2, dpPoint.Y - r / 2, r, r); } else { Eventech.Model.FeatPoint dpFeatPointX1 = new Eventech.Model.FeatPoint() { X = designPoint.X * crossPoint.TolRatioMinQ, Y = designPoint.Y }; System.Drawing.Point dpPointX1 = mainDiagram.DiagramToPoint(dpFeatPointX1.X, dpFeatPointX1.Y).Point; Eventech.Model.FeatPoint dpFeatPointX2 = new Eventech.Model.FeatPoint() { X = designPoint.X * crossPoint.TolRatioMaxQ, Y = designPoint.Y }; System.Drawing.Point dpPointX2 = mainDiagram.DiagramToPoint(dpFeatPointX2.X, dpFeatPointX2.Y).Point; Eventech.Model.FeatPoint dpFeatPointY1 = new Eventech.Model.FeatPoint() { X = designPoint.X, Y = designPoint.Y * crossPoint.TolRatioMinH }; System.Drawing.Point dpPointY1 = mainDiagram.DiagramToPoint(dpFeatPointY1.X, dpFeatPointY1.Y).Point; Eventech.Model.FeatPoint dpFeatPointY2 = new Eventech.Model.FeatPoint() { 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); var x = Math.Abs(dpPointX1.X - dpPointX2.X) / 4; var y = Math.Abs(dpPointY1.Y - dpPointY2.Y) / 5; var r = Math.Min(x, y); Eventech.Model.FeatPoint dpFeatPoint = new Eventech.Model.FeatPoint() { X = designPoint.X, Y = designPoint.Y }; System.Drawing.Point dpPoint = mainDiagram.DiagramToPoint(dpFeatPoint.X, dpFeatPoint.Y).Point; using (Brush b = new SolidBrush(pointColor)) g.FillEllipse(b, dpPoint.X - r / 2, dpPoint.Y - r / 2, r, r); } } } } public static void DrawDesignPoint4Triangle(this DevExpress.XtraCharts.ChartControl chart, Graphics g, Eventech.Model.FeatPoint designPoint, Eventech.Model.LxpCoordinateParas 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; Eventech.Model.FeatPoint dpFeatPointX = new Eventech.Model.FeatPoint() { X = designPoint.X - coordinate.CoordSpaceQ / 2, Y = designPoint.Y }; System.Drawing.Point dpPointX = mainDiagram.DiagramToPoint(dpFeatPointX.X, dpFeatPointX.Y).Point; Eventech.Model.FeatPoint dpFeatPointY = new Eventech.Model.FeatPoint() { 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 DrawDesignPoint4Triangle(this DevExpress.XtraCharts.ChartControl chart, Graphics g, Eventech.Model.FeatPoint designPoint, Eventech.Model.QhCoordinateParas 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)) { double CoordSpaceQ = coordinate.AxisLabelQ[1] - coordinate.AxisLabelQ[0]; double CoordSpaceH = coordinate.AxisLabelH[1] - coordinate.AxisLabelH[0]; System.Drawing.Point dpPoint = mainDiagram.DiagramToPoint(designPoint.X, designPoint.Y).Point; Eventech.Model.FeatPoint dpFeatPointX = new Eventech.Model.FeatPoint() { X = designPoint.X - CoordSpaceQ / 2, Y = designPoint.Y }; System.Drawing.Point dpPointX = mainDiagram.DiagramToPoint(dpFeatPointX.X, dpFeatPointX.Y).Point; Eventech.Model.FeatPoint dpFeatPointY = new Eventech.Model.FeatPoint() { X = designPoint.X, Y = designPoint.Y - 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); Eventech.Model.FeatPoint dpFeatPointX_S1 = new Eventech.Model.FeatPoint() { X = designPoint.X - CoordSpaceQ / 2 + CoordSpaceQ / 6, Y = designPoint.Y }; System.Drawing.Point dpPointX_S1 = mainDiagram.DiagramToPoint(dpFeatPointX_S1.X, dpFeatPointX_S1.Y).Point; Eventech.Model.FeatPoint dpFeatPointY_S1 = new Eventech.Model.FeatPoint() { X = designPoint.X, Y = designPoint.Y - CoordSpaceH / 2 + CoordSpaceH / 6 }; System.Drawing.Point dpPointY_S1 = mainDiagram.DiagramToPoint(dpFeatPointY_S1.X, dpFeatPointY_S1.Y).Point; g.DrawLine(pen, dpPointX_S1, dpPointY_S1); Eventech.Model.FeatPoint dpFeatPointX_S2 = new Eventech.Model.FeatPoint() { X = designPoint.X - CoordSpaceQ / 2 + CoordSpaceQ / 3, Y = designPoint.Y }; System.Drawing.Point dpPointX_S2 = mainDiagram.DiagramToPoint(dpFeatPointX_S2.X, dpFeatPointX_S2.Y).Point; Eventech.Model.FeatPoint dpFeatPointY_S2 = new Eventech.Model.FeatPoint() { X = designPoint.X, Y = designPoint.Y - CoordSpaceH / 2 + CoordSpaceH / 3 }; System.Drawing.Point dpPointY_S2 = mainDiagram.DiagramToPoint(dpFeatPointY_S2.X, dpFeatPointY_S2.Y).Point; g.DrawLine(pen, dpPointX_S2, dpPointY_S2); } } public static void DrawDesignPoints(this DevExpress.XtraCharts.ChartControl chart, Graphics g, List designPoints, Color pointColor, float curveWidth = 2f, Eventech.Model.eDesignPointDispType dispType = Eventech.Model.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(designPoint.X, designPoint.Y).Point; //一级4.5% 二级是8% Eventech.Model.FeatPoint dpFeatPointX = new Eventech.Model.FeatPoint() { X = designPoint.X * 0.92, Y = designPoint.Y }; System.Drawing.Point dpPointX = mainDiagram.DiagramToPoint(dpFeatPointX.X, dpFeatPointX.Y).Point; //一级3% 二级是5% Eventech.Model.FeatPoint dpFeatPointY = new Eventech.Model.FeatPoint() { 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); g.DrawLine(pen, dpPointX, dpPointY); } } } public static void DrawDesignPointsLog10(this DevExpress.XtraCharts.ChartControl chart, Graphics g, List designPoints, Color pointColor, float curveWidth = 2f, Eventech.Model.eDesignPointDispType dispType = Eventech.Model.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% Eventech.Model.FeatPoint dpFeatPointX = new Eventech.Model.FeatPoint() { 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% Eventech.Model.FeatPoint dpFeatPointY = new Eventech.Model.FeatPoint() { 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 画装置曲线 //在Chart上画型谱(填充) public static void DrawEquipmentCurve(this DevExpress.XtraCharts.ChartControl chart, Graphics g, List curve, bool isMonoColor = false) { if (curve == null || curve.Count() < 3) return; XYDiagram mainDiagram = (XYDiagram)chart.Diagram; if (mainDiagram == null) return; //得到屏幕上的点坐标 List chartPoint = new List(); 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.Basic.XPump.Properties.Settings.Speed.CurveColorEquipCurve; Point[] pointArray = chartPoint.Distinct().ToArray();//如果点过密,投影到屏幕上,由于是整数可能会位置一样,取Distinct if (pointArray.Length < 3) return; using (Pen pen = new Pen(IStation.WinFrmUI.Basic.ChartDisp.Settings.Default.CurveColorEquipCurve, IStation.WinFrmUI.Basic.ChartDisp.Settings.Default.CurveWidthEquipCurve)) { g.DrawCurve(pen, pointArray); } } #endregion #region 绘制曲线QH //不考虑坐标单位变化 public static Point[] DrawOpenCurve(this DevExpress.XtraCharts.ChartControl chart, Graphics g, List curve, Color curveColor, float curveWidth) { if (curve == null) return null; //if (qCalcHelper == null) // return null; //if (hCalcHelper == null) // return null; XYDiagram mainDiagram = (XYDiagram)chart.Diagram; if (mainDiagram == null) return null; List screenPoints = new List(); for (int i = 0; i < curve.Count; i++) { ControlCoordinates coor = mainDiagram.DiagramToPoint(curve[i].X, curve[i].Y); screenPoints.Add(coor.Point); } //去掉重曲线复点 Point[] pointArray = screenPoints.Distinct().ToArray(); if (pointArray.Length > 2) { using (Pen pen = new Pen(curveColor, curveWidth)) { g.DrawCurve(pen, pointArray);//, 0.5f); } } else if (pointArray.Length == 2) { using (Pen pen = new Pen(curveColor, curveWidth)) { g.DrawLine(pen, pointArray[0], pointArray[1]); } } else if (pointArray.Length == 1) { using (Pen pen = new Pen(curveColor, curveWidth)) { Rectangle rc = new Rectangle(pointArray[0].X - 2, pointArray[0].Y - 2, 4, 4); g.FillEllipse(new SolidBrush(curveColor), rc); } } else if (pointArray.Length == 0) { return null; } return pointArray; } //考虑坐标单位变化 public static Point[] DrawOpenCurve(this DevExpress.XtraCharts.ChartControl chart, Graphics g, List curve, Color curveColor, float curveWidth, Eventech.Model.IAxisCalcer qCalcHelper, Eventech.Model.IAxisCalcer hCalcHelper) { if (curve == null) return null; //if (qCalcHelper == null) // return null; //if (hCalcHelper == null) // return null; XYDiagram mainDiagram = (XYDiagram)chart.Diagram; if (mainDiagram == null) return null; List screenPoints = new List(); if (qCalcHelper == null || hCalcHelper == null) { for (int i = 0; i < curve.Count; i++) { ControlCoordinates coor = mainDiagram.DiagramToPoint(curve[i].X, curve[i].Y); screenPoints.Add(coor.Point); } } else { for (int i = 0; i < curve.Count; i++) { ControlCoordinates coor = mainDiagram.DiagramToPoint(qCalcHelper.Calc(curve[i].X), hCalcHelper.Calc(curve[i].Y)); screenPoints.Add(coor.Point); } } //去掉重曲线复点 Point[] pointArray = screenPoints.Distinct().ToArray(); if (pointArray.Length > 2) { using (Pen pen = new Pen(curveColor, curveWidth)) { g.DrawCurve(pen, pointArray);//, 0.5f); } } else if (pointArray.Length == 2) { using (Pen pen = new Pen(curveColor, curveWidth)) { g.DrawLine(pen, pointArray[0], pointArray[1]); } } else if (pointArray.Length == 1) { using (Pen pen = new Pen(curveColor, curveWidth)) { Rectangle rc = new Rectangle(pointArray[0].X - 2, pointArray[0].Y - 2, 4, 4); g.FillEllipse(new SolidBrush(curveColor), rc); } } else if (pointArray.Length == 0) { return null; } return pointArray; } #endregion #region 绘制水印 public static void DrawCorpLogo(this DevExpress.XtraCharts.ChartControl chart, Graphics g) { //if (!IStation.WinFrmUI.Basic.GlobeParas.IsPrintWaterMark) // return; /*string imgWaterMark = null; var posi_list = IStation.WinFrmUI.Basic.ImageWaterMarkHelper.CalcLogoImagePosiF2x2(chart.Width, chart.Height, true, out imgWaterMark); if (posi_list != null && posi_list.Count > 0) { Image water_logo_image = Image.FromFile(imgWaterMark); for (int i = 0; i < posi_list.Count; i = i + 1) { g.DrawImage(water_logo_image, posi_list[i]); } } else {//防止用户把水印文件删除掉 DrawWaterMarkText(chart, g); }*/ } public static void DrawWaterMarkText(this DevExpress.XtraCharts.ChartControl chart, Graphics g) { var waterMarkText = "义维科技"; if (string.IsNullOrEmpty(waterMarkText)) return; GraphicsState gs = g.Save(); using (Font fontText = new Font("楷体", 24, FontStyle.Bold)) using (SolidBrush drawBrush = new SolidBrush(Color.FromArgb(50, 0, 191, 255))) { 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); } #endregion } }