using DevExpress.Spreadsheet;
using Yw.Geometry;
using Yw.Pump;
using Yw.WinFrmUI.Phart;
namespace HStation.WinFrmUI
{
public partial class PumpChartViewCtrl : DevExpress.XtraEditors.XtraUserControl
{
public PumpChartViewCtrl()
{
InitializeComponent();
this.barCekEqVisible.Checked = true;
this.barCekEqulEffVisible.Checked = true;
//this.bar2.Visible = false;
//this.barCekEqulEffVisible.Visibility = DevExpress.XtraBars.BarItemVisibility.Never;
}
private Yw.Vmo.PhartDiagramExGraphListVmo _vmo = null;
private Yw.WinFrmUI.Phart.PumpPerformCurveViewModel _model = null;
private Yw.WinFrmUI.Phart.PumpCurveViewModel _vm = null;
private bool _default_visible = true;
private bool _power_visible = true;
private bool _eff_visible = true;
private bool _equal_eff_visible = true;
private bool _split_panel = true;
private double _nr;
///
/// 数据变更事件
///
public event Action DataChangedEvent;
///
/// 绑定数据
///
public void SetBindingData(Yw.Vmo.PhartDiagramExGraphListVmo vmo, double nr)
{
_vmo = vmo;
_nr = nr;
if (vmo == null)
{
ClearBindingData();
return;
}
var vm_list = vmo.GetPumpCurveViewMdoelList();
if (vm_list == null || !vm_list.Any())
{
ClearBindingData();
return;
}
_model = vmo.GetDefaultPumpCurveViewMdoel();
if (_model == null)
return;
var vm_equal_eff_list = vmo.GetCurveEqualEViewMdoelList();
var vm_variable_speed_eff_list = vmo.GetVariableSpeedPumpCurveViewMdoelList();
var vm = new Yw.WinFrmUI.Phart.PumpCurveViewModel();
vm.Id = "";
vm.ColorQH = Color.Blue;
vm.ColorQE = Color.Green;
vm.ColorQP = Color.Red;
vm.CurveQHName = $"{_nr}rpm({50}hz)";
vm.CurveQPName = $"{_nr}rpm({50}hz)";
vm.CurveQH = _model.CurveQH.FeatCurve.GetPointList(50);
vm.CurveQE = _model.CurveQE?.FeatCurve.GetPointList(50);
vm.CurveQP = _model.CurveQP?.FeatCurve.GetPointList(50);
vm.PointListQH = vm.CurveQH;
vm.PointListQE = vm.CurveQE;
vm.PointListQP = vm.CurveQP;
vm.Equip = null;
if (vm_equal_eff_list != null && vm_equal_eff_list.Any())
{
vm.EqualEffList = new();
foreach (var item in vm_equal_eff_list)
{
var eff_vm = new Yw.WinFrmUI.Phart.PumpCurveEqualEffViewModel();
eff_vm.Id = Guid.NewGuid().ToString();
eff_vm.CurveName = $"{item.Eff:N1}";
eff_vm.Color = Color.DarkGreen;
eff_vm.CurveEqualEff = item.DefinePoints;
eff_vm.Tension = item.Tension;
eff_vm.IsClosed = item.IsClosed;
vm.EqualEffList.Add(eff_vm);
}
}
if (vm_variable_speed_eff_list != null && vm_variable_speed_eff_list.Any())
{
vm.VariableSpeedList = new();
var index = 0;
foreach (var item in vm_variable_speed_eff_list)
{
var vs_color = Yw.WinFrmUI.PhartColorHelper.Get(index);
var vs_vm = new Yw.WinFrmUI.Phart.PumpCurveVariableSpeedViewModel();
vs_vm.Id = Guid.NewGuid().ToString();
vs_vm.ColorQH = vs_color;
vs_vm.ColorQE = vs_color;
vs_vm.ColorQP = vs_color;
vs_vm.CurveQHName = $"{item.N}rpm({item.Hz}hz)";
vs_vm.CurveQPName = $"{item.N}rpm({item.Hz}hz)";
vs_vm.CurveQH = item.CurveQH.FeatCurve.GetPointList(30);
vs_vm.CurveQE = item.CurveQE.FeatCurve.GetPointList(30);
vs_vm.CurveQP = item.CurveQP.FeatCurve.GetPointList(30);
vs_vm.N = item.N;
vs_vm.Hz = item.Hz;
vm.VariableSpeedList.Add(vs_vm);
index++;
}
}
vm.VariableSpeedList = new List();
vm.EqualEffList = new List();
vm.EqualPowerList = new();
SetBindingData(vm, _default_visible, _split_panel, _eff_visible, _power_visible, _equal_eff_visible);
}
///
/// 绑定数据
///
public void SetBindingData(Yw.WinFrmUI.Phart.PumpCurveViewModel vm, bool default_visible, bool split_panel, bool eff_visible, bool power_visible, bool equal_eff_visible)
{
_vm = vm;
if (vm == null)
{
ClearBindingData();
return;
}
if (vm.VariableSpeedList != null && vm.VariableSpeedList.Any())
{
vm.ColorQH = vm.ColorQE = vm.ColorQP = Color.Black;
}
this.pumpViewChart1.SetBindingData(vm, default_visible, split_panel, eff_visible, power_visible, equal_eff_visible);
}
///
/// 清空绑定数据
///
public void ClearBindingData()
{
this.pumpViewChart1.ClearBindingData();
}
private void SetEquip()
{
if (_vm == null)
return;
if (!_vm.IsValid())
return;
if (this.barTxtStartHead.EditValue == null)
return;
if (this.barTxtPipeHead.EditValue == null)
return;
if (this.barTxtPipeQ.EditValue == null)
return;
var start_head = Convert.ToDouble(this.barTxtStartHead.EditValue);
var pipe_head = Convert.ToDouble(this.barTxtPipeHead.EditValue);
var pipe_flow = Convert.ToDouble(this.barTxtPipeQ.EditValue);
var equip_pt = new Yw.Geometry.Point2d(pipe_flow, pipe_head);
var qh_line = new Yw.Ahart.CurveQH(Yw.Ahart.eFeatType.Cubic, _vm.CurveQH);
var equip_line = Yw.Pump.PerformParabolaHelper.GetEquipCurvePointListByQH(qh_line, equip_pt, start_head, 30, true, out Yw.Geometry.Point2d sect_pt);
if (equip_line == null || sect_pt == null)
{
XtraMessageBox.Show("计算失败,设计点不合理!");
return;
}
_vm.Equip = new Yw.WinFrmUI.Phart.PumpCurveEquipViewModel();
_vm.Equip.Id = Guid.NewGuid().ToString();
_vm.Equip.Color = Color.Black;
_vm.Equip.StartH = start_head;
_vm.Equip.PipeQ = pipe_flow;
_vm.Equip.PipeH = pipe_head;
_vm.Equip.SectQ = sect_pt.X;
_vm.Equip.SectH = sect_pt.Y;
if (_vm.CurveQP != null && _vm.CurveQP.Any())
{
_vm.Equip.SectP = _vm.CurveQP.GetInterPointsY(sect_pt.X)?.FirstOrDefault();
}
if (_vm.CurveQE != null && _vm.CurveQE.Any())
{
_vm.Equip.SectE = _vm.CurveQE.GetInterPointsY(sect_pt.X)?.FirstOrDefault();
}
_vm.Equip.CurveEquip = equip_line.GetPointList(Yw.Ahart.eFeatType.Cubic);
SetBindingData(_vm, _default_visible, _split_panel, _eff_visible, _power_visible, _equal_eff_visible);
}
private void barCekEffVisible_CheckedChanged(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
{
_eff_visible = this.barCekEffVisible.Checked;
SetBindingData(_vm, _default_visible, _split_panel, _eff_visible, _power_visible, _equal_eff_visible);
}
private void barCekPowerVisible_CheckedChanged(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
{
_power_visible = this.barCekPowerVisible.Checked;
SetBindingData(_vm, _default_visible, _split_panel, _eff_visible, _power_visible, _equal_eff_visible);
}
private void barCekSplitPanel_CheckedChanged(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
{
_split_panel = this.barCekSplitPanel.Checked;
SetBindingData(_vm, _default_visible, _split_panel, _eff_visible, _power_visible, _equal_eff_visible);
}
private void barCekEqVisible_CheckedChanged(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
{
if (this.barCekEqVisible.Checked)
{
SetEquip();
}
else
{
_vm.Equip = null;
SetBindingData(_vm, _default_visible, _split_panel, _eff_visible, _power_visible, _equal_eff_visible);
}
}
private void barCekEqulEffVisible_CheckedChanged(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
{
_equal_eff_visible = this.barCekEqulEffVisible.Checked;
SetBindingData(_vm, _default_visible, _split_panel, _eff_visible, _power_visible, _equal_eff_visible);
}
private void barBtnEqClear_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
{
this.barTxtStartHead.EditValue = 0;
this.barTxtPipeQ.EditValue = null;
this.barTxtPipeHead.EditValue = null;
_vm.Equip = null;
SetBindingData(_vm, _default_visible, _split_panel, _eff_visible, _power_visible, _equal_eff_visible);
}
private void barBtnSetEqPt_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
{
SetEquip();
}
private void barBtnAddVariableSpeedByN_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
{
AddByN();
}
private void barBtnAddVariableSpeedByHz_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
{
AddByHz();
}
private void barBtnAddVariableSpeedByPoint_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
{
AddByPoint();
}
private void barBtnAddEqualEffByEff_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
{
AddByEff();
}
private void AddByN()
{
if (_vm == null)
return;
var dlg = new SetValueDlg();
dlg.SetBindingData(_nr);
dlg.VerifyValueChanged += (speed) =>
{
var hz = Math.Round(speed / _nr * 50, 1);
if (hz > 50 || hz < 10)
{
return false;
}
var index = _vm.VariableSpeedList?.Count + 1 ?? 1;
var vs_color = Yw.WinFrmUI.PhartColorHelper.Get(index);
var vs_vm = new Yw.WinFrmUI.Phart.PumpCurveVariableSpeedViewModel();
vs_vm.Id = Guid.NewGuid().ToString();
vs_vm.ColorQH = vs_color;
vs_vm.ColorQE = vs_color;
vs_vm.ColorQP = vs_color;
vs_vm.CurveQHName = $"{speed}rpm({hz}hz)";
vs_vm.CurveQPName = $"{speed}rpm({hz}hz)";
vs_vm.CurveQH = _vm.CurveQH.GetQHPointListByN(50, hz);
vs_vm.CurveQE = _vm.CurveQE.GetQEPointListByN(50, hz);
vs_vm.CurveQP = _vm.CurveQP.GetQEPointListByN(50, hz);
vs_vm.N = speed;
vs_vm.Hz = hz;
_vm.VariableSpeedList.Add(vs_vm);
SetBindingData(_vm, _default_visible, _split_panel, _eff_visible, _power_visible, _equal_eff_visible);
//this.DataChangedEvent?.Invoke();
return true;
};
dlg.ShowDialog();
}
private void AddByHz()
{
if (_vm == null)
return;
var dlg = new SetValueDlg();
dlg.VerifyValueChanged += (hz) =>
{
if (hz > 50 || hz < 10)
{
return false;
}
var speed = Math.Round(hz / 50 * _nr);
var index = _vm.VariableSpeedList?.Count + 1 ?? 1;
var vs_color = Yw.WinFrmUI.PhartColorHelper.Get(index);
var vs_vm = new Yw.WinFrmUI.Phart.PumpCurveVariableSpeedViewModel();
vs_vm.Id = Guid.NewGuid().ToString();
vs_vm.ColorQH = vs_color;
vs_vm.ColorQE = vs_color;
vs_vm.ColorQP = vs_color;
vs_vm.CurveQHName = $"{speed}rpm({hz}hz)";
vs_vm.CurveQPName = $"{speed}rpm({hz}hz)";
vs_vm.CurveQH = _vm.CurveQH.GetQHPointListByN(50, hz);
vs_vm.CurveQE = _vm.CurveQE.GetQEPointListByN(50, hz);
vs_vm.CurveQP = _vm.CurveQP.GetQEPointListByN(50, hz);
vs_vm.N = speed;
vs_vm.Hz = hz;
_vm.VariableSpeedList.Add(vs_vm);
SetBindingData(_vm, _default_visible, _split_panel, _eff_visible, _power_visible, _equal_eff_visible);
return true;
};
dlg.ShowDialog();
}
private void AddByPoint()
{
if (_vm == null)
return;
if (!_vm.IsValid())
return;
var dlg = new SetPointDlg();
dlg.SetBindingData();
dlg.VerifyValueChanged += (x, y) =>
{
var pt = new Yw.Geometry.Point2d(x, y);
var sect_pt = Yw.Pump.PerformParabolaHelper.GetQHSectPoint(_model.CurveQH, pt);
if (sect_pt == null || sect_pt.IsZeroPoint())
return false;
var speed = sect_pt.Y.CalculateSimuByH(_nr, pt.Y);
var hz = Math.Round(speed / _nr * 50, 1);
if (hz > 50 || hz < 20)
{
return false;
}
speed = Math.Round(speed, 1);
var index = _vm.VariableSpeedList?.Count + 1 ?? 1;
var vs_color = Yw.WinFrmUI.PhartColorHelper.Get(index);
var vs_vm = new Yw.WinFrmUI.Phart.PumpCurveVariableSpeedViewModel();
vs_vm.Id = Guid.NewGuid().ToString();
vs_vm.ColorQH = vs_color;
vs_vm.ColorQE = vs_color;
vs_vm.ColorQP = vs_color;
vs_vm.CurveQHName = $"{speed}rpm({hz}hz)";
vs_vm.CurveQPName = $"{speed}rpm({hz}hz)";
vs_vm.CurveQH = _vm.CurveQH.GetQHPointListByN(50, hz);
vs_vm.CurveQE = _vm.CurveQE.GetQEPointListByN(50, hz);
vs_vm.CurveQP = _vm.CurveQP.GetQEPointListByN(50, hz);
vs_vm.N = speed;
vs_vm.Hz = hz;
_vm.VariableSpeedList.Add(vs_vm);
SetBindingData(_vm, _default_visible, _split_panel, _eff_visible, _power_visible, _equal_eff_visible);
return true;
};
dlg.ShowDialog();
}
private void AddByEff()
{
if (_vm == null)
return;
if (!_vm.IsValid())
return;
if (_vm.CurveQE == null || !_vm.CurveQE.Any())
return;
var dlg = new SetEffDlg();
dlg.SetBindingData();
dlg.VerifyValueChanged += (eff_double_list) =>
{
double max_hz = 50;
double min_hz = 30;
if (_vm.VariableSpeedList != null && _vm.VariableSpeedList.Any())
{
max_hz = Math.Max(max_hz, _vm.VariableSpeedList.Max(x => x.Hz));
min_hz = Math.Min(min_hz, _vm.VariableSpeedList.Min(x => x.Hz));
}
foreach (var eff in eff_double_list)
{
var eff_list = EqualParaCurveEListHelper.CalcEqualParaCurveE(_model.CurveQH, _model.CurveQE, max_hz, min_hz, eff);
if (eff_list != null && eff_list.Any())
{
foreach (var item in eff_list)
{
var def_pt_list = item.DefinePoints;
var eff_vm = new Yw.WinFrmUI.Phart.PumpCurveEqualEffViewModel();
eff_vm.Id = Guid.NewGuid().ToString();
eff_vm.CurveName = $"{item.Eff:N1}";
eff_vm.Color = Color.DarkGreen;
eff_vm.CurveEqualEff = item.DefinePoints;
eff_vm.Tension = item.Tension;
eff_vm.IsClosed = item.IsClosed;
_vm.EqualEffList.Add(eff_vm);
}
}
}
SetBindingData(_vm, _default_visible, _split_panel, _eff_visible, _power_visible, _equal_eff_visible);
return true;
};
dlg.ShowDialog();
}
///
/// 获取
///
public Yw.Vmo.PhartDiagramExGraphListVmo Get()
{
return new Yw.Vmo.PhartDiagramExGraphListVmo();
}
}
}