lixiaojun
2024-10-18 82dfff29bca77a1e11459fb7a69f729a09f4345c
WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/XhsProjectSimulationCorePage.cs
@@ -1,4 +1,6 @@
global using Yw.EPAnet;
using DevExpress.Mvvm.Native;
using DevExpress.Utils.DirectXPaint;
using Yw.WinFrmUI.Bimface;
using Yw.WinFrmUI.Hydro;
@@ -12,6 +14,7 @@
            this.PageTitle.Caption = "水力模拟";
            this.PageTitle.HeaderSvgImage = this.svgImg32[0];
            this.docPnlBottom.Visibility = DevExpress.XtraBars.Docking.DockVisibility.Hidden;
            this.docPnlRight.Visibility = DevExpress.XtraBars.Docking.DockVisibility.Hidden;
        }
        private HStation.Vmo.XhsProjectVmo _project = null;//项目
@@ -70,10 +73,6 @@
            this.tabPageQ3d.Controls.Clear();
            this.tabPageQ3d.Controls.Add(q3dCtrl);
            q3dCtrl.InitialData(() => _hydroInfo);
            var propertyCtrl = GetPropertyCtrl();
            this.controlContainerRight.Controls.Clear();
            this.controlContainerRight.Controls.Add(propertyCtrl);
            propertyCtrl.InitialData(() => _hydroInfo);
        }
        #region Bimface
@@ -208,6 +207,9 @@
        #region 属性面板
        //属性控件
        private XhsProjectSimulationPropertyCtrl _propertyCtrl = null;
        //获取属性控件
        private XhsProjectSimulationPropertyCtrl GetPropertyCtrl()
        {
@@ -215,13 +217,80 @@
            {
                _propertyCtrl = new XhsProjectSimulationPropertyCtrl();
                _propertyCtrl.Dock = DockStyle.Fill;
                _propertyCtrl.InitialData(() => _hydroInfo);
            }
            return _propertyCtrl;
        }
        private XhsProjectSimulationPropertyCtrl _propertyCtrl = null;//属性控件
        //显示属性面板
        private void ShowPropertyCtrl()
        {
            var propertyCtrl = GetPropertyCtrl();
            this.controlContainerRight.Controls.Clear();
            this.controlContainerRight.Controls.Add(propertyCtrl);
            this.docPnlRight.Text = "属性";
            this.docPnlRight.Visibility = DevExpress.XtraBars.Docking.DockVisibility.Visible;
            this.docPnlRight.Width = 270;
        }
        #endregion 属性面板
        //属性面板按钮
        private void barBtnProperty_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            ShowPropertyCtrl();
        }
        //显示属性
        private void ShowProperty()
        {
            if (_hydroInfo == null)
            {
                return;
            }
            if (_parter == null)
            {
                _propertyCtrl?.SelectParter(null);
                return;
            }
            _propertyCtrl?.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)
                    {
                        IHydroCalcuResult calcuProperty = null;
                        if (calcuParter is Yw.EPAnet.CalcuNode calcuNode)
                        {
                            var calcuNodeProperty = new Yw.WinFrmUI.HydroCalcuNodeResult();
                            calcuNodeProperty.Code = _parter.Code;
                            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.HydroCalcuLinkResult();
                            calcuLinkProperty.Code = _parter.Code;
                            calcuLinkProperty.CalcuHeadLoss = calcuLink.Headloss;
                            calcuLinkProperty.CalcuFlow = calcuLink.Flow;
                            calcuLinkProperty.CalcuVelocity = calcuLink.Velocity;
                            calcuProperty = calcuLinkProperty;
                        }
                        if (calcuProperty != null)
                        {
                            _propertyCtrl?.UpdateCalcuProperty(calcuProperty);
                        }
                    }
                }
            }
        }
        #endregion
        #region 自动匹配
