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 { /// /// ChartContorl扩展类 /// 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 画型谱 /// /// 画型谱 (coordinatePara为空表示不用坐标系计算LOG) /// 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); } } /// /// 画型谱 /// 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); } } /// /// 画型谱 (只有边界(用坐标系进行计算LOG)) /// private static List 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 boundaryPoint = new List(); 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; } } /// /// 画型谱 (背景填充) /// 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 boundaryPoint = new List(); 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); } } // /// /// 画型谱 (需要设置背景色) /// 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 boundaryPoint = new List(); 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 绘制曲线公差范围 /// /// 绘制曲线公差范围(背景填充) /// /// /// /// /// 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 boundaryPoint = new List(); 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 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 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 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 画装置曲线 /// /// 在Chart上画型谱(填充) /// public static void DrawEquipmentCurve(this 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.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 } }