Shuxia Ning
2024-10-24 0711485ecb4fe66fbe820478d92eb9f04b77c042
WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/XhsProjectSimulationCorePage.cs
@@ -1,7 +1,9 @@
global using Yw.EPAnet;
using DevExpress.Mvvm.Native;
using DevExpress.XtraRichEdit.Layout;
using DevExpress.XtraSpreadsheet.Commands;
using HStation.WinFrmUI.PhartRelation;
using Yw.Pump;
using Yw.WinFrmUI.Bimface;
using Yw.WinFrmUI.Hydro;
@@ -245,50 +247,22 @@
            {
                ShowPropertyCtrl();
            }
            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);
                        }
                    }
            var allCalcuResultList = GetAllCalcuResultList();
            if (allCalcuResultList != null && allCalcuResultList.Count > 0)
            {
                var calcuResult = allCalcuResultList.Find(x => x.Code == _parter.Code);
                if (calcuResult != null)
                {
                    _propertyCtrl?.UpdateCalcuProperty(calcuResult);
                }
            }
        }
        #endregion
@@ -970,6 +944,68 @@
        #region 水力计算
        #region 前提条件
        //显示计算前提条件窗体
        private async void ShowCalcuPrefixDlg()
        {
            if (_hydroInfo == null)
            {
                return;
            }
            var dlg = new SetHydroCalcuPrefixDlg();
            dlg.SetBindingData(_hydroInfo);
            dlg.HydroViewEvent += async (parter) =>
            {
                _parter = parter;
                if (_parter != null)
                {
                    await _bimfaceCtrl?.ZoomAndSelectComponents(new List<string>() { _parter.Code });
                }
                ShowProperty();
            };
            dlg.HydroCalcuEvent += async () =>
            {
                if (_hydroInfo == null)
                {
                    return;
                }
                //校验
                _checkResult = _hydroInfo.Check();
                if (!_checkResult.Succeed)
                {
                    ShowCheckCtrl();
                    TipFormHelper.ShowWarn("校验失败,请检查后重试");
                    return;
                }
                var netWork = Yw.Hydro.ParseHelper.ToNetwork(_hydroInfo);
                _calcuResult = netWork.Calcu();
                if (_calcuResult.Succeed)
                {
                    GetAllCalcuResultList(false);
                    await _bimfaceCtrl?.SetLogicCalcuCustomLabels(_calcuResult);
                    TipFormHelper.ShowSucceed("计算成功!");
                }
                else
                {
                    ShowCalcuFailedCtrl();
                    TipFormHelper.ShowError("计算失败!");
                }
            };
            if (dlg.ShowDialog() == DialogResult.Cancel)
            {
                await _bimfaceCtrl?.ClearLogicCalcuCustomLabels();
            }
        }
        #endregion
        #region 计算失败
        //计算失败控件
        private HydroCalcuFailedCtrl _calcuFailedCtrl = null;
