using DevExpress.Utils; using DevExpress.XtraCharts; using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Drawing.Drawing2D; using System.Linq; using System.Windows.Forms; namespace TProduct.WinFrmUI.TPump { public partial class ChartLxpMultiCurveExCtrl : DevExpress.XtraEditors.XtraUserControl, Eventech.Model.IDispOperateInfo { public event Eventech.Model.DispOperateInfoHandler OnDispOperateInfo = null; //public event TagEventHandler OnChangeQueryPtStatus = null; //泵的曲线 private List AllCurveQH = new List(); private List AllCurveQE = new List(); private List AllCurveQP = new List(); private List AllCurveNPSH = new List(); private Dictionary SeriesGuidDict = new Dictionary(); private Dictionary AnnoGuidDict_QH = new Dictionary(); private Dictionary AnnoGuidDict_QP = new Dictionary(); public List GetAllCurveQH() { return AllCurveQH; } public List GetAllCurveQE() { return AllCurveQE; } public List GetAllCurveQP() { return AllCurveQP; } public List GetAllCurveNPSH() { return AllCurveNPSH; } private bool IsDisplayCurveQE = true; #region CHART变量 // private DevExpress.XtraCharts.XYDiagram mainChartDiagram = null; private DevExpress.XtraCharts.XYDiagramPane bottomChartDiagram = null; private DevExpress.XtraCharts.Series QueryLineHorizontal = null; private DevExpress.XtraCharts.TextAnnotation QueryParaInfoText = null; private DevExpress.XtraCharts.ConstantLine QueryLineVertical = null; private DevExpress.XtraCharts.ConstantLine refConstantLineH = null; private DevExpress.XtraCharts.Strip StripWorkRegion = null; // private AxisX AxisQ = null; private AxisY QHAxisY = null; private SecondaryAxisY QEAxisY = null; private SecondaryAxisY QPAxisY = null; private SecondaryAxisY NPSHAxisY = null; private double _maxQ = 0, _minQ = 1000; private double _maxH = 0, _minH = 1000; private double _maxE = 100, _minE = 0; private double _maxP = 0, _minP = 1000; private double _maxNPSH = 0, _minNPSH = 1000; //获取的最小扬程 用于计算坐标时放小的倍率 private double _scaleMinH = 1; public double ChartScaleMinH { get { return _scaleMinH; } set { _scaleMinH = value; } } private double _scaleMaxH = 1; public double ChartScaleMaxH { get { return _scaleMaxH; } set { _scaleMaxH = value; } } #endregion CHART变量 #region 构造函数和加载函数 public ChartLxpMultiCurveExCtrl() { InitializeComponent(); InitialChart(); } private void LoadWindow(object sender, EventArgs e) { // this.SizeChanged += new System.EventHandler(this.OnFrmSizeChanged); SetChartDisplay(); SetAxisTitle(); LocationDialog(); } //翻译界面语言 private void LocationDialog() { if (TProduct.UserSetting.Localization.IsCN) return; this.查询曲线参数MenuItem.Text = TProduct.UserSetting.Localization.TranslateHelper.GetString("查询曲线参数"); this.设置曲线标签显示MenuItem.Text = TProduct.UserSetting.Localization.TranslateHelper.GetString("设置曲线标签"); this.设置图形显示Menu.Text = TProduct.UserSetting.Localization.TranslateHelper.GetString("设置图表显示"); this.调整坐标系Menu.Text = TProduct.UserSetting.Localization.TranslateHelper.GetString("设置图表坐标"); this.设置坐标AxisMenuItem.Text = TProduct.UserSetting.Localization.TranslateHelper.GetString("设置坐标"); this.显示坐标标签ItemMenu.Text = TProduct.UserSetting.Localization.TranslateHelper.GetString("显示坐标标签"); this.设置颜色AxisMenuItem.Text = TProduct.UserSetting.Localization.TranslateHelper.GetString("设置颜色"); this.颜色交织AxisMenuItem.Text = TProduct.UserSetting.Localization.TranslateHelper.GetString("颜色交织"); this.设置子刻度数AxisMenuItem.Text = TProduct.UserSetting.Localization.TranslateHelper.GetString("设置子刻度数"); this.MenuItemAnno修改内容.Text = TProduct.UserSetting.Localization.TranslateHelper.GetString("修改名称"); this.MenuItemAnno设置文字颜色.Text = TProduct.UserSetting.Localization.TranslateHelper.GetString("设置文字颜色"); this.MenuItemAnno设置背景色.Text = TProduct.UserSetting.Localization.TranslateHelper.GetString("设置背景色"); this.MenuItemAnno设置背景透明.Text = TProduct.UserSetting.Localization.TranslateHelper.GetString("设置背景透明"); this.设置颜色SeriesMenuItem.Text = TProduct.UserSetting.Localization.TranslateHelper.GetString("设置颜色"); this.设置宽度SeriesMenuItem.Text = TProduct.UserSetting.Localization.TranslateHelper.GetString("设置宽度"); this.设置线型SeriesMenuItem.Text = TProduct.UserSetting.Localization.TranslateHelper.GetString("设置线型"); this.设置颜色LineMenuItem.Text = TProduct.UserSetting.Localization.TranslateHelper.GetString("设置颜色"); this.设置值LineMenuItem.Text = TProduct.UserSetting.Localization.TranslateHelper.GetString("设置值"); //this.曲线显示ToolStripMenuItem.Text = TProduct.UserSetting.Localization.TranslateHelper.GetString("设置曲线显示"); //this.流量扬程曲线DispMenuItem.Text = TProduct.UserSetting.Localization.TranslateHelper.GetString("流量扬程曲线"); //this.流量效率曲线DispMenuItem.Text = TProduct.UserSetting.Localization.TranslateHelper.GetString("流量效率曲线"); //this.流量功率曲线DispMenuItem.Text = TProduct.UserSetting.Localization.TranslateHelper.GetString("流量功率曲线"); //this.流量汽蚀曲线DispMenuItem.Text = TProduct.UserSetting.Localization.TranslateHelper.GetString("流量汽蚀曲线"); } private void OnFrmSizeChanged(object sender, EventArgs e) { if (_isAutoPadding) { if (this.Width > 700) { SetChartPadding(false); } else { SetChartPadding(true); } } } private bool _isAutoPadding = false; public bool IsAutoPadding { set { _isAutoPadding = value; } get { return _isAutoPadding; } } public void SetChartPadding(bool isNonePadding) { if (!isNonePadding) { int space = (int)((this.Width - 680) * 0.4); this.Padding = new System.Windows.Forms.Padding(space, 5, space, 5); } else { this.Padding = new System.Windows.Forms.Padding(5, 5, 5, 5); } } private void InitialChart() { mainChartDiagram = (XYDiagram)chartControl1.Diagram; for (int i = 0; i < mainChartDiagram.Panes.Count; i++) { var panel = mainChartDiagram.Panes[i]; if (panel.Name == "PaneBottom") { bottomChartDiagram = panel; } } AxisQ = mainChartDiagram.AxisX; QHAxisY = mainChartDiagram.AxisY; QEAxisY = mainChartDiagram.SecondaryAxesY.GetAxisByName("QEAxisY"); QPAxisY = mainChartDiagram.SecondaryAxesY.GetAxisByName("QPAxisY"); NPSHAxisY = mainChartDiagram.SecondaryAxesY.GetAxisByName("NPSHAxisY"); AxisQ.NumericScaleOptions.AutoGrid = false; AxisQ.VisualRange.Auto = false; QHAxisY.VisualRange.Auto = false; QHAxisY.NumericScaleOptions.AutoGrid = false; QEAxisY.VisualRange.Auto = false; QEAxisY.NumericScaleOptions.AutoGrid = false; QPAxisY.VisualRange.Auto = false; QPAxisY.NumericScaleOptions.AutoGrid = false; NPSHAxisY.VisualRange.Auto = false; NPSHAxisY.NumericScaleOptions.AutoGrid = false; QueryLineHorizontal = chartControl1.Series["QueryLineHorizontal"]; QueryLineHorizontal.Visible = false; QueryLineHorizontal.CrosshairHighlightPoints = DefaultBoolean.False; QueryLineHorizontal.CrosshairEnabled = DefaultBoolean.False; QueryLineVertical = (DevExpress.XtraCharts.ConstantLine)mainChartDiagram.AxisX.ConstantLines.GetElementByName("refConstantLineQ"); QueryLineVertical.Visible = false; refConstantLineH = (DevExpress.XtraCharts.ConstantLine)mainChartDiagram.AxisY.ConstantLines.GetElementByName("refConstantLineH"); refConstantLineH.Visible = false; QueryParaInfoText = chartControl1.AnnotationRepository[0] as DevExpress.XtraCharts.TextAnnotation; QueryParaInfoText.Visible = false; StripWorkRegion = AxisQ.Strips.GetStripByName("StripWorkRegion"); StripWorkRegion.Visible = false; //设置此属性 this.chartControl1.SelectionMode = ElementSelectionMode.Single;// = true;// 表示可以选择CHART上物体 //this.chartControl1.SeriesSelectionMode = SeriesSelectionMode.Point;//系列选择是选择其中的点而不是整个系列 this.chartControl1.SeriesSelectionMode = SeriesSelectionMode.Series; //添加事件 this.chartControl1.CustomPaint += new DevExpress.XtraCharts.CustomPaintEventHandler(this.chartControl_CustomPaint); this.chartControl1.ObjectHotTracked += new DevExpress.XtraCharts.HotTrackEventHandler(this.chartControl1_ObjectHotTracked); ////this.chartControl1.MouseLeave += new System.EventHandler(this.chartControl1_MouseLeave); this.chartControl1.MouseMove += new System.Windows.Forms.MouseEventHandler(this.chartControl_MouseMove); this.chartControl1.MouseUp += new System.Windows.Forms.MouseEventHandler(this.chartControl_MouseUp); this.chartControl1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.chartControl_MouseDown); this.chartControl1.MouseClick += new System.Windows.Forms.MouseEventHandler(this.chartControl_MouseClick); this.chartControl1.LegendItemChecked += new DevExpress.XtraCharts.LegendItemCheckedEventHandler(this.chartControl1_LegendItemChecked); } private void SetAxisTitle() { //TProduct.WinFrmUI.TPump.XtraChartHelper.SetTitle(AxisQ, // string.Format("{0}({1})", // TProduct.UserSetting.Localization.TranslateHelper.GetString("流量"), // Eventech.Common.UnitQHelper.GetEnUnitName(_coordinate_unitQ))); //if (_coordinate_unitH == Eventech.Model.UnitH.MPa || _coordinate_unitH == Eventech.Model.UnitH.KPa) //{ // TProduct.WinFrmUI.TPump.XtraChartHelper.SetTitle(QHAxisY, // string.Format("{0}({1})", // TProduct.UserSetting.Localization.TranslateHelper.GetString("压力"), // Eventech.Common.UnitHHelper.GetEnUnitName(_coordinate_unitH))); //} //else //{ // TProduct.WinFrmUI.TPump.XtraChartHelper.SetTitle(QHAxisY, // string.Format("{0}({1})", // TProduct.UserSetting.Localization.TranslateHelper.GetString("扬程"), // Eventech.Common.UnitHHelper.GetEnUnitName(_coordinate_unitH))); //} //TProduct.WinFrmUI.TPump.XtraChartHelper.SetTitle(NPSHAxisY, string.Format("{0}({1})", // TProduct.UserSetting.Localization.TranslateHelper.GetString("汽蚀"), // "m")); //if (_seriesEntity != null) //{ // TProduct.WinFrmUI.TPump.XtraChartHelper.SetTitle(QEAxisY, string.Format("{0}(%)", // TProduct.UserSetting.Localization.TranslateHelper.GetString(_seriesEntity.GetEtaTextName(TProduct.UserSetting.Localization.Current)), TProduct.CorpSetting.Chart.AbbreviateTextE)); // TProduct.WinFrmUI.TPump.XtraChartHelper.SetTitle(QPAxisY, string.Format("{0}({1})", // TProduct.UserSetting.Localization.TranslateHelper.GetString(_seriesEntity.GetPowerTextName(TProduct.UserSetting.Localization.Current)), // Eventech.Common.UnitPHelper.GetEnUnitName(_coordinate_unitP))); //} //else //{ // TProduct.WinFrmUI.TPump.XtraChartHelper.SetTitle(QEAxisY, TProduct.CorpSetting.Chart.AbbreviateTextE + "(%)"); // TProduct.WinFrmUI.TPump.XtraChartHelper.SetTitle(QPAxisY, string.Format("{0}({1})", // TProduct.UserSetting.Localization.TranslateHelper.GetString("功率"), // Eventech.Common.UnitPHelper.GetEnUnitName(_coordinate_unitP))); //} } #endregion 构造函数和加载函数 #region 坐标单位 protected Eventech.Model.UnitQ _queryInfo_unitQ = Eventech.Model.UnitQ.M3H; protected Eventech.Model.UnitH _queryInfo_unitH = Eventech.Model.UnitH.M;//图表查询用的单位 protected Eventech.Model.UnitQ _unit_design_point_Q = Eventech.Model.UnitQ.M3H; protected Eventech.Model.UnitH _unit_design_point_H = Eventech.Model.UnitH.M; //注意即使改了单位,曲线里面的数据没有变,只变化了图表的坐标显示 protected Eventech.Model.UnitQ _coordinate_unitQ = Eventech.Model.UnitQ.M3H; protected Eventech.Model.UnitH _coordinate_unitH = Eventech.Model.UnitH.M; protected Eventech.Model.UnitP _coordinate_unitP = Eventech.Model.UnitP.KW; protected Eventech.Model.UnitH _coordinate_unitNPSH = Eventech.Model.UnitH.M; public Eventech.Model.UnitH CoordinateUnitH { get { return _coordinate_unitH; } } public Eventech.Model.UnitQ CoordinateUnitQ { get { return _coordinate_unitQ; } } public Eventech.Model.UnitP CoordinateUnitP { get { return _coordinate_unitP; } } public Eventech.Model.UnitH CoordinateUnitNPSH { get { return _coordinate_unitNPSH; } } public void SetUnit(Eventech.Model.UnitQ unit_q, Eventech.Model.UnitH unit_h, Eventech.Model.UnitP unit_p, Eventech.Model.UnitH unitNPSH) { this._coordinate_unitH = unit_h; this._unit_design_point_H = unit_h; this._queryInfo_unitH = unit_h; this._coordinate_unitQ = unit_q; this._queryInfo_unitQ = unit_q; this._unit_design_point_Q = unit_q; this._coordinate_unitP = unit_p; this._coordinate_unitNPSH = unitNPSH; } //改变单位只改变了坐标显示,其他都没变 public double CalcDispValueQ(double q) { if (_coordinate_unitQ == Eventech.Model.UnitQ.M3H) return q; return Math.Round(Eventech.Common.UnitQHelper.fromM3H(_coordinate_unitQ, q), 2); } public string CalcDispValueQ_STR(double q) { if (_coordinate_unitQ != Eventech.Model.UnitQ.M3H) { q = Eventech.Common.UnitQHelper.fromM3H(_coordinate_unitQ, q); } if (q < 9) return q.ToString("N2"); else return q.ToString("N1"); } public string CalcDispValueQ_STR(Eventech.Model.UnitQ UnitQ, double q) { if (_coordinate_unitQ != Eventech.Model.UnitQ.M3H) { q = Eventech.Common.UnitQHelper.fromM3H(UnitQ, q); } if (q < 5) return q.ToString("N2"); else return q.ToString("N1"); } public double CalcDataValueQ(double q) { if (_coordinate_unitQ == Eventech.Model.UnitQ.M3H) return q; return Eventech.Common.UnitQHelper.toM3H(_coordinate_unitQ, q); } public double CalcDispValueH(double h) { if (_coordinate_unitH == Eventech.Model.UnitH.M) return h; else if (_coordinate_unitH == Eventech.Model.UnitH.MPa) return Math.Round(Eventech.Common.UnitHHelper.fromM2(_coordinate_unitH, h), 4); else return Math.Round(Eventech.Common.UnitHHelper.fromM(_coordinate_unitH, h), 2); } public string CalcDispValueH_STR(double h) { if (_coordinate_unitH == Eventech.Model.UnitH.M) return Math.Round(h, 1).ToString(); else if (_coordinate_unitH == Eventech.Model.UnitH.MPa) return Math.Round(Eventech.Common.UnitHHelper.fromM2(_coordinate_unitH, h), 4).ToString(); else { var v = Eventech.Common.UnitHHelper.fromM2(_coordinate_unitH, h); if (v > 100) return Math.Round(v, 0).ToString(); else if (v > 10) return Math.Round(v, 1).ToString(); else return Math.Round(v, 2).ToString(); } } public string CalcDispValueH_STR(Eventech.Model.UnitH UnitH, double h) { if (UnitH == Eventech.Model.UnitH.M) return Math.Round(h, 1).ToString(); else if (UnitH == Eventech.Model.UnitH.MPa) return Math.Round(Eventech.Common.UnitHHelper.fromM2(UnitH, h), 4).ToString(); else { var v = Eventech.Common.UnitHHelper.fromM2(UnitH, h); if (v > 100) return Math.Round(v, 0).ToString(); else if (v > 10) return Math.Round(v, 1).ToString(); else return Math.Round(v, 2).ToString(); } } public double CalcDataValueH(double h) { if (_coordinate_unitH == Eventech.Model.UnitH.M) return h; else if (_coordinate_unitH == Eventech.Model.UnitH.MPa) return Math.Round(Eventech.Common.UnitHHelper.toM2(_coordinate_unitH, h), 4); else return Math.Round(Eventech.Common.UnitHHelper.toM(_coordinate_unitH, h), 2); } public double CalcDispValueP(double power) { if (_coordinate_unitP == Eventech.Model.UnitP.KW) return TProduct.Common.RoundHelper.GetDispValuePower(power); return TProduct.Common.RoundHelper.GetDispValuePower(Eventech.Common.UnitPHelper.fromKW(_coordinate_unitP, power)); } public double CalcDataValueP(double power) { if (_coordinate_unitP == Eventech.Model.UnitP.KW) return power; return Math.Round(Eventech.Common.UnitPHelper.toKW(_coordinate_unitP, power), 3); } public double CalcDispValueNPSH(double npsh) { if (_coordinate_unitNPSH == Eventech.Model.UnitH.M) { return TProduct.Common.RoundHelper.GetDispValuePower(npsh); } var npsh2 = Eventech.Common.UnitHHelper.fromM2(_coordinate_unitNPSH, npsh); return TProduct.Common.RoundHelper.GetDispValuePower(npsh2); } #endregion 坐标单位 #region 获取曲线的随机颜色 private static List ColorArray = new List() { Color.Red, Color.Blue, Color.Green, Color.DodgerBlue,Color.Fuchsia,Color.MidnightBlue,Color.Maroon, Color.Aquamarine, Color.Bisque ,Color.BurlyWood }; public static Color GetCurveColor(int index) { return index < ColorArray.Count ? ColorArray[index] : GetRandomColor(); } public static Color GetRandomColor() { Random RandomNum_First = new Random((int)DateTime.Now.Ticks); int int_Red = RandomNum_First.Next(256); Random RandomNum_Sencond = new Random((int)DateTime.Now.Ticks); int int_Green = RandomNum_Sencond.Next(256); int int_Blue = RandomNum_Sencond.Next(256); return Color.FromArgb(int_Red, int_Green, int_Blue); } #endregion 获取曲线的随机颜色 #region 设置曲线 //添加曲线 public void AddFeatCurve(Eventech.Model.CurveDispParasEx curve) { if (curve == null || curve.CurveInfo == null) return; if (curve.CurveType == Eventech.Model.eFeatCurveType.QH) { AllCurveQH.Add(curve); } if (curve.CurveType == Eventech.Model.eFeatCurveType.QE) { AllCurveQE.Add(curve); } if (curve.CurveType == Eventech.Model.eFeatCurveType.QP) { AllCurveQP.Add(curve); } if (curve.CurveType == Eventech.Model.eFeatCurveType.QNPSH) { AllCurveNPSH.Add(curve); } } public void SetCurveColorByGroupID(Guid id, Color color) { if (this.AllCurveQH != null) foreach (var curve in AllCurveQH) { if (curve.GroupID == id) { curve.CurveColor = color; if (AnnoGuidDict_QH.ContainsKey(curve.CurveID)) AnnoGuidDict_QH[curve.CurveID].TextColor = color; } } if (this.AllCurveQE != null) foreach (var curve in AllCurveQE) { if (curve.GroupID == id) { curve.CurveColor = color; } } if (this.AllCurveQP != null) foreach (var curve in AllCurveQP) { if (curve.GroupID == id) { curve.CurveColor = color; if (AnnoGuidDict_QP.ContainsKey(curve.CurveID)) AnnoGuidDict_QP[curve.CurveID].TextColor = color; } } if (this.AllCurveNPSH != null) foreach (var curve in this.AllCurveNPSH) { if (curve.GroupID == id) { curve.CurveColor = color; } } UpdateAllCurve(); } public void SetCurveParaByGroupID(Guid id, string CurvePara, bool isRefresh) { if (this.AllCurveQH != null) foreach (var curve in AllCurveQH) { if (curve.GroupID == id) { curve.CurvePara = CurvePara; if (AnnoGuidDict_QH.ContainsKey(curve.CurveID)) AnnoGuidDict_QH[curve.CurveID].Text = CurvePara; } } if (this.AllCurveQE != null) foreach (var curve in AllCurveQE) { if (curve.GroupID == id) { curve.CurvePara = CurvePara; } } if (this.AllCurveQP != null) foreach (var curve in AllCurveQP) { if (curve.GroupID == id) { curve.CurvePara = CurvePara; if (AnnoGuidDict_QP.ContainsKey(curve.CurveID)) AnnoGuidDict_QP[curve.CurveID].Text = CurvePara; } } if (this.AllCurveNPSH != null) foreach (var curve in this.AllCurveNPSH) { if (curve.GroupID == id) { curve.CurvePara = CurvePara; } } if (AnnoGuidDict_QH.ContainsKey(id)) { AnnoGuidDict_QH[id].Text = CurvePara; } if (AnnoGuidDict_QP.ContainsKey(id)) { AnnoGuidDict_QP[id].Text = CurvePara; } //if (isRefresh) // UpdateAllCurve(); } public void SetCurveInfoByGroupID(Guid id, string CurvePara, Eventech.Model.LxpCurveGroupExpress curveGrpExpress) { if (this.AllCurveQH != null) foreach (var curve in AllCurveQH) { if (curve.GroupID == id) { curve.CurvePara = CurvePara; curve.CurveExpress = curveGrpExpress.CurveExpressQH; curve.CurveInfo = Eventech.Common.CurveExpressConver.ToPoints(curveGrpExpress.CurveExpressQH, 16); if (AnnoGuidDict_QH.ContainsKey(curve.CurveID)) AnnoGuidDict_QH[curve.CurveID].Text = CurvePara; } } if (this.AllCurveQE != null) foreach (var curve in AllCurveQE) { if (curve.GroupID == id) { curve.CurvePara = CurvePara; curve.CurveExpress = curveGrpExpress.CurveExpressQE; curve.CurveInfo = Eventech.Common.CurveExpressConver.ToPoints(curveGrpExpress.CurveExpressQE, 16); } } if (this.AllCurveQP != null) foreach (var curve in AllCurveQP) { if (curve.GroupID == id) { curve.CurvePara = CurvePara; curve.CurveExpress = curveGrpExpress.CurveExpressQP; curve.CurveInfo = Eventech.Common.CurveExpressConver.ToPoints(curveGrpExpress.CurveExpressQP, 16); if (AnnoGuidDict_QP.ContainsKey(curve.CurveID)) AnnoGuidDict_QP[curve.CurveID].Text = CurvePara; } } if (this.AllCurveNPSH != null) foreach (var curve in this.AllCurveNPSH) { if (curve.GroupID == id) { curve.CurvePara = CurvePara; curve.CurveExpress = curveGrpExpress.CurveExpressNPSH; curve.CurveInfo = Eventech.Common.CurveExpressConver.ToPoints(curveGrpExpress.CurveExpressNPSH, 16); } } if (AnnoGuidDict_QH.ContainsKey(id)) { AnnoGuidDict_QH[id].Text = CurvePara; } if (AnnoGuidDict_QP.ContainsKey(id)) { AnnoGuidDict_QP[id].Text = CurvePara; } } //清理曲线 public void RemoveCurveByGroupID(Guid id) { var qh = from x in AllCurveQH where x.GroupID == id select x; if (qh.Count() != 0) { var c = qh.First(); AllCurveQH.Remove(c); if (AnnoGuidDict_QH.ContainsKey(c.CurveID)) this.chartControl1.AnnotationRepository.Remove(AnnoGuidDict_QH[c.CurveID]); //if (AnnoGuidDict_QP.ContainsKey(c.CurveID)) // this.chartControl1.AnnotationRepository.Remove(AnnoGuidDict_QP[c.CurveID]); if (SeriesGuidDict.ContainsKey(c.CurveID)) this.chartControl1.Series.Remove(SeriesGuidDict[c.CurveID]); } if (AllCurveQE != null) { var qe = from x in AllCurveQE where x.GroupID == id select x; if (qe.Count() != 0) { var c = qe.First(); AllCurveQE.Remove(c); //if (AnnoGuidDict_QH.ContainsKey(c.CurveID)) // this.chartControl1.AnnotationRepository.Remove(AnnoGuidDict_QH[c.CurveID]); //if (AnnoGuidDict_QP.ContainsKey(c.CurveID)) // this.chartControl1.AnnotationRepository.Remove(AnnoGuidDict_QP[c.CurveID]); if (SeriesGuidDict.ContainsKey(c.CurveID)) this.chartControl1.Series.Remove(SeriesGuidDict[c.CurveID]); } } if (AllCurveQP != null) { var qp = from x in AllCurveQP where x.GroupID == id select x; if (qp.Count() != 0) { var c = qp.First(); AllCurveQP.Remove(c); if (AnnoGuidDict_QP.ContainsKey(c.CurveID)) this.chartControl1.AnnotationRepository.Remove(AnnoGuidDict_QP[c.CurveID]); if (SeriesGuidDict.ContainsKey(c.CurveID)) this.chartControl1.Series.Remove(SeriesGuidDict[c.CurveID]); } } if (AllCurveNPSH != null) { var np = from x in AllCurveNPSH where x.GroupID == id select x; if (np.Count() != 0) { var c = np.First(); AllCurveNPSH.Remove(c); //if (AnnoGuidDict.ContainsKey(c.CurveID)) // this.chartControl1.AnnotationRepository.Remove(AnnoGuidDict[c.CurveID]); if (SeriesGuidDict.ContainsKey(c.CurveID)) this.chartControl1.Series.Remove(SeriesGuidDict[c.CurveID]); } } } public void ClearAllCurves() { AllCurveQH.Clear(); AllCurveQE.Clear(); AllCurveQP.Clear(); AllCurveNPSH.Clear(); ClearCurveSeries(); } private void ClearCurveSeries() { foreach (var series in SeriesGuidDict.Values) { this.chartControl1.Series.Remove(series); } foreach (var anno in AnnoGuidDict_QH.Values) { this.chartControl1.AnnotationRepository.Remove(anno); } foreach (var anno in AnnoGuidDict_QP.Values) { this.chartControl1.AnnotationRepository.Remove(anno); } AnnoGuidDict_QH.Clear(); AnnoGuidDict_QP.Clear(); SeriesGuidDict.Clear(); //for (int i = this.chartControl1.SeriesSerializable.Count() - 1; i >= 0; i--) //{ // var series = this.chartControl1.Series[i];//.RemoveAt(iExcelCol); // if (series.Name == "QueryLineHorizontal") // continue; // if (series.Name.StartsWith("QH_") || series.Name.StartsWith("QE_") || series.Name.StartsWith("QP_") || series.Name.StartsWith("QNPSH_")) // { // i++; // if (i > this.chartControl1.SeriesSerializable.Count() - 1) // i = this.chartControl1.SeriesSerializable.Count() - 1; // this.chartControl1.Series.Remove(series); // } //} //for (int i = this.chartControl1.AnnotationRepository.Count - 1; i >= 0; i--) //{ // var anno = this.chartControl1.AnnotationRepository[i]; // if (anno.Name == "QueryParaInfoText") // continue; // if (anno.Name.StartsWith("QH_") || anno.Name.StartsWith("QE_") || anno.Name.StartsWith("QP_") || anno.Name.StartsWith("QNPSH_")) // { // i++; // if (i > this.chartControl1.AnnotationRepository.Count - 1) // i = this.chartControl1.AnnotationRepository.Count - 1; // this.chartControl1.AnnotationRepository.Remove(anno); // } //} } #endregion 设置曲线 #region 泵信息 protected Eventech.Model.eChartType _chartType = Eventech.Model.eChartType.BaoLuo; protected bool _isMeter = true; #endregion 泵信息 #region 设计点 private List _designPointList = new List();//可以显示多个设计点 private Eventech.Model.eDesignPointDispType _desginPointSyle = Eventech.Model.eDesignPointDispType.LeftDownHalfCross; public Eventech.Model.eDesignPointDispType DesginPointSyle { get { return _desginPointSyle; } set { _desginPointSyle = value; } } public Eventech.Model.FeatPoint GetDefaultDesignPoint() { return _designPointList.FirstOrDefault(); } public List GetDesignPoints() { return _designPointList; } //添加设计点(可以加入,显示多个设计点) public void AddDesignPoint(Eventech.Model.FeatPoint pt) { if (pt == null) return; _designPointList.Add(pt); } public void RemoveDesignPoint(Eventech.Model.FeatPoint pt) { if (pt == null) return; if (_designPointList == null || _designPointList.Count() == 0) return; foreach (var p in _designPointList) { if (Math.Abs(p.X - pt.X) < 0.1 && Math.Abs(p.Y - pt.Y) < 0.1) { _designPointList.Remove(p); return;//删掉后返回 } } } public void AddDesignPoint(decimal ptQ, decimal ptH) { _designPointList.Add(new Eventech.Model.FeatPoint(ptQ, ptH)); } public void AddDesignPoint(double ptQ, double ptH) { _designPointList.Add(new Eventech.Model.FeatPoint(ptQ, ptH)); } public void ClearDesignPoint() { _designPointList.Clear(); } #endregion 设计点 #region 查询点 //是否可以查询曲线参数 private bool _isQueryCurvePara = false; public bool IsQueryCurvePara { set { _isQueryCurvePara = value; QueryLineVertical.Visible = _isQueryCurvePara; QueryLineVertical.Title.Visible = _isQueryCurvePara; QueryParaInfoText.Visible = _isQueryCurvePara; QueryLineHorizontal.Visible = _isQueryCurvePara; } get { return _isQueryCurvePara; } } #endregion 查询点 #region 获取曲线 public List GetDefaultCurveInfoQE() { return null; } public List GetDefaultCurveInfoQP() { return null; } public List GetDefaultCurveInfoNPSH() { return null; } #endregion 获取曲线 #region 坐标 private Eventech.Model.LxpCoordinateParas _coordinateParas = null; public void SetCoordinate(Eventech.Model.LxpCoordinateParas coordinateParas) { this._coordinateParas = coordinateParas; if (coordinateParas != null) { SetChartPanelStyle(); } } //计算最大最小值 private void CalcCoordLimit() { _maxQ = 0; _minQ = 10000; _maxH = 0; _minH = 10000; _maxE = 0; _minE = 0; _maxP = 0; _minP = 1000; _maxNPSH = 0; _minNPSH = 1000; foreach (Eventech.Model.CurveDispParasEx info in AllCurveQH) { var xxx = info.CurveInfo.Select(x => x.X); var yyy = info.CurveInfo.Select(x => x.Y); _minQ = Math.Min(_minQ, xxx.Min()); _maxQ = Math.Max(_maxQ, xxx.Max()); _minH = Math.Min(_minH, yyy.Min()); _maxH = Math.Max(_maxH, yyy.Max()); } foreach (Eventech.Model.CurveDispParasEx info in AllCurveQE) { var xxx = info.CurveInfo.Select(x => x.X); var yyy = info.CurveInfo.Select(x => x.Y); _minQ = Math.Min(_minQ, xxx.Min()); _maxQ = Math.Max(_maxQ, xxx.Max()); //minE = Math.Min(minE, (from posi_off in pumpStr.CurveQE select posi_off.Y).Min()); _maxE = Math.Max(_maxE, yyy.Max()); } foreach (Eventech.Model.CurveDispParasEx info in AllCurveQP) { var xxx = info.CurveInfo.Select(x => x.X); var yyy = info.CurveInfo.Select(x => x.Y); _minQ = Math.Min(_minQ, xxx.Min()); _maxQ = Math.Max(_maxQ, xxx.Max()); _minP = Math.Min(_minP, yyy.Min()); _maxP = Math.Max(_maxP, yyy.Max()); } foreach (Eventech.Model.CurveDispParasEx info in AllCurveNPSH) { var xxx = info.CurveInfo.Select(x => x.X); var yyy = info.CurveInfo.Select(x => x.Y); _minQ = Math.Min(_minQ, xxx.Min()); _maxQ = Math.Max(_maxQ, xxx.Max()); _minNPSH = Math.Min(_minNPSH, yyy.Min()); _maxNPSH = Math.Max(_maxNPSH, yyy.Max()); } } //计算坐标 public void CalcCoordinate() { // _coordinateParas = null; if (AllCurveQH == null || AllCurveQH.Count() == 0) return; // CalcCoordLimit(); _coordinateParas = Eventech.Common.CoordinateHelper.CalcCoordinate( _minQ, _maxQ, this._coordinate_unitQ, _minH * _scaleMinH, _maxH * _scaleMaxH, this._coordinate_unitH, _minE, _maxE, _minP, _maxP, this._coordinate_unitP, _minNPSH, _maxNPSH); if (_coordinateParas == null) return; if (_coordinateParas.CoordMinQ + _coordinateParas.CoordSpaceQ * this._coordinateParas.GridNumberX < _maxQ * 1.05) { _coordinateParas.GridNumberX++; } if (QueryLineVertical != null && _coordinateParas != null) { if (QueryLineVertical.AxisValue != null && Convert.ToDouble(QueryLineVertical.AxisValue) <= _coordinateParas.CoordMinQ + (_coordinateParas.DispMaxQ() - _coordinateParas.CoordMinQ) * 0.1) QueryLineVertical.AxisValue = (_coordinateParas.CoordMinQ + _coordinateParas.DispMaxQ()) * 0.5; } } //更新坐标 public bool UpdateCoordinate() { if (_coordinateParas == null) return false; if (this._minH > _maxH) { this.CalcCoordLimit(); } if (_coordinateParas.CoordSpaceQ < 0.1) { return false; } if (_coordinateParas.CoordSpaceH < 0.1) { return false; } // 流量坐标刻度 List q_Label_List = new List(); AxisQ.CustomLabels.Clear(); double disQ = _coordinateParas.CoordMinQ; for (int i = 0; i < _coordinateParas.GridNumberX + 1; i++) { q_Label_List.Add(new CustomAxisLabel(CalcDispValueQ(disQ).ToString(), disQ)); disQ = disQ + _coordinateParas.CoordSpaceQ; } AxisQ.CustomLabels.AddRange(q_Label_List.ToArray()); //设置显示 TProduct.WinFrmUI.TPump.XtraChartHelper.SetAxisRange(AxisQ, _coordinateParas.CoordMinQ, _coordinateParas.CoordMinQ + _coordinateParas.GridNumberX * _coordinateParas.CoordSpaceQ); //子刻度 AxisQ.MinorCount = 4; //扬程 //坐标刻度 QHAxisY.CustomLabels.Clear(); List h_Label_List = new List(); double disH = _coordinateParas.CoordMinH + _coordinateParas.CoordSpaceH * _coordinateParas.StartLineNoH; for (int i = _coordinateParas.StartLineNoH; i < _coordinateParas.EndLineNoH + 1; i++) { if (disH >= 0) { h_Label_List.Add(new CustomAxisLabel(CalcDispValueH(disH).ToString(), disH)); } disH = disH + _coordinateParas.CoordSpaceH; } QHAxisY.CustomLabels.AddRange(h_Label_List.ToArray()); //子刻度 QHAxisY.MinorCount = 4; //效率 if (_minE < _maxE) { //坐标刻度 QEAxisY.CustomLabels.Clear(); List E_Label_List = new List(); double disE = _coordinateParas.CoordMinE + _coordinateParas.CoordSpaceE * _coordinateParas.StartLineNoE; for (int i = _coordinateParas.StartLineNoE; i < _coordinateParas.EndLineNoE + 1; i++) { E_Label_List.Add(new CustomAxisLabel(disE <= 100 ? disE.ToString() : "", disE)); disE = disE + _coordinateParas.CoordSpaceE; } QEAxisY.CustomLabels.AddRange(E_Label_List.ToArray()); //子刻度 QEAxisY.MinorCount = 4; } //功率 if (_minP < _maxP) { //坐标刻度 QPAxisY.CustomLabels.Clear(); List P_Label_List = new List(); double disP = Math.Round(_coordinateParas.CoordMinP + _coordinateParas.CoordSpaceP * _coordinateParas.StartLineNoP, 4);//防止小数点过多 for (int i = _coordinateParas.StartLineNoP; i < _coordinateParas.EndLineNoP + 1; i++) { var coord_P = CalcDispValueP(disP); P_Label_List.Add(new CustomAxisLabel(coord_P < 0.001 ? "0" : Math.Round(coord_P, 4).ToString("g"), disP));//改变单位只改变了坐标显示,其他都没变 disP = disP + _coordinateParas.CoordSpaceP; } QPAxisY.CustomLabels.AddRange(P_Label_List.ToArray()); //子刻度 QPAxisY.MinorCount = 4; } //汽蚀 if (_minNPSH < _maxNPSH) { //坐标刻度 NPSHAxisY.CustomLabels.Clear(); List NPSH_Label_List = new List(); double dispNPSH = _coordinateParas.CoordMinNPSH + _coordinateParas.CoordSpaceNPSH * _coordinateParas.StartLineNoNPSH; for (int i = _coordinateParas.StartLineNoNPSH; i < _coordinateParas.EndLineNoNPSH + 1; i++) { if (dispNPSH >= 0) { NPSH_Label_List.Add(new CustomAxisLabel(dispNPSH.ToString(), dispNPSH)); } dispNPSH = dispNPSH + _coordinateParas.CoordSpaceNPSH; } NPSHAxisY.CustomLabels.AddRange(NPSH_Label_List.ToArray()); //子刻度 NPSHAxisY.MinorCount = 4; } return true; } //检查坐标 private void CheckCoordinate() { if (_coordinateParas == null) return; double minQ = 1000000, maxQ = 0; double minH = 1000000, maxH = 0; if (AllCurveQH != null && AllCurveQH.Count > 0) { foreach (Eventech.Model.CurveDispParasEx info in AllCurveQH) { minH = Math.Min(minH, (from x in info.CurveInfo select x.Y).Min()); maxH = Math.Max(maxH, (from x in info.CurveInfo select x.Y).Max()); minQ = Math.Min(minQ, (from x in info.CurveInfo select x.X).Min()); maxQ = Math.Max(maxQ, (from x in info.CurveInfo select x.X).Max()); } } double minP = 1000000, maxP = 0; if (this.AllCurveQP != null) { foreach (var curveGrp in AllCurveQP) { double maxP0 = 0; double minP0 = 0; Eventech.Common.FitCurveHelper.GetMinMaxPointY(curveGrp.CurveExpress, out maxP0, out minP0); maxP = Math.Max(maxP, maxP0); minP = Math.Min(minP, minP0); minQ = Math.Min(minQ, curveGrp.CurveExpress.RangeMin); maxQ = Math.Max(maxQ, curveGrp.CurveExpress.RangeMax); } } //double disH_min = _coordinateParas.CoordMinH + _coordinateParas.CoordSpaceH * _coordinateParas.StartLineNoH; //if (minH < disH_min) //{ // CalcCoordinate(); //} if (maxH > minH) { var old_count = this._coordinateParas.EndLineNoH - this._coordinateParas.StartLineNoH; for (int i = 0; i < 100; i++) { if (this._coordinateParas.DispMinH() < minH) break; //this._coordinateParas.StartLineNoH = this._coordinateParas.StartLineNoH - 1; if (this._coordinateParas.StartLineNoH <= 0) { this._coordinateParas.CoordMinH = this._coordinateParas.CoordMinH - this._coordinateParas.CoordSpaceH; } else { this._coordinateParas.StartLineNoH--; } } for (int i = 3; i < 100; i++) { if (this._coordinateParas.DispMaxH() > maxH) break; this._coordinateParas.EndLineNoH = this._coordinateParas.StartLineNoH + i; } if ((this._coordinateParas.EndLineNoH - this._coordinateParas.StartLineNoH) > old_count * 1.5 || this._coordinateParas.DispMaxH() > maxH * 1.4) { double disp_max_h, disp_min_h; Eventech.Common.CoordinateHelper.CalcCoordinateH2(minH, maxH, this._coordinate_unitH, old_count, ref this._coordinateParas, out disp_min_h, out disp_max_h); _coordinateParas.CoordMinH = Eventech.Common.NumberHelper.GetByPlacesLength(disp_max_h - _coordinateParas.EndLineNoH * _coordinateParas.CoordSpaceH, 3); } } this._maxH = maxH; this._minH = minH; if (maxP > minP) { var old_count = this._coordinateParas.EndLineNoP - this._coordinateParas.StartLineNoP; for (int i = 0; i < 100; i++) { if (this._coordinateParas.DispMinP() < minP) break; // if (this._coordinateParas.StartLineNoP <= 0) this._coordinateParas.CoordMinP = this._coordinateParas.CoordMinP - this._coordinateParas.CoordSpaceP; else this._coordinateParas.StartLineNoP = this._coordinateParas.StartLineNoP - 1; } for (int i = 3; i < 100; i++) { if (this._coordinateParas.DispMaxP() > maxP) break; this._coordinateParas.EndLineNoP = this._coordinateParas.StartLineNoP + i; } if ((this._coordinateParas.EndLineNoP - this._coordinateParas.StartLineNoP) > old_count * 1.5 || this._coordinateParas.DispMaxP() > maxP * 1.4) { double disp_max_p, disp_min_p; var space = Eventech.Common.CoordinateHelper.GetOptimalSpaceMin(minP, maxP, old_count, out disp_min_p, out disp_max_p); this._coordinateParas.CoordSpaceP = space; // double disP = disp_max_p; this._coordinateParas.EndLineNoP = this._coordinateParas.StartLineNoH - 5; this._coordinateParas.StartLineNoP = this._coordinateParas.EndLineNoP; while (disP > minP * 0.98) { disP = disP - space; if (disP < 0) break; this._coordinateParas.StartLineNoP--; } this._coordinateParas.CoordMinP = Eventech.Common.NumberHelper.GetByPlacesLength(disp_max_p - this._coordinateParas.EndLineNoP * this._coordinateParas.CoordSpaceP, 3); } } this._maxP = maxP; this._minP = minP; if (maxQ > minQ) { var old_count = this._coordinateParas.GridNumberX; for (int i = 3; i < 100; i++) { if (this._coordinateParas.DispMaxQ() > maxQ) break; this._coordinateParas.GridNumberX = this._coordinateParas.GridNumberX + 1; } if (this._coordinateParas.GridNumberX > old_count * 1.3 || this._coordinateParas.DispMaxQ() > maxQ * 1.4) { Eventech.Common.CoordinateHelper.CalcCoordinateQ1(minQ, maxQ, this._coordinate_unitQ, ref this._coordinateParas, old_count); } } this._maxQ = maxQ; this._minQ = minQ; } private void 调整坐标系MenuItem_Click(object sender, EventArgs e) { SetCoordinateByDlg(); } public void SetCoordinateByDlg() { SetLxpCoordinateDlg theSetDlg = new SetLxpCoordinateDlg(); theSetDlg.SetCoordinate(_coordinateParas, this._coordinate_unitQ, this._coordinate_unitH, this._coordinate_unitP); theSetDlg.OnChangedCoord += ChangedCoordHandler; theSetDlg.ShowDialog(); } private void ChangedCoordHandler(object sender, LxpCoordEventArgs e) { //if (e.IsChangeUnitQ) //{ // UpdateChart(false); //} //else { UpdateCoordinate(); SetChartPanelStyle(); SetChartCurveStyle(); } } public Eventech.Model.LxpCoordinateParas GetCoordinateParas() { return _coordinateParas; } #endregion 坐标 #region 更新 //更新所有 public void UpdateChart(bool isCheckCoord) { if (_coordinateParas == null || _coordinateParas.CoordSpaceQ < .1 || _coordinateParas.CoordSpaceQ < 0.1) { CalcCoordinate(); } if (isCheckCoord) { CheckCoordinate(); } if (!UpdateCoordinate()) return; UpdateAllCurve(); SetChartPanelStyle(); SetChartCurveStyle(); SetAxisTitleDispH(); } //更新所有曲线 public void UpdateAllCurve() { ClearCurveSeries(); if (AllCurveQH.Count == 0) { QueryLineHorizontal.Visible = false; QueryLineVertical.Visible = false; refConstantLineH.Visible = false; QueryParaInfoText.Visible = false; return; } if (AllCurveQH != null && AllCurveQH.Count > 0) { int i = 0; for (i = 0; i < AllCurveQH.Count; i++) { CreateSeriesQH(AllCurveQH[i], i.ToString()); } } if (AllCurveQE != null && AllCurveQE.Count > 0) { int i = 0; for (i = 0; i < AllCurveQE.Count; i++) { CreateSeriesQE(AllCurveQE[i], i.ToString()); } } if (AllCurveQP != null && AllCurveQP.Count > 0) { int i = 0; for (i = 0; i < AllCurveQP.Count; i++) { CreateSeriesQP(AllCurveQP[i], i.ToString()); } } if (AllCurveNPSH != null && AllCurveNPSH.Count > 0) { int i = 0; for (i = 0; i < AllCurveNPSH.Count; i++) { CreateSeriesNPSH(AllCurveNPSH[i], i.ToString()); } } } //插入QH曲线 private bool isDispCurvePoint = false; private void CreateSeriesQH(Eventech.Model.CurveDispParasEx curve, string nameAppend) { DevExpress.XtraCharts.Series series_curve = new DevExpress.XtraCharts.Series(); series_curve.ArgumentScaleType = DevExpress.XtraCharts.ScaleType.Numerical; series_curve.LabelsVisibility = DevExpress.Utils.DefaultBoolean.False; series_curve.Name = "QH_" + nameAppend; series_curve.ShowInLegend = false; series_curve.CrosshairEnabled = DefaultBoolean.False; series_curve.Tag = curve.CurveID; DevExpress.XtraCharts.SplineSeriesView splineSeriesView = new DevExpress.XtraCharts.SplineSeriesView(); splineSeriesView.LineStyle.Thickness = curve.CurveThickness; splineSeriesView.LineStyle.DashStyle = (DevExpress.XtraCharts.DashStyle)curve.CurveDashStyle; splineSeriesView.Color = curve.CurveColor; series_curve.SeriesPointsSorting = SortingMode.None; series_curve.SeriesPointsSortingKey = SeriesPointKey.Value_1; series_curve.Visible = curve.IsDispCurve; series_curve.View = splineSeriesView; for (int j = 0; j < curve.CurveInfo.Count(); j++) { series_curve.Points.Add(new SeriesPoint(curve.CurveInfo[j].X, new double[] { curve.CurveInfo[j].Y })); } this.chartControl1.Series.Add(series_curve); SeriesGuidDict[curve.CurveID] = series_curve; if (isDispCurvePoint) { DevExpress.XtraCharts.Series series_point = new DevExpress.XtraCharts.Series(); series_point.ArgumentScaleType = DevExpress.XtraCharts.ScaleType.Numerical; series_point.LabelsVisibility = DevExpress.Utils.DefaultBoolean.False; series_point.Name = "QH_Point_" + nameAppend; series_point.ShowInLegend = false; series_point.CrosshairEnabled = DefaultBoolean.False; series_point.Tag = curve.CurveID; DevExpress.XtraCharts.PointSeriesView pointSeriesView = new DevExpress.XtraCharts.PointSeriesView(); pointSeriesView.Color = curve.CurveColor; series_point.View = pointSeriesView; this.chartControl1.Series.Add(series_point); for (int j = 0; j < curve.CurveInfo.Count(); j++) { series_point.Points.Add(new SeriesPoint(curve.CurveInfo[j].X, new double[] { curve.CurveInfo[j].Y })); } } if (curve.IsDispPara && curve.LabelPosiPara != null && !string.IsNullOrEmpty(curve.CurvePara)) { DevExpress.XtraCharts.TextAnnotation annotationText = new DevExpress.XtraCharts.TextAnnotation(); DevExpress.XtraCharts.PaneAnchorPoint ptPaneAnchor = new DevExpress.XtraCharts.PaneAnchorPoint(); ptPaneAnchor.AxisXCoordinate.AxisValueSerializable = curve.LabelPosiPara.X.ToString(); ptPaneAnchor.AxisYCoordinate.AxisValueSerializable = curve.LabelPosiPara.Y.ToString(); annotationText.AnchorPoint = ptPaneAnchor; annotationText.BackColor = Color.Transparent; annotationText.TextColor = Color.LightGray; annotationText.Border.Visibility = DevExpress.Utils.DefaultBoolean.False; annotationText.LabelMode = false; annotationText.RuntimeAnchoring = true; annotationText.RuntimeMoving = true; annotationText.RuntimeResizing = true; annotationText.RuntimeRotation = true; annotationText.Name = "QH_" + nameAppend; DevExpress.XtraCharts.RelativePosition relativePosition1 = new DevExpress.XtraCharts.RelativePosition(); relativePosition1.Angle = 90D; relativePosition1.ConnectorLength = 12; annotationText.ShapePosition = relativePosition1; annotationText.Visible = true; annotationText.Text = curve.CurvePara; annotationText.TextColor = curve.CurveColor; annotationText.BackColor = System.Drawing.Color.Transparent; annotationText.Shadow.Visible = false; //annotationText.Border.Color = Curve.CurveColor; this.chartControl1.AnnotationRepository.Add(annotationText); AnnoGuidDict_QH[curve.CurveID] = annotationText; } } //插入QE曲线 public void CreateSeriesQE(Eventech.Model.CurveDispParasEx curve, string nameAppend) { DevExpress.XtraCharts.Series series = new DevExpress.XtraCharts.Series(); series.ArgumentScaleType = DevExpress.XtraCharts.ScaleType.Numerical; series.LabelsVisibility = DevExpress.Utils.DefaultBoolean.False; series.Name = "QE_" + nameAppend; series.ShowInLegend = false; series.CrosshairEnabled = DefaultBoolean.False; series.Tag = curve.CurveID; DevExpress.XtraCharts.SplineSeriesView splineSeriesView = new DevExpress.XtraCharts.SplineSeriesView(); splineSeriesView.Color = curve.CurveColor; splineSeriesView.LineStyle.Thickness = curve.CurveThickness; splineSeriesView.LineStyle.DashStyle = (DevExpress.XtraCharts.DashStyle)curve.CurveDashStyle; splineSeriesView.AxisY = QEAxisY;//.AxisYName = "QEAxisY"; series.View = splineSeriesView; this.chartControl1.Series.Add(series); for (int j = 0; j < curve.CurveInfo.Count(); j++) { series.Points.Add(new SeriesPoint(curve.CurveInfo[j].X, new double[] { curve.CurveInfo[j].Y })); } series.Visible = curve.IsDispCurve; SeriesGuidDict[curve.CurveID] = series; } //更新QP曲线 public void CreateSeriesQP(Eventech.Model.CurveDispParasEx curve, string nameAppend) { DevExpress.XtraCharts.Series series = new DevExpress.XtraCharts.Series(); series.ArgumentScaleType = DevExpress.XtraCharts.ScaleType.Numerical; series.LabelsVisibility = DevExpress.Utils.DefaultBoolean.False; series.Name = "QP_" + nameAppend; series.ShowInLegend = false; series.CrosshairEnabled = DefaultBoolean.False; series.Tag = curve.CurveID; DevExpress.XtraCharts.SplineSeriesView splineSeriesView = new DevExpress.XtraCharts.SplineSeriesView(); splineSeriesView.Color = curve.CurveColor; splineSeriesView.LineStyle.Thickness = curve.CurveThickness; splineSeriesView.LineStyle.DashStyle = (DevExpress.XtraCharts.DashStyle)curve.CurveDashStyle; splineSeriesView.AxisY = QPAxisY;//.AxisYName = "QEAxisY"; if (_chartPanelStyle == TProduct.Model.eChartDiagramPanelStyle.Whole) {// splineSeriesView.Pane = mainChartDiagram.DefaultPane; } else {//分开放 splineSeriesView.Pane = this.bottomChartDiagram; } series.View = splineSeriesView; this.chartControl1.Series.Add(series); for (int j = 0; j < curve.CurveInfo.Count(); j++) { series.Points.Add(new SeriesPoint(curve.CurveInfo[j].X, new double[] { curve.CurveInfo[j].Y })); } series.Visible = curve.IsDispCurve; SeriesGuidDict[curve.CurveID] = series; if (curve.IsDispPara && curve.LabelPosiPara != null && !string.IsNullOrEmpty(curve.CurvePara)) { DevExpress.XtraCharts.TextAnnotation annotationText = new DevExpress.XtraCharts.TextAnnotation(); if (_chartPanelStyle == TProduct.Model.eChartDiagramPanelStyle.Whole) { DevExpress.XtraCharts.PaneAnchorPoint ptPaneAnchor = new DevExpress.XtraCharts.PaneAnchorPoint(); ptPaneAnchor.AxisXCoordinate.AxisValueSerializable = curve.LabelPosiPara.X.ToString(); ptPaneAnchor.AxisYCoordinate.AxisValueSerializable = curve.LabelPosiPara.Y.ToString(); ptPaneAnchor.AxisYCoordinate.Axis = this.QPAxisY; annotationText.AnchorPoint = ptPaneAnchor; } else { DevExpress.XtraCharts.PaneAnchorPoint ptPaneAnchor = new DevExpress.XtraCharts.PaneAnchorPoint(); ptPaneAnchor.AxisXCoordinate.AxisValueSerializable = curve.LabelPosiPara.X.ToString(); ptPaneAnchor.AxisYCoordinate.AxisValueSerializable = curve.LabelPosiPara.Y.ToString(); ptPaneAnchor.AxisYCoordinate.Axis = this.QPAxisY; ptPaneAnchor.Pane = this.bottomChartDiagram; annotationText.AnchorPoint = ptPaneAnchor; } annotationText.BackColor = Color.Transparent; annotationText.TextColor = Color.LightGray; annotationText.Border.Visibility = DevExpress.Utils.DefaultBoolean.False; annotationText.LabelMode = false; annotationText.RuntimeAnchoring = true; annotationText.RuntimeMoving = true; annotationText.RuntimeResizing = true; annotationText.RuntimeRotation = true; annotationText.Name = "QP_" + nameAppend; DevExpress.XtraCharts.RelativePosition relativePosition1 = new DevExpress.XtraCharts.RelativePosition(); relativePosition1.Angle = 0D; relativePosition1.ConnectorLength = 25; annotationText.ShapePosition = relativePosition1; annotationText.Visible = true; annotationText.Text = curve.CurvePara; annotationText.TextColor = curve.CurveColor; annotationText.BackColor = System.Drawing.Color.Transparent; annotationText.Shadow.Visible = false; //annotationText.Border.Color = Curve.CurveColor; this.chartControl1.AnnotationRepository.Add(annotationText); AnnoGuidDict_QP[curve.CurveID] = annotationText; } } //更新QNPS曲线 public void CreateSeriesNPSH(Eventech.Model.CurveDispParasEx curve, string nameAppend) { DevExpress.XtraCharts.Series series = new DevExpress.XtraCharts.Series(); series.ArgumentScaleType = DevExpress.XtraCharts.ScaleType.Numerical; series.LabelsVisibility = DevExpress.Utils.DefaultBoolean.False; series.Name = "QNPSH_" + nameAppend; series.ShowInLegend = false; series.CrosshairEnabled = DefaultBoolean.False; series.Tag = curve.CurveID; DevExpress.XtraCharts.SplineSeriesView splineSeriesView = new DevExpress.XtraCharts.SplineSeriesView(); splineSeriesView.Color = curve.CurveColor; splineSeriesView.LineStyle.Thickness = curve.CurveThickness; splineSeriesView.LineStyle.DashStyle = (DevExpress.XtraCharts.DashStyle)curve.CurveDashStyle; splineSeriesView.AxisY = NPSHAxisY;//.AxisYName = "QEAxisY"; if (_chartPanelStyle == TProduct.Model.eChartDiagramPanelStyle.Whole) {// splineSeriesView.Pane = mainChartDiagram.DefaultPane; } else {//分开放 splineSeriesView.Pane = this.bottomChartDiagram; } series.View = splineSeriesView; this.chartControl1.Series.Add(series); for (int j = 0; j < curve.CurveInfo.Count(); j++) { series.Points.Add(new SeriesPoint(curve.CurveInfo[j].X, new double[] { curve.CurveInfo[j].Y })); } series.Visible = curve.IsDispCurve; SeriesGuidDict[curve.CurveID] = series; } // public void RefreshChart() { chartControl1.Refresh(); } #endregion 更新 #region 重绘 private Rectangle CalculateDiagramBounds() { return CalculateDiagramBounds(mainChartDiagram.AxisX.VisualRange, mainChartDiagram.AxisY.VisualRange); } private Rectangle CalculateDiagramBounds(VisualRange RangeAxisX, VisualRange RangeAxisY) { Point p1 = mainChartDiagram.DiagramToPoint((double)RangeAxisX.MinValue, (double)RangeAxisY.MinValue).Point; Point p2 = mainChartDiagram.DiagramToPoint((double)RangeAxisX.MaxValue, (double)RangeAxisY.MaxValue).Point; return Eventech.Common.RectangleHelper.CreateRectangle(p1, p2); } private void chartControl_CustomPaint(object sender, CustomPaintEventArgs e) { if (_coordinateParas == null) return; Graphics g = e.Graphics; //g.SetClip(CalculateDiagramBounds()); g.SmoothingMode = SmoothingMode.AntiAlias; //绘制默认曲线的文字MaxCurveQH.PointInfo //if (isDispCurveName && MaxCurveQH.CurvePara > 1) //{ // ControlCoordinates coorPoint = mainChartDiagram.DiagramToPoint(MaxCurveQH.PointInfo.Last().X, // MaxCurveQH.PointInfo.Last().Y, AxisX, AxisY); // Point textPosi = new Point(coorPoint.Point.X - 3, coorPoint.Point.Y + 8); // g.DrawString(MaxCurveQH.CurvePara.ToString(), TProduct.WinFrmUI.TPump.Properties.Settings.Dia.AnnoCurveName, new SolidBrush(Color.Black), textPosi); //} #region 绘制网格线 if (_chartPanelStyle == TProduct.Model.eChartDiagramPanelStyle.Whole) { chartControl1.DrawGridLineY(g, _coordinateParas, isMonoColor ? Color.Silver : TProduct.WinFrmUI.TPump.ChartDisp.Settings.Default.GridLinesColorY); } #endregion 绘制网格线 #region 添加水印 if (TProduct.WinFrmUI.GlobeParas.IsPrintWaterMark) { chartControl1.DrawCorpLogo(g); } #endregion 添加水印 #region 设计点 if (_designPointList != null && _designPointList.Count() > 0) { if (this._desginPointSyle == Eventech.Model.eDesignPointDispType.CrossAnPointCircle) { System.Drawing.Point dpPoint = this.mainChartDiagram.DiagramToPoint(_designPointList[0].X, _designPointList[0].Y).Point; // var first_pt = _coordinateParas.ToChartValue(_designPointList).First(); using (var brsh = new SolidBrush(Color.Red)) { RectangleF rc = new RectangleF(dpPoint.X - 5, dpPoint.Y - 5, 10, 10); g.FillEllipse(brsh, rc); } } else { chartControl1.DrawDesignPoints4Cross(g, _coordinateParas.ToChartValue(_designPointList), isMonoColor ? Color.Gray : Color.Red); } } #endregion 设计点 #region 绘制装配曲线 if (_isDispEquipmentCurve && _equipmentCurveList != null) { g.SetClip(CalculateDiagramBounds());//保证曲线不会绘制图表外面 using (Pen penCurve = new Pen(System.Drawing.Color.LightCyan, 3f)) { foreach (var curve in _equipmentCurveList) { if (curve.Item2.CurveInfo != null) { chartControl1.DrawEquipmentCurve(g, _coordinateParas.ToChartValue(curve.Item2.CurveInfo), isMonoColor); } for (int i = 0; i < curve.Item1.Count; i++) { ControlCoordinates coor = mainChartDiagram.DiagramToPoint(curve.Item1[i].X, curve.Item1[i].Y, AxisQ, QHAxisY); g.DrawEllipse(penCurve, coor.Point.X - 3, coor.Point.Y - 3, 6, 6); } } } g.ResetClip(); } #endregion 绘制装配曲线 } private void DrawEqualCurve(List points, Eventech.Model.CombineCurve equalCurve, Graphics g, Color curveColor) { //去掉重曲线复点 Point[] pointArray = points.Distinct().ToArray(); //写字 //using (SolidBrush brushTextQP = new SolidBrush(curveColor)) //using (Font fontTextQP = TProduct.WinFrmUI.CorpSkinStyleHelper.GetDefaultFont()) //{ // g.DrawString(equalCurve.CurvePara.ToString(), fontTextQP, brushTextQP, // pointArray.First().X, pointArray.First().Y - 15); //} //绘制曲线 if (pointArray.Length > 2) { using (Pen penCurve = new Pen(curveColor, 3f)) { if (equalCurve.IsClosed) { System.Drawing.Drawing2D.FillMode aFillMode = System.Drawing.Drawing2D.FillMode.Alternate; g.DrawClosedCurve(penCurve, pointArray, equalCurve.DispTension, aFillMode); } else {//DrawBeziers g.DrawCurve(penCurve, pointArray, equalCurve.DispTension); } } } else if (pointArray.Length == 2) { using (Pen penCurve = new Pen(curveColor, 3f)) { g.DrawLine(penCurve, pointArray[0], pointArray[1]); } } else if (pointArray.Length == 1) { using (var brsh = new SolidBrush(curveColor)) { Rectangle rc = new Rectangle(pointArray[0].X - 2, pointArray[0].Y - 2, 4, 4); g.FillEllipse(brsh, rc); } } } #endregion 重绘 #region 显示 //是否显示曲线Legend private bool isDispLegend = false; public bool IsDispLegend { get { return isDispLegend; } set { isDispLegend = value; this.chartControl1.Legend.Visibility = value ? DefaultBoolean.True : DefaultBoolean.False; } } //是否显示曲线参数 private bool isDispCurveName = false; public bool IsDispCurveName { get { return isDispCurveName; } set { isDispCurveName = value; 设置曲线标签显示MenuItem.Visible = value; } } private bool isMonoColor = false; public bool IsMonoColor { get { return isMonoColor; } set { isMonoColor = value; if (isMonoColor) { TProduct.WinFrmUI.TPump.XtraChartHelper.SetMonoColor(chartControl1); } else { SetSettingColor(); } } } public void SetChartDisplay() { if (isMonoColor) { TProduct.WinFrmUI.TPump.XtraChartHelper.SetMonoColor(chartControl1); } else { SetSettingColor(); } } private void SetSettingColor() { TProduct.WinFrmUI.TPump.XtraChartHelper.SetDisplay(AxisQ, QHAxisY, QEAxisY, QPAxisY, NPSHAxisY); //TProduct.WinFrmUI.TPump.XtraChartHelper.SetCurveDisplay(SeriesQHdefault, SeriesQEdefault, SeriesQPdefault, SeriesNPSHdefault); //TProduct.WinFrmUI.TPump.XtraChartHelper.SetCurveDisplay(SeriesQHmax, SeriesQEmax, SeriesQPmax, SeriesNPSHmax); //TProduct.WinFrmUI.TPump.XtraChartHelper.SetCurveDisplay(SeriesQHmin, SeriesQEmin, SeriesQPmin, SeriesNPSHmin); TProduct.WinFrmUI.TPump.XtraChartHelper.SetDisplay(StripWorkRegion); TProduct.WinFrmUI.TPump.XtraChartHelper.SetBackColor(chartControl1, mainChartDiagram); } #endregion 显示 #region 查询点 public void SetQueryPointQ(double q) { QueryLineVertical.AxisValue = q; if (_coordinateParas == null) { QueryLineHorizontal.Points.Clear(); } else { CalcCurveParasByQ(q); } } //是否可以查询曲线参数 public void SetQueryLineDisp(bool isDisp) { _isQueryCurvePara = isDisp; QueryLineVertical.Visible = _isQueryCurvePara; QueryLineVertical.Title.Visible = _isQueryCurvePara; QueryParaInfoText.Visible = _isQueryCurvePara; QueryLineHorizontal.Visible = _isQueryCurvePara; if (_isQueryCurvePara) this.IsHandCursor(); else this.IsCrossCursor(); } #endregion 查询点 #region 图表事件 private object _rightClickObj = null; private double _rightClickFlow = 0; private void chartControl_MouseClick(object sender, MouseEventArgs e) { if (e.Button == System.Windows.Forms.MouseButtons.Right) { ChartHitInfo hitInfo = chartControl1.CalcHitInfo(e.Location); DiagramCoordinates coordPt = mainChartDiagram.PointToDiagram(e.Location); _rightClickFlow = coordPt.NumericalArgument; if (hitInfo.InAnnotation) { _rightClickObj = hitInfo.Annotation; annoRightMenu.Show(chartControl1, e.Location); } else if (hitInfo.InSeries) { _rightClickObj = hitInfo.Series; curveRightMenu.Show(chartControl1, e.Location); } else if (hitInfo.InAxis) { _rightClickObj = hitInfo.Axis; axisRightMenu.Show(chartControl1, e.Location); } else if (hitInfo.InConstantLine) { _rightClickObj = hitInfo.ConstantLine; lineMenuStrip.Show(chartControl1, e.Location); } //else if (hitInfo.InChartTitle) //{ // rightClickObj = hitInfo.AxisTitle; // lineMenuStrip.Show(chartControl1, e.locationType); //} else { _rightClickObj = null; chartRightMenu.Show(chartControl1, e.Location); } } } //ToolTipController toolTipController1 = new ToolTipController(); private void chartControl1_ObjectHotTracked(object sender, HotTrackEventArgs e) { //if (e.Button == System.Windows.Forms.MouseButtons.Right) //{ // ChartHitInfo hitInfo = chartControl1.CalcHitInfo(e.Location); // if (hitInfo.InConstantLine) // { // rightClickObj = hitInfo.ConstantLine; // lineMenuStrip.Show(chartControl1, e.Location); // } // else // { // rightClickObj = null; // chartRightMenu.Show(chartControl1, e.Location); // } //} } public Eventech.Model.LxpFeatChartCurveGroup GetDefaultCurveGroupChart() { if (AllCurveQH == null || AllCurveQH.Count() == 0) return null; Eventech.Model.LxpFeatChartCurveGroup defaultCurveGrp = new Eventech.Model.LxpFeatChartCurveGroup(); defaultCurveGrp.FeatCurveQH = this.AllCurveQH.First(); if (this.AllCurveQP != null && this.AllCurveQP.Count > 0) defaultCurveGrp.FeatCurveQP = this.AllCurveQP.First(); if (this.AllCurveQE != null && this.AllCurveQE.Count > 0) defaultCurveGrp.FeatCurveQE = this.AllCurveQE.First(); return defaultCurveGrp; } private Eventech.Model.CurveDispParasEx GetCurveByIndex(Eventech.Model.eFeatCurveType type, int index) { if (index < 0) return null; if (type == Eventech.Model.eFeatCurveType.QH) { if (this.AllCurveQH == null) return null; if (index >= this.AllCurveQH.Count) return null; return this.AllCurveQH[index]; } if (type == Eventech.Model.eFeatCurveType.QE) { if (this.AllCurveQE == null) return null; if (index >= this.AllCurveQE.Count) return null; return this.AllCurveQE[index]; } if (type == Eventech.Model.eFeatCurveType.QP) { if (this.AllCurveQP == null) return null; if (index >= this.AllCurveQP.Count) return null; return this.AllCurveQP[index]; } if (type == Eventech.Model.eFeatCurveType.QNPSH) { if (this.AllCurveNPSH == null) return null; if (index >= this.AllCurveNPSH.Count) return null; return this.AllCurveNPSH[index]; } return null; } private void CalcCurveParasByQ(double queryQ) { for (int indx = 0; indx < this.AllCurveQH.Count(); indx++) { var queryPt = CalcQueryPointPt( GetCurveByIndex(Eventech.Model.eFeatCurveType.QH, indx), GetCurveByIndex(Eventech.Model.eFeatCurveType.QE, indx), GetCurveByIndex(Eventech.Model.eFeatCurveType.QP, indx), GetCurveByIndex(Eventech.Model.eFeatCurveType.QNPSH, indx), queryQ); if (queryPt == null || queryPt.Q < 1) continue; if (indx == 0) { DispQueryInfoInChart(queryPt); SetQueryParaLineQ(queryPt); } if (OnCalcQueryPtInfo != null) { OnCalcQueryPtInfo(indx, queryPt); } } } //修改了查询点位置 public Action OnCalcQueryPtInfo = null; private Eventech.Model.GroupPoint CalcQueryPointPt( Eventech.Model.CurveDispParasEx FeatCurveQH, Eventech.Model.CurveDispParasEx FeatCurveQE, Eventech.Model.CurveDispParasEx FeatCurveQP, Eventech.Model.CurveDispParasEx FeatCurveNPSH, double queryQ) { var query_posi = new Eventech.Model.GroupPoint(0, 0, 0, 0, 0); query_posi.Q = queryQ; query_posi.H = Eventech.Common.FitCurveHelper.GetFitPointY(FeatCurveQH.CurveExpress, queryQ); if (FeatCurveQE != null && IsDisplayCurveQE) { query_posi.E = Eventech.Common.FitCurveHelper.GetFitPointY(FeatCurveQE.CurveExpress, queryQ); } if (FeatCurveQP != null) { query_posi.P = Eventech.Common.FitCurveHelper.GetFitPointY(FeatCurveQP.CurveExpress, queryQ); } if (FeatCurveNPSH != null) { if (queryQ > FeatCurveNPSH.CurveExpress.RangeMin && queryQ < FeatCurveNPSH.CurveExpress.RangeMax) { query_posi.NPSH = Eventech.Common.FitCurveHelper.GetFitPointY(FeatCurveNPSH.CurveExpress, queryQ); } } return query_posi; } private void DispQueryInfoInChart(Eventech.Model.GroupPoint queryPt) { // if (queryPt == null) // return; // StringBuilder builder = new StringBuilder(); // builder.AppendLine("---" + TProduct.UserSetting.Localization.TranslateHelper.GetString("曲线点参数") + "---"); // if (_unit_design_point_Q == _coordinate_unitQ) // { // builder.AppendFormat("{0}:{1} {2}", //TProduct.UserSetting.Localization.TranslateHelper.GetString("流量"), //CalcDispValueQ_STR(_coordinate_unitQ, queryPt.Q), //Eventech.Common.UnitQHelper.GetEnUnitName(this._coordinate_unitQ)); // } // else // { // builder.AppendFormat("{0}:{1} {2} ({3} {4})", //TProduct.UserSetting.Localization.TranslateHelper.GetString("流量"), //CalcDispValueQ_STR(_queryInfo_unitQ, queryPt.Q), //Eventech.Common.UnitQHelper.GetEnUnitName(this._queryInfo_unitQ), //CalcDispValueQ_STR(Eventech.Common.UnitQHelper.Tran(this._coordinate_unitQ, _unit_design_point_Q, queryPt.Q)), //Eventech.Common.UnitQHelper.GetEnUnitName(this._unit_design_point_Q)); // } // builder.AppendLine(""); // if (_unit_design_point_H == _coordinate_unitH) // { // builder.AppendFormat("{0}:{1} {2}", // TProduct.UserSetting.Localization.TranslateHelper.GetString("扬程"), // CalcDispValueH_STR(_queryInfo_unitH, queryPt.H), // Eventech.Common.UnitHHelper.GetEnUnitName(this._queryInfo_unitH)); // } // else // { // builder.AppendFormat("{0}:{1} {2} ({3} {4})", // TProduct.UserSetting.Localization.TranslateHelper.GetString("扬程"), // CalcDispValueH_STR(_queryInfo_unitH, queryPt.H), // Eventech.Common.UnitHHelper.GetEnUnitName(this._queryInfo_unitH), // CalcDispValueH_STR(Eventech.Common.UnitHHelper.Tran(this._coordinate_unitH, _unit_design_point_H, queryPt.H)), // Eventech.Common.UnitHHelper.GetEnUnitName(this._unit_design_point_H)); // } // if (_seriesEntity.IsDisplayCurveQE() && queryPt.E > 0) // { // builder.AppendLine(""); // // builder.AppendFormat(TProduct.UserSetting.Localization.TranslateHelper.GetString("效率") + // // ":{0:N1}%", _queryPt.E); // builder.AppendFormat("{0}:{1:N1}%", // TProduct.UserSetting.Localization.TranslateHelper.GetString(_seriesEntity.GetEtaTextName(TProduct.UserSetting.Localization.Current)), queryPt.E); // } // if (_seriesEntity.IsDisplayCurveQP() && queryPt.P > 0) // { // queryPt.P = TProduct.Common.RoundHelper.GetDispValuePower(queryPt.P); // builder.AppendLine(""); // //builder.AppendFormat(TProduct.UserSetting.Localization.TranslateHelper.GetString("轴功率") + ":{0:N1}{1}", CalcDispValueP(_queryPt.P), // // Eventech.Common.UnitPHelper.GetEnUnitName(this._unitP)); // builder.AppendFormat("{0}:{1}{2}", TProduct.UserSetting.Localization.TranslateHelper.GetString(_seriesEntity.GetPowerTextName(TProduct.UserSetting.Localization.Current)), CalcDispValueP(queryPt.P), //Eventech.Common.UnitPHelper.GetEnUnitName(this._coordinate_unitP)); // } // if (queryPt.NPSH > 0) // { // builder.AppendLine(""); // if (queryPt.NPSH < 3) // builder.AppendFormat(TProduct.UserSetting.Localization.TranslateHelper.GetString("汽蚀") + ":{0:N2}", queryPt.NPSH); // else // builder.AppendFormat(TProduct.UserSetting.Localization.TranslateHelper.GetString("汽蚀") + ":{0:N1}", queryPt.NPSH); // } //QueryParaInfoText.Text = builder.ToString(); } private void SetQueryParaLineQ(Eventech.Model.GroupPoint queryPt) { QueryLineVertical.AxisValue = queryPt.Q; QueryLineVertical.Title.Text = string.Format("{0} ({1})", CalcDispValueQ_STR(queryPt.Q), Eventech.Common.UnitQHelper.GetEnUnitName(this._coordinate_unitQ)); QueryLineHorizontal.Points.Clear(); if (_coordinateParas != null) QueryLineHorizontal.Points.Add(new SeriesPoint(_coordinateParas.CoordMinQ, queryPt.H)); else QueryLineHorizontal.Points.Add(new SeriesPoint(_minQ, queryPt.H)); QueryLineHorizontal.Points.Add(new SeriesPoint(queryPt.Q, queryPt.H)); } private bool _isMoveQueryLineQ1 = false; private bool _isMoveQueryLineH1 = false; private Point _clickLocation; private void chartControl_MouseDown(object sender, MouseEventArgs e) { if (e.Button == System.Windows.Forms.MouseButtons.Left) { _clickLocation = e.Location; ChartHitInfo hitInfo = chartControl1.CalcHitInfo(_clickLocation); if (hitInfo.InConstantLine) { if (hitInfo.ConstantLine == QueryLineVertical) _isMoveQueryLineQ1 = true; } else if (hitInfo.InSeries) { if (hitInfo.Series == QueryLineHorizontal) _isMoveQueryLineH1 = true; } else { DiagramCoordinates coordPt = mainChartDiagram.PointToDiagram(e.Location); double refQ = coordPt.NumericalArgument; double refH = coordPt.NumericalValue; if (OnDispOperateInfo != null) { if (TProduct.UserSetting.Localization.Current == Eventech.Model.eLocalizationType.zhCN) OnDispOperateInfo(this, new Eventech.Model.OperateInfoEventArgs(string.Format("鼠标点击处 流量={0:N1};扬程={1:N1}", refQ, refH))); else OnDispOperateInfo(this, new Eventech.Model.OperateInfoEventArgs(string.Format("Clink Point: Flow={0:N1};Head={1:N1}", refQ, refH))); } } } //if (isRectSel) //{//进行框选删除点 // Rectangle bounds = CalculateDiagramBounds(); // if (bounds.Contains(e.locationType)) // { // selCornerFirstPt = selCornerLastPt = e.locationType; // selRectangleIng = Rectangle.Empty; // } //} } private void chartControl_MouseMove(object sender, MouseEventArgs e) { if (_isMoveQueryLineQ1) { DiagramCoordinates coordPt = mainChartDiagram.PointToDiagram(e.Location); double refQ = coordPt.NumericalArgument; CalcCurveParasByQ(refQ); } else if (_isMoveQueryLineH1) { //DiagramCoordinates coordPt = mainChartDiagram.PointToDiagram(e.Location); //double refH = coordPt.NumericalValue; //double refQ = 0; //if (CalcCurveParasByH(refH, ref refQ)) //{ // CalcCurveParasByQ(refQ); // SetQueryParaLineQ(); //} } } //public event TagEventHandler OnChangeWorkPt = null; private void chartControl_MouseUp(object sender, MouseEventArgs e) { //if (isMoveQueryLineQ || isMoveQueryLineH) //{ // if (OnChangeWorkPt != null) // { // OnChangeWorkPt(this, new TagEventArgs(_queryPt)); // } //} _isMoveQueryLineQ1 = false; _isMoveQueryLineH1 = false; //if (isRectSel) //{ // isRectSel = false; // #region 框选删除 // if (isRectSelDelPts) // {// // isRectSelDelPts = false; // DiagramCoordinates firstCoordinate = theXYDiagram.PointToDiagram(selCornerFirstPt); // DiagramCoordinates lastCoordinate = theXYDiagram.PointToDiagram(selCornerLastPt); if // (firstCoordinate.IsEmpty || lastCoordinate.IsEmpty) return; PointF firstPoint = new // PointF((float)firstCoordinate.NumericalArgument, // (float)firstCoordinate.NumericalValue); PointF lastPoint = new // PointF((float)lastCoordinate.NumericalArgument, (float)lastCoordinate.NumericalValue); // //foreach (var row in _clickPointInfo) //{ // if (row.X < lastPoint.X && row.X > // firstPoint.X && row.Y > lastPoint.Y && row.Y < firstPoint.Y) // { // // _clickPointInfo.Remove(row); // } //} for (int iExcelCol = _clickPointInfo.Count - 1; // iExcelCol >= 0; iExcelCol--) { var row = _clickPointInfo[iExcelCol]; if (row.X < // lastPoint.X && row.X > firstPoint.X && row.Y > lastPoint.Y && row.Y < firstPoint.Y) { // _clickPointInfo.Remove(row); } // } // SeriesPoint.Spectrum.Clear(); foreach (var ftPoint in _clickPointInfo) { // SeriesPoint.Spectrum.Add(new SeriesPoint(ftPoint.X, new double[] { ftPoint.Y })); } } #endregion //} //selCornerFirstPt = Point.Empty; //selCornerLastPt = Point.Empty; //selRectangleIng = Rectangle.Empty; } private void chartControl1_LegendItemChecked(object sender, LegendItemCheckedEventArgs e) { //if (curvesGroups.Count == 0) // return; ////if (e.CheckedElement == SeriesQHdefault) ////{ //// SetCurveTypeDisp(eCurveType.QHcurve,e.NewCheckState,false); ////} //if (e.CheckedElement == SeriesQEdefault) //{ // SetCurveTypeDisp(eCurveType.QEcurve, e.NewCheckState, false); //} //if (e.CheckedElement == SeriesQPdefault) //{ // SetCurveTypeDisp(eCurveType.QPcurve, e.NewCheckState, false); //} //UpdateCoordinate(); } #endregion 图表事件 #region 鼠标样式 public void IsCrossCursor() { this.chartControl1.Cursor = System.Windows.Forms.Cursors.Cross; } public void IsHandCursor() { this.chartControl1.Cursor = System.Windows.Forms.Cursors.Hand; } #endregion 鼠标样式 #region 右击菜单 private void chartRightMenu_Opening(object sender, CancelEventArgs e) { if (_isQueryCurvePara) { 查询曲线参数MenuItem.Text = TProduct.UserSetting.Localization.TranslateHelper.GetString("关闭曲线参数查询"); } else { 查询曲线参数MenuItem.Text = TProduct.UserSetting.Localization.TranslateHelper.GetString("查询曲线参数"); } } private void 查询曲线参数MenuItem_Click(object sender, EventArgs e) { //if (_maxCurves == null || _maxCurves.FeatCurveQH == null || _maxCurves.FeatCurveQH.PointInfo.Count < 4) // return; //查询曲线参数MenuItem.IsSelect = !查询曲线参数MenuItem.IsSelect; //IsQueryCurvePara = 查询曲线参数MenuItem.IsSelect; //if (OnChangeQueryPtStatus != null) // OnChangeQueryPtStatus(this, new TagEventArgs(_isQueryCurvePara)); //AnalysisParasByQDlg theCalcParasByQDlg = new AnalysisParasByQDlg(); //theCalcParasByQDlg.SetPointInfo(MaxCurveQH.PointInfo, MaxCurveQE.PointInfo, MaxCurveQP.PointInfo, null); //theCalcParasByQDlg.Show(); } private bool isDispCoodTittle = true; private void 显示坐标标签ItemMenu_Click(object sender, EventArgs e) { 显示坐标标签ItemMenu.Checked = !显示坐标标签ItemMenu.Checked; isDispCoodTittle = 显示坐标标签ItemMenu.Checked; AxisQ.Title.Visibility = isDispCoodTittle ? DefaultBoolean.True : DefaultBoolean.False; QHAxisY.Title.Visibility = isDispCoodTittle ? DefaultBoolean.True : DefaultBoolean.False; QEAxisY.Title.Visibility = isDispCoodTittle ? DefaultBoolean.True : DefaultBoolean.False; QPAxisY.Title.Visibility = isDispCoodTittle ? DefaultBoolean.True : DefaultBoolean.False; NPSHAxisY.Title.Visibility = isDispCoodTittle ? DefaultBoolean.True : DefaultBoolean.False; SetAxisTitleDispH(); } private void SetAxisTitleDispH() { if (QEAxisY.Visibility != DefaultBoolean.True && QPAxisY.Visibility != DefaultBoolean.True) { QHAxisY.Title.Alignment = StringAlignment.Center; } else { QHAxisY.Title.Alignment = StringAlignment.Far; } } private void 设置图形显示Menu_Click(object sender, EventArgs e) { SetChartDisp(); } public void SetChartDisp() { TProduct.WinFrmUI.SetChartDisplayDlg theDlg = new TProduct.WinFrmUI.SetChartDisplayDlg(); if (theDlg.ShowDialog() == DialogResult.OK) { SetChartDisplay(); chartControl1.Refresh(); } } private void 设置曲线标签显示MenuItem_Click(object sender, EventArgs e) { //System.Windows.Forms.FontDialog fontDialog1 = new System.Windows.Forms.FontDialog(); //fontDialog1.Font = TProduct.WinFrmUI.TPump.ChartDisp.Settings.Default.AnnoCurveName; //if (fontDialog1.ShowDialog() != DialogResult.Cancel) //{ // TProduct.WinFrmUI.TPump.ChartDisp.Settings.Default.AnnoCurveName = fontDialog1.Font; // chartControl1.Refresh(); //} } //显示曲线方程 public void DispCurveExpressInfo() { //if (AllCurveQH == null || AllCurveQH.Count() == 0) // return; //Eventech.WinFrmUI.DispCurveEquation2Dlg theSetDlg = new Eventech.WinFrmUI.DispCurveEquation2Dlg(); //theSetDlg.SetCurveInfo(this.AllCurveQH); //theSetDlg.Show(); } #region Anno private void annoRightMenu_Opening(object sender, CancelEventArgs e) { var anno = _rightClickObj as DevExpress.XtraCharts.TextAnnotation; if (anno == null) return; if (anno == QueryParaInfoText) { MenuItemAnno删除.Visible = false; MenuItemAnno修改内容.Visible = false; } else if (anno.Name.StartsWith("EE_")) { MenuItemAnno删除.Visible = true; MenuItemAnno修改内容.Visible = true; } else { MenuItemAnno删除.Visible = false; MenuItemAnno修改内容.Visible = false; } } private void MenuItemAnno删除_Click(object sender, EventArgs e) { } public Func OnCalcEqualEtaCurvePoints = null; private void MenuItemAnno修改内容_Click(object sender, EventArgs e) { } private void 设置颜色AnnoMenuItem_Click(object sender, EventArgs e) { try { var anno = _rightClickObj as DevExpress.XtraCharts.TextAnnotation; if (anno == null) return; System.Windows.Forms.ColorDialog colorDialog1 = new System.Windows.Forms.ColorDialog(); colorDialog1.Color = anno.TextColor; if (colorDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK) { anno.TextColor = colorDialog1.Color; anno.Border.Color = colorDialog1.Color; } } catch { return; } } private void 设置背景色AnnoMenuItem_Click(object sender, EventArgs e) { try { var anno = _rightClickObj as DevExpress.XtraCharts.TextAnnotation; if (anno == null) return; System.Windows.Forms.ColorDialog colorDialog1 = new System.Windows.Forms.ColorDialog(); colorDialog1.Color = anno.BackColor; if (colorDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK) { anno.BackColor = colorDialog1.Color; } } catch { return; } } private void 设置背景透明AnnoMenuItem_Click(object sender, EventArgs e) { var anno = _rightClickObj as DevExpress.XtraCharts.TextAnnotation; if (anno == null) return; anno.BackColor = Color.Transparent; anno.Shadow.Visible = false; } #endregion Anno #region Axis private void axisRightMenu_Opening(object sender, CancelEventArgs e) { if (_rightClickObj == null) e.Cancel = true; if (_rightClickObj == AxisQ) { 颜色交织AxisMenuItem.Visible = true; } else { 颜色交织AxisMenuItem.Visible = false; } } private void 颜色交织AxisMenuItem_Click(object sender, EventArgs e) { var axis = _rightClickObj as DevExpress.XtraCharts.Axis; if (axis == null) return; 颜色交织AxisMenuItem.Checked = !颜色交织AxisMenuItem.Checked; axis.Interlaced = 颜色交织AxisMenuItem.Checked; } private void 设置颜色AxisMenuItem_Click(object sender, EventArgs e) { var axis = _rightClickObj as DevExpress.XtraCharts.Axis; if (axis == null) return; System.Windows.Forms.ColorDialog colorDialog1; colorDialog1 = new System.Windows.Forms.ColorDialog(); colorDialog1.Color = axis.Label.TextColor; if (colorDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK) { axis.Title.TextColor = colorDialog1.Color; axis.Label.TextColor = colorDialog1.Color; axis.Color = colorDialog1.Color; } } private void 设置坐标值MenuItem_Click(object sender, EventArgs e) { var axis = _rightClickObj as DevExpress.XtraCharts.Axis; if (axis == null) return; if (_rightClickObj == AxisQ) { TProduct.WinFrmUI.TPump.SetSingleCoordLxpQDlg theSetDlg = new TProduct.WinFrmUI.TPump.SetSingleCoordLxpQDlg(); theSetDlg.SetBindingData(_coordinateParas); theSetDlg.OnChangedCoord += ChangedCoordHandler; theSetDlg.ShowDialog(); } else if (_rightClickObj == QHAxisY) { TProduct.WinFrmUI.TPump.SetSingleCoordLxpHDlg theSetDlg = new TProduct.WinFrmUI.TPump.SetSingleCoordLxpHDlg(); theSetDlg.SetBindingData(_coordinateParas); theSetDlg.OnChangedCoord += ChangedCoordHandler; theSetDlg.ShowDialog(); } else if (_rightClickObj == QPAxisY) { TProduct.WinFrmUI.TPump.SetSingleCoordLxpPDlg theSetDlg = new TProduct.WinFrmUI.TPump.SetSingleCoordLxpPDlg(); theSetDlg.SetBindingData(_coordinateParas, this._coordinate_unitP); theSetDlg.OnChangedCoord += ChangedCoordHandler; theSetDlg.ShowDialog(); } else if (_rightClickObj == NPSHAxisY) { TProduct.WinFrmUI.TPump.SetSingleCoordLxpNpshDlg theSetDlg = new TProduct.WinFrmUI.TPump.SetSingleCoordLxpNpshDlg(); theSetDlg.SetBindingData(_coordinateParas, this._coordinate_unitNPSH); theSetDlg.OnChangedCoord += ChangedCoordHandler; theSetDlg.ShowDialog(); } else if (_rightClickObj == QEAxisY) { TProduct.WinFrmUI.TPump.SetSingleCoordLxpEDlg theSetDlg = new TProduct.WinFrmUI.TPump.SetSingleCoordLxpEDlg(); theSetDlg.SetBindingData(_coordinateParas); theSetDlg.OnChangedCoord += ChangedCoordHandler; theSetDlg.ShowDialog(); } } private void 设置子刻度数AxisMenuItem_Click(object sender, EventArgs e) { var axis = _rightClickObj as DevExpress.XtraCharts.Axis; if (axis == null) return; SetNumberDlg theDlg = new SetNumberDlg(); theDlg.IsInt(); theDlg.Number = axis.MinorCount; if (theDlg.ShowDialog() == System.Windows.Forms.DialogResult.OK) { axis.MinorCount = Convert.ToInt32(theDlg.Number); } } #endregion Axis #region Series private void 设置颜色SeriesMenuItem_Click(object sender, EventArgs e) { var series = _rightClickObj as DevExpress.XtraCharts.Series; if (series == null) return; System.Windows.Forms.ColorDialog colorDialog1; colorDialog1 = new System.Windows.Forms.ColorDialog(); colorDialog1.Color = series.View.Color; if (colorDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK) { series.View.Color = colorDialog1.Color; } } private void 设置宽度SeriesMenuItem_Click(object sender, EventArgs e) { var series = _rightClickObj as DevExpress.XtraCharts.Series; if (series == null) return; if (!(series.View is DevExpress.XtraCharts.LineSeriesView)) return; SetCurveWidthDlg theDlg = new SetCurveWidthDlg(); theDlg.CurveWidth = (series.View as DevExpress.XtraCharts.LineSeriesView).LineStyle.Thickness; if (theDlg.ShowDialog() == System.Windows.Forms.DialogResult.OK) { (series.View as DevExpress.XtraCharts.LineSeriesView).LineStyle.Thickness = theDlg.CurveWidth; } } private void 设置线型SeriesMenuItem_Click(object sender, EventArgs e) { var series = _rightClickObj as DevExpress.XtraCharts.Series; if (series == null) return; if (!(series.View is DevExpress.XtraCharts.LineSeriesView)) return; SetLineStyleDlg theDlg = new SetLineStyleDlg(); theDlg.DashStyle = (series.View as DevExpress.XtraCharts.LineSeriesView).LineStyle.DashStyle; if (theDlg.ShowDialog() == System.Windows.Forms.DialogResult.OK) { (series.View as DevExpress.XtraCharts.LineSeriesView).LineStyle.DashStyle = theDlg.DashStyle; } } #endregion Series #region Line private void 设置颜色LineMenuItem_Click(object sender, EventArgs e) { var refLine = _rightClickObj as DevExpress.XtraCharts.ConstantLine; if (refLine == null) return; System.Windows.Forms.ColorDialog colorDialog1; colorDialog1 = new System.Windows.Forms.ColorDialog(); colorDialog1.Color = refLine.Color; if (colorDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK) { refLine.Color = colorDialog1.Color; refLine.Title.TextColor = colorDialog1.Color; } } private void MenuItem设置值Line_Click(object sender, EventArgs e) { if (_rightClickObj == QueryLineHorizontal) { //SetRefLineValue1Dlg theDlg = new SetRefLineValue1Dlg(); //theDlg.SetUnitName(Eventech.Common.UnitHHelper.GetEnUnitName(this._unitH)); //theDlg.RefLineValue = Convert.ToDecimal(Math.Round(CalcDispValueH(QueryLineHorizontal.Points[0].Values[0]), 1)); //if (theDlg.ShowDialog() == DialogResult.OK) //{ // double refH = CalcDataValueH(Convert.ToDouble(theDlg.RefLineValue)); // double refQ = 0; // if (CalcCurveParasByH(refH, ref refQ)) // { // CalcCurveParasByQ(refQ); // SetQueryParaLineQ(); // } //} } else { var refLine = _rightClickObj as DevExpress.XtraCharts.ConstantLine; if (refLine == null) return; if (refLine == QueryLineVertical) { //SetRefLineValue2Dlg theDlg = new SetRefLineValue2Dlg(); //theDlg.SetUnitName(Eventech.Common.UnitQHelper.GetEnUnitName(this._coordinate_unitQ)); //theDlg.SetValue(Math.Round(CalcDispValueQ(Convert.ToDouble(QueryLineVertical.AxisValue)), 1)); //if (theDlg.ShowDialog() == DialogResult.OK) //{ // CalcCurveParasByQ(CalcDataValueQ(theDlg.GetValue().Value)); //} } } } #endregion Line #endregion 右击菜单 #region 装置曲线 private List> _equipmentCurveList = null; public bool IsHaveEquipmentCurve() { if (_equipmentCurveList == null || _equipmentCurveList.Count() == 0) return false; else return true; } private bool _isDispEquipmentCurve = false; public bool IsDispEquipmentCurve { get { return _isDispEquipmentCurve; } set { _isDispEquipmentCurve = value; } } public void ClearEquipmentCurve() { _equipmentCurveList = null; chartControl1.Refresh(); } public void SetEquipmentCurve(Eventech.Model.FeatPoint other_pt, double zeroh) { var defaultWrkCurve = GetDefaultCurveGroupChart(); if (defaultWrkCurve == null || defaultWrkCurve.FeatCurveQH == null) return; var set_pt1 = Eventech.Common.ParabolaCurveHelper_H.GetSectPoint(defaultWrkCurve.FeatCurveQH.CurveExpress, other_pt, zeroh); if (set_pt1 == null) return; if (_equipmentCurveList == null) _equipmentCurveList = new List>(); var curve = BuildEquipCurveParas(set_pt1, zeroh); Eventech.Model.FeatPointList sect_points = new Eventech.Model.FeatPointList(); sect_points.Add(set_pt1); if (this.OnCalcQueryPtInfo != null) { Eventech.Model.GroupPoint queryPt = new Eventech.Model.GroupPoint(); queryPt.Q = set_pt1.X; queryPt.H = set_pt1.Y; OnCalcQueryPtInfo(0, queryPt); } for (int indx = 1; indx < this.AllCurveQH.Count(); indx++) { var wrkCurve2 = GetCurveByIndex(Eventech.Model.eFeatCurveType.QH, indx); var set_pt2 = Eventech.Common.ParabolaCurveHelper_H.GetSectPoint(wrkCurve2.CurveExpress, other_pt, zeroh); if (set_pt2 == null) return; sect_points.Add(set_pt2); if (this.OnCalcQueryPtInfo != null) { Eventech.Model.GroupPoint queryPt = new Eventech.Model.GroupPoint(); queryPt.Q = set_pt2.X; queryPt.H = set_pt2.Y; OnCalcQueryPtInfo(indx, queryPt); } } if (_equipmentCurveList.Count() == 0) { _equipmentCurveList.Add(new Tuple(sect_points, curve)); } else { _equipmentCurveList[0] = new Tuple(sect_points, curve); } chartControl1.Refresh(); } private Eventech.Model.EquipCurveParas BuildEquipCurveParas(Eventech.Model.FeatPoint other_pt, double textZeroH) { double b = textZeroH; double y1 = other_pt.Y; double x1 = other_pt.X; double k = (y1 - b) / (x1 * x1); List points = new List(); double space = (other_pt.X - _minQ) / 10;//11个点 for (int i = 0; i < 11; i++) { double x = space * i + _minQ; double y = k * x * x + b; points.Add(new Eventech.Model.FeatPoint(x, y)); } var equipmentCurveParas = new Eventech.Model.EquipCurveParas(); equipmentCurveParas.Type = 0;//0表示二次曲线 equipmentCurveParas.OriginPoints = new List(); equipmentCurveParas.OriginPoints.Add(new Eventech.Model.FeatPoint() { X = 0, Y = b }); equipmentCurveParas.OriginPoints.Add(new Eventech.Model.FeatPoint() { X = x1, Y = y1 }); equipmentCurveParas.CurveInfo = points; equipmentCurveParas.CurveExpress = Eventech.Common.CurveExpressConver.ToParameter(points); return equipmentCurveParas; } #endregion 装置曲线 #region 曲线分开放菜单 protected TProduct.Model.eChartDiagramPanelStyle _chartPanelStyle = TProduct.Model.eChartDiagramPanelStyle.Two; public void SetChartPanelStyleParas(TProduct.Model.eChartDiagramPanelStyle style) { _chartPanelStyle = style; SetChartPanelStyle(); } //0 是一整块 1 上面扬程效率 下面功率汽蚀 public void SetChartPanelStyle() { bool isHaveCurveQH = false; bool isHaveCurveQE = false; bool isHaveCurveQP = false; bool isHaveCurveNPSH = false; if (AllCurveQH != null && AllCurveQH.Count > 0) { isHaveCurveQH = AllCurveQH.Find(x => x.IsDispCurve) == null ? false : true; } if (AllCurveQE != null && AllCurveQE.Count > 0) { isHaveCurveQE = AllCurveQE.Find(x => x.IsDispCurve) == null ? false : true; } if (AllCurveQP != null && AllCurveQP.Count > 0) { isHaveCurveQP = AllCurveQP.Find(x => x.IsDispCurve) == null ? false : true; } if (AllCurveNPSH != null && AllCurveNPSH.Count > 0) { isHaveCurveNPSH = AllCurveNPSH.Find(x => x.IsDispCurve) == null ? false : true; } this.QEAxisY.Visibility = isHaveCurveQE ? DefaultBoolean.True : DefaultBoolean.False; this.QPAxisY.Visibility = isHaveCurveQP ? DefaultBoolean.True : DefaultBoolean.False; this.NPSHAxisY.Visibility = isHaveCurveNPSH ? DefaultBoolean.True : DefaultBoolean.False; if (!isHaveCurveQE) this.QEAxisY.GridLines.Visible = false; if (!isHaveCurveQP) this.QPAxisY.GridLines.Visible = false; if (!isHaveCurveNPSH) this.NPSHAxisY.GridLines.Visible = false; if (_chartPanelStyle == TProduct.Model.eChartDiagramPanelStyle.Whole) { this.bottomChartDiagram.Visibility = ChartElementVisibility.Hidden; this.QPAxisY.Title.Alignment = StringAlignment.Near; this.NPSHAxisY.Title.Alignment = StringAlignment.Near; this.QHAxisY.GridLines.Visible = false; this.QEAxisY.GridLines.Visible = false; this.QPAxisY.GridLines.Visible = false; this.NPSHAxisY.GridLines.Visible = false; } else { this.QHAxisY.GridLines.Visible = true; this.QPAxisY.Title.Alignment = StringAlignment.Center; this.NPSHAxisY.Title.Alignment = StringAlignment.Center; this.QEAxisY.GridLines.Visible = isHaveCurveQE; if (isHaveCurveQP || isHaveCurveNPSH) { this.QPAxisY.GridLines.Visible = isHaveCurveQP; this.NPSHAxisY.GridLines.Visible = isHaveCurveNPSH; this.bottomChartDiagram.Visibility = ChartElementVisibility.Visible; } else { this.QPAxisY.Visibility = DefaultBoolean.False; this.NPSHAxisY.Visibility = DefaultBoolean.False; this.bottomChartDiagram.Visibility = ChartElementVisibility.Hidden; } } if (_coordinateParas == null) return; if (_chartPanelStyle == TProduct.Model.eChartDiagramPanelStyle.Whole) { #region 整个 TProduct.WinFrmUI.TPump.XtraChartHelper.SetAxisRange(QHAxisY, _coordinateParas.CoordMinH + _coordinateParas.StartLineNoH * _coordinateParas.CoordSpaceH, _coordinateParas.CoordMinH + _coordinateParas.EndLineNoH * _coordinateParas.CoordSpaceH); if (this._coordinate_unitH == Eventech.Model.UnitH.Psi) { TProduct.WinFrmUI.TPump.XtraChartHelper.SetAxisRange(QHAxisY, _coordinateParas.CoordMinH - 0.01, _coordinateParas.CoordMinH + _coordinateParas.GridNumberY * _coordinateParas.CoordSpaceH + 0.01); } else { TProduct.WinFrmUI.TPump.XtraChartHelper.SetAxisRange(QHAxisY, _coordinateParas.CoordMinH, _coordinateParas.CoordMinH + _coordinateParas.GridNumberY * _coordinateParas.CoordSpaceH); } TProduct.WinFrmUI.TPump.XtraChartHelper.SetAxisRange(QEAxisY, _coordinateParas.CoordMinE, _coordinateParas.CoordMinE + _coordinateParas.GridNumberY * _coordinateParas.CoordSpaceE); TProduct.WinFrmUI.TPump.XtraChartHelper.SetAxisRange(QPAxisY, _coordinateParas.CoordMinP, _coordinateParas.CoordMinP + _coordinateParas.GridNumberY * _coordinateParas.CoordSpaceP); TProduct.WinFrmUI.TPump.XtraChartHelper.SetAxisRange(NPSHAxisY, _coordinateParas.CoordMinNPSH, _coordinateParas.CoordMinNPSH + _coordinateParas.GridNumberY * _coordinateParas.CoordSpaceNPSH); #endregion 整个 } else { #region 上面是扬程,效率, 下面是功率汽蚀 if (isHaveCurveQE) { var grid_num_h = _coordinateParas.EndLineNoH - _coordinateParas.StartLineNoH; var grid_num_e = _coordinateParas.EndLineNoE - _coordinateParas.StartLineNoE; int grid_num_up = Math.Max(grid_num_h, grid_num_e) + _coordinateParas.DislocationNumUp;//多两条 var max_coor_h = _coordinateParas.CoordMinH + _coordinateParas.EndLineNoH * _coordinateParas.CoordSpaceH; var min_coor_h = max_coor_h - grid_num_up * _coordinateParas.CoordSpaceH; TProduct.WinFrmUI.TPump.XtraChartHelper.SetAxisRange(QHAxisY, min_coor_h, max_coor_h); var min_coor_e = _coordinateParas.CoordMinE + _coordinateParas.StartLineNoE * _coordinateParas.CoordSpaceE; var max_coor_e = min_coor_e + grid_num_up * _coordinateParas.CoordSpaceE; TProduct.WinFrmUI.TPump.XtraChartHelper.SetAxisRange(QEAxisY, min_coor_e, max_coor_e); QEAxisY.Alignment = AxisAlignment.Far; } else { var grid_num_h = _coordinateParas.EndLineNoH - _coordinateParas.StartLineNoH; var grid_num_e = _coordinateParas.EndLineNoE - _coordinateParas.StartLineNoE; int grid_num_up = Math.Max(grid_num_h, grid_num_e);//多两条 var max_coor_h = _coordinateParas.CoordMinH + _coordinateParas.EndLineNoH * _coordinateParas.CoordSpaceH; var min_coor_h = max_coor_h - grid_num_up * _coordinateParas.CoordSpaceH; TProduct.WinFrmUI.TPump.XtraChartHelper.SetAxisRange(QHAxisY, min_coor_h, max_coor_h); var min_coor_e = _coordinateParas.CoordMinE + _coordinateParas.StartLineNoE * _coordinateParas.CoordSpaceE; var max_coor_e = min_coor_e + grid_num_up * _coordinateParas.CoordSpaceE; TProduct.WinFrmUI.TPump.XtraChartHelper.SetAxisRange(QEAxisY, min_coor_e, max_coor_e); QEAxisY.Alignment = AxisAlignment.Far; } if (isHaveCurveNPSH) { var grid_num_NPSH = _coordinateParas.EndLineNoNPSH - _coordinateParas.StartLineNoNPSH; var grid_num_p = _coordinateParas.EndLineNoP - _coordinateParas.StartLineNoP; int grid_num_down = Math.Max(grid_num_NPSH, grid_num_p) + 2; var max_coor_p = _coordinateParas.CoordMinP + _coordinateParas.EndLineNoP * _coordinateParas.CoordSpaceP; var min_coor_p = max_coor_p - grid_num_down * _coordinateParas.CoordSpaceP; TProduct.WinFrmUI.TPump.XtraChartHelper.SetAxisRange(QPAxisY, min_coor_p, max_coor_p); var min_coor_NPSH = _coordinateParas.CoordMinNPSH + _coordinateParas.StartLineNoNPSH * _coordinateParas.CoordSpaceNPSH; var max_coor_NPSH = min_coor_NPSH + grid_num_down * _coordinateParas.CoordSpaceNPSH; TProduct.WinFrmUI.TPump.XtraChartHelper.SetAxisRange(NPSHAxisY, min_coor_NPSH, max_coor_NPSH); } else { var grid_num_NPSH = _coordinateParas.EndLineNoNPSH - _coordinateParas.StartLineNoNPSH; var grid_num_p = _coordinateParas.EndLineNoP - _coordinateParas.StartLineNoP; int grid_num_down = Math.Max(grid_num_NPSH, grid_num_p); var min_coor_p = _coordinateParas.CoordMinP + _coordinateParas.StartLineNoP * _coordinateParas.CoordSpaceP; var max_coor_p = min_coor_p + grid_num_down * _coordinateParas.CoordSpaceP; TProduct.WinFrmUI.TPump.XtraChartHelper.SetAxisRange(QPAxisY, min_coor_p, max_coor_p); var min_coor_NPSH = _coordinateParas.CoordMinNPSH + _coordinateParas.StartLineNoNPSH * _coordinateParas.CoordSpaceNPSH; var max_coor_NPSH = min_coor_NPSH + grid_num_down * _coordinateParas.CoordSpaceNPSH; TProduct.WinFrmUI.TPump.XtraChartHelper.SetAxisRange(NPSHAxisY, min_coor_NPSH, max_coor_NPSH); } NPSHAxisY.Alignment = AxisAlignment.Far; QPAxisY.Alignment = AxisAlignment.Near; #endregion 上面是扬程,效率, 下面是功率汽蚀 } } #endregion 曲线分开放菜单 #region 设置曲线显示 //是否显示 private void DispCurveMenuItem_Click(object sender, EventArgs e) { var senderMenu = sender as ToolStripMenuItem; if (senderMenu == null) return; bool isDispCurve = !senderMenu.Checked; var tag = senderMenu.Tag; if (tag == null) return; senderMenu.Checked = isDispCurve; switch (tag.ToString()) { case "FeatCurveQH": for (int iExcelCol = this.chartControl1.SeriesSerializable.Count() - 1; iExcelCol > 0; iExcelCol--) { var modelSeries = this.chartControl1.Series[iExcelCol]; if (modelSeries.Name.StartsWith("SeriesQH")) { //var viewQHsimu = modelSeries.View as DevExpress.XtraCharts.SplineSeriesView; modelSeries.Visible = isDispCurve; } } break; case "FeatCurveQE": if (AllCurveQE == null || AllCurveQE.Count() == 0) return; foreach (var c in AllCurveQE) { var series = SeriesGuidDict[c.CurveID]; series.Visible = isDispCurve; c.IsDispCurve = isDispCurve; } for (int iExcelCol = this.chartControl1.SeriesSerializable.Count() - 1; iExcelCol > 0; iExcelCol--) { var modelSeries = this.chartControl1.Series[iExcelCol]; if (modelSeries.Name.StartsWith("SeriesQE")) { if (isDispCurve) this.QEAxisY.Visibility = DefaultBoolean.True; //var viewQHsimu = modelSeries.View as DevExpress.XtraCharts.SplineSeriesView; modelSeries.Visible = isDispCurve; } } break; case "FeatCurveQP": if (AllCurveQP == null || AllCurveQP.Count() == 0) return; foreach (var c in AllCurveQP) { var series = SeriesGuidDict[c.CurveID]; series.Visible = isDispCurve; c.IsDispCurve = isDispCurve; } for (int iExcelCol = this.chartControl1.SeriesSerializable.Count() - 1; iExcelCol > 0; iExcelCol--) { var modelSeries = this.chartControl1.Series[iExcelCol]; if (modelSeries.Name.StartsWith("SeriesQP")) { if (isDispCurve) this.QPAxisY.Visibility = DefaultBoolean.True; //var viewQHsimu = modelSeries.View as DevExpress.XtraCharts.SplineSeriesView; modelSeries.Visible = isDispCurve; } } break; case "FeatCurveNPSH": if (this.AllCurveNPSH == null || AllCurveNPSH.Count() == 0) return; foreach (var c in AllCurveNPSH) { var series = SeriesGuidDict[c.CurveID]; series.Visible = isDispCurve; c.IsDispCurve = isDispCurve; } for (int iExcelCol = this.chartControl1.SeriesSerializable.Count() - 1; iExcelCol > 0; iExcelCol--) { var modelSeries = this.chartControl1.Series[iExcelCol]; if (modelSeries.Name.StartsWith("SeriesNPSH")) { if (isDispCurve) this.NPSHAxisY.Visibility = DefaultBoolean.True; //var viewQHsimu = modelSeries.View as DevExpress.XtraCharts.SplineSeriesView; modelSeries.Visible = isDispCurve; } } break; } SetChartCurveStyle(); } // public void SetCurveDisp(Guid id, bool isDisp) { var curve = (from x in AllCurveQH where x.CurveID == id select x).FirstOrDefault(); if (curve != null) { curve.IsDispCurve = isDisp; } curve = (from x in AllCurveQE where x.CurveID == id select x).FirstOrDefault(); if (curve != null) { curve.IsDispCurve = isDisp; } curve = (from x in AllCurveQP where x.CurveID == id select x).FirstOrDefault(); if (curve != null) { curve.IsDispCurve = isDisp; } curve = (from x in AllCurveNPSH where x.CurveID == id select x).FirstOrDefault(); if (curve != null) { curve.IsDispCurve = isDisp; } this.SetChartPanelStyle(); this.SetChartCurveStyle(); } // public void SetCurveDisp(Eventech.Model.eFeatCurveType type, bool isDisp) { switch (type) { case Eventech.Model.eFeatCurveType.QH: return; case Eventech.Model.eFeatCurveType.QE: if (AllCurveQE == null) return; foreach (var c in AllCurveQE) { c.IsDispCurve = isDisp; } break; case Eventech.Model.eFeatCurveType.QP: if (AllCurveQP == null) return; foreach (var c in AllCurveQP) { c.IsDispCurve = isDisp; } foreach (var c in AnnoGuidDict_QP) { c.Value.Visible = isDisp; } break; case Eventech.Model.eFeatCurveType.QNPSH: if (AllCurveNPSH == null) return; foreach (var c in AllCurveNPSH) { c.IsDispCurve = isDisp; } break; } this.SetChartPanelStyle(); this.SetChartCurveStyle(); } //更新图表视图 public void SetChartCurveStyle() { #region 流量扬程曲线 if (AllCurveQH != null && AllCurveQH.Count > 0) { foreach (var c in AllCurveQH) { if (SeriesGuidDict.ContainsKey(c.CurveID)) { SeriesGuidDict[c.CurveID].Visible = c.IsDispCurve; } } } #endregion 流量扬程曲线 #region 流量效率线 if (AllCurveQE != null && AllCurveQE.Count > 0) { foreach (var c in AllCurveQE) { if (SeriesGuidDict.ContainsKey(c.CurveID)) { var series = SeriesGuidDict[c.CurveID]; series.Visible = c.IsDispCurve; if (c.IsDispCurve) { var viewSeries = series.View as DevExpress.XtraCharts.SplineSeriesView; viewSeries.Pane = mainChartDiagram.DefaultPane; } } } } #endregion 流量效率线 #region 流量功率线 if (AllCurveQP != null && AllCurveQP.Count > 0) { foreach (var c in AllCurveQP) { if (SeriesGuidDict.ContainsKey(c.CurveID)) { var series = SeriesGuidDict[c.CurveID]; series.Visible = c.IsDispCurve; if (c.IsDispCurve) { var viewSeries = series.View as DevExpress.XtraCharts.SplineSeriesView; if (_chartPanelStyle == TProduct.Model.eChartDiagramPanelStyle.Whole) {// viewSeries.Pane = mainChartDiagram.DefaultPane; } else {//分开放 viewSeries.Pane = this.bottomChartDiagram; } } } } } #endregion 流量功率线 #region 流量汽蚀线 if (AllCurveNPSH != null && AllCurveNPSH.Count > 0) { foreach (var c in AllCurveNPSH) { if (SeriesGuidDict.ContainsKey(c.CurveID)) { var series = SeriesGuidDict[c.CurveID]; series.Visible = c.IsDispCurve; if (c.IsDispCurve) { var viewSeries = series.View as DevExpress.XtraCharts.SplineSeriesView; if (_chartPanelStyle == TProduct.Model.eChartDiagramPanelStyle.Whole) {// viewSeries.Pane = mainChartDiagram.DefaultPane; } else {//分开放 viewSeries.Pane = this.bottomChartDiagram; } } } } } #endregion 流量汽蚀线 } #endregion 设置曲线显示 } }