using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Drawing2D; namespace TProduct.PumpGraph.Picture { public partial class LxpFeatChart : FeatChart { #region 曲线宽度和颜色 protected float _curvePointSize = 8f; public float CurvePointSize { get { return _curvePointSize; } set { _curvePointSize = value; } } protected float _curvePointWidth = 2f; public float PointPointWidth { get { return _curvePointWidth; } set { _curvePointWidth = value; } } protected Color _coefficientLineColor = Color.Black; public Color CoefficientLineColor { get { return _coefficientLineColor; } set { _coefficientLineColor = value; } } protected float _coefficientLineWidth = 3f; public float CoefficientLineWidth { get { return _coefficientLineWidth; } set { _coefficientLineWidth = value; } } protected float _pointCrossLineWidth = 1f;//交叉线 public float PointCrossLineWidth { get { return _pointCrossLineWidth; } set { _pointCrossLineWidth = value; } } protected float _curveNameSize = 10f; public float CurveNameSize { get { return _curveNameSize; } set { _curveNameSize = value; } } protected string _curveNameFontName = "Arial"; protected bool _isDispCurveName = false; public bool IsDispCurveName { get { return _isDispCurveName; } set { _isDispCurveName = value; } } protected bool _isDispQNPSH = true;//是否显示汽蚀曲线 public bool IsDispQNPSH { get { return _isDispQNPSH; } set { _isDispQNPSH = value; } } bool _isDispQP = true;//是否显示功率曲线 public bool IsDispQP { get { return _isDispQP; } set { _isDispQP = value; } } /// /// /// public bool IsAccordQE { get { return _isAccordQE; } set { _isAccordQE = value; } } bool _isAccordQE = true; bool _isAccordQH = true; public bool IsAccordQH { get { return _isAccordQH; } set { _isAccordQH = value; } } private int _curveParaTextPosi = 1;//1开始位置, 2 表示结束位置 protected int CurveParaTextPosi { get { return _curveParaTextPosi; } set { _curveParaTextPosi = value; } } #endregion #region 绘制曲线 protected void DrawAllCurves() { DrawCurveQH(); DrawCurveQE(); DrawCurveQP(); DrawCurveQNPSH(); } //绘制汽蚀曲线 protected void DrawCurveQNPSH() { if (_points_CurveNPSH == null || _points_CurveNPSH.Count < 3) return; List QNPSHPts = new List(); for (int i = 0; i < _points_CurveNPSH.Count; i++) { PointF QNPSHPt = new PointF(); QNPSHPt.X = MapRealToPictQ(_points_CurveNPSH[i].X); QNPSHPt.Y = MapRealToPictNPSH(_points_CurveNPSH[i].Y); QNPSHPts.Add(QNPSHPt); } if (QNPSHPts.Count < 3) return; using (Pen pen = new Pen(_curveColorNPSH, base._curveWidth)) { _graphics.DrawCurve(pen, QNPSHPts.ToArray()); } if (_isDispCurveName) { //画曲线标签 PointF pt1 = new PointF(); pt1 = QNPSHPts[QNPSHPts.Count - 1]; PointF pt2 = new PointF(); pt2.X = pt1.X + 10; pt2.Y = pt1.Y - 10; string title = "Q-NPSH"; using (var font = new Font(_curveNameFontName, _curveNameSize, System.Drawing.FontStyle.Regular | System.Drawing.FontStyle.Bold)) { _graphics.DrawString(title, font, new SolidBrush(Color.Black), pt2); } } } //绘制扬程曲线 protected void DrawCurveQH() { if (_curveInfoQH == null) return; //画曲线 DrawSingleCurveQH(this._curveInfoQH, this._curveColorQH, this._curveWidth); DrawCurveLabelQH(); } protected virtual void DrawCurveLabelQH() { //画曲线标签 if (_isDispCurveName) { PointF pt1 = new PointF(); pt1.X = MapRealToPictQ(_curveInfoQH[_curveInfoQH.Count - 2].X); pt1.Y = MapRealToPictH(_curveInfoQH[_curveInfoQH.Count - 2].Y); PointF pt2 = new PointF(); pt2.X = pt1.X + 10; pt2.Y = pt1.Y - 10; string title = "Q-H"; using (var font = new Font(_curveNameFontName, _curveNameSize, System.Drawing.FontStyle.Regular | System.Drawing.FontStyle.Bold)) { _graphics.DrawString(title, font, new SolidBrush(_curveColorQH), pt2); } } } //绘制效率曲线 protected void DrawCurveQE() { if (_curveInfoQE == null) return; //画曲线 DrawSingleCurveQE(_curveInfoQE, this._curveColorQE, this._curveWidth); DrawCurveLabelQE(); } protected virtual void DrawCurveLabelQE() { //画曲线标签 if (_isDispCurveName) { PointF pt1 = new PointF(); pt1.X = MapRealToPictQ(_curveInfoQE[_curveInfoQE.Count - 2].X); pt1.Y = MapRealToPictE(_curveInfoQE[_curveInfoQE.Count - 2].Y); PointF pt2 = new PointF(); pt2.X = pt1.X + 10; pt2.Y = pt1.Y - 10; string title = "Q-η"; using (var font = new Font(_curveNameFontName, _curveNameSize, System.Drawing.FontStyle.Regular | System.Drawing.FontStyle.Bold)) { _graphics.DrawString(title, font, new SolidBrush(_curveColorQE), pt2); } } } //绘制功率曲线 protected void DrawCurveQP() { if (_curveInfoQP == null) return; DrawSingleCurveQP(_curveInfoQP, this._curveColorQP, this._curveWidth); DrawCurveLabelQP(); } protected virtual void DrawCurveLabelQP() { //画曲线标签 if (_isDispCurveName) { PointF pt1 = new PointF(); pt1.X = MapRealToPictQ(_curveInfoQP[_curveInfoQP.Count - 2].X); pt1.Y = MapRealToPictP(_curveInfoQP[_curveInfoQP.Count - 2].Y); PointF pt2 = new PointF(); pt2.X = pt1.X + 10; pt2.Y = pt1.Y - 10; string title = "Q-P"; using (var font = new Font(_curveNameFontName, _curveNameSize, System.Drawing.FontStyle.Regular | System.Drawing.FontStyle.Bold)) { _graphics.DrawString(title, font, new SolidBrush(_curveColorQP), pt2); } } } // protected void DrawSingleCurveQH( List curvePoints, System.Drawing.Color curveColor, float curveWidth, DashStyle DashStyle = DashStyle.Solid) { if (curvePoints == null || curvePoints.Count < 3) return; if (this._isMonoColor) curveColor = Color.Black; List picture_points = new List(); for (int i = 0; i < curvePoints.Count; i++) { PointF image_pt = new PointF(); image_pt.X = MapRealToPictQ(curvePoints[i].X); image_pt.Y = MapRealToPictH(curvePoints[i].Y); picture_points.Add(image_pt); } //去掉重曲线复点 //Point[] pointArray = screenPoints.Distinct().ToArray(); using (Pen pen = new Pen(curveColor, curveWidth)) { pen.DashStyle = DashStyle; //penMajorTick.DashPattern = new float[] { 3f, 3f }; _graphics.DrawCurve(pen, picture_points.ToArray()); } } // protected void DrawSingleCurveQE(List curvePoints, System.Drawing.Color curveColor, float curveWidth, DashStyle DashStyle = DashStyle.Solid) { if (curvePoints == null || curvePoints.Count < 3) return; if (this._isMonoColor) curveColor = Color.Black; List picture_points = new List(); for (int i = 0; i < curvePoints.Count; i++) { PointF image_pt = new PointF(); image_pt.X = MapRealToPictQ(curvePoints[i].X); image_pt.Y = MapRealToPictE(curvePoints[i].Y); picture_points.Add(image_pt); } //去掉重曲线复点 //Point[] pointArray = screenPoints.Distinct().ToArray(); using (Pen pen = new Pen(curveColor, curveWidth)) { pen.DashStyle = DashStyle; _graphics.DrawCurve(pen, picture_points.ToArray()); } } // protected void DrawSingleCurveQP(List curvePoints, System.Drawing.Color curveColor, float curveWidth, DashStyle DashStyle = DashStyle.Solid) { if (curvePoints == null || curvePoints.Count < 3) return; List picture_points = new List(); for (int i = 0; i < curvePoints.Count; i++) { PointF image_pt = new PointF(); image_pt.X = MapRealToPictQ(curvePoints[i].X); image_pt.Y = MapRealToPictP(curvePoints[i].Y); picture_points.Add(image_pt); } //去掉重曲线复点 //Point[] pointArray = screenPoints.Distinct().ToArray(); if (this._isMonoColor) curveColor = Color.Black; using (Pen pen = new Pen(curveColor, curveWidth)) { pen.DashStyle = DashStyle; _graphics.DrawCurve(pen, picture_points.ToArray()); } } // protected void DrawSingleCurveQNPSH(List curvePoints, System.Drawing.Color curveColor, float curveWidth, DashStyle DashStyle = DashStyle.Solid) { if (curvePoints == null || curvePoints.Count < 3) return; if (this._isMonoColor) curveColor = Color.Black; List picture_points = new List(); for (int i = 0; i < curvePoints.Count; i++) { PointF image_pt = new PointF(); image_pt.X = MapRealToPictQ(curvePoints[i].X); image_pt.Y = MapRealToPictNPSH(curvePoints[i].Y); picture_points.Add(image_pt); } //去掉重曲线复点 //Point[] pointArray = screenPoints.Distinct().ToArray(); using (Pen pen = new Pen(curveColor, curveWidth)) { pen.DashStyle = DashStyle; _graphics.DrawCurve(pen, picture_points.ToArray()); } } #endregion #region 测试点 protected void DrawAllPoint() { DrawPointQH(); DrawPointQE(); DrawPointQP(); DrawPointQNPSH(); } protected void DrawPointQH() { if (_pointInfoQH == null || _pointInfoQH.Count < 1) return; for (int i = 0; i < _pointInfoQH.Count; i++) { PointF pt = new PointF(); pt.X = MapRealToPictQ(_pointInfoQH[i].X); pt.Y = MapRealToPictH(_pointInfoQH[i].Y); DrawPoint_CircleStyle(pt, true, this._curveColorQH, this._curvePointSize, this._curvePointWidth); } } protected void DrawPointQE() { if (_pointInfoQE == null || _pointInfoQE.Count < 1) return; for (int i = 0; i < _pointInfoQE.Count; i++) { PointF pt = new PointF(); pt.X = MapRealToPictQ(_pointInfoQE[i].X); pt.Y = MapRealToPictE(_pointInfoQE[i].Y); DrawPoint_RectStyle(pt, true, _curveColorQE, this._curvePointSize, this._curvePointWidth); } } protected void DrawPointQP() { if (_pointInfoQP == null || _pointInfoQP.Count < 1) return; for (int i = 0; i < _pointInfoQP.Count; i++) { PointF pt = new PointF(); pt.X = MapRealToPictQ(_pointInfoQP[i].X); pt.Y = MapRealToPictP(_pointInfoQP[i].Y); DrawPoint_CrossStyle(pt, _curveColorQP, this._curvePointSize, this._curvePointWidth); } } protected void DrawPointQNPSH() { if (_points_TestNPSH == null || _points_TestNPSH.Count < 1) return; for (int i = 0; i < _points_TestNPSH.Count; i++) { PointF pt = new PointF(); pt.X = MapRealToPictQ(_points_TestNPSH[i].X); pt.Y = MapRealToPictNPSH(_points_TestNPSH[i].Y); DrawPoint_RectStyle(pt, true, _curveColorNPSH, this._curvePointSize, this._curvePointWidth); } } #endregion #region 最小流量线 Eventech.Model.FeatPointList _minFlowCurve; public Eventech.Model.FeatPointList MinFlowCurve { get { return _minFlowCurve; } set { _minFlowCurve = value; } } #endregion #region 型谱 //型谱颜色 protected Color _spectrumBackColor = Color.FromArgb(60, Color.Gray); //型谱形状 protected Eventech.Model.LxpSpectrumShape _spectrumShape = null; public Eventech.Model.LxpSpectrumShape SpectrumShape { get { return _spectrumShape; } set { _spectrumShape = value; } } //是否显示型谱 protected bool _isDispSpectrum = true; public bool IsDispSpectrum { get { return _isDispSpectrum; } set { _isDispSpectrum = value; } } #endregion #region 区域 protected Eventech.Model.LxpRegionPointParas _regionPointParas = null; public bool SetRegionParas(Eventech.Model.LxpPerformParas lxpPerformParas, Eventech.Model.LxpCurveGroupExpress wrkCurve) { if (lxpPerformParas == null || wrkCurve == null) return false; if (wrkCurve == null) return false; this._regionPointParas = new Eventech.Model.LxpRegionPointParas(); if (lxpPerformParas.PreferredRegionMin > 0.1) { this._regionPointParas.PerferRegionMin = new Eventech.Model.GroupPoint(); _regionPointParas.PerferRegionMin.Q = lxpPerformParas.PreferredRegionMin; _regionPointParas.PerferRegionMin.H = Math.Round(Eventech.Common.FitCurveHelper.GetFitPointY(wrkCurve.CurveExpressQH, lxpPerformParas.PreferredRegionMin), 1); _regionPointParas.PerferRegionMin.E = Math.Round(Eventech.Common.FitCurveHelper.GetFitPointY(wrkCurve.CurveExpressQE, lxpPerformParas.PreferredRegionMin), 1); _regionPointParas.PerferRegionMin.P = Math.Round(Eventech.Common.FitCurveHelper.GetFitPointY(wrkCurve.CurveExpressQP, lxpPerformParas.PreferredRegionMin), 2); if (wrkCurve.CurveExpressNPSH != null) { this._regionPointParas.PerferRegionMin.NPSH = Math.Round(Eventech.Common.FitCurveHelper.GetFitPointY(wrkCurve.CurveExpressNPSH, this._regionPointParas.PerferRegionMin.Q), 1); } } if (lxpPerformParas.PreferredRegionMax > 0.1) { this._regionPointParas.PerferRegionMax = new Eventech.Model.GroupPoint(); _regionPointParas.PerferRegionMax.Q = lxpPerformParas.PreferredRegionMax; _regionPointParas.PerferRegionMax.H = Math.Round(Eventech.Common.FitCurveHelper.GetFitPointY(wrkCurve.CurveExpressQH, lxpPerformParas.PreferredRegionMax), 1); _regionPointParas.PerferRegionMax.E = Math.Round(Eventech.Common.FitCurveHelper.GetFitPointY(wrkCurve.CurveExpressQE, lxpPerformParas.PreferredRegionMax), 1); _regionPointParas.PerferRegionMax.P = Math.Round(Eventech.Common.FitCurveHelper.GetFitPointY(wrkCurve.CurveExpressQP, lxpPerformParas.PreferredRegionMax), 2); if (wrkCurve.CurveExpressNPSH != null) { this._regionPointParas.PerferRegionMax.NPSH = Math.Round(Eventech.Common.FitCurveHelper.GetFitPointY(wrkCurve.CurveExpressNPSH, this._regionPointParas.PerferRegionMax.Q), 1); } } if (lxpPerformParas.AllowableRegionMin > 0.1) { this._regionPointParas.AllowRegionMin = new Eventech.Model.GroupPoint(); this._regionPointParas.AllowRegionMin.Q = lxpPerformParas.AllowableRegionMin; this._regionPointParas.AllowRegionMin.H = Math.Round(Eventech.Common.FitCurveHelper.GetFitPointY(wrkCurve.CurveExpressQH, lxpPerformParas.AllowableRegionMin), 1); this._regionPointParas.AllowRegionMin.E = Math.Round(Eventech.Common.FitCurveHelper.GetFitPointY(wrkCurve.CurveExpressQE, lxpPerformParas.AllowableRegionMin), 1); this._regionPointParas.AllowRegionMin.P = Math.Round(Eventech.Common.FitCurveHelper.GetFitPointY(wrkCurve.CurveExpressQP, lxpPerformParas.AllowableRegionMin), 2); if (wrkCurve.CurveExpressNPSH != null) { this._regionPointParas.AllowRegionMin.NPSH = Math.Round(Eventech.Common.FitCurveHelper.GetFitPointY(wrkCurve.CurveExpressNPSH, this._regionPointParas.AllowRegionMin.Q), 1); } } if (lxpPerformParas.AllowableRegionMax > 0.1) { this._regionPointParas.AllowRegionMax = new Eventech.Model.GroupPoint(); this._regionPointParas.AllowRegionMax.Q = lxpPerformParas.AllowableRegionMax; this._regionPointParas.AllowRegionMax.H = Math.Round(Eventech.Common.FitCurveHelper.GetFitPointY(wrkCurve.CurveExpressQH, lxpPerformParas.AllowableRegionMax), 1); this._regionPointParas.AllowRegionMax.E = Math.Round(Eventech.Common.FitCurveHelper.GetFitPointY(wrkCurve.CurveExpressQE, lxpPerformParas.AllowableRegionMax), 1); this._regionPointParas.AllowRegionMax.P = Math.Round(Eventech.Common.FitCurveHelper.GetFitPointY(wrkCurve.CurveExpressQP, lxpPerformParas.AllowableRegionMax), 2); if (wrkCurve.CurveExpressNPSH != null) { this._regionPointParas.AllowRegionMax.NPSH = Math.Round(Eventech.Common.FitCurveHelper.GetFitPointY(wrkCurve.CurveExpressNPSH, this._regionPointParas.AllowRegionMax.Q), 1); } } return true; } public bool SetRegionParas(Eventech.Model.LxpPerformParas lxpPerformParas, Eventech.Model.LxpFeatChartCurveGroup wrkCurve) { if (lxpPerformParas == null || wrkCurve == null) return false; this._regionPointParas = new Eventech.Model.LxpRegionPointParas(); this._regionPointParas.PerferRegionMax = new Eventech.Model.GroupPoint(); this._regionPointParas.PerferRegionMax.Q = lxpPerformParas.PreferredRegionMax; this._regionPointParas.PerferRegionMax.H = Math.Round(Eventech.Common.FitCurveHelper.GetFitPointY(wrkCurve.FeatCurveQH.CurveExpress, lxpPerformParas.PreferredRegionMax), 1); this._regionPointParas.PerferRegionMax.E = Math.Round(Eventech.Common.FitCurveHelper.GetFitPointY(wrkCurve.FeatCurveQE.CurveExpress, lxpPerformParas.PreferredRegionMax), 1); this._regionPointParas.PerferRegionMax.P = Math.Round(Eventech.Common.FitCurveHelper.GetFitPointY(wrkCurve.FeatCurveQP.CurveExpress, lxpPerformParas.PreferredRegionMax), 2); this._regionPointParas.PerferRegionMin = new Eventech.Model.GroupPoint(); this._regionPointParas.PerferRegionMin.Q = lxpPerformParas.PreferredRegionMin; this._regionPointParas.PerferRegionMin.H = Math.Round(Eventech.Common.FitCurveHelper.GetFitPointY(wrkCurve.FeatCurveQH.CurveExpress, lxpPerformParas.PreferredRegionMin), 1); this._regionPointParas.PerferRegionMin.E = Math.Round(Eventech.Common.FitCurveHelper.GetFitPointY(wrkCurve.FeatCurveQE.CurveExpress, lxpPerformParas.PreferredRegionMin), 1); this._regionPointParas.PerferRegionMin.P = Math.Round(Eventech.Common.FitCurveHelper.GetFitPointY(wrkCurve.FeatCurveQP.CurveExpress, lxpPerformParas.PreferredRegionMin), 2); this._regionPointParas.AllowRegionMax = new Eventech.Model.GroupPoint(); this._regionPointParas.AllowRegionMax.Q = lxpPerformParas.AllowableRegionMax; this._regionPointParas.AllowRegionMax.H = Math.Round(Eventech.Common.FitCurveHelper.GetFitPointY(wrkCurve.FeatCurveQH.CurveExpress, lxpPerformParas.AllowableRegionMax), 1); this._regionPointParas.AllowRegionMax.E = Math.Round(Eventech.Common.FitCurveHelper.GetFitPointY(wrkCurve.FeatCurveQE.CurveExpress, lxpPerformParas.AllowableRegionMax), 1); this._regionPointParas.AllowRegionMax.P = Math.Round(Eventech.Common.FitCurveHelper.GetFitPointY(wrkCurve.FeatCurveQP.CurveExpress, lxpPerformParas.AllowableRegionMax), 2); this._regionPointParas.AllowRegionMin = new Eventech.Model.GroupPoint(); this._regionPointParas.AllowRegionMin.Q = lxpPerformParas.AllowableRegionMin; this._regionPointParas.AllowRegionMin.H = Math.Round(Eventech.Common.FitCurveHelper.GetFitPointY(wrkCurve.FeatCurveQH.CurveExpress, lxpPerformParas.AllowableRegionMin), 1); this._regionPointParas.AllowRegionMin.E = Math.Round(Eventech.Common.FitCurveHelper.GetFitPointY(wrkCurve.FeatCurveQE.CurveExpress, lxpPerformParas.AllowableRegionMin), 1); this._regionPointParas.AllowRegionMin.P = Math.Round(Eventech.Common.FitCurveHelper.GetFitPointY(wrkCurve.FeatCurveQP.CurveExpress, lxpPerformParas.AllowableRegionMin), 2); if (wrkCurve.FeatCurveNPSH != null && wrkCurve.FeatCurveNPSH.CurveExpress != null) { this._regionPointParas.AllowRegionMin.NPSH = Math.Round(Eventech.Common.FitCurveHelper.GetFitPointY(wrkCurve.FeatCurveNPSH.CurveExpress, this._regionPointParas.AllowRegionMin.Q), 1); this._regionPointParas.AllowRegionMax.NPSH = Math.Round(Eventech.Common.FitCurveHelper.GetFitPointY(wrkCurve.FeatCurveNPSH.CurveExpress, this._regionPointParas.AllowRegionMax.Q), 1); this._regionPointParas.PerferRegionMin.NPSH = Math.Round(Eventech.Common.FitCurveHelper.GetFitPointY(wrkCurve.FeatCurveNPSH.CurveExpress, this._regionPointParas.PerferRegionMin.Q), 1); this._regionPointParas.PerferRegionMax.NPSH = Math.Round(Eventech.Common.FitCurveHelper.GetFitPointY(wrkCurve.FeatCurveNPSH.CurveExpress, this._regionPointParas.PerferRegionMax.Q), 1); } return true; } public bool SetRegionParas(Eventech.Model.LxpRegionPointParas regionPointParas) { _regionPointParas = regionPointParas; return true; } //最优区域(是否显示) protected bool _isDispRegionPrefer = false; public bool IsDispRegionPrefer { get { return _isDispRegionPrefer; } set { _isDispRegionPrefer = value; } } //允许区域(是否显示) protected bool _isDispRegionAllow = false; public bool IsDispRegionAllow { get { return _isDispRegionAllow; } set { _isDispRegionAllow = value; } } #endregion } }