using DevExpress.Utils;
using DevExpress.XtraCharts;
namespace Yw.WinFrmUI.Phart
{
///
/// 泵图表
///
public partial class PumpViewChart : DevExpress.XtraEditors.XtraUserControl
{
public PumpViewChart()
{
InitializeComponent();
InitialChart();
}
#region Private Variable
private XYDiagram _diagram;
private XYDiagramDefaultPane _default_pane;
private XYDiagramPane _bottom_pane;
private AxisX _axis_x_flow;
private AxisY _axis_y_head;
private SecondaryAxisY _axis_y_eff, _axis_y_power;
private ConstantLine _const_line_x;
private ConstantLine _const_line_y;
private TextAnnotation _anno_txt_query_info;
private PumpCoordinate _coordinate = null;
private PumpCurveViewModel _vm = null;
private bool _default_visible = false;
private bool _power_visible = false;
private bool _eff_visible = false;
private bool _equal_eff_visible = false;
private bool _split_panel = false;
private bool _line_visible = false;
private bool _initial_data = false;
#endregion
#region Public Variable
///
///
///
public bool LineVisible
{
get
{
return _line_visible;
}
set
{
_line_visible = value;
_const_line_x.Visible = value;
_const_line_y.Visible = value;
SetAxisXValue();
}
}
///
///
///
public bool SplitPanel
{
get
{
return _split_panel;
}
set
{
_split_panel = value;
}
}
#endregion
#region Private Initial
///
/// 初始化图表
///
private void InitialChart()
{
this.chartControl1.SetChartDisplay();
this.chartControl1.RuntimeHitTesting = true;
this.chartControl1.AnimationStartMode = ChartAnimationMode.OnLoad;
this.chartControl1.ObjectHotTracked += new DevExpress.XtraCharts.HotTrackEventHandler(this.chartControl1_ObjectHotTracked);
this.chartControl1.MouseMove += new System.Windows.Forms.MouseEventHandler(this.chartControl1_MouseMove);
this.chartControl1.MouseUp += new System.Windows.Forms.MouseEventHandler(this.chartControl1_MouseUp);
this.chartControl1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.chartControl1_MouseDown);
this.chartControl1.Resize += new System.EventHandler(this.chartControl1_Resize);
this.chartControl1.CustomPaint += ChartControl1_CustomPaint;
_diagram = (XYDiagram)this.chartControl1.Diagram;
_default_pane = _diagram.DefaultPane;
_bottom_pane = (XYDiagramPane)_diagram.FindPaneByName("BottomPanel");
_axis_x_flow = _diagram.AxisX;
_axis_x_flow.SetAxisXQDisplay();
_axis_y_head = _diagram.AxisY;
_axis_y_head.SetAxisYQHDisplay();
_axis_y_eff = _diagram.SecondaryAxesY.GetAxisByName("AxisYEff");
_axis_y_eff.SetSecondaryAxisYQEDisplay();
_axis_y_eff.Alignment = AxisAlignment.Far;
_axis_y_power = _diagram.SecondaryAxesY.GetAxisByName("AxisYPower");
_axis_y_power.SetSecondaryAxisYQPDisplay();
_const_line_x = (ConstantLine)_diagram.AxisX.ConstantLines.GetElementByName("ConstantLineX");
_const_line_x.SetWorkPointLineDisplay();
_const_line_y = (ConstantLine)_diagram.AxisY.ConstantLines.GetElementByName("ConstantLineY");
_const_line_y.SetWorkPointLineDisplay();
_axis_x_flow.Visibility = DefaultBoolean.False;
_axis_x_flow.GridLines.Visible = false;
_axis_y_head.Visibility = DefaultBoolean.False;
_axis_y_head.GridLines.Visible = false;
_axis_y_eff.Visibility = DefaultBoolean.False;
_axis_y_eff.GridLines.Visible = false;
_axis_y_power.Visibility = DefaultBoolean.False;
_axis_y_power.GridLines.Visible = false;
_const_line_x.Visible = false;
_const_line_y.Visible = false;
}
///
/// 初始化坐标轴
///
private void InitialCoordinate()
{
//设置成白板坐标
_coordinate = new PumpCoordinate();
_coordinate.GridNumberX = 30;
_coordinate.GridNumberY = 16;
//显示的坐标线号
_coordinate.StartLineNoH = 10;
_coordinate.EndLineNoH = 15;
_coordinate.StartLineNoE = 0;
_coordinate.EndLineNoE = 10;
_coordinate.StartLineNoP = 2;
_coordinate.EndLineNoP = 9;
//坐标最小值和间隔
_coordinate.CoordMinQ = 0; _coordinate.CoordSpaceQ = 1000;
_coordinate.CoordMinH = 10; _coordinate.CoordSpaceH = 100;
_coordinate.CoordMinE = 0; _coordinate.CoordSpaceE = 100;
_coordinate.CoordMinP = 10; _coordinate.CoordSpaceP = 100;
}
#endregion
#region Private Chart Event
ToolTipController _tool_tip = new();
private void chartControl1_ObjectHotTracked(object sender, HotTrackEventArgs e)
{
//if (!_initial_data)
// return;
//if (e.AdditionalObject is SeriesPoint series_pt)
//{
// var tip = string.Format("X:{0:N1} Y:{1:N1}", series_pt.Argument, series_pt.Values[0]);
// _tool_tip.ShowHint(tip);
//}
//else
//{
// _tool_tip.HideHint();
//}
}
private bool _on_move_x_line = false;
private bool _on_move_y_line = false;
private void chartControl1_MouseDown(object sender, MouseEventArgs e)
{
if (!_initial_data)
return;
var hitInfo = chartControl1.CalcHitInfo(e.Location);
if (e.Button == MouseButtons.Left)
{
if (hitInfo.InConstantLine)
{
if (hitInfo.ConstantLine == _const_line_x)
{
_on_move_x_line = true;
}
else if (hitInfo.ConstantLine == _const_line_y)
{
_on_move_y_line = true;
}
}
}
}
private void chartControl1_MouseMove(object sender, MouseEventArgs e)
{
if (!_initial_data)
return;
if (_on_move_x_line)
{
var diagram_coordinates = _diagram.PointToDiagram(e.Location);
var axis_value = diagram_coordinates.GetAxisValue(_axis_x_flow);
if (axis_value == null)
return;
double chartQ = axis_value.NumericalValue;
SetAxisXValue(chartQ);
}
else if (_on_move_y_line)
{
var diagram_coordinates = _diagram.PointToDiagram(e.Location);
var axis_value = diagram_coordinates.GetAxisValue(_axis_y_head);
if (axis_value == null)
return;
double chartH = axis_value.NumericalValue;
SetAxisYValue(chartH);
}
else
{
var hitInfo = chartControl1.CalcHitInfo(e.Location);
if (hitInfo.InConstantLine)
{
this.chartControl1.Cursor = Cursors.Hand;
}
else if (hitInfo.InAnnotation)
{
this.chartControl1.Cursor = Cursors.SizeAll;
}
else
{
this.chartControl1.Cursor = Cursors.Default;
}
}
}
private void chartControl1_MouseUp(object sender, MouseEventArgs e)
{
if (!_initial_data)
return;
_on_move_x_line = false;
_on_move_y_line = false;
}
private void chartControl1_Resize(object sender, EventArgs e)
{
}
private void ChartControl1_CustomPaint(object sender, CustomPaintEventArgs e)
{
if (!_initial_data)
return;
if (_vm == null)
return;
if (_axis_x_flow.Visibility == DefaultBoolean.False)
return;
if (e is not DXCustomPaintEventArgs dx_args)
return;
var cache = dx_args.Cache;
cache.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
if (_equal_eff_visible && _vm.EqualEffList != null && _vm.EqualEffList.Any())
{
using Pen pen = new(Color.Green, 2);
foreach (var eq_eff in _vm.EqualEffList)
{
if (!eq_eff.IsValid())
continue;
var eq_eff_pt_list = eq_eff.CurveEqualEff;
var pic_eq_eff_pt_list = new List();
foreach (var eq_eff_pt in eq_eff_pt_list)
{
var x = eq_eff_pt.X;
var y = eq_eff_pt.Y;
var coordinates = _diagram.DiagramToPoint(x, y, _diagram.AxisX, _diagram.AxisY);
if (coordinates == null)
continue;
var pt = new Point(coordinates.Point.X, coordinates.Point.Y);
pic_eq_eff_pt_list.Add(pt);
}
var pt_count = pic_eq_eff_pt_list.Count;
if (pt_count > 2)
{
if (eq_eff.IsClosed)
{
var path = cache.CreatePath();
path.AddClosedCurve(pic_eq_eff_pt_list.ToArray(), (float)eq_eff.Tension);
cache.DrawPath(pen, path);
}
else
{
var path = cache.CreatePath();
path.AddCurve(pic_eq_eff_pt_list.ToArray(), (float)eq_eff.Tension);
cache.DrawPath(pen, path);
}
}
else if (pt_count == 2)
{
cache.DrawLine(pen, pic_eq_eff_pt_list[0], pic_eq_eff_pt_list[1]);
}
else if (pt_count == 1)
{
Rectangle rc = new Rectangle(pic_eq_eff_pt_list[0].X - 2, pic_eq_eff_pt_list[0].Y - 2, 4, 4);
using (Brush b = new SolidBrush(pen.Color))
cache.FillEllipse(b, rc);
}
}
}
if (_vm.Equip != null && _vm.Equip.IsValid())
{
using Pen pen = new(Color.Black, 2);
pen.DashStyle = System.Drawing.Drawing2D.DashStyle.DashDotDot;
var offset_size = 10;
var qh_pt = _diagram.DiagramToPoint(_vm.Equip.SectQ, _vm.Equip.SectH, _axis_x_flow, _axis_y_head);
var qh_pt_x = qh_pt.Point.X;
var qh_pt_y = qh_pt.Point.Y;
cache.DrawLine(pen, new Point(qh_pt_x, qh_pt_y - offset_size), new Point(qh_pt_x, qh_pt_y + offset_size));
if (_eff_visible && _vm.Equip.SectE != null)
{
var qe_pt = _diagram.DiagramToPoint(_vm.Equip.SectQ, _vm.Equip.SectE.Value, _axis_x_flow, _axis_y_eff);
var qe_pt_x = qe_pt.Point.X;
var qe_pt_y = qe_pt.Point.Y;
cache.DrawLine(pen, new Point(qe_pt_x, qe_pt_y - offset_size), new Point(qe_pt_x, qe_pt_y + offset_size));
}
if (_power_visible && _vm.Equip.SectP != null)
{
var qp_pt = _diagram.DiagramToPoint(_vm.Equip.SectQ, _vm.Equip.SectP.Value, _axis_x_flow, _axis_y_power);
var qp_pt_x = qp_pt.Point.X;
var qp_pt_y = qp_pt.Point.Y;
cache.DrawLine(pen, new Point(qp_pt_x, qp_pt_y - offset_size), new Point(qp_pt_x, qp_pt_y + offset_size));
}
}
}
#endregion
#region Set
///
/// 清空图表
///
public void Clear()
{
_vm = null;
_default_visible = false;
_split_panel = false;
_eff_visible = false;
_power_visible = false;
_initial_data = false;
this.chartControl1.BeginInit();
this.chartControl1.Series.Clear();
this.chartControl1.AnnotationRepository.Clear();
this.chartControl1.Legend.CustomItems.Clear();
this.chartControl1.EndInit();
}
///
/// 设置图表
///
public void SetBindingData(PumpCurveViewModel vm, bool split_panel = false, bool eff_visible = false, bool power_visible = true, bool equal_eff_visible = false)
{
_vm = vm;
_split_panel = split_panel;
_eff_visible = eff_visible;
_power_visible = power_visible;
_equal_eff_visible = equal_eff_visible;
this.chartControl1.BeginInit();
this.chartControl1.Series.Clear();
this.chartControl1.AnnotationRepository.Clear();
this.chartControl1.Legend.CustomItems.Clear();
if (vm == null)
{
_initial_data = false;
this.chartControl1.EndInit();
return;
}
AddDefault(vm);
AddEquip(vm.Equip);
AddVariableSpeedList(vm.VariableSpeedList);
if (_equal_eff_visible)
AddEqualEffList(vm.EqualEffList);
AddEqualPowerList(vm.EqualPowerList);
if (vm.Coordinate == null)
{
SetCoordinate();
}
else
{
_coordinate = vm.Coordinate;
}
SetChartAxis();
this.chartControl1.EndInit();
_initial_data = true;
}
//是否是无效数据
private bool IsInvalidData()
{
if (_vm == null)
{
return true;
}
return false;
}
#region Add Data
private void AddDefault(PumpCurveViewModel vm)
{
var id = vm.Id;
var caption_qh = vm.CurveQHName;
var caption_qp = vm.CurveQPName;
var color_qh = vm.ColorQH ?? PumpChartDisplay.CurveColorQH;
var color_qe = vm.ColorQE ?? PumpChartDisplay.CurveColorQE;
var color_qp = vm.ColorQP ?? PumpChartDisplay.CurveColorQP;
var qh = vm.CurveQH;
var qe = vm.CurveQE;
var qp = vm.CurveQP;
XYDiagramPaneBase bottom_pane = _split_panel ? _bottom_pane : _default_pane;
AddLineSeries(id, color_qh, _axis_x_flow, _axis_y_head, _default_pane, qh, DevExpress.XtraCharts.DashStyle.Dash);
if (!string.IsNullOrEmpty(caption_qh))
AddAnnotation(id, caption_qh, color_qh, _axis_y_head, _default_pane, qh.Last());
if (qe != null && qe.Any() && _eff_visible)
{
AddLineSeries(id, color_qe, _axis_x_flow, _axis_y_eff, _default_pane, qe, DevExpress.XtraCharts.DashStyle.Dash);
}
if (qp != null && qp.Any() && _power_visible)
{
AddLineSeries(id, color_qp, _axis_x_flow, _axis_y_power, bottom_pane, qp, DevExpress.XtraCharts.DashStyle.Dash);
if (!string.IsNullOrEmpty(caption_qp))
{
AddAnnotation(id, caption_qp, color_qp, _axis_y_power, bottom_pane, qp.Last());
}
}
}
private void AddEquip(PumpCurveEquipViewModel vm)
{
if (vm == null)
return;
var id = vm.Id;
var caption = vm.CurveName;
var color = vm.Color ?? Color.Black;
var equip = vm.CurveEquip;
var equip_pt = new Yw.Geometry.Point2d(vm.PipeQ, vm.PipeH);
AddLineSeries(id, color, _axis_x_flow, _axis_y_head, _default_pane, equip, DevExpress.XtraCharts.DashStyle.DashDotDot);
// AddPointSeries(id, color, _axis_x_flow, _axis_y_head, _default_pane, new List() { equip_pt }, MarkerKind.ThinCross);
if (!string.IsNullOrEmpty(caption))
AddAnnotation(id, caption, color, _axis_y_head, _default_pane, equip.Last());
}
private void AddVariableSpeedList(List vm_list)
{
if (vm_list == null || !vm_list.Any())
return;
XYDiagramPaneBase bottom_pane = _split_panel ? _bottom_pane : _default_pane;
foreach (var vm in vm_list)
{
if (!vm.IsValid())
continue;
var id = vm.Id;
var caption_qh = vm.CurveQHName;
var caption_qp = vm.CurveQPName;
var color_qh = vm.ColorQH ?? PumpChartDisplay.CurveColorQH;
var color_qe = vm.ColorQE ?? PumpChartDisplay.CurveColorQE;
var color_qp = vm.ColorQP ?? PumpChartDisplay.CurveColorQP;
var qh = vm.CurveQH;
var qe = vm.CurveQE;
var qp = vm.CurveQP;
AddLineSeries(id, color_qh, _axis_x_flow, _axis_y_head, _default_pane, qh);
if (!string.IsNullOrEmpty(caption_qh))
AddAnnotation(id, caption_qh, color_qh, _axis_y_head, _default_pane, qh.Last());
if (qe != null && qe.Any() && _eff_visible)
{
AddLineSeries(id, color_qe, _axis_x_flow, _axis_y_eff, _default_pane, qe);
}
if (qp != null && qp.Any() && _power_visible)
{
AddLineSeries(id, color_qp, _axis_x_flow, _axis_y_power, bottom_pane, qp);
if (!string.IsNullOrEmpty(caption_qp))
{
AddAnnotation(id, caption_qp, color_qp, _axis_y_power, bottom_pane, qp.Last());
}
}
}
}
private void AddEqualEffList(List vm_list)
{
if (vm_list == null || !vm_list.Any())
return;
foreach (var vm in vm_list)
{
if (!vm.IsValid())
continue;
var id = vm.Id;
var caption = vm.CurveName;
var color = vm.Color ?? Color.Green;
var equif_eff = vm.CurveEqualEff;
if (!string.IsNullOrEmpty(caption))
{
if (equif_eff.Count > 2)
{
AddAnnotation(id, caption, color, _axis_y_head, _default_pane, equif_eff.First(), 60);
}
AddAnnotation(id, caption, color, _axis_y_head, _default_pane, equif_eff.Last(), 60);
}
}
}
private void AddEqualPowerList(List vm_list)
{
if (vm_list == null || !vm_list.Any())
return;
foreach (var vm in vm_list)
{
if (!vm.IsValid())
continue;
var id = vm.Id;
var caption = vm.CurveName;
var color = vm.Color ?? Color.Green;
var equif_power = vm.CurveEqualPower;
if (equif_power.Count < 2)
{
AddPointSeries(id, color, _axis_x_flow, _axis_y_head, _default_pane, equif_power);
}
else
{
AddLineSeries(id, color, _axis_x_flow, _axis_y_head, _default_pane, equif_power, DashStyle.Dash);
}
if (!string.IsNullOrEmpty(caption))
AddAnnotation(id, caption, color, _axis_y_head, _default_pane, equif_power.Last());
}
}
#endregion
#region Add Chart Data
private void AddPointSeries(string id, Color color, AxisXBase axis_x, AxisYBase axis_y, XYDiagramPaneBase pane, List pt_list, MarkerKind marker = MarkerKind.Circle)
{
if (pt_list == null || !pt_list.Any())
return;
var view = new DevExpress.XtraCharts.PointSeriesView();
view.PointMarkerOptions.Size = 8;
view.PointMarkerOptions.Kind = marker;
view.PointMarkerOptions.BorderColor = color;
view.Color = color;
view.AxisX = axis_x;
view.AxisY = axis_y;
view.EmptyPointOptions.Color = Color.Transparent;
view.Pane = pane;
var series_pt_list = pt_list.Select(x => x.ToSeriesPoint()).ToArray();
var series = new DevExpress.XtraCharts.Series();
series.Tag = id;
series.ShowInLegend = false;
series.ArgumentScaleType = DevExpress.XtraCharts.ScaleType.Numerical;
series.LabelsVisibility = DevExpress.Utils.DefaultBoolean.False;
series.CrosshairEnabled = DefaultBoolean.False;
series.CrosshairLabelVisibility = DefaultBoolean.False;
series.ToolTipEnabled = DefaultBoolean.False;
series.SeriesPointsSorting = SortingMode.None;
series.Visible = true;
series.View = view;
series.CrosshairLabelPattern = "{A}";
series.Points.AddRange(series_pt_list);
this.chartControl1.Series.Add(series);
}
private void AddLineSeries(string id, Color color, AxisXBase axis_x, AxisYBase axis_y, XYDiagramPaneBase pane, List pt_list, DevExpress.XtraCharts.DashStyle dash = DevExpress.XtraCharts.DashStyle.Solid)
{
if (pt_list == null || !pt_list.Any())
return;
var view = new DevExpress.XtraCharts.LineSeriesView();
view.LineStyle.DashStyle = dash;
view.LineStyle.LineJoin = System.Drawing.Drawing2D.LineJoin.Round;
view.LineStyle.Thickness = 2;
view.Color = color;
view.EnableAntialiasing = DefaultBoolean.True;
view.MarkerVisibility = DefaultBoolean.False;
view.AxisX = axis_x;
view.AxisY = axis_y;
view.EmptyPointOptions.Color = Color.Transparent;
view.Pane = pane;
var series_pt_list = pt_list.Select(x => x.ToSeriesPoint()).ToArray();
var series = new DevExpress.XtraCharts.Series();
series.Tag = id;
series.ShowInLegend = false;
series.ArgumentScaleType = DevExpress.XtraCharts.ScaleType.Numerical;
series.LabelsVisibility = DevExpress.Utils.DefaultBoolean.False;
series.CrosshairEnabled = DefaultBoolean.False;
series.ToolTipEnabled = DefaultBoolean.False;
series.SeriesPointsSorting = SortingMode.None;
series.Visible = true;
series.View = view;
series.Points.AddRange(series_pt_list);
this.chartControl1.Series.Add(series);
}
private void AddAnnotation(string id, string caption, Color color, AxisYBase axis_y, XYDiagramPaneBase pane, Yw.Geometry.Point2d pt, double angle = -10)
{
if (pt == null)
return;
var anchor_pt = pt;
var pane_anchor_pt = new DevExpress.XtraCharts.PaneAnchorPoint();
pane_anchor_pt.Pane = pane;
pane_anchor_pt.AxisYCoordinate.Axis = axis_y;
pane_anchor_pt.AxisXCoordinate.AxisValue = anchor_pt.X;
pane_anchor_pt.AxisYCoordinate.AxisValue = anchor_pt.Y;
var relative_position = new DevExpress.XtraCharts.RelativePosition();
relative_position.Angle = angle;
relative_position.ConnectorLength = 20;
var text_annotation = new TextAnnotation();
text_annotation.AnchorPoint = pane_anchor_pt;
text_annotation.AutoHeight = true;
text_annotation.AutoWidth = true;
text_annotation.BackColor = System.Drawing.Color.Transparent;
text_annotation.Border.Color = System.Drawing.Color.Transparent;
text_annotation.Border.Visibility = DefaultBoolean.False;
text_annotation.ConnectorStyle = DevExpress.XtraCharts.AnnotationConnectorStyle.None;
text_annotation.Tag = id;
text_annotation.Padding.Bottom = 1;
text_annotation.Padding.Left = 1;
text_annotation.Padding.Right = 1;
text_annotation.Padding.Top = 1;
text_annotation.RuntimeMoving = true;
text_annotation.RuntimeAnchoring = false;
text_annotation.RuntimeResizing = false;
text_annotation.RuntimeRotation = false;
text_annotation.Text = caption;
text_annotation.TextColor = color;
text_annotation.ShapePosition = relative_position;
text_annotation.Visible = true;
text_annotation.DXFont = new DevExpress.Drawing.DXFont(this.Font.Name, 10F);
this.chartControl1.AnnotationRepository.Add(text_annotation);
}
#endregion
#endregion
#region Set Axis
private double _minQ, _maxQ;
private double _maxH = 0, _minH = 10000;
private double _maxE = 0, _minE = 0;
private double _maxP = 0, _minP = 1000;
///
/// 设置坐标
///
private void SetCoordinate()
{
if (_vm == null)
{
InitialCoordinate();
return;
}
if (_vm.CurveQH == null || !_vm.CurveQH.Any())
{
InitialCoordinate();
return;
}
_maxQ = 0; _minQ = 100000;
_maxH = 0; _minH = 10000;
_maxE = 0; _minE = 0;
_maxP = 0; _minP = 1000;
var q_list_list = new List>();
var h_list_list = new List>();
var e_list_list = new List>();
var p_list_list = new List>();
if (_default_visible)
{
q_list_list.Add(_vm.CurveQH.Select(x => x.X).ToList());
h_list_list.Add(_vm.CurveQH.Select(x => x.Y).ToList());
if (_vm.CurveQE != null)
{
e_list_list.Add(_vm.CurveQE.Select(x => x.Y).ToList());
}
if (_vm.CurveQP != null)
{
p_list_list.Add(_vm.CurveQP.Select(x => x.Y).ToList());
}
}
if (_vm.Equip != null)
{
var item = _vm.Equip;
q_list_list.Add(item.CurveEquip.Select(x => x.X).ToList());
h_list_list.Add(item.CurveEquip.Select(x => x.Y).ToList());
}
if (_vm.VariableSpeedList != null && _vm.VariableSpeedList.Any())
{
foreach (var item in _vm.VariableSpeedList)
{
q_list_list.Add(item.CurveQH.Select(x => x.X).ToList());
h_list_list.Add(item.CurveQH.Select(x => x.Y).ToList());
if (item.CurveQE != null)
{
e_list_list.Add(item.CurveQE.Select(x => x.Y).ToList());
}
if (item.CurveQP != null)
{
p_list_list.Add(item.CurveQP.Select(x => x.Y).ToList());
}
}
}
if (_vm.EqualEffList != null && _vm.EqualEffList.Any())
{
foreach (var item in _vm.EqualEffList)
{
q_list_list.Add(item.CurveEqualEff.Select(x => x.X).ToList());
h_list_list.Add(item.CurveEqualEff.Select(x => x.Y).ToList());
}
}
if (_vm.EqualPowerList != null && _vm.EqualPowerList.Any())
{
foreach (var item in _vm.EqualPowerList)
{
q_list_list.Add(item.CurveEqualPower.Select(x => x.X).ToList());
h_list_list.Add(item.CurveEqualPower.Select(x => x.Y).ToList());
}
}
foreach (var list in q_list_list)
{
_minQ = Math.Min(_minQ, list.Min());
_maxQ = Math.Max(_maxQ, list.Max());
}
foreach (var list in h_list_list)
{
_minH = Math.Min(_minH, list.Min());
_maxH = Math.Max(_maxH, list.Max());
}
foreach (var list in e_list_list)
{
_minE = Math.Max(_minE, list.Min());
_maxE = Math.Max(_maxE, list.Max());
}
foreach (var list in p_list_list)
{
_minP = Math.Min(_minP, list.Min());
_maxP = Math.Max(_maxP, list.Max());
}
_coordinate = PumpCoordinate.CalcCoordinate(_minQ, _maxQ, _minH, _maxH, _minE, _maxE, _minP, _maxP);
if (_coordinate == null)
return;
if (_coordinate.CoordMinQ + _coordinate.CoordSpaceQ * this._coordinate.GridNumberX < _maxQ * 1.05)
{
_coordinate.GridNumberX++;
}
}
///
/// 设置图表轴
///
private void SetChartAxis()
{
_axis_x_flow.Visibility = DefaultBoolean.False;
_axis_x_flow.GridLines.Visible = false;
_axis_y_head.Visibility = DefaultBoolean.False;
_axis_y_head.GridLines.Visible = false;
_axis_y_eff.Visibility = DefaultBoolean.False;
_axis_y_eff.GridLines.Visible = false;
_axis_y_power.Visibility = DefaultBoolean.False;
_axis_y_power.GridLines.Visible = false;
if (_coordinate == null)
{
_const_line_x.Visible = false;
_const_line_y.Visible = false;
_bottom_pane.Visibility = ChartElementVisibility.Hidden;
return;
}
//计算刻度 Q
var axisQLabels = new List();
var disQ = _coordinate.CoordMinQ;
for (int i = 0; i < _coordinate.GridNumberX + 1; i++)
{
axisQLabels.Add(new CustomAxisLabel(disQ.ToString("N0"), disQ));
disQ = disQ + _coordinate.CoordSpaceQ;
}
_axis_x_flow.CustomLabels.Clear();
_axis_x_flow.CustomLabels.AddRange(axisQLabels.ToArray());
_axis_x_flow.Visibility = DefaultBoolean.True;
_axis_x_flow.GridLines.Visible = true;
//计算刻度
var axis_head_labels = new List();
var display_head = _coordinate.CoordMinH + _coordinate.CoordSpaceH * _coordinate.StartLineNoH;
for (int i = _coordinate.StartLineNoH; i < _coordinate.EndLineNoH + 1; i++)
{
axis_head_labels.Add(new CustomAxisLabel(display_head.ToString(), display_head));
display_head = display_head + _coordinate.CoordSpaceH;
}
_axis_y_head.CustomLabels.Clear();
_axis_y_head.CustomLabels.AddRange(axis_head_labels.ToArray());
_axis_y_head.Visibility = DefaultBoolean.True;
_axis_y_head.GridLines.Visible = true;
//效率
if (_maxE > _minE && _eff_visible)
{
//计算刻度
var label_list = new List();
var display_eff = _coordinate.CoordMinE + _coordinate.CoordSpaceE * _coordinate.StartLineNoE;
for (int i = _coordinate.StartLineNoE; i < _coordinate.EndLineNoE + 1; i++)
{
label_list.Add(new CustomAxisLabel(display_eff.ToString(), display_eff));
display_eff = display_eff + _coordinate.CoordSpaceE;
}
_axis_y_eff.CustomLabels.Clear();
_axis_y_eff.CustomLabels.AddRange(label_list.ToArray());
_axis_y_eff.Visibility = DefaultBoolean.True;
_axis_y_eff.GridLines.Visible = true;
}
//功率
if (_maxP > _minP && _power_visible)
{
//计算刻度
var label_list = new List();
double display_power = _coordinate.CoordMinP + _coordinate.CoordSpaceP * _coordinate.StartLineNoP;
for (int i = _coordinate.StartLineNoP; i < _coordinate.EndLineNoP + 1; i++)
{
label_list.Add(new CustomAxisLabel(display_power.ToString(), display_power));
display_power = display_power + _coordinate.CoordSpaceP;
}
_axis_y_power.CustomLabels.Clear();
_axis_y_power.CustomLabels.AddRange(label_list.ToArray());
_axis_y_power.Visibility = DefaultBoolean.True;
_axis_y_power.GridLines.Visible = true;
}
_axis_x_flow.SetAxisRange(_coordinate.CoordMinQ, _coordinate.CoordMinQ + _coordinate.GridNumberX * _coordinate.CoordSpaceQ);
//是否分割面板:流量效率在上,功率在下
if (_split_panel)
{
if (_power_visible)
{
var grid_count_head = _coordinate.EndLineNoH - _coordinate.StartLineNoH;
var grid_count_eff = _coordinate.EndLineNoE - _coordinate.StartLineNoE;
int grid_count_add = Math.Max(grid_count_head, grid_count_eff);
if (_eff_visible)
grid_count_add += +5;//多两条
var max_axis_head = _coordinate.CoordMinH + _coordinate.EndLineNoH * _coordinate.CoordSpaceH;
var min_axis_head = max_axis_head - grid_count_add * _coordinate.CoordSpaceH;
_axis_y_head.SetAxisRange(min_axis_head, max_axis_head);
var min_axis_eff = _coordinate.CoordMinE + _coordinate.StartLineNoE * _coordinate.CoordSpaceE;
var max_axis_eff = min_axis_eff + grid_count_add * _coordinate.CoordSpaceE;
_axis_y_eff.SetAxisRange(min_axis_eff, max_axis_eff);
_bottom_pane.Visibility = ChartElementVisibility.Visible;
}
else
{
var grid_count_power = _coordinate.EndLineNoP - _coordinate.StartLineNoP;
var grid_delete_head = grid_count_power * _coordinate.CoordSpaceH;
grid_delete_head = _coordinate.CoordMinH < 0 ? -grid_delete_head : grid_delete_head;
var grid_delete_eff = grid_count_power * _coordinate.CoordSpaceE;
grid_delete_eff = _coordinate.CoordMinE < 0 ? -grid_delete_eff : grid_delete_eff;
_axis_y_head.SetAxisRange(_coordinate.CoordMinH - grid_delete_head, _coordinate.CoordMinH + _coordinate.GridNumberY * _coordinate.CoordSpaceH);
_axis_y_eff.SetAxisRange(_coordinate.CoordMinE - grid_delete_eff, _coordinate.CoordMinE + _coordinate.GridNumberY * _coordinate.CoordSpaceE);
_bottom_pane.Visibility = ChartElementVisibility.Hidden;
}
if ((!_eff_visible) && (!_power_visible))
{
_axis_y_head.SetAxisRange(_coordinate.DispMinH(), _coordinate.DispMaxH());
}
_axis_y_power.SetAxisRange(_coordinate.DispMinP(), _coordinate.DispMaxP());
}
else
{
if ((!_eff_visible) && (!_power_visible))
{
_axis_y_head.SetAxisRange(_coordinate.DispMinH(), _coordinate.DispMaxH());
}
else if ((!_eff_visible) && _power_visible)
{
var grid_count_eff = _coordinate.EndLineNoE - _coordinate.StartLineNoE;
if (_coordinate.EndLineNoH - _coordinate.StartLineNoH < 6)
grid_count_eff++;
var grid_delete_head = grid_count_eff * _coordinate.CoordSpaceH;
grid_delete_head = _coordinate.CoordMinH < 0 ? -grid_delete_head : grid_delete_head;
var grid_delete_power = grid_count_eff * _coordinate.CoordSpaceP;
_axis_y_head.SetAxisRange(_coordinate.CoordMinH - grid_delete_head, _coordinate.CoordMinH + _coordinate.GridNumberY * _coordinate.CoordSpaceH);
_axis_y_power.SetAxisRange(_coordinate.CoordMinP, _coordinate.CoordMinP + _coordinate.GridNumberY * _coordinate.CoordSpaceP - grid_delete_power);
}
else if (_eff_visible && (!_power_visible))
{
var grid_count_power = _coordinate.EndLineNoP - _coordinate.StartLineNoP;
var grid_delete_head = grid_count_power * _coordinate.CoordSpaceH;
grid_delete_head = _coordinate.CoordMinH < 0 ? -grid_delete_head : grid_delete_head;
var grid_delete_eff = grid_count_power * _coordinate.CoordSpaceE;
grid_delete_eff = _coordinate.CoordMinE < 0 ? -grid_delete_eff : grid_delete_eff;
_axis_y_head.SetAxisRange(_coordinate.CoordMinH - grid_delete_head, _coordinate.CoordMinH + _coordinate.GridNumberY * _coordinate.CoordSpaceH);
_axis_y_eff.SetAxisRange(_coordinate.CoordMinE - grid_delete_eff, _coordinate.CoordMinE + _coordinate.GridNumberY * _coordinate.CoordSpaceE);
}
else
{
_axis_y_head.SetAxisRange(_coordinate.CoordMinH, _coordinate.CoordMinH + _coordinate.GridNumberY * _coordinate.CoordSpaceH);
_axis_y_eff.SetAxisRange(_coordinate.CoordMinE, _coordinate.CoordMinE + _coordinate.GridNumberY * _coordinate.CoordSpaceE);
_axis_y_power.SetAxisRange(_coordinate.CoordMinP, _coordinate.CoordMinP + _coordinate.GridNumberY * _coordinate.CoordSpaceP);
}
_bottom_pane.Visibility = ChartElementVisibility.Hidden;
}
}
#endregion
#region Set Axis Value
///
/// 设置X轴值
///
public void SetAxisXValue(double? x = null)
{
if (!_line_visible)
{
_const_line_x.Visible = false;
_const_line_x.Title.Visible = false;
_const_line_y.Visible = false;
_const_line_y.Title.Visible = false;
return;
}
else
{
_const_line_x.Visible = true;
_const_line_x.Title.Visible = true;
_const_line_y.Visible = true;
_const_line_y.Title.Visible = true;
}
if (this.IsInvalidData())
return;
var min_x = _fit_pt_list.Min(x => x.X);
var max_x = _fit_pt_list.Max(x => x.X);
if (x == null)
{
x = (min_x + max_x) / 2;
}
else
{
if (x < min_x || x > max_x)
return;
}
var x_value = x.Value;
var y_value = _fit_pt_list.GetInterPointsY(x_value)?.FirstOrDefault();
_const_line_x.AxisValue = x_value;
_const_line_x.Title.Text = $"{x_value:N1}";
_const_line_y.AxisValue = y_value;
_const_line_y.Title.Text = $"{y_value:N1}";
}
///
/// 设置Y轴值
///
public void SetAxisYValue(double y)
{
if (!_line_visible)
return;
if (IsInvalidData())
return;
var min_y = _fit_pt_list.Min(x => x.Y);
var max_y = _fit_pt_list.Max(x => x.Y);
if (y < min_y || y > max_y)
return;
var x_value = _fit_pt_list.GetInterPointsX(y)?.LastOrDefault();
SetAxisXValue(x_value);
}
#endregion
}
}