lixiaojun
2024-11-03 7507591ef45cfa8f1080f6dbf68b411edcc7f086
WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/XhsProjectSimulationCorePage.cs
@@ -1,8 +1,10 @@
global using Yw.EPAnet;
using DevExpress.Mvvm.Native;
using DevExpress.Xpo.Helpers;
using DevExpress.XtraRichEdit.Layout;
using DevExpress.XtraSpreadsheet.Commands;
using HStation.WinFrmUI.PhartRelation;
using System.Diagnostics;
using System.Windows.Media.Media3D;
using Yw.Pump;
using Yw.Vmo;
@@ -498,7 +500,17 @@
            {
                return;
            }
            Stopwatch sw = new Stopwatch();
            sw.Start();
            var id = await BLLFactory<Yw.BLL.HydroModelInfo>.Instance.Save(_hydroInfo);
            //耗时巨大的代码
            sw.Stop();
            TimeSpan ts2 = sw.Elapsed;
            Console.WriteLine("Stopwatch总共花费{0}ms.", ts2.TotalMilliseconds);
            if (id < 1)
            {
                TipFormHelper.ShowError("保存失败!");
@@ -1380,22 +1392,18 @@
        #region 模型标注
        //所有标注列表
        private List<HydroMarkSetViewModel> _allMarkList = null;
        //所有标注设置列表
        private List<HydroMarkSetViewModel> _allMarkSetList = null;
        //显示标注窗体
        private void ShowMarkDlg()
        //获取标注设置列表
        private List<HydroMarkSetViewModel> GetMarkSetList()
        {
            if (_hydroInfo == null)
            if (_allMarkSetList == null)
            {
                return;
            }
            if (_allMarkList == null)
            {
                _allMarkList = new List<HydroMarkSetViewModel>();
                _allMarkSetList = new List<HydroMarkSetViewModel>();
                if (_hydroInfo.Waterboxs != null && _hydroInfo.Waterboxs.Count > 0)
                {
                    _allMarkList.Add(new HydroMarkSetViewModel()
                    _allMarkSetList.Add(new HydroMarkSetViewModel()
                    {
                        Code = Yw.Hydro.ParterCatalog.Waterbox,
                        Name = Yw.WinFrmUI.HydroParterCatalogHelper.GetCatalogName(Yw.Hydro.ParterCatalog.Waterbox),
@@ -1404,7 +1412,7 @@
                }
                if (_hydroInfo.Pumps != null && _hydroInfo.Pumps.Count > 0)
                {
                    _allMarkList.Add(new HydroMarkSetViewModel()
                    _allMarkSetList.Add(new HydroMarkSetViewModel()
                    {
                        Code = Yw.Hydro.ParterCatalog.Pump,
                        Name = Yw.WinFrmUI.HydroParterCatalogHelper.GetCatalogName(Yw.Hydro.ParterCatalog.Pump),
@@ -1413,7 +1421,7 @@
                }
                if (_hydroInfo.Valves != null && _hydroInfo.Valves.Count > 0)
                {
                    _allMarkList.Add(new HydroMarkSetViewModel()
                    _allMarkSetList.Add(new HydroMarkSetViewModel()
                    {
                        Code = Yw.Hydro.ParterCatalog.Valve,
                        Name = Yw.WinFrmUI.HydroParterCatalogHelper.GetCatalogName(Yw.Hydro.ParterCatalog.Valve),
@@ -1422,7 +1430,7 @@
                }
                if (_hydroInfo.Pipes != null && _hydroInfo.Pipes.Count > 0)
                {
                    _allMarkList.Add(new HydroMarkSetViewModel()
                    _allMarkSetList.Add(new HydroMarkSetViewModel()
                    {
                        Code = Yw.Hydro.ParterCatalog.Pipe,
                        Name = Yw.WinFrmUI.HydroParterCatalogHelper.GetCatalogName(Yw.Hydro.ParterCatalog.Pipe),
@@ -1431,7 +1439,7 @@
                }
                if (_hydroInfo.Nozzles != null && _hydroInfo.Nozzles.Count > 0)
                {
                    _allMarkList.Add(new HydroMarkSetViewModel()
                    _allMarkSetList.Add(new HydroMarkSetViewModel()
                    {
                        Code = Yw.Hydro.ParterCatalog.Nozzle,
                        Name = Yw.WinFrmUI.HydroParterCatalogHelper.GetCatalogName(Yw.Hydro.ParterCatalog.Nozzle),
@@ -1439,12 +1447,462 @@
                    });
                }
            }
            var dlg = new SetHydroMarkDlg();
            dlg.SetBindingData(_hydroInfo, _allMarkList);
            dlg.ReloadDataEvent += async (allResultList) =>
            return _allMarkSetList;
        }
        //所有标注结果列表
        private List<HydroMarkResultViewModel> _allMarkResultList = null;
        //获取标注结果列表
        private List<HydroMarkResultViewModel> GetMarkResultList()
        {
            if (_hydroInfo == null)
            {
                var leadLabels = allResultList?.Select(x => new LogicMarkLeadLabel(x.Code, x.Text, 100000)).ToList();
                await _bimfaceCtrl?.SetLogicMarkLeadLabels(leadLabels);
                return default;
            }
            _allMarkResultList = new List<HydroMarkResultViewModel>();
            var allMarkSetList = GetMarkSetList();
            foreach (var markSet in allMarkSetList)
            {
                switch (markSet.Code)
                {
                    case Yw.Hydro.ParterCatalog.Waterbox:
                        {
                            if (_hydroInfo.Waterboxs != null && _hydroInfo.Waterboxs.Count > 0)
                            {
                                switch ((eWaterboxMarkType)markSet.MarkType)
                                {
                                    case eWaterboxMarkType.None:
                                        {
                                        }
                                        break;
                                    case eWaterboxMarkType.PoolElev:
                                        {
                                            _hydroInfo.Waterboxs.ForEach(t =>
                                            {
                                                _allMarkResultList.Add(new HydroMarkResultViewModel()
                                                {
                                                    Code = t.Code,
                                                    Text = $"池底标高:{Math.Round(t.PoolElev, 4)}m"
                                                });
                                            });
                                        }
                                        break;
                                    case eWaterboxMarkType.InitLevel:
                                        {
                                            _hydroInfo.Waterboxs.ForEach(t =>
                                            {
                                                _allMarkResultList.Add(new HydroMarkResultViewModel()
                                                {
                                                    Code = t.Code,
                                                    Text = $"初始水位:{Math.Round(t.InitLevel, 4)}m"
                                                });
                                            });
                                        }
                                        break;
                                    case eWaterboxMarkType.MinLevel:
                                        {
                                            _hydroInfo.Waterboxs.ForEach(t =>
                                            {
                                                _allMarkResultList.Add(new HydroMarkResultViewModel()
                                                {
                                                    Code = t.Code,
                                                    Text = $"最小水位:{Math.Round(t.MinLevel, 4)}m"
                                                });
                                            });
                                        }
                                        break;
                                    case eWaterboxMarkType.MaxLevel:
                                        {
                                            _hydroInfo.Waterboxs.ForEach(t =>
                                            {
                                                _allMarkResultList.Add(new HydroMarkResultViewModel()
                                                {
                                                    Code = t.Code,
                                                    Text = $"最高水位:{Math.Round(t.MaxLevel, 4)}m"
                                                });
                                            });
                                        }
                                        break;
                                    case eWaterboxMarkType.DN:
                                        {
                                            _hydroInfo.Waterboxs.ForEach(t =>
                                            {
                                                _allMarkResultList.Add(new HydroMarkResultViewModel()
                                                {
                                                    Code = t.Code,
                                                    Text = $"直径:{Math.Round(t.DN, 4)}m"
                                                });
                                            });
                                        }
                                        break;
                                    case eWaterboxMarkType.MinVol:
                                        {
                                            _hydroInfo.Waterboxs.ForEach(t =>
                                            {
                                                _allMarkResultList.Add(new HydroMarkResultViewModel()
                                                {
                                                    Code = t.Code,
                                                    Text = $"最小容积:{Math.Round(t.MinVol, 1)}m"
                                                });
                                            });
                                        }
                                        break;
                                    default: break;
                                }
                            }
                        }
                        break;
                    case Yw.Hydro.ParterCatalog.Pump:
                        {
                            if (_hydroInfo.Pumps != null && _hydroInfo.Pumps.Count > 0)
                            {
                                switch ((ePumpMarkType)markSet.MarkType)
                                {
                                    case ePumpMarkType.None:
                                        {
                                        }
                                        break;
                                    case ePumpMarkType.PumpStatus:
                                        {
                                            _hydroInfo.Pumps.ForEach(t =>
                                            {
                                                _allMarkResultList.Add(new HydroMarkResultViewModel()
                                                {
                                                    Code = t.Code,
                                                    Text = $"开机状态:{Yw.WinFrmUI.HydroLinkStatusHelper.GetStatusName(t.LinkStatus)}"
                                                });
                                            });
                                        }
                                        break;
                                    case ePumpMarkType.RatedP:
                                        {
                                            _hydroInfo.Pumps.ForEach(t =>
                                            {
                                                _allMarkResultList.Add(new HydroMarkResultViewModel()
                                                {
                                                    Code = t.Code,
                                                    Text = $"额定功率:{t.RatedP}kW"
                                                });
                                            });
                                        }
                                        break;
                                    case ePumpMarkType.RatedQ:
                                        {
                                            _hydroInfo.Pumps.ForEach(t =>
                                            {
                                                _allMarkResultList.Add(new HydroMarkResultViewModel()
                                                {
                                                    Code = t.Code,
                                                    Text = $"额定流量:{t.RatedQ}m³/h"
                                                });
                                            });
                                        }
                                        break;
                                    case ePumpMarkType.RatedH:
                                        {
                                            _hydroInfo.Pumps.ForEach(t =>
                                            {
                                                _allMarkResultList.Add(new HydroMarkResultViewModel()
                                                {
                                                    Code = t.Code,
                                                    Text = $"额定扬程:{t.RatedH}m"
                                                });
                                            });
                                        }
                                        break;
                                    case ePumpMarkType.RatedN:
                                        {
                                            _hydroInfo.Pumps.ForEach(t =>
                                            {
                                                _allMarkResultList.Add(new HydroMarkResultViewModel()
                                                {
                                                    Code = t.Code,
                                                    Text = $"额定转速:{t.RatedN}r/min"
                                                });
                                            });
                                        }
                                        break;
                                    case ePumpMarkType.RatedHz:
                                        {
                                            _hydroInfo.Pumps.ForEach(t =>
                                            {
                                                _allMarkResultList.Add(new HydroMarkResultViewModel()
                                                {
                                                    Code = t.Code,
                                                    Text = $"额定频率:{t.RatedHz}"
                                                });
                                            });
                                        }
                                        break;
                                    case ePumpMarkType.CurrentN:
                                        {
                                            _hydroInfo.Pumps.ForEach(t =>
                                            {
                                                if (t.RatedN.HasValue)
                                                {
                                                    _allMarkResultList.Add(new HydroMarkResultViewModel()
                                                    {
                                                        Code = t.Code,
                                                        Text = $"设定转速:{Math.Round(t.RatedN.Value * t.SpeedRatio, 1)}r/min"
                                                    });
                                                }
                                            });
                                        }
                                        break;
                                    case ePumpMarkType.CurrentHz:
                                        {
                                            _hydroInfo.Pumps.ForEach(t =>
                                            {
                                                _allMarkResultList.Add(new HydroMarkResultViewModel()
                                                {
                                                    Code = t.Code,
                                                    Text = $"设定频率:{Math.Round(t.RatedHz * t.SpeedRatio, 1)}hz"
                                                });
                                            });
                                        }
                                        break;
                                    default: break;
                                }
                            }
                        }
                        break;
                    case Yw.Hydro.ParterCatalog.Valve:
                        {
                            if (_hydroInfo.Valves != null && _hydroInfo.Valves.Count > 0)
                            {
                                switch ((eValveMarkType)markSet.MarkType)
                                {
                                    case eValveMarkType.None:
                                        {
                                        }
                                        break;
                                    case eValveMarkType.ValveStatus:
                                        {
                                            _hydroInfo.Valves.ForEach(t =>
                                            {
                                                _allMarkResultList.Add(new HydroMarkResultViewModel()
                                                {
                                                    Code = t.Code,
                                                    Text = $"阀门状态:{HydroLinkStatusHelper.GetStatusName(t.LinkStatus)}"
                                                });
                                            });
                                        }
                                        break;
                                    case eValveMarkType.ValveType:
                                        {
                                            _hydroInfo.Valves.ForEach(t =>
                                            {
                                                _allMarkResultList.Add(new HydroMarkResultViewModel()
                                                {
                                                    Code = t.Code,
                                                    Text = $"阀门类型:{HydroValveTypeHelper.GetTypeName(t.ValveType)}"
                                                });
                                            });
                                        }
                                        break;
                                    case eValveMarkType.Diameter:
                                        {
                                            _hydroInfo.Valves.ForEach(t =>
                                            {
                                                _allMarkResultList.Add(new HydroMarkResultViewModel()
                                                {
                                                    Code = t.Code,
                                                    Text = $"直径:{t.Diameter}mm"
                                                });
                                            });
                                        }
                                        break;
                                    case eValveMarkType.MinorLoss:
                                        {
                                            _hydroInfo.Valves.ForEach(t =>
                                            {
                                                _allMarkResultList.Add(new HydroMarkResultViewModel()
                                                {
                                                    Code = t.Code,
                                                    Text = $"局阻系数:{t.MinorLoss}"
                                                });
                                            });
                                        }
                                        break;
                                    default: break;
                                }
                            }
                        }
                        break;
                    case Yw.Hydro.ParterCatalog.Pipe:
                        {
                            if (_hydroInfo.Pipes != null && _hydroInfo.Pipes.Count > 0)
                            {
                                switch ((ePipeMarkType)markSet.MarkType)
                                {
                                    case ePipeMarkType.None:
                                        {
                                        }
                                        break;
                                    case ePipeMarkType.PipeStatus:
                                        {
                                            _hydroInfo.Pipes.ForEach(t =>
                                            {
                                                _allMarkResultList.Add(new HydroMarkResultViewModel()
                                                {
                                                    Code = t.Code,
                                                    Text = $"状态:{Yw.WinFrmUI.HydroLinkStatusHelper.GetStatusName(t.LinkStatus)}"
                                                });
                                            });
                                        }
                                        break;
                                    case ePipeMarkType.Diameter:
                                        {
                                            _hydroInfo.Pipes.ForEach(t =>
                                            {
                                                _allMarkResultList.Add(new HydroMarkResultViewModel()
                                                {
                                                    Code = t.Code,
                                                    Text = $"直径:{t.Diameter}mm"
                                                });
                                            });
                                        }
                                        break;
                                    case ePipeMarkType.Length:
                                        {
                                            _hydroInfo.Pipes.ForEach(t =>
                                            {
                                                _allMarkResultList.Add(new HydroMarkResultViewModel()
                                                {
                                                    Code = t.Code,
                                                    Text = $"长度:{t.Length}m"
                                                });
                                            });
                                        }
                                        break;
                                    case ePipeMarkType.Roughness:
                                        {
                                            _hydroInfo.Pipes.ForEach(t =>
                                            {
                                                _allMarkResultList.Add(new HydroMarkResultViewModel()
                                                {
                                                    Code = t.Code,
                                                    Text = $"粗糙系数:{t.Roughness}"
                                                });
                                            });
                                        }
                                        break;
                                    case ePipeMarkType.MinorLoss:
                                        {
                                            _hydroInfo.Pipes.ForEach(t =>
                                            {
                                                _allMarkResultList.Add(new HydroMarkResultViewModel()
                                                {
                                                    Code = t.Code,
                                                    Text = $"局阻系数:{t.MinorLoss}"
                                                });
                                            });
                                        }
                                        break;
                                    default: break;
                                }
                            }
                        }
                        break;
                    case Yw.Hydro.ParterCatalog.Nozzle:
                        {
                            if (_hydroInfo.Nozzles != null && _hydroInfo.Nozzles.Count > 0)
                            {
                                switch ((eNozzleMarkType)markSet.MarkType)
                                {
                                    case eNozzleMarkType.None:
                                        {
                                        }
                                        break;
                                    case eNozzleMarkType.Elev:
                                        {
                                            _hydroInfo.Nozzles.ForEach(t =>
                                            {
                                                _allMarkResultList.Add(new HydroMarkResultViewModel()
                                                {
                                                    Code = t.Code,
                                                    Text = $"标高:{Math.Round(t.Elev, 4)}m"
                                                });
                                            });
                                        }
                                        break;
                                    case eNozzleMarkType.Demand:
                                        {
                                            _hydroInfo.Nozzles.ForEach(t =>
                                            {
                                                _allMarkResultList.Add(new HydroMarkResultViewModel()
                                                {
                                                    Code = t.Code,
                                                    Text = $"需水量:{t.Demand}m³/h"
                                                });
                                            });
                                        }
                                        break;
                                    case eNozzleMarkType.Coefficient:
                                        {
                                            _hydroInfo.Nozzles.ForEach(t =>
                                            {
                                                _allMarkResultList.Add(new HydroMarkResultViewModel()
                                                {
                                                    Code = t.Code,
                                                    Text = $"喷射系数:{t.Coefficient}"
                                                });
                                            });
                                        }
                                        break;
                                    default: break;
                                }
                            }
                        }
                        break;
                    default: break;
                }
            }
            return _allMarkResultList;
        }
        //应用标注结果列表
        private async Task ApplyMarkResultList()
        {
            var allMarkResultList = GetMarkResultList();
            var leadLabels = allMarkResultList?.Select(x => new LogicMarkLeadLabel(x.Code, x.Text, 100000)).ToList();
            await _bimfaceCtrl?.SetLogicMarkLeadLabels(leadLabels);
            TipFormHelper.ShowSucceed("标注信息已设置");
        }
        //清除标注结果列表
        private async Task ClearMarkResultList()
        {
            if (_allMarkResultList == null || _allMarkResultList.Count < 1)
            {
                TipFormHelper.ShowWarn("尚未设置标注信息");
                return;
            }
            _allMarkResultList = null;
            await _bimfaceCtrl?.ClearLogicMarkLeadLabels();
            TipFormHelper.ShowSucceed("标注信息已清除");
        }
        //显示标注设置窗体
        private void ShowMarkSetDlg()
        {
            if (_hydroInfo == null)
            {
                return;
            }
            var allMarkSetList = GetMarkSetList();
            var dlg = new SetHydroMarkDlg();
            dlg.SetBindingData(allMarkSetList);
            dlg.ReloadDataEvent += async (list) =>
            {
                _allMarkSetList = list;
                await ApplyMarkResultList();
            };
            dlg.ShowDialog();
        }
@@ -1452,7 +1910,13 @@
        //设置标注
        private void barBtnSetMark_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            ShowMarkDlg();
            ShowMarkSetDlg();
        }
        //清除标注
        private async void barBtnClearMark_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            await ClearMarkResultList();
        }
        #endregion
@@ -1987,7 +2451,12 @@
                }
                var hydroRelation = await BLLFactory<Yw.BLL.HydroModelRelation>.Instance
                    .GetDefaultByObjectTypeAndObjectIDOfPurpose(HStation.Xhs.DataType.XhsProjectSite, _projectSite.ID, HStation.Xhs.Purpose.Simulation);
                Stopwatch sw = new Stopwatch();
                sw.Start();
                _hydroInfo = await BLLFactory<Yw.BLL.HydroModelInfo>.Instance.GetByID(hydroRelation.ModelID);
                sw.Stop();
                TimeSpan ts2 = sw.Elapsed;
                Console.WriteLine("Stopwatch总共花费{0}ms.", ts2.TotalMilliseconds);
                _parter = null;
                await _bimfaceCtrl?.ZoomAndSelectComponents(null);
                ShowProperty();
@@ -1996,5 +2465,34 @@
        }
        #endregion
        #region 水流动画
        //加载流向
        private async void barBtnLoadFlowDirection_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            var pipes = _hydroInfo.Pipes;
            var list = pipes.Select(x =>
            {
                return new Yw.WinFrmUI.Bimface.LogicFlowEffect()
                {
                    Id = x.Code,
                    Rotation = 90,
                    Speed = 0.1d
                };
            }).ToList();
            await _bimfaceCtrl?.LoadFlowEffect(list);
        }
        //卸载流向
        private async void barBtnUnloadFlowDirection_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            await _bimfaceCtrl?.UnloadFlowEffect();
        }
        #endregion
    }
}