@@ -372,14 +441,17 @@
        #region 水力校验
        //获取校验结果控件
        private XhsProjectSimulationHydroCheckResultCtrl GetCheckResultCtrl()
        //校验控件
        private XhsProjectSimulationHydroCheckResultCtrl _checkCtrl = null;
        //获取校验控件
        private XhsProjectSimulationHydroCheckResultCtrl GetCheckCtrl()
        {
            if (_checkResultCtrl == null)
            if (_checkCtrl == null)
            {
                _checkResultCtrl = new XhsProjectSimulationHydroCheckResultCtrl();
                _checkResultCtrl.Dock = DockStyle.Fill;
                _checkResultCtrl.HydroClickEvent += async (code) =>
                _checkCtrl = new XhsProjectSimulationHydroCheckResultCtrl();
                _checkCtrl.Dock = DockStyle.Fill;
                _checkCtrl.HydroClickEvent += async (code) =>
                {
                    if (_hydroInfo == null)
                    {
@@ -404,11 +476,24 @@
                    SetBimfaceLinkColor();
                };
            }
            return _checkResultCtrl;
            return _checkCtrl;
        }
        //校验结果控件
        private XhsProjectSimulationHydroCheckResultCtrl _checkResultCtrl = null;
        //显示校验控件
        private void ShowCheckCtrl()
        {
            if (_checkResult == null)
            {
                return;
            }
            var checkCtrl = GetCheckCtrl();
            checkCtrl.SetBindingData(_checkResult);
            this.controlContainerBottom.Controls.Clear();
            this.controlContainerBottom.Controls.Add(checkCtrl);
            this.docPnlBottom.Text = "校验结果";
            this.docPnlBottom.Height = 350;
            this.docPnlBottom.Visibility = DevExpress.XtraBars.Docking.DockVisibility.Visible;
        }
        //水力验证
        private void barBtnHydroCheck_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
@@ -418,13 +503,7 @@
                return;
            }
            _checkResult = _hydroInfo.Check();
            this.controlContainerBottom.Controls.Clear();
            var checkResultCtrl = GetCheckResultCtrl();
            checkResultCtrl.SetBindingData(_checkResult);
            this.controlContainerBottom.Controls.Add(checkResultCtrl);
            this.docPnlBottom.Visibility = DevExpress.XtraBars.Docking.DockVisibility.Visible;
            this.docPnlBottom.Text = "校验结果";
            this.docPnlBottom.Height = 350;
            ShowCheckCtrl();
        }
        #endregion 水力校验
@@ -518,62 +597,6 @@
        #endregion INP导出
        #region 业务方法
        //显示属性
        private void ShowProperty()
        {
            if (_hydroInfo == null)
            {
                return;
            }
            if (_parter == null)
            {
                _propertyCtrl?.SelectParter(null);
                return;
            }
            _propertyCtrl?.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)
                    {
                        IHydroCalcuResult calcuProperty = null;
                        if (calcuParter is Yw.EPAnet.CalcuNode calcuNode)
                        {
                            var calcuNodeProperty = new Yw.WinFrmUI.HydroCalcuNodeResult();
                            calcuNodeProperty.Code = _parter.Code;
                            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.HydroCalcuLinkResult();
                            calcuLinkProperty.Code = _parter.Code;
                            calcuLinkProperty.CalcuHeadLoss = calcuLink.Headloss;
                            calcuLinkProperty.CalcuFlow = calcuLink.Flow;
                            calcuLinkProperty.CalcuVelocity = calcuLink.Velocity;
                            calcuProperty = calcuLinkProperty;
                        }
                        if (calcuProperty != null)
                        {
                            _propertyCtrl?.UpdateCalcuProperty(calcuProperty);
                        }
                    }
                }
            }
        }
        #endregion 业务方法
        #region 配置
        //显示RadialMenu