@@ -1008,8 +1044,16 @@
            this.docPnlBottom.Height = 350;
        }
        #endregion
        #region 计算结果
        //所有计算结果列表
        private List<IHydroCalcuResult> _allCalcuResultList = null;
        //获取计算结果
        private List<IHydroCalcuResult> GetAllCalcuResultList()
        //true 使用缓存,false 不使用缓存
        private List<IHydroCalcuResult> GetAllCalcuResultList(bool isCache = true)
        {
            if (_hydroInfo == null)
            {
@@ -1023,7 +1067,12 @@
            {
                return default;
            }
            var list = new List<IHydroCalcuResult>();
            if (isCache)
            {
                return _allCalcuResultList;
            }
            _allCalcuResultList = new List<IHydroCalcuResult>();
            var allNodeList = _hydroInfo.GetAllNodes();
            if (allNodeList != null && allNodeList.Count > 0)
            {
@@ -1042,91 +1091,86 @@
                                CalcuHead = calcuNode.Head,
                                CalcuDemand = calcuNode.Demand
                            };
                            list.Add(calcuResult);
                            _allCalcuResultList.Add(calcuResult);
                        }
                    }
                }
            }
            var allListList = _hydroInfo.GetAllLinks();
            if (allListList != null && allListList.Count > 0)
            var allLinkList = _hydroInfo.GetAllLinks();
            if (allLinkList != null && allLinkList.Count > 0)
            {
                var allCalcuLinkList = _calcuResult.LinkList;
                if (allCalcuLinkList != null && allCalcuLinkList.Count > 0)
                {
                    foreach (var link in allListList)
                    foreach (var link in allLinkList)
                    {
                        var calcuLink = allCalcuLinkList.Find(x => x.Id == link.Code);
                        if (calcuLink != null)
                        {
                            var calcuResult = new HydroCalcuLinkResult()
                            if (link is Yw.Model.HydroPumpInfo pump)
                            {
                                Code = link.Code,
                                CalcuFlow = calcuLink.Flow,
                                CalcuVelocity = calcuLink.Velocity,
                                CalcuHeadLoss = calcuLink.Headloss
                            };
                            list.Add(calcuResult);
                                var calcuResult = new HydroCalcuPumpResult()
                                {
                                    Code = link.Code,
                                    CalcuFlow = calcuLink.Flow,
                                    CalcuVelocity = calcuLink.Velocity,
                                    CalcuHeadLoss = calcuLink.Headloss,
                                    CalcuQ = calcuLink.Flow
                                };
                                if (calcuResult.CalcuQ > 0)
                                {
                                    var startCalcuNode = _calcuResult.NodeList?.Find(x => x.Id == link.StartCode);
                                    var endCalcuNode = _calcuResult.NodeList?.Find(x => x.Id == link.EndCode);
                                    if (startCalcuNode != null && endCalcuNode != null)
                                    {
                                        calcuResult.CalcuH = Math.Abs(startCalcuNode.Press - endCalcuNode.Press);
                                    }
                                    if (pump.RatedN.HasValue)
                                    {
                                        var curveqp = _hydroInfo.Curves?.Find(x => x.Code == pump.CurveQP);
                                        if (curveqp != null)
                                        {
                                            if (curveqp.CurveData != null && curveqp.CurveData.Count > 3)
                                            {
                                                var point2dList = curveqp.CurveData.Select(x => new Yw.Geometry.Point2d(x.X, x.Y)).ToList();
                                                var point2dSimularList = point2dList.GetQPPointListByN(pump.RatedN.Value, pump.RatedN.Value * pump.SpeedRatio);
                                                var pumpCurveQp = new Yw.Pump.CurveQP(eFeatType.Cubic, point2dSimularList);
                                                calcuResult.CalcuP = pumpCurveQp.FeatCurve.GetPointY(calcuResult.CalcuQ.Value);
                                            }
                                        }
                                    }
                                    if (calcuResult.CalcuH.HasValue && calcuResult.CalcuP.HasValue)
                                    {
                                        calcuResult.CalcuE = Yw.Pump.CalculationHelper.CalcuE(calcuResult.CalcuQ.Value, calcuResult.CalcuH.Value, calcuResult.CalcuP.Value);
                                    }
                                }
                                _allCalcuResultList.Add(calcuResult);
                            }
                            else
                            {
                                var calcuResult = new HydroCalcuLinkResult()
                                {
                                    Code = link.Code,
                                    CalcuFlow = calcuLink.Flow,
                                    CalcuVelocity = calcuLink.Velocity,
                                    CalcuHeadLoss = calcuLink.Headloss
                                };
                                _allCalcuResultList.Add(calcuResult);
                            }
                        }
                    }
                }
            }
            return list;
            return _allCalcuResultList;
        }
        //显示计算前提窗体
        private async void ShowCalcuPrefixDlg()
        {
            if (_hydroInfo == null)
            {
                return;
            }
            var dlg = new SetHydroCalcuPrefixDlg();
            dlg.SetBindingData(_hydroInfo);
            dlg.HydroViewEvent += async (parter) =>
            {
                _parter = parter;
                if (_parter != null)
                {
                    await _bimfaceCtrl?.ZoomAndSelectComponents(new List<string>() { _parter.Code });
                }
                ShowProperty();
            };
            dlg.HydroCalcuEvent += async () =>
            {
                if (_hydroInfo == null)
                {
                    return;
                }
                //校验
                _checkResult = _hydroInfo.Check();
                if (!_checkResult.Succeed)
                {
                    ShowCheckCtrl();
                    TipFormHelper.ShowWarn("校验失败,请检查后重试");
                    return;
                }
                var netWork = Yw.Hydro.ParseHelper.ToNetwork(_hydroInfo);
                _calcuResult = netWork.Calcu();
                if (_calcuResult.Succeed)
                {
                    await _bimfaceCtrl?.SetLogicCalcuCustomLabels(_calcuResult);
                    TipFormHelper.ShowSucceed("计算成功!");
                }
                else
                {
                    ShowCalcuFailedCtrl();
                    TipFormHelper.ShowError("计算失败!");
                }
            };
            if (dlg.ShowDialog() == DialogResult.Cancel)
            {
                await _bimfaceCtrl?.ClearLogicCalcuCustomLabels();
            }
        }
        #endregion
        //水力计算
        private void barBtnHydroCalcu_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)