global using Yw.EPAnet;
using DevExpress.Xpo.Helpers;
using HStation.WinFrmUI.Xhs;
using HStation.WinFrmUI.Xhs.Core;
using NPOI.SS.Formula.Functions;
using Yw.WinFrmUI.HydroL2d;
using Yw.WinFrmUI.HydroL3d;
namespace HStation.WinFrmUI
{
public partial class XhsProjectSimulationCorePage : DocumentPage
{
public XhsProjectSimulationCorePage()
{
InitializeComponent();
this.PageTitle.Caption = "水力模拟";
this.PageTitle.HeaderSvgImage = this.svgImg32[0];
this.docPnlHydroCheck.Visibility = DevExpress.XtraBars.Docking.DockVisibility.Hidden;
this.docPnlHydroCalcu.Visibility = DevExpress.XtraBars.Docking.DockVisibility.Hidden;
this.docPnlHydroParterList.Visibility = DevExpress.XtraBars.Docking.DockVisibility.Hidden;
this.docPnlUnMatchingList.Visibility = DevExpress.XtraBars.Docking.DockVisibility.Hidden;
this.docPnlMatchingList.Visibility = DevExpress.XtraBars.Docking.DockVisibility.Hidden;
}
private HStation.Vmo.XhsProjectVmo _project = null;//项目
private HStation.Vmo.XhsProjectSiteVmo _projectSite = null;//项目站
private Yw.Model.HydroModelInfo _hydroInfo = null;//水力信息
private Yw.Model.HydroParterInfo _parter = null;
private Yw.EPAnet.CheckResult _checkResult = null;
private Yw.EPAnet.CalcuResult _calcuResult = null;
///
/// 绑定数据
///
public async Task SetBindingData
(
HStation.Vmo.XhsProjectVmo project,
HStation.Vmo.XhsProjectSiteVmo projectSite,
Yw.Model.HydroModelInfo hydroInfo
)
{
if (project == null)
{
return;
}
_project = project;
_projectSite = projectSite;
_hydroInfo = hydroInfo;
if (_projectSite == null)
{
_projectSite = await BLLFactory.Instance.GetDefaultByProjectID(_project.ID);
}
if (_hydroInfo == null)
{
var hydroRelation = await BLLFactory.Instance
.GetDefaultByObjectTypeAndObjectIDOfPurpose(HStation.Xhs.DataType.XhsProjectSite, _projectSite.ID, HStation.Xhs.Purpose.Simulation);
_hydroInfo = await BLLFactory.Instance.GetByID(hydroRelation.ModelID);
}
}
///
/// 初始化数据
///
public override async void InitialDataSource()
{
base.InitialDataSource();
if (_project == null)
{
return;
}
this.PageTitle.Caption = $"{_project.Name}\r\n水力模拟";
await this.xhsProjectSimulationBimfaceCtrl1.SetBindingData(_project, _projectSite, () => _hydroInfo);
this.xhsProjectSimulationQ3dCtrl1.SetBindingData(_hydroInfo);
this.xhsProjectSimulationL3dCtrl1.SetBindingData(_hydroInfo);
this.xhsProjectSimulationPropertyCtrl1.SetBindingData(() => _hydroInfo);
}
//水力计算
private async void barBtnHydroCalcu_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
{
if (_hydroInfo == null)
{
return;
}
this.docPnlHydroCheck.Visibility = DevExpress.XtraBars.Docking.DockVisibility.Hidden;
this.docPnlHydroCalcu.Visibility = DevExpress.XtraBars.Docking.DockVisibility.Hidden;
this.docPnlHydroParterList.Visibility = DevExpress.XtraBars.Docking.DockVisibility.Hidden;
this.docPnlUnMatchingList.Visibility = DevExpress.XtraBars.Docking.DockVisibility.Hidden;
var netWork = Yw.Hydro.ParseHelper.ToNetwork(_hydroInfo);
_calcuResult = netWork.Calcu();
if (_calcuResult.Succeed)
{
ShowProperty();
TipFormHelper.ShowSucceed("计算成功!");
}
else
{
this.xhsProjectSimulationHydroCalcuFailedCtrl1.SetBindingData(_calcuResult.FailedList);
this.docPnlHydroCalcu.Visibility = DevExpress.XtraBars.Docking.DockVisibility.Visible;
this.docPnlHydroCalcu.Height = 350;
}
await this.xhsProjectSimulationBimfaceCtrl1.ShowCalcuCustomLabels(_calcuResult);
}
//水力构件列表
private void barBtnHydroParterList_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
{
if (_hydroInfo == null)
{
return;
}
this.docPnlHydroCheck.Visibility = DevExpress.XtraBars.Docking.DockVisibility.Hidden;
this.docPnlHydroCalcu.Visibility = DevExpress.XtraBars.Docking.DockVisibility.Hidden;
this.docPnlHydroParterList.Visibility = DevExpress.XtraBars.Docking.DockVisibility.Hidden;
this.docPnlUnMatchingList.Visibility = DevExpress.XtraBars.Docking.DockVisibility.Hidden;
// this.docPnlMatchingList.Visibility = DevExpress.XtraBars.Docking.DockVisibility.Hidden;
this.hydroParterListCtrl1.SetBindingData(_hydroInfo);
this.docPnlHydroParterList.Visibility = DevExpress.XtraBars.Docking.DockVisibility.Visible;
this.docPnlHydroParterList.Height = 350;
}
//导出水力INP文件
private void barBtnHydroExportInp_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
{
if (_hydroInfo == null)
{
return;
}
var fileName = Yw.WinFrmUI.FileDialogHelper.SaveInp("导出Inp文件");
if (string.IsNullOrEmpty(fileName))
{
return;
}
var netWork = Yw.Hydro.ParseHelper.ToNetwork(_hydroInfo);
var result = netWork.ToInpString();
File.WriteAllText(fileName, result);
TipFormHelper.ShowSucceed("导出成功");
}
//水力构件明细面板点击事件
private async void hydroParterListCtrl1_HydroClickEvent(Yw.Model.HydroParterInfo parter)
{
var allParterList = _hydroInfo.GetAllParters();
_parter = allParterList.Find(x => x.ID == parter.ID);
await this.xhsProjectSimulationBimfaceCtrl1.SetSelectedComponents(new List() { _parter.Code });
ShowProperty();
}
#region Bimface
//bimface 加载完成事件
private async void xhsProjectSimulationBimfaceCtrl1_LoadCompletedEvent()
{
if (_hydroInfo == null)
{
return;
}
var elementIds = new List();
var pumps = _hydroInfo.Pumps?.Where(x => x.LinkStatus == Yw.Hydro.PumpStatus.Open).ToList();
pumps?.ForEach(x => elementIds.Add(x.Code));
var valves = _hydroInfo.Valves?.Where(x => x.LinkStatus == Yw.Hydro.ValveStatus.Open).ToList();
valves?.ForEach(x => elementIds.Add(x.Code));
await this.xhsProjectSimulationBimfaceCtrl1.SetOpenComponentsColor(elementIds);
}
//bimface 水力点击事件
private void xhsProjectSimulationBimfaceCtrl1_HydroClickEvent(Yw.Model.HydroParterInfo obj)
{
if (_hydroInfo == null)
{
return;
}
_parter = obj;
ShowProperty();
SetBimfaceLinkColor();
}
//设置Bimface连接颜色
private async void SetBimfaceLinkColor()
{
if (_hydroInfo == null)
{
return;
}
List elementIds = null;
if (_parter != null)
{
if (_parter is Yw.Model.HydroLinkInfo linker)
{
elementIds = new List() { linker.StartCode, linker.EndCode };
}
}
await this.xhsProjectSimulationBimfaceCtrl1.SetLinkComponentsColor(elementIds);
}
#endregion Bimface
#region 属性面板
#endregion
#region 自动匹配
//自动匹配
private void barBtnMatchingList_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
{
if (_hydroInfo == null)
{
return;
}
this.docPnlHydroCheck.Visibility = DevExpress.XtraBars.Docking.DockVisibility.Hidden;
this.docPnlHydroCalcu.Visibility = DevExpress.XtraBars.Docking.DockVisibility.Hidden;
this.docPnlHydroParterList.Visibility = DevExpress.XtraBars.Docking.DockVisibility.Hidden;
this.docPnlMatchingList.Visibility = DevExpress.XtraBars.Docking.DockVisibility.Hidden;
this.docPnlUnMatchingList.Visibility = DevExpress.XtraBars.Docking.DockVisibility.Hidden;
var input = AssetsMatchingParasHelper.Create(_hydroInfo);
this.xhsProjectSimulationMatchingListCtrl1.SetBindingData(input);
this.xhsProjectSimulationMatchingListCtrl1.ApplyMatchingEvent += (output) =>
{
return AssetsMatchingParasHelper.Apply(_hydroInfo, output);
};
this.docPnlMatchingList.Visibility = DevExpress.XtraBars.Docking.DockVisibility.Visible;
this.docPnlMatchingList.Height = 350;
}
#endregion
#region 未匹配列表
//未匹配列表
private void barBtnUnMatchingList_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
{
if (_hydroInfo == null)
{
return;
}
this.docPnlHydroCheck.Visibility = DevExpress.XtraBars.Docking.DockVisibility.Hidden;
this.docPnlHydroCalcu.Visibility = DevExpress.XtraBars.Docking.DockVisibility.Hidden;
this.docPnlHydroParterList.Visibility = DevExpress.XtraBars.Docking.DockVisibility.Hidden;
this.docPnlMatchingList.Visibility = DevExpress.XtraBars.Docking.DockVisibility.Hidden;
this.docPnlUnMatchingList.Visibility = DevExpress.XtraBars.Docking.DockVisibility.Hidden;
this.xhsProjectSimulationUnMatchingListCtrl1.SetBindingData(_hydroInfo);
this.docPnlUnMatchingList.Visibility = DevExpress.XtraBars.Docking.DockVisibility.Visible;
this.docPnlUnMatchingList.Height = 350;
}
//未匹配列表点击事件
private async void xhsProjectSimulationUnMatchingListCtrl1_HydroClickEvent(Yw.Model.HydroParterInfo parter)
{
var allParterList = _hydroInfo.GetAllParters();
_parter = allParterList.Find(x => x.ID == parter.ID);
var elementIds = new List() { _parter.Code };
await this.xhsProjectSimulationBimfaceCtrl1.ZoomAndSelectComponents(elementIds);
ShowProperty();
SetBimfaceLinkColor();
}
//未匹配列表查看模型
private async void xhsProjectSimulationUnMatchingListCtrl1_ViewModelEvent(List parters)
{
var codes = parters?.Select(x => x.Code).Distinct().ToList();
await this.xhsProjectSimulationBimfaceCtrl1.ZoomAndSelectComponents(codes);
_parter = null;
ShowProperty();
}
#endregion
#region 一键显隐
//显隐编码列表
private List _fastShowHideCodeList = null;
//触发一键显隐
private async void barBtnShowHide_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
{
if (_hydroInfo == null)
{
return;
}
if (_hydroInfo.Decorators == null || _hydroInfo.Decorators.Count < 1)
{
return;
}
if (_fastShowHideCodeList == null)
{
_fastShowHideCodeList = _hydroInfo.Decorators.Select(x => x.Code).ToList();
await this.xhsProjectSimulationBimfaceCtrl1.HideComponents(_fastShowHideCodeList);
}
else
{
await this.xhsProjectSimulationBimfaceCtrl1.ShowComponents(_fastShowHideCodeList);
_fastShowHideCodeList = null;
}
}
#endregion
#region 水力校验
//水力验证
private void barBtnHydroCheck_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
{
if (_hydroInfo == null)
{
return;
}
this.docPnlHydroCheck.Visibility = DevExpress.XtraBars.Docking.DockVisibility.Hidden;
this.docPnlHydroCalcu.Visibility = DevExpress.XtraBars.Docking.DockVisibility.Hidden;
this.docPnlHydroParterList.Visibility = DevExpress.XtraBars.Docking.DockVisibility.Hidden;
this.docPnlUnMatchingList.Visibility = DevExpress.XtraBars.Docking.DockVisibility.Hidden;
this.docPnlMatchingList.Visibility = DevExpress.XtraBars.Docking.DockVisibility.Hidden;
var netWork = Yw.Hydro.ParseHelper.ToNetwork(_hydroInfo);
_checkResult = netWork.Check();
if (_checkResult.Succeed)
{
TipFormHelper.ShowSucceed("校验通过!");
return;
}
this.xhsProjectSimulationHydroCheckFailedCtrl1.SetBindingData(_checkResult.FailedList);
this.docPnlHydroCheck.Visibility = DevExpress.XtraBars.Docking.DockVisibility.Visible;
this.docPnlHydroCheck.Height = 350;
}
//水力校验点击
private async void xhsProjectSimulationHydroCheckFailedCtrl1_HydroClickEvent(string code)
{
if (_hydroInfo == null)
{
return;
}
var allParterList = _hydroInfo.GetAllParters();
_parter = allParterList.Find(x => x.Code == code);
var elementIds = new List() { _parter.Code };
await this.xhsProjectSimulationBimfaceCtrl1.ZoomAndSelectComponents(elementIds);
ShowProperty();
}
#endregion
#region 保存水力信息
//保存
private async void barBtnSave_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
{
if (_hydroInfo == null)
{
return;
}
var id = await BLLFactory.Instance.Save(_hydroInfo);
if (id < 1)
{
TipFormHelper.ShowError("保存失败!");
return;
}
_hydroInfo = await BLLFactory.Instance.GetByID(id);
TipFormHelper.ShowSucceed("保存成功!");
}
#endregion
#region 业务方法
//显示属性
private void ShowProperty()
{
if (_hydroInfo == null)
{
return;
}
if (_parter == null)
{
this.xhsProjectSimulationPropertyCtrl1.SelectParter(null);
return;
}
this.xhsProjectSimulationPropertyCtrl1.SelectParter(_parter.Code);
if (_calcuResult != null)
{
if (_calcuResult.Succeed)
{
var allCalcuParterList = _calcuResult.GetParterList();
var calcuParter = allCalcuParterList.Find(x => x.Id == _parter.Code);
if (calcuParter != null)
{
IHydroCalcuProperty calcuProperty = null;
if (calcuParter is Yw.EPAnet.CalcuNode calcuNode)
{
var calcuNodeProperty = new Yw.WinFrmUI.HydroCalcuNodeProperty();
calcuNodeProperty.ID = _parter.ID;
calcuNodeProperty.CalcuPress = calcuNode.Press;
calcuNodeProperty.CalcuDemand = calcuNode.Demand;
calcuNodeProperty.CalcuHead = calcuNode.Head;
calcuProperty = calcuNodeProperty;
}
else if (calcuParter is Yw.EPAnet.CalcuLink calcuLink)
{
var calcuLinkProperty = new Yw.WinFrmUI.HydroCalcuLinkProperty();
calcuLinkProperty.ID = _parter.ID;
calcuLinkProperty.CalcuHeadLoss = calcuLink.Headloss;
calcuLinkProperty.CalcuFlow = calcuLink.Flow;
calcuLinkProperty.CalcuVelocity = calcuLink.Velocity;
calcuProperty = calcuLinkProperty;
}
if (calcuProperty != null)
{
this.xhsProjectSimulationPropertyCtrl1.UpdateCalcuProperty(calcuProperty);
}
}
}
}
}
#endregion 业务方法
#region 配置
//显示RadialMenu
private void barBtnSetList_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
{
this.rmSet.ShowPopup(MousePosition, true);
}
#endregion
}
}