@@ -653,163 +676,59 @@
        #region 水力计算
        //计算控件
        private SetHydroCalcuPrefixCtrl _calcuCtrl = null;
        //获取计算控件
        private XhsProjectSimulationCalcuCtrl GetCalcuCtrl()
        private SetHydroCalcuPrefixCtrl GetCalcuCtrl()
        {
            if (_calcuCtrl == null)
            {
                _calcuCtrl = new XhsProjectSimulationCalcuCtrl();
                _calcuCtrl = new SetHydroCalcuPrefixCtrl();
                _calcuCtrl.Dock = DockStyle.Fill;
                _calcuCtrl.CancelEvent += () =>
                    {
                        this.docPnlBottom.Visibility = DevExpress.XtraBars.Docking.DockVisibility.Hidden;
                    };
                _calcuCtrl.OkEvent += async () =>
                    {
                        if (_hydroInfo == null)
                        {
                            return;
                        }
                        _checkResult = _hydroInfo.Check();
                        if (!_checkResult.Succeed)
                        {
                            this.controlContainerBottom.Controls.Clear();
                            var checkResultCtrl = GetCheckResultCtrl();
                            checkResultCtrl.SetBindingData(_checkResult);
                            this.controlContainerBottom.Controls.Add(checkResultCtrl);
                            TipFormHelper.ShowWarn("校验失败,请检查后重试");
                            return;
                        }
                        var netWork = Yw.Hydro.ParseHelper.ToNetwork(_hydroInfo);
                        _calcuResult = netWork.Calcu();
                        if (_calcuResult.Succeed)
                        {
                            this.controlContainerBottom.Controls.Clear();
                            var parterListCtrl = GetParterListCtrl();
                            var calcuResultList = new List<IHydroCalcuResult>();
                            _calcuResult.NodeList?.ForEach(x =>
                            {
                                calcuResultList.Add(new HydroCalcuNodeResult()
                                {
                                    Code = x.Id,
                                    CalcuPress = x.Press,
                                    CalcuHead = x.Head,
                                    CalcuDemand = x.Demand,
                                });
                            });
                            _calcuResult.LinkList?.ForEach(x =>
                            {
                                calcuResultList.Add(new HydroCalcuLinkResult()
                                {
                                    Code = x.Id,
                                    CalcuFlow = x.Flow,
                                    CalcuVelocity = x.Velocity,
                                    CalcuHeadLoss = x.Headloss
                                });
                            });
                            parterListCtrl.SetBindingData(_hydroInfo, calcuResultList);
                            parterListCtrl.SetCalcuView();
                            this.controlContainerBottom.Controls.Add(parterListCtrl);
                            this.docPnlBottom.Text = "计算结果";
                            ShowProperty();
                            await _bimfaceCtrl?.ShowCalcuCustomLabels(_calcuResult);
                            TipFormHelper.ShowSucceed("计算成功!");
                        }
                        else
                        {
                            _calcuCtrl.SetBindingData(_calcuResult.FailedList);
                            this.docPnlBottom.Visibility = DevExpress.XtraBars.Docking.DockVisibility.Visible;
                            this.docPnlBottom.Text = "计算失败原因";
                            this.docPnlBottom.Height = 350;
                            TipFormHelper.ShowError("计算失败");
                        }
                    };
            }
            return _calcuCtrl;
        }
        private XhsProjectSimulationCalcuCtrl _calcuCtrl = null;//计算控件
        private SetHydroCalcuPrefixCtrl _calcuPrefixCtrl = null;
        private SetHydroCalcuPrefixCtrl GetCalcuPrefixCtrl()
        {
            if (_calcuPrefixCtrl == null)
            {
                _calcuPrefixCtrl = new SetHydroCalcuPrefixCtrl();
                _calcuPrefixCtrl.Dock = DockStyle.Fill;
                _calcuPrefixCtrl.InitialData(() => _hydroInfo);
                _calcuPrefixCtrl.HydroViewEvent += async (parter) =>
                {
                _calcuCtrl.InitialData(() => _hydroInfo);
                _calcuCtrl.HydroViewEvent += async (parter) =>
                {//水力查看事件
                    if (parter == null)
                    {
                        return;
                    }
                    await _bimfaceCtrl.ZoomAndSelectComponents(new List<string>() { parter.Code });
                    await _bimfaceCtrl?.ZoomAndSelectComponents(new List<string>() { parter.Code });
                };
                _calcuPrefixCtrl.HydroCalcuEvent += async (hydroInfo) =>
                {
                    if (hydroInfo == null)
                _calcuCtrl.HydroCalcuEvent += async () =>
                {//水力计算事件
                    if (_hydroInfo == null)
                    {
                        return;
                    }
                    _checkResult = hydroInfo.Check();
                    //校验
                    _checkResult = _hydroInfo.Check();
                    if (!_checkResult.Succeed)
                    {
                        this.controlContainerBottom.Controls.Clear();
                        var checkResultCtrl = GetCheckResultCtrl();
                        checkResultCtrl.SetBindingData(_checkResult);
                        this.controlContainerBottom.Controls.Add(checkResultCtrl);
                        ShowCheckCtrl();
                        TipFormHelper.ShowWarn("校验失败,请检查后重试");
                        return;
                    }
                    var netWork = Yw.Hydro.ParseHelper.ToNetwork(hydroInfo);
                    var netWork = Yw.Hydro.ParseHelper.ToNetwork(_hydroInfo);
                    _calcuResult = netWork.Calcu();
                    if (_calcuResult.Succeed)
                    {
                        this.controlContainerBottom.Controls.Clear();
                        var parterListCtrl = GetParterListCtrl();
                        var calcuResultList = new List<IHydroCalcuResult>();
                        _calcuResult.NodeList?.ForEach(x =>
                        {
                            calcuResultList.Add(new HydroCalcuNodeResult()
                            {
                                Code = x.Id,
                                CalcuPress = x.Press,
                                CalcuHead = x.Head,
                                CalcuDemand = x.Demand,
                            });
                        });
                        _calcuResult.LinkList?.ForEach(x =>
                        {
                            calcuResultList.Add(new HydroCalcuLinkResult()
                            {
                                Code = x.Id,
                                CalcuFlow = x.Flow,
                                CalcuVelocity = x.Velocity,
                                CalcuHeadLoss = x.Headloss
                            });
                        });
                        parterListCtrl.SetBindingData(_hydroInfo, calcuResultList);
                        parterListCtrl.SetCalcuView();
                        this.controlContainerBottom.Controls.Add(parterListCtrl);
                        this.docPnlBottom.Text = "计算结果";
                        ShowProperty();
                        await _bimfaceCtrl?.ShowCalcuCustomLabels(_calcuResult);
                        this.docPnlRight.Visibility = DevExpress.XtraBars.Docking.DockVisibility.Hidden;
                        await _bimfaceCtrl?.SetLogicCalcuCustomLabels(_calcuResult);
                        TipFormHelper.ShowSucceed("计算成功!");
                    }
                    else
                    {
                        _calcuCtrl.SetBindingData(_calcuResult.FailedList);
                        this.docPnlBottom.Visibility = DevExpress.XtraBars.Docking.DockVisibility.Visible;
                        this.docPnlBottom.Text = "计算失败原因";
                        this.docPnlBottom.Height = 350;
                        _calcuCtrl.SetFailedList(_calcuResult.FailedList);
                        this.docPnlRight.Text = "失败原因";
                        this.docPnlRight.Visibility = DevExpress.XtraBars.Docking.DockVisibility.Visible;
                        TipFormHelper.ShowError("计算失败");
                    }
                };
            }
            return _calcuPrefixCtrl;
            return _calcuCtrl;
        }
        //水力计算
@@ -819,7 +738,7 @@
            {
                return;
            }
            var calcuPrefixCtrl = GetCalcuPrefixCtrl();
            var calcuPrefixCtrl = GetCalcuCtrl();
            calcuPrefixCtrl.SetBindingData();
            this.controlContainerRight.Controls.Clear();
            this.controlContainerRight.Controls.Add(calcuPrefixCtrl);
@@ -890,8 +809,8 @@
        private List<HydroMarkSetViewModel> _allMarkList = null;
        //标注
        private void barBtnMark_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        //设置标注
        private void barBtnMarkSet_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            if (_hydroInfo == null)
            {
@@ -956,6 +875,19 @@
            dlg.ShowDialog();
        }
        #endregion 标注
        //取消标注
        private async void barBtnMarkCancel_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            if (_hydroInfo == null)
            {
                return;
            }
            await _bimfaceCtrl?.ClearLogicMarkLeadLabels();
        }
        #endregion
    }
}