Shuxia Ning
2024-11-20 4fa5e391fcb989f4687ba3398f84a5ab066d7285
Merge branch 'master' of http://47.103.154.90:83/r/HStation/XHS.V1.0
已修改9个文件
1056 ■■■■ 文件已修改
WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/02-bimface/XhsProjectSimulationBimfaceCtrl.cs 164 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/04-scheme/01-add/AddXhsSchemeDlg.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/04-scheme/XhsProjectSimulationSchemeMgrPage.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/XhsProjectSimulationCorePage.Designer.cs 151 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/XhsProjectSimulationCorePage.cs 653 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/XhsProjectSimulationCorePage.resx 36 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/05-tree/HydroWorkingTreeCtrl.Designer.cs 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/05-tree/HydroWorkingTreeCtrl.cs 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/05-tree/HydroWorkingTreeViewModel.cs 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/02-bimface/XhsProjectSimulationBimfaceCtrl.cs
@@ -9,25 +9,56 @@
            InitializeComponent();
        }
        #region 事件集
        /// <summary>
        /// 水力点击事件(包含左键和右键)
        /// 水力点击事件
        /// 包含左键和右键
        /// </summary>
        public event Action<Yw.Model.HydroVisualInfo> HydroClickEvent;
        public event Action<string> HydroClickEvent;
        /// <summary>
        /// 水力点击事件(仅左键)
        /// 水力点击事件
        /// 仅左键
        /// </summary>
        public event Action<Yw.Model.HydroVisualInfo> HydroMouseLeftClickEvent;
        public event Action<string> HydroMouseLeftClickEvent;
        /// <summary>
        /// 加载完成事件
        /// </summary>
        public event Action LoadCompletedEvent;
        #endregion
        //项目
        private HStation.Vmo.XhsProjectVmo _project = null;
        private XhsProjectVmo _project = null;
        //项目站
        private HStation.Vmo.XhsProjectSiteVmo _projectSite = null;
        //获取水力信息方法
        private Func<Yw.Model.HydroModelInfo> _hydroInfoFunc = null;
        private XhsProjectSiteVmo _projectSite = null;
        /// <summary>
        /// 初始化数据
        /// 仅支持调用一次
        /// </summary>
        public async Task InitialData(XhsProjectVmo project, XhsProjectSiteVmo projectSite)
        {
            if (project == null)
            {
                return;
            }
            _project = project;
            _projectSite = projectSite;
            if (_projectSite == null)
            {
                _projectSite = await BLLFactory<HStation.BLL.XhsProjectSite>.Instance.GetDefaultByProjectID(_project.ID);
            }
            var bimfaceInteropContainer = GetBimfaceInteropContainer();
            this.Controls.Clear();
            this.Controls.Add(bimfaceInteropContainer);
            await bimfaceInteropContainer.InitialContainer();
        }
        #region 交互容器
        //bimface 交互容器
        private BimfaceInterop3dContainer _bimfaceInteropContainer = null;
        //获取Bimface 交互容器
        private BimfaceInterop3dContainer GetBimfaceInteropContainer()
@@ -82,17 +113,7 @@
                    {
                        return;
                    }
                    if (this.HydroClickEvent != null)
                    {
                        var hydroInfo = _hydroInfoFunc?.Invoke();
                        if (hydroInfo == null)
                        {
                            return;
                        }
                        var allParterList = hydroInfo.GetAllVisuals();
                        var parter = allParterList?.Find(x => x.Code == obj.ObjectId);
                        this.HydroClickEvent.Invoke(parter);
                    }
                    this.HydroClickEvent?.Invoke(obj.ObjectId);
                };
                _bimfaceInteropContainer.ClickOutEvent += (obj) =>
                {
@@ -104,17 +125,7 @@
                    {
                        return;
                    }
                    if (this.HydroMouseLeftClickEvent != null)
                    {
                        var hydroInfo = _hydroInfoFunc?.Invoke();
                        if (hydroInfo == null)
                        {
                            return;
                        }
                        var allParterList = hydroInfo.GetAllVisuals();
                        var parter = allParterList?.Find(x => x.Code == obj.ObjectId);
                        this.HydroMouseLeftClickEvent.Invoke(parter);
                    }
                    this.HydroMouseLeftClickEvent?.Invoke(obj.ObjectId);
                };
                _bimfaceInteropContainer.MouseLeftClickOutEvent += (obj) =>
                {
@@ -123,39 +134,11 @@
            }
            return _bimfaceInteropContainer;
        }
        //bimface 交互容器
        private BimfaceInterop3dContainer _bimfaceInteropContainer = null;
        /// <summary>
        /// 初始化数据
        /// 仅支持调用一次
        /// </summary>
        public async Task InitialData
            (
                HStation.Vmo.XhsProjectVmo project,
                HStation.Vmo.XhsProjectSiteVmo projectSite,
                Func<Yw.Model.HydroModelInfo> hydroInfoFunc
            )
        {
            if (project == null)
            {
                return;
            }
            _project = project;
            _projectSite = projectSite;
            _hydroInfoFunc = hydroInfoFunc;
            if (_projectSite == null)
            {
                _projectSite = await BLLFactory<HStation.BLL.XhsProjectSite>.Instance.GetDefaultByProjectID(_project.ID);
            }
            var bimfaceInteropContainer = GetBimfaceInteropContainer();
            this.Controls.Clear();
            this.Controls.Add(bimfaceInteropContainer);
            await bimfaceInteropContainer.InitialContainer();
        }
        #region 构件的显示与隐藏
        #endregion
        #region 显示与隐藏
        /// <summary>
        /// 显示构件
@@ -200,8 +183,6 @@
        /// <summary>
        /// 半透明构件
        /// </summary>
        /// <param name="elementIds">构件id列表</param>
        /// <returns></returns>
        public async Task TranslucentComponents(List<string> elementIds)
        {
            if (_bimfaceInteropContainer == null)
@@ -214,8 +195,6 @@
        /// <summary>
        /// 取消构件半透明
        /// </summary>
        /// <param name="elementIds">构件id列表</param>
        /// <returns></returns>
        public async Task OpaqueComponents(List<string> elementIds)
        {
            if (_bimfaceInteropContainer == null)
@@ -420,61 +399,10 @@
        #region 业务计算自定义标签
        /// <summary>
        /// 显示业务计算自定义标签
        /// 设置业务计算自定义标签
        /// </summary>
        public async Task SetLogicCalcuCustomLabelsCalcuResult(HydroCalcuResult calcuResult)
        public async Task SetLogicCalcuCustomLabels(List<LogicCalcuCustomLabel> obj)
        {
            var hydroInfo = _hydroInfoFunc?.Invoke();
            if (hydroInfo == null)
            {
                return;
            }
            if (calcuResult == null)
            {
                return;
            }
            if (!calcuResult.Succeed)
            {
                await _bimfaceInteropContainer?.ClearLogicCalcuCustomLabels();
                return;
            }
            var obj = new List<LogicCalcuCustomLabel>();
            var allParterList = hydroInfo.GetAllParters();
            allParterList?.ForEach(x =>
            {
                if (x is Yw.Model.HydroPumpInfo pump)
                {
                    var hz = Math.Round(pump.RatedHz * pump.SpeedRatio);
                    var calcuPump = calcuResult.LinkList.Find(x => x.Code == pump.Code);
                    var calcuPumpStart = calcuResult.NodeList.Find(x => x.Code == pump.StartCode);
                    var calcuPumpEnd = calcuResult.NodeList.Find(x => x.Code == pump.EndCode);
                    var pumpCustomLabel = new LogicCalcuCustomLabel();
                    pumpCustomLabel.Id = pump.Code;
                    pumpCustomLabel.Distance = 10000;
                    pumpCustomLabel.Data = new List<LogicCalcuCustomLabelItem>()
                    {
                        new LogicCalcuCustomLabelItem(){ Name="状态",Value=HydroLinkStatusHelper.GetStatusName(pump.LinkStatus),Unit=string.Empty},
                        new LogicCalcuCustomLabelItem(){ Name="频率",Value=hz.ToString(),Unit=string.Empty},
                        new LogicCalcuCustomLabelItem(){ Name="流量",Value=Math.Round(calcuPump.CalcuFlow.Value,1).ToString(),Unit="m³/h"},
                        new LogicCalcuCustomLabelItem(){ Name="进口压力",Value=Math.Round(calcuPumpStart.CalcuHead.Value,4).ToString(),Unit="m"},
                        new LogicCalcuCustomLabelItem(){ Name="出口压力",Value=Math.Round(calcuPumpEnd.CalcuHead.Value,4).ToString(),Unit="m"},
                    };
                    obj.Add(pumpCustomLabel);
                }
                else if (x is Yw.Model.HydroEmitterInfo emitter)
                {
                    var calcuEmitter = calcuResult.NodeList.Find(x => x.Code == emitter.Code);
                    var emitterCustomLabel = new LogicCalcuCustomLabel();
                    emitterCustomLabel.Id = emitter.Code;
                    emitterCustomLabel.Distance = 10000;
                    emitterCustomLabel.Data = new List<LogicCalcuCustomLabelItem>()
                    {
                        new LogicCalcuCustomLabelItem(){ Name="流量",Value=Math.Round(calcuEmitter.CalcuDemand.Value,1).ToString(),Unit="m³/h"},
                        new LogicCalcuCustomLabelItem(){ Name="压力",Value=Math.Round(calcuEmitter.CalcuDemand.Value,4).ToString(),Unit="m"}
                    };
                    obj.Add(emitterCustomLabel);
                }
            });
            await _bimfaceInteropContainer?.SetLogicCalcuCustomLabels(obj);
        }
WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/04-scheme/01-add/AddXhsSchemeDlg.cs
@@ -170,7 +170,7 @@
            {
                _bimfaceCtrl = new XhsProjectSimulationBimfaceCtrl();
                _bimfaceCtrl.Dock = DockStyle.Fill;
                await _bimfaceCtrl.InitialData(_project, _project_site, () => _hydro_info);
                await _bimfaceCtrl.InitialData(_project, _project_site);
                _bimfaceCtrl.LoadCompletedEvent += () =>
                {
                    //view加载完成事件
WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/04-scheme/XhsProjectSimulationSchemeMgrPage.cs
@@ -88,7 +88,7 @@
            {
                _bimfaceCtrl = new XhsProjectSimulationBimfaceCtrl();
                _bimfaceCtrl.Dock = DockStyle.Fill;
                await _bimfaceCtrl.InitialData(_project, _projectSite, () => _hydroInfo);
                await _bimfaceCtrl.InitialData(_project, _projectSite);
                _bimfaceCtrl.LoadCompletedEvent += () =>
                {//view加载完成事件
                    if (_hydroInfo == null)
@@ -103,7 +103,7 @@
                    {
                        return;
                    }
                    _selectedVisual = obj;
                    //_selectedVisual = obj;
                    ShowSelectedProperty();
                };
            }
WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/XhsProjectSimulationCorePage.Designer.cs
@@ -53,7 +53,7 @@
            barBtnSetTranslationList = new DevExpress.XtraBars.BarButtonItem();
            barBtnSetExchangerList = new DevExpress.XtraBars.BarButtonItem();
            barBtnSetJunctionList = new DevExpress.XtraBars.BarButtonItem();
            barBtnCurrentWorkingParallelAnalysis = new DevExpress.XtraBars.BarButtonItem();
            barBtnWorkingParallel = new DevExpress.XtraBars.BarButtonItem();
            barBtnSearch = new DevExpress.XtraBars.BarButtonItem();
            barBtnGradingSet = new DevExpress.XtraBars.BarButtonItem();
            barBtnGradingApply = new DevExpress.XtraBars.BarButtonItem();
@@ -77,14 +77,15 @@
            barCkMark = new DevExpress.XtraBars.BarCheckItem();
            barCkFlowEffect = new DevExpress.XtraBars.BarCheckItem();
            barCkGrading = new DevExpress.XtraBars.BarCheckItem();
            barCkCurrentWorkingCalcuResult = new DevExpress.XtraBars.BarCheckItem();
            barBtnCurrentWorkingLossCurve = new DevExpress.XtraBars.BarButtonItem();
            barBtnCurrentWorkingLossScale = new DevExpress.XtraBars.BarButtonItem();
            barBtnCurrentWorkingPowerAnalysis = new DevExpress.XtraBars.BarButtonItem();
            barBtnCurrentWorkingMultiAnalysis = new DevExpress.XtraBars.BarButtonItem();
            barCkCalcuLabels = new DevExpress.XtraBars.BarCheckItem();
            barBtnWorkingLossCurve = new DevExpress.XtraBars.BarButtonItem();
            barBtnWorkingLossScale = new DevExpress.XtraBars.BarButtonItem();
            barBtnWorkingPower = new DevExpress.XtraBars.BarButtonItem();
            barBtnWorkingAnaly = new DevExpress.XtraBars.BarButtonItem();
            barBtnParallel = new DevExpress.XtraBars.BarButtonItem();
            barBtnRepair = new DevExpress.XtraBars.BarButtonItem();
            barBtnWorkingList = new DevExpress.XtraBars.BarButtonItem();
            barBtnWorkingEvaluation = new DevExpress.XtraBars.BarButtonItem();
            ribbonPage1 = new DevExpress.XtraBars.Ribbon.RibbonPage();
            pageGroupMatching = new DevExpress.XtraBars.Ribbon.RibbonPageGroup();
            pageGroupModel = new DevExpress.XtraBars.Ribbon.RibbonPageGroup();
@@ -105,7 +106,6 @@
            controlContainerBottom = new DevExpress.XtraBars.Docking.ControlContainer();
            svgImg32 = new DevExpress.Utils.SvgImageCollection(components);
            rmSet = new DevExpress.XtraBars.Ribbon.RadialMenu(components);
            dockPanel2 = new DevExpress.XtraBars.Docking.DockPanel();
            ((ISupportInitialize)ribbonControl1).BeginInit();
            ((ISupportInitialize)repositoryItemImageComboBox1).BeginInit();
            ((ISupportInitialize)tabPane1).BeginInit();
@@ -121,9 +121,9 @@
            // 
            ribbonControl1.ExpandCollapseItem.Id = 0;
            ribbonControl1.ItemPanelStyle = DevExpress.XtraBars.Ribbon.RibbonItemPanelStyle.Classic;
            ribbonControl1.Items.AddRange(new DevExpress.XtraBars.BarItem[] { ribbonControl1.ExpandCollapseItem, barBtnCheck, barBtnWorkingCalcu, barBtnExportInp, barBtnSave, barBtnHydroVisualList, barBtnFastShowHidden, barBtnMatchingList, barBtnUnMatchingList, barBtnSetList, barBtnSetPumpList, barBtnSetValveList, barBtnSetPipeList, barBtnSetElbowsList, barBtnSetThreelinkList, barBtnSetFourlinkList, barBtnSetTranslationList, barBtnSetExchangerList, barBtnSetJunctionList, barBtnCurrentWorkingParallelAnalysis, barBtnSearch, barBtnGradingSet, barBtnGradingApply, barBtnRefresh, barBtnSetMark, barBtnSetReservoirList, barBtnSetTankList, barBtnSetWaterboxList, barBtnSetBluntheadList, barBtnSetNozzleList, barBtnSetHydrantList, barBtnSetMeterList, barBtnSetCompressorList, barBtnSetFlowmeterList, barBtnSetPressmeterList, barBtnSetMonitor, barBtnSetMonitorValue, barCkMonitor, barEditCurrentWorking, barCkMark, barCkFlowEffect, barCkGrading, barCkCurrentWorkingCalcuResult, barBtnCurrentWorkingLossCurve, barBtnCurrentWorkingLossScale, barBtnCurrentWorkingPowerAnalysis, barBtnCurrentWorkingMultiAnalysis, barBtnParallel, barBtnRepair, barBtnWorkingList });
            ribbonControl1.Items.AddRange(new DevExpress.XtraBars.BarItem[] { ribbonControl1.ExpandCollapseItem, barBtnCheck, barBtnWorkingCalcu, barBtnExportInp, barBtnSave, barBtnHydroVisualList, barBtnFastShowHidden, barBtnMatchingList, barBtnUnMatchingList, barBtnSetList, barBtnSetPumpList, barBtnSetValveList, barBtnSetPipeList, barBtnSetElbowsList, barBtnSetThreelinkList, barBtnSetFourlinkList, barBtnSetTranslationList, barBtnSetExchangerList, barBtnSetJunctionList, barBtnWorkingParallel, barBtnSearch, barBtnGradingSet, barBtnGradingApply, barBtnRefresh, barBtnSetMark, barBtnSetReservoirList, barBtnSetTankList, barBtnSetWaterboxList, barBtnSetBluntheadList, barBtnSetNozzleList, barBtnSetHydrantList, barBtnSetMeterList, barBtnSetCompressorList, barBtnSetFlowmeterList, barBtnSetPressmeterList, barBtnSetMonitor, barBtnSetMonitorValue, barCkMonitor, barEditCurrentWorking, barCkMark, barCkFlowEffect, barCkGrading, barCkCalcuLabels, barBtnWorkingLossCurve, barBtnWorkingLossScale, barBtnWorkingPower, barBtnWorkingAnaly, barBtnParallel, barBtnRepair, barBtnWorkingList, barBtnWorkingEvaluation });
            ribbonControl1.Location = new Point(0, 0);
            ribbonControl1.MaxItemId = 76;
            ribbonControl1.MaxItemId = 77;
            ribbonControl1.Name = "ribbonControl1";
            ribbonControl1.Pages.AddRange(new DevExpress.XtraBars.Ribbon.RibbonPage[] { ribbonPage1 });
            ribbonControl1.RepositoryItems.AddRange(new DevExpress.XtraEditors.Repository.RepositoryItem[] { repositoryItemImageComboBox1 });
@@ -275,14 +275,14 @@
            barBtnSetJunctionList.Id = 30;
            barBtnSetJunctionList.Name = "barBtnSetJunctionList";
            // 
            // barBtnCurrentWorkingParallelAnalysis
            // barBtnWorkingParallel
            // 
            barBtnCurrentWorkingParallelAnalysis.Caption = "并联分析";
            barBtnCurrentWorkingParallelAnalysis.Id = 31;
            barBtnCurrentWorkingParallelAnalysis.ImageOptions.SvgImage = (DevExpress.Utils.Svg.SvgImage)resources.GetObject("barBtnCurrentWorkingParallelAnalysis.ImageOptions.SvgImage");
            barBtnCurrentWorkingParallelAnalysis.Name = "barBtnCurrentWorkingParallelAnalysis";
            barBtnCurrentWorkingParallelAnalysis.RibbonStyle = DevExpress.XtraBars.Ribbon.RibbonItemStyles.SmallWithText;
            barBtnCurrentWorkingParallelAnalysis.ItemClick += barBtnAnaly_ItemClick;
            barBtnWorkingParallel.Caption = "并联分析";
            barBtnWorkingParallel.Id = 31;
            barBtnWorkingParallel.ImageOptions.SvgImage = (DevExpress.Utils.Svg.SvgImage)resources.GetObject("barBtnWorkingParallel.ImageOptions.SvgImage");
            barBtnWorkingParallel.Name = "barBtnWorkingParallel";
            barBtnWorkingParallel.RibbonStyle = DevExpress.XtraBars.Ribbon.RibbonItemStyles.SmallWithText;
            barBtnWorkingParallel.ItemClick += barBtnAnaly_ItemClick;
            // 
            // barBtnSearch
            // 
@@ -416,7 +416,7 @@
            // barCkMonitor
            // 
            barCkMonitor.Caption = "显示";
            barCkMonitor.CheckBoxVisibility = DevExpress.XtraBars.CheckBoxVisibility.AfterText;
            barCkMonitor.CheckBoxVisibility = DevExpress.XtraBars.CheckBoxVisibility.BeforeText;
            barCkMonitor.Id = 58;
            barCkMonitor.Name = "barCkMonitor";
            barCkMonitor.CheckedChanged += barCkMonitor_CheckedChanged;
@@ -438,7 +438,7 @@
            // barCkMark
            // 
            barCkMark.Caption = "显示";
            barCkMark.CheckBoxVisibility = DevExpress.XtraBars.CheckBoxVisibility.AfterText;
            barCkMark.CheckBoxVisibility = DevExpress.XtraBars.CheckBoxVisibility.BeforeText;
            barCkMark.Id = 65;
            barCkMark.Name = "barCkMark";
            barCkMark.CheckedChanged += barCkMark_CheckedChanged;
@@ -446,7 +446,7 @@
            // barCkFlowEffect
            // 
            barCkFlowEffect.Caption = "水流动画";
            barCkFlowEffect.CheckBoxVisibility = DevExpress.XtraBars.CheckBoxVisibility.AfterText;
            barCkFlowEffect.CheckBoxVisibility = DevExpress.XtraBars.CheckBoxVisibility.BeforeText;
            barCkFlowEffect.Id = 66;
            barCkFlowEffect.Name = "barCkFlowEffect";
            barCkFlowEffect.CheckedChanged += barCkFlowEffect_CheckedChanged;
@@ -454,49 +454,54 @@
            // barCkGrading
            // 
            barCkGrading.Caption = "显示";
            barCkGrading.CheckBoxVisibility = DevExpress.XtraBars.CheckBoxVisibility.AfterText;
            barCkGrading.CheckBoxVisibility = DevExpress.XtraBars.CheckBoxVisibility.BeforeText;
            barCkGrading.Id = 67;
            barCkGrading.Name = "barCkGrading";
            barCkGrading.CheckedChanged += barCkGrading_CheckedChanged;
            // 
            // barCkCurrentWorkingCalcuResult
            // barCkCalcuLabels
            // 
            barCkCurrentWorkingCalcuResult.Caption = "计算结果";
            barCkCurrentWorkingCalcuResult.CheckBoxVisibility = DevExpress.XtraBars.CheckBoxVisibility.AfterText;
            barCkCurrentWorkingCalcuResult.Id = 68;
            barCkCurrentWorkingCalcuResult.Name = "barCkCurrentWorkingCalcuResult";
            barCkCalcuLabels.Caption = "计算标签";
            barCkCalcuLabels.CheckBoxVisibility = DevExpress.XtraBars.CheckBoxVisibility.BeforeText;
            barCkCalcuLabels.Id = 68;
            barCkCalcuLabels.Name = "barCkCalcuLabels";
            barCkCalcuLabels.CheckedChanged += barCkCalcuLabels_CheckedChanged;
            // 
            // barBtnCurrentWorkingLossCurve
            // barBtnWorkingLossCurve
            // 
            barBtnCurrentWorkingLossCurve.Caption = "损失曲线";
            barBtnCurrentWorkingLossCurve.Id = 69;
            barBtnCurrentWorkingLossCurve.ImageOptions.SvgImage = (DevExpress.Utils.Svg.SvgImage)resources.GetObject("barBtnCurrentWorkingLossCurve.ImageOptions.SvgImage");
            barBtnCurrentWorkingLossCurve.Name = "barBtnCurrentWorkingLossCurve";
            barBtnCurrentWorkingLossCurve.RibbonStyle = DevExpress.XtraBars.Ribbon.RibbonItemStyles.SmallWithText;
            barBtnWorkingLossCurve.Caption = "损失曲线";
            barBtnWorkingLossCurve.Id = 69;
            barBtnWorkingLossCurve.ImageOptions.SvgImage = (DevExpress.Utils.Svg.SvgImage)resources.GetObject("barBtnWorkingLossCurve.ImageOptions.SvgImage");
            barBtnWorkingLossCurve.Name = "barBtnWorkingLossCurve";
            barBtnWorkingLossCurve.RibbonStyle = DevExpress.XtraBars.Ribbon.RibbonItemStyles.SmallWithText;
            barBtnWorkingLossCurve.ItemClick += barBtnWorkingLossCurve_ItemClick;
            // 
            // barBtnCurrentWorkingLossScale
            // barBtnWorkingLossScale
            // 
            barBtnCurrentWorkingLossScale.Caption = "损失比例";
            barBtnCurrentWorkingLossScale.Id = 70;
            barBtnCurrentWorkingLossScale.ImageOptions.SvgImage = (DevExpress.Utils.Svg.SvgImage)resources.GetObject("barBtnCurrentWorkingLossScale.ImageOptions.SvgImage");
            barBtnCurrentWorkingLossScale.Name = "barBtnCurrentWorkingLossScale";
            barBtnCurrentWorkingLossScale.RibbonStyle = DevExpress.XtraBars.Ribbon.RibbonItemStyles.SmallWithText;
            barBtnWorkingLossScale.Caption = "损失比例";
            barBtnWorkingLossScale.Id = 70;
            barBtnWorkingLossScale.ImageOptions.SvgImage = (DevExpress.Utils.Svg.SvgImage)resources.GetObject("barBtnWorkingLossScale.ImageOptions.SvgImage");
            barBtnWorkingLossScale.Name = "barBtnWorkingLossScale";
            barBtnWorkingLossScale.RibbonStyle = DevExpress.XtraBars.Ribbon.RibbonItemStyles.SmallWithText;
            barBtnWorkingLossScale.ItemClick += barBtnWorkingLossScale_ItemClick;
            // 
            // barBtnCurrentWorkingPowerAnalysis
            // barBtnWorkingPower
            // 
            barBtnCurrentWorkingPowerAnalysis.Caption = "能效分析";
            barBtnCurrentWorkingPowerAnalysis.Id = 71;
            barBtnCurrentWorkingPowerAnalysis.ImageOptions.SvgImage = (DevExpress.Utils.Svg.SvgImage)resources.GetObject("barBtnCurrentWorkingPowerAnalysis.ImageOptions.SvgImage");
            barBtnCurrentWorkingPowerAnalysis.Name = "barBtnCurrentWorkingPowerAnalysis";
            barBtnCurrentWorkingPowerAnalysis.RibbonStyle = DevExpress.XtraBars.Ribbon.RibbonItemStyles.SmallWithText;
            barBtnWorkingPower.Caption = "能效分析";
            barBtnWorkingPower.Id = 71;
            barBtnWorkingPower.ImageOptions.SvgImage = (DevExpress.Utils.Svg.SvgImage)resources.GetObject("barBtnWorkingPower.ImageOptions.SvgImage");
            barBtnWorkingPower.Name = "barBtnWorkingPower";
            barBtnWorkingPower.RibbonStyle = DevExpress.XtraBars.Ribbon.RibbonItemStyles.SmallWithText;
            barBtnWorkingPower.ItemClick += barBtnWorkingPower_ItemClick;
            // 
            // barBtnCurrentWorkingMultiAnalysis
            // barBtnWorkingAnaly
            // 
            barBtnCurrentWorkingMultiAnalysis.Caption = "综合分析";
            barBtnCurrentWorkingMultiAnalysis.Id = 72;
            barBtnCurrentWorkingMultiAnalysis.ImageOptions.SvgImage = (DevExpress.Utils.Svg.SvgImage)resources.GetObject("barBtnCurrentWorkingMultiAnalysis.ImageOptions.SvgImage");
            barBtnCurrentWorkingMultiAnalysis.Name = "barBtnCurrentWorkingMultiAnalysis";
            barBtnCurrentWorkingMultiAnalysis.RibbonStyle = DevExpress.XtraBars.Ribbon.RibbonItemStyles.Large;
            barBtnWorkingAnaly.Caption = "综合分析";
            barBtnWorkingAnaly.Id = 72;
            barBtnWorkingAnaly.ImageOptions.SvgImage = (DevExpress.Utils.Svg.SvgImage)resources.GetObject("barBtnWorkingAnaly.ImageOptions.SvgImage");
            barBtnWorkingAnaly.Name = "barBtnWorkingAnaly";
            barBtnWorkingAnaly.RibbonStyle = DevExpress.XtraBars.Ribbon.RibbonItemStyles.Large;
            barBtnWorkingAnaly.ItemClick += barBtnWorkingAnaly_ItemClick;
            // 
            // barBtnParallel
            // 
@@ -525,7 +530,17 @@
            barBtnWorkingList.Id = 75;
            barBtnWorkingList.ImageOptions.SvgImage = (DevExpress.Utils.Svg.SvgImage)resources.GetObject("barBtnWorkingList.ImageOptions.SvgImage");
            barBtnWorkingList.Name = "barBtnWorkingList";
            barBtnWorkingList.RibbonStyle = DevExpress.XtraBars.Ribbon.RibbonItemStyles.SmallWithText;
            barBtnWorkingList.ItemClick += barBtnWorkingList_ItemClick;
            //
            // barBtnWorkingEvaluation
            //
            barBtnWorkingEvaluation.Caption = "精度评估";
            barBtnWorkingEvaluation.Id = 76;
            barBtnWorkingEvaluation.ImageOptions.SvgImage = (DevExpress.Utils.Svg.SvgImage)resources.GetObject("barBtnWorkingEvaluation.ImageOptions.SvgImage");
            barBtnWorkingEvaluation.Name = "barBtnWorkingEvaluation";
            barBtnWorkingEvaluation.RibbonStyle = DevExpress.XtraBars.Ribbon.RibbonItemStyles.SmallWithText;
            barBtnWorkingEvaluation.ItemClick += barBtnWorkingEvaluation_ItemClick;
            // 
            // ribbonPage1
            // 
@@ -586,13 +601,14 @@
            // ribbonPageGroup9
            // 
            ribbonPageGroup9.ItemLinks.Add(barEditCurrentWorking);
            ribbonPageGroup9.ItemLinks.Add(barCkCurrentWorkingCalcuResult);
            ribbonPageGroup9.ItemLinks.Add(barBtnCurrentWorkingParallelAnalysis);
            ribbonPageGroup9.ItemLinks.Add(barBtnCurrentWorkingLossCurve);
            ribbonPageGroup9.ItemLinks.Add(barBtnCurrentWorkingLossScale);
            ribbonPageGroup9.ItemLinks.Add(barBtnCurrentWorkingPowerAnalysis);
            ribbonPageGroup9.ItemLinks.Add(barBtnCurrentWorkingMultiAnalysis);
            ribbonPageGroup9.ItemLinks.Add(barBtnWorkingList);
            ribbonPageGroup9.ItemLinks.Add(barCkCalcuLabels);
            ribbonPageGroup9.ItemLinks.Add(barBtnWorkingEvaluation);
            ribbonPageGroup9.ItemLinks.Add(barBtnWorkingParallel);
            ribbonPageGroup9.ItemLinks.Add(barBtnWorkingPower);
            ribbonPageGroup9.ItemLinks.Add(barBtnWorkingLossCurve);
            ribbonPageGroup9.ItemLinks.Add(barBtnWorkingLossScale);
            ribbonPageGroup9.ItemLinks.Add(barBtnWorkingAnaly);
            ribbonPageGroup9.Name = "ribbonPageGroup9";
            ribbonPageGroup9.Text = "工况分析";
            // 
@@ -711,17 +727,6 @@
            rmSet.Ribbon = ribbonControl1;
            rmSet.BeforePopup += rmSet_BeforePopup;
            // 
            // dockPanel2
            //
            dockPanel2.Dock = DevExpress.XtraBars.Docking.DockingStyle.Right;
            dockPanel2.ID = new Guid("9e1401bf-eba9-4e65-8e3e-50e08d389108");
            dockPanel2.Location = new Point(1666, 128);
            dockPanel2.Name = "dockPanel2";
            dockPanel2.OriginalSize = new Size(275, 200);
            dockPanel2.Size = new Size(275, 572);
            dockPanel2.Tabbed = true;
            dockPanel2.Text = "panelContainer1";
            //
            // XhsProjectSimulationCorePage
            // 
            Appearance.BackColor = SystemColors.Control;
@@ -781,7 +786,7 @@
        private DevExpress.XtraBars.BarButtonItem barBtnSetTranslationList;
        private DevExpress.XtraBars.BarButtonItem barBtnSetExchangerList;
        private DevExpress.XtraBars.BarButtonItem barBtnSetJunctionList;
        private DevExpress.XtraBars.BarButtonItem barBtnCurrentWorkingParallelAnalysis;
        private DevExpress.XtraBars.BarButtonItem barBtnWorkingParallel;
        private DevExpress.XtraBars.BarButtonItem barBtnSearch;
        private DevExpress.XtraBars.Ribbon.RibbonPageGroup pageGroupModel;
        private DevExpress.XtraBars.Docking.DockPanel docPnlBottom;
@@ -813,14 +818,14 @@
        private DevExpress.XtraBars.BarCheckItem barCkMark;
        private DevExpress.XtraBars.BarCheckItem barCkFlowEffect;
        private DevExpress.XtraBars.BarCheckItem barCkGrading;
        private DevExpress.XtraBars.BarCheckItem barCkCurrentWorkingCalcuResult;
        private DevExpress.XtraBars.BarButtonItem barBtnCurrentWorkingLossCurve;
        private DevExpress.XtraBars.BarButtonItem barBtnCurrentWorkingLossScale;
        private DevExpress.XtraBars.BarButtonItem barBtnCurrentWorkingPowerAnalysis;
        private DevExpress.XtraBars.BarButtonItem barBtnCurrentWorkingMultiAnalysis;
        private DevExpress.XtraBars.BarCheckItem barCkCalcuLabels;
        private DevExpress.XtraBars.BarButtonItem barBtnWorkingLossCurve;
        private DevExpress.XtraBars.BarButtonItem barBtnWorkingLossScale;
        private DevExpress.XtraBars.BarButtonItem barBtnWorkingPower;
        private DevExpress.XtraBars.BarButtonItem barBtnWorkingAnaly;
        private DevExpress.XtraBars.BarButtonItem barBtnParallel;
        private DevExpress.XtraBars.BarButtonItem barBtnRepair;
        private DevExpress.XtraBars.BarButtonItem barBtnWorkingList;
        private DevExpress.XtraBars.Docking.DockPanel dockPanel2;
        private DevExpress.XtraBars.BarButtonItem barBtnWorkingEvaluation;
    }
}
WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/XhsProjectSimulationCorePage.cs
@@ -1,13 +1,16 @@
global using Yw.EPAnet;
using DevExpress.CodeParser;
using DevExpress.Diagram.Core.Native;
using DevExpress.Mvvm.Native;
using DevExpress.Office.Utils;
using DevExpress.PivotGrid.QueryMode.TuplesTree;
using DevExpress.Utils.Extensions;
using DevExpress.Xpo.Helpers;
using DevExpress.XtraBars.Ribbon;
using DevExpress.XtraRichEdit.Layout;
using DevExpress.XtraSpreadsheet.Commands;
using HStation.WinFrmUI.PhartRelation;
using NetTaste;
using NPOI.SS.Formula.Functions;
using System.Diagnostics;
using System.Windows.Media;
@@ -81,11 +84,15 @@
            ShowBimfaceCtrl();
            ShowQ3dCtrl();
            ShowPropertyCtrl();
        }
        private void InitialUI()
        {
            InitialCurrentWorking();
        }
        #region Bimface
        #region BIM控件
        //bimface控件
        private XhsProjectSimulationBimfaceCtrl _bimfaceCtrl = null;
@@ -97,13 +104,14 @@
            {
                _bimfaceCtrl = new XhsProjectSimulationBimfaceCtrl();
                _bimfaceCtrl.Dock = DockStyle.Fill;
                await _bimfaceCtrl.InitialData(_project, _projectSite, () => _hydroInfo);
                await _bimfaceCtrl.InitialData(_project, _projectSite);
                _bimfaceCtrl.LoadCompletedEvent += () =>
                {//view加载完成事件
                    if (_hydroInfo == null)
                    {
                        return;
                    }
                    InitialUI();
                };
                _bimfaceCtrl.HydroMouseLeftClickEvent += (obj) =>
                {//鼠标左键点击事件
@@ -111,7 +119,7 @@
                    {
                        return;
                    }
                    _selectedVisual = obj;
                    //_selectedVisual = obj;
                    ShowSelectedProperty();
                };
            }
@@ -133,7 +141,7 @@
        #endregion
        #region Q3d
        #region Q3d控件
        //Q3d 控件
        private XhsProjectSimulationQ3dCtrl _q3dCtrl = null;
@@ -350,7 +358,7 @@
        #endregion
        #region 可见视图列表
        #region 视图列表
        //所有可见视图字典
        private Dictionary<string, HydroVisualViewModel> _allVisualViewModelDict = null;
@@ -720,7 +728,7 @@
        #endregion
        #region 未匹配列表
        #region 未匹列表
        //获取未匹配列表控件
        private XhsProjectSimulationUnMatchingListCtrl GetUnMatchingListCtrl()
@@ -1236,99 +1244,6 @@
                this.barBtnSetValveList.Visibility = DevExpress.XtraBars.BarItemVisibility.Always;
            }
        }
        #endregion
        #region 并联分析
        //并联分析
        private void barBtnAnaly_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            if (_hydroInfo == null)
            {
                return;
            }
            if (_hydroInfo.Pumps == null || _hydroInfo.Pumps.Count < 1)
            {
                return;
            }
            var allCalcuResultList = GetCalcuVisualResultList(Yw.EPAnet.CalcuMode.MinorLoss, false);
            var vmList = new List<XhsSinglePumpViewModel>();
            foreach (var pump in _hydroInfo.Pumps)
            {
                if (!pump.RatedN.HasValue)
                {
                    continue;
                }
                var qh = _hydroInfo.Curves?.Find(t => t.Code == pump.CurveQH)?.CurveData;
                var qe = _hydroInfo.Curves?.Find(t => t.Code == pump.CurveQE)?.CurveData;
                var qp = _hydroInfo.Curves?.Find(t => t.Code == pump.CurveQP)?.CurveData;
                if (qh == null)
                {
                    continue;
                }
                var qhPtList = qh.Select(x => new XhsSplinePointViewModel(x.X, x.Y)).ToList();
                var qePtList = qe?.Select(x => new XhsSplinePointViewModel(x.X, x.Y)).ToList();
                var qpPtList = qp?.Select(x => new XhsSplinePointViewModel(x.X, x.Y)).ToList();
                var vm = new XhsSinglePumpViewModel();
                vmList.Add(vm);
                vm.ID = pump.ID;
                vm.Name = pump.Name;
                vm.Code = pump.Code;
                vm.IsBp = true;
                vm.RunStatus = pump.LinkStatus == Yw.Hydro.LinkStatus.Open;
                vm.RatedHz = pump.RatedHz;
                vm.CurrentHz = Math.Round(pump.RatedHz * pump.SpeedRatio, 1);
                vm.RatedSpeed = pump.RatedN.Value;
                vm.CurrentSpeed = Math.Round(pump.RatedN.Value * pump.SpeedRatio);
                vm.CurveQH = qhPtList;
                vm.CurveQE = qePtList;
                vm.CurveQP = qpPtList;
                if (allCalcuResultList != null && allCalcuResultList.Count > 0)
                {
                    var calcuResult = allCalcuResultList.Find(x => x.Code == pump.Code) as HydroCalcuLinkResult;
                    if (calcuResult != null)
                    {
                        if (calcuResult.CalcuFlow.HasValue)
                        {
                            vm.CalcuQ = Math.Abs(calcuResult.CalcuFlow.Value);
                        }
                        var calcuResultStart = allCalcuResultList.Find(x => x.Code == pump.StartCode) as HydroCalcuNodeResult;
                        var calcuResultEnd = allCalcuResultList.Find(x => x.Code == pump.EndCode) as HydroCalcuNodeResult;
                        if (calcuResultStart != null && calcuResultEnd != null)
                        {
                            if (calcuResultStart.CalcuHead.HasValue && calcuResultEnd.CalcuHead.HasValue)
                            {
                                vm.CalcuH = Math.Round(Math.Abs(calcuResultStart.CalcuHead.Value - calcuResultEnd.CalcuHead.Value), 4);
                            }
                        }
                    }
                }
            }
            var dlg = new PumpParallelAnalyDlg();
            dlg.SetBindingData(vmList);
            dlg.ReloadDataEvent += (list) =>
            {
                list?.ForEach(x =>
                {
                    var pump = _hydroInfo.Pumps?.Find(t => t.Code == x.Code);
                    if (pump != null)
                    {
                        pump.LinkStatus = x.RunStatus ? Yw.Hydro.PumpStatus.Open : Yw.Hydro.PumpStatus.Closed;
                        pump.SpeedRatio = Math.Round(x.CurrentHz / pump.RatedHz, 1);
                    }
                });
                ShowSelectedProperty();
                return true;
            };
            dlg.ShowDialog();
        }
        #endregion
@@ -2000,7 +1915,7 @@
        #endregion
        #region 构件明细控件
        #region 构件控件
        //构件明细控件
        private Yw.WinFrmUI.HydroVisualListCtrl _visualListCtrl = null;
@@ -2097,12 +2012,10 @@
        #region 监测列表
        #region 测点列表
        //所有监测点列表
        //所有监测列表
        private List<HydroMonitorVmo> _allMonitorList = null;
        //获取监测点列表
        //获取监测列表
        private async Task<List<HydroMonitorVmo>> GetMonitorList()
        {
            if (_hydroInfo == null)
@@ -2120,14 +2033,10 @@
            return _allMonitorList;
        }
        //更新监测点列表
        //更新监测列表
        private async void UpdateMonitorList(string code)
        {
            if (_hydroInfo == null)
            {
                return;
            }
            if (string.IsNullOrEmpty(code))
            {
                return;
            }
@@ -2185,6 +2094,10 @@
        }
        #endregion
        #region 监测列表
        #region 监测值列表
@@ -2545,7 +2458,7 @@
        #endregion
        #region 导出INP文件
        #region 导出INP
        //导出INP文件
        private void barBtnExportInp_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
@@ -2650,8 +2563,70 @@
        #region 工况计算
        //所有工况列表
        private List<HydroWorkingVmo> _allWorkingList = null;
        //获取工况列表
        private async Task<List<HydroWorkingVmo>> GetWorkingList()
        {
            if (_allWorkingList == null)
            {
                _allWorkingList = await BLLFactory<Yw.BLL.HydroWorking>.Instance.GetByModelID(_hydroInfo.ID);
                if (_allWorkingList == null)
                {
                    _allWorkingList = new List<HydroWorkingVmo>();
                }
            }
            return _allWorkingList;
        }
        //所有工况元组列表
        private List<Tuple<HydroWorkingVmo, HydroCheckResult, HydroCalcuResult>> _allWorkingTupleList = new List<Tuple<HydroWorkingVmo, HydroCheckResult, HydroCalcuResult>>();
        private List<Tuple<HydroWorkingVmo, HydroCheckResult, HydroCalcuResult>> _allWorkingTupleList = null;
        //获取工况元组列表
        private async Task<List<Tuple<HydroWorkingVmo, HydroCheckResult, HydroCalcuResult>>> GetWorkingTupleList()
        {
            if (_hydroInfo == null)
            {
                return default;
            }
            if (_allWorkingTupleList == null)
            {
                _allWorkingTupleList = new List<Tuple<HydroWorkingVmo, HydroCheckResult, HydroCalcuResult>>();
                var allWorkingList = await GetWorkingList();
                if (allWorkingList.Count > 0)
                {
                    allWorkingList.ForEach(x =>
                    {
                        var checkResult = _hydroInfo.Check();
                        HydroCalcuResult calcuResult = null;
                        if (checkResult != null && checkResult.Succeed)
                        {
                            calcuResult = _hydroInfo.Calcu(Yw.EPAnet.CalcuMode.MinorLoss);
                        }
                        _allWorkingTupleList.Add(new Tuple<HydroWorkingVmo, HydroCheckResult, HydroCalcuResult>(x, checkResult, calcuResult));
                    });
                }
            }
            return _allWorkingTupleList;
        }
        //添加工况元组
        private async void AppendWorkingTuple(HydroWorkingVmo working, HydroCheckResult check, HydroCalcuResult calcu)
        {
            var allWorkingTupleList = await GetWorkingTupleList();
            allWorkingTupleList.Add(new Tuple<HydroWorkingVmo, HydroCheckResult, HydroCalcuResult>(working, check, calcu));
        }
        //移除工况元组
        private async void RemoveWorkingTuple(HydroWorkingVmo working)
        {
            var allWorkingTupleList = await GetWorkingTupleList();
            if (allWorkingTupleList.Count > 0)
            {
                allWorkingTupleList.RemoveAll(x => x.Item1.ID == working.ID);
            }
        }
        //显示工况计算窗体
        private void ShowWorkingCalcuDlg()
@@ -2672,12 +2647,13 @@
                {
                    return;
                }
                var allWorkingList = await GetWorkingList();
                var vmo = new HydroWorkingVmo();
                vmo.ModelID = _hydroInfo.ID;
                vmo.Name = working.Name;
                vmo.WorkingInfo = JsonHelper.Object2Json(working.WorkingInfo);
                vmo.MonitorInfo = JsonHelper.Object2Json(working.MonitorInfo);
                vmo.SortCode = _allWorkingList.Count < 1 ? 1 : _allWorkingList.Max(x => x.SortCode) + 1;
                vmo.SortCode = allWorkingList.Count < 1 ? 1 : allWorkingList.Max(x => x.SortCode) + 1;
                vmo.Description = working.Description;
                vmo.ID = await BLLFactory<Yw.BLL.HydroWorking>.Instance.Insert(vmo);
                if (vmo.ID < 1)
@@ -2685,7 +2661,7 @@
                    TipFormHelper.ShowError("创建工况失败,计算取消!");
                    return;
                }
                _allWorkingList.Add(vmo);
                allWorkingList.Add(vmo);
                _hydroInfo.UpdateWorkingInfo(working.WorkingInfo);
                //校验
@@ -2713,7 +2689,7 @@
                    UpdateVisualViewModelCalcuProperty();
                    UpdateVisualListCtrl();
                    UpdateSelectedProperty();
                    await _bimfaceCtrl?.SetLogicCalcuCustomLabelsCalcuResult(_calcuResult);
                    //await _bimfaceCtrl?.SetLogicCalcuCustomLabelsCalcuResult(_calcuResult);
                    TipFormHelper.ShowSucceed("计算成功!");
                    var codes = _hydroInfo.Pumps.Select(x => x.Code).ToList();
                    await _bimfaceCtrl?.ZoomAndSelectComponents(codes);
@@ -2739,14 +2715,98 @@
        #endregion
        #region 计算标签
        //计算标签是否显示
        private bool _isCalcuLabelsVisible = false;
        //所有计算标签
        private List<LogicCalcuCustomLabel> _allCalcuLabels = null;
        //获取计算标签
        private List<LogicCalcuCustomLabel> GetCalcuLabels()
        {
            if (_hydroInfo == null)
            {
                return default;
            }
            var allCalcuResultList = GetCalcuVisualResultList(Yw.EPAnet.CalcuMode.MinorLoss, false);
            if (allCalcuResultList == null || allCalcuResultList.Count < 1)
            {
                return default;
            }
            var list = new List<LogicCalcuCustomLabel>();
            _hydroInfo.Pumps?.ForEach(x =>
            {
                var hz = Math.Round(x.RatedHz * x.SpeedRatio);
                var calcuPumpResult = GetCalcuVisualResult(x.Code) as HydroCalcuLinkResult;
                if (calcuPumpResult != null)
                {
                    var calcuPumpStartResult = GetCalcuVisualResult(x.StartCode) as HydroCalcuNodeResult;
                    var calcuPumpEndResult = GetCalcuVisualResult(x.EndCode) as HydroCalcuNodeResult;
                    var pumpCustomLabel = new LogicCalcuCustomLabel();
                    pumpCustomLabel.Id = x.Code;
                    pumpCustomLabel.Distance = 20000;
                    pumpCustomLabel.Data = new List<LogicCalcuCustomLabelItem>()
                    {
                        new LogicCalcuCustomLabelItem(){ Name="状态",Value=HydroLinkStatusHelper.GetStatusName(x.LinkStatus),Unit=string.Empty},
                        new LogicCalcuCustomLabelItem(){ Name="频率",Value=hz.ToString(),Unit=string.Empty},
                        new LogicCalcuCustomLabelItem(){ Name="流量",Value=Math.Round(calcuPumpResult.CalcuFlow.Value,1).ToString(),Unit="m³/h"},
                        new LogicCalcuCustomLabelItem(){ Name="进口压力",Value=Math.Round(calcuPumpStartResult.CalcuHead.Value,4).ToString(),Unit="m"},
                        new LogicCalcuCustomLabelItem(){ Name="出口压力",Value=Math.Round(calcuPumpEndResult.CalcuHead.Value,4).ToString(),Unit="m"},
                    };
                    list.Add(pumpCustomLabel);
                }
            });
            _hydroInfo.GetAllEmitters()?.ForEach(x =>
            {
                var calcuEmitter = GetCalcuVisualResult(x.Code) as HydroCalcuNodeResult;
                var emitterCustomLabel = new LogicCalcuCustomLabel();
                emitterCustomLabel.Id = x.Code;
                emitterCustomLabel.Distance = 30000;
                emitterCustomLabel.Data = new List<LogicCalcuCustomLabelItem>()
                    {
                        new LogicCalcuCustomLabelItem(){ Name="流量",Value=Math.Round(calcuEmitter.CalcuDemand.Value,1).ToString(),Unit="m³/h"},
                        new LogicCalcuCustomLabelItem(){ Name="压力",Value=Math.Round(calcuEmitter.CalcuDemand.Value,4).ToString(),Unit="m"}
                    };
                list.Add(emitterCustomLabel);
            });
            return list;
        }
        //设置计算标签
        private void SetCalcuLabels()
        {
            if (_isCalcuLabelsVisible)
            {
                var allCalcuLabels = GetCalcuLabels();
                _bimfaceCtrl?.SetLogicCalcuCustomLabels(allCalcuLabels);
            }
            else
            {
                _bimfaceCtrl?.ClearLogicCalcuCustomLabels();
            }
        }
        //设置计算标签是否显示
        private void barCkCalcuLabels_CheckedChanged(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            _isCalcuLabelsVisible = this.barCkCalcuLabels.Checked;
        }
        #endregion
        #region 当前工况
        //当前工况
        private Yw.Vmo.HydroWorkingVmo _currentWorking = null;
        //初始化当前工况
        private void InitialCurrentWorking(List<HydroWorkingVmo> allWorkingList)
        private async void InitialCurrentWorking()
        {
            var allWorkingList = await GetWorkingList();
            this.repositoryItemImageComboBox1.Items.BeginUpdate();
            this.repositoryItemImageComboBox1.Items.Clear();
            if (allWorkingList != null && allWorkingList.Count > 0)
@@ -2767,9 +2827,22 @@
        }
        //设置当前工况
        private void SetCurrentWorking(HydroWorkingVmo working)
        private async void SetCurrentWorking(HydroWorkingVmo working)
        {
            if (working == null)
            {
                return;
            }
            this.barEditCurrentWorking.EditValue = working;
            _currentWorking = working;
            var allWorkingTupleList = await GetWorkingTupleList();
            var tuple = allWorkingTupleList?.Find(x => x.Item1.ID == working.ID);
            if (tuple == null)
            {
                return;
            }
            _checkResult = tuple.Item2;
            _calcuResult = tuple.Item3;
        }
        //当前工况发生改变
@@ -2777,155 +2850,6 @@
        {
            var working = this.barEditCurrentWorking.EditValue as HydroWorkingVmo;
            SetCurrentWorking(working);
        }
        #endregion
        #region 工况列表
        //所有工况列表
        private List<HydroWorkingVmo> _allWorkingList = null;
        //初始化工况列表
        private async void InitialWorkingList()
        {
            _allWorkingList = await BLLFactory<Yw.BLL.HydroWorking>.Instance.GetByModelID(_hydroInfo.ID);
            if (_allWorkingList == null)
            {
                _allWorkingList = new List<HydroWorkingVmo>();
            }
        }
        ////获取属性控件
        //private XhsProjectSimulationPropertyCtrl GetPropertyCtrl()
        //{
        //    if (_propertyCtrl == null)
        //    {
        //        _propertyCtrl = new XhsProjectSimulationPropertyCtrl();
        //        _propertyCtrl.Dock = DockStyle.Fill;
        //        _propertyCtrl.HydroViewEvent += (visual) =>
        //        {
        //            if (visual == null)
        //            {
        //                return;
        //            }
        //            _bimfaceCtrl?.ZoomToComponent(visual.Code);
        //        };
        //        _propertyCtrl.BlinkLinkNodeEvent += async (link, linkNodeCode) =>
        //        { //强调连接节点
        //            if (_hydroInfo == null)
        //            {
        //                return;
        //            }
        //            if (link == null)
        //            {
        //                return;
        //            }
        //            if (string.IsNullOrEmpty(linkNodeCode))
        //            {
        //                return;
        //            }
        //            var linkNode = GetVisual(linkNodeCode);
        //            if (linkNode == null)
        //            {
        //                return;
        //            }
        //            var blinkCodes = new List<string>();
        //            if (linkNode.GetType() == typeof(HydroJunctionInfo))
        //            {
        //                var allLinkList = GetLinkList();
        //                if (allLinkList == null || allLinkList.Count < 1)
        //                {
        //                    return;
        //                }
        //                var linkList = allLinkList.Where(x => (x.StartCode == linkNodeCode || x.EndCode == linkNodeCode) && x.Code != linkNodeCode).ToList();
        //                if (linkList == null || linkList.Count < 1)
        //                {
        //                    return;
        //                }
        //                blinkCodes.AddRange(linkList.Select(x => x.Code));
        //            }
        //            else
        //            {
        //                blinkCodes.Add(linkNodeCode);
        //            }
        //            await _bimfaceCtrl?.ClearBlinkComponents();
        //            await _bimfaceCtrl?.SetBlinkComponents(blinkCodes);
        //            await Task.Delay(5000);
        //            await _bimfaceCtrl?.ClearBlinkComponents();
        //        };
        //        _propertyCtrl.PropertyValueChangedEvent += (visual) =>
        //        {
        //            if (visual == null)
        //            {
        //                return;
        //            }
        //            UpdateVisualListCtrl();
        //            //ApplyGradingResultList(visual);
        //        };
        //        _propertyCtrl.MarkPropertyValueChangedEvent += (visual) =>
        //        {
        //            //标注属性发生改变
        //            //判断当前是否有标注展示,若有则更新标注,最好是更新单个标注
        //            //UpdateMark(visual);
        //        };
        //        _propertyCtrl.GradingPropertyValueChangedEvent += (parter) =>
        //        {
        //            //分级属性发生改变
        //            //判断当前是否有分级展示,若有则更新分级,最好是更新单个分级
        //        };
        //        _propertyCtrl.FlowEffectPropertyValueChangedEvent += (visual) =>
        //        {
        //            //流向属性发生改变
        //            //判断流向是否加载,如果加载则更新流向,最好是更新单个流向
        //            //UpdateFlowEffect(visual);
        //        };
        //    }
        //    return _propertyCtrl;
        //}
        ////属性控件是否可见
        //private bool IsPropertyCtrlVisible
        //{
        //    get
        //    {
        //        if (this.docPnlRight.Visibility == DevExpress.XtraBars.Docking.DockVisibility.Visible)
        //        {
        //            if (this.controlContainerRight.Controls.Count > 0)
        //            {
        //                if (this.controlContainerRight.Controls[0] is XhsProjectSimulationPropertyCtrl)
        //                {
        //                    return true;
        //                }
        //            }
        //        }
        //        return false;
        //    }
        //}
        ////显示属性控件
        //private void ShowPropertyCtrl()
        //{
        //    if (IsPropertyCtrlVisible)
        //    {
        //        return;
        //    }
        //    var propertyCtrl = GetPropertyCtrl();
        //    this.controlContainerRight.Controls.Clear();
        //    this.controlContainerRight.Controls.Add(propertyCtrl);
        //    this.docPnlRight.Visibility = DevExpress.XtraBars.Docking.DockVisibility.Visible;
        //    this.docPnlRight.Text = "属性";
        //    this.docPnlRight.Width = 300;
        //}
        private void barBtnWorkingList_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
        }
        #endregion
@@ -2936,20 +2860,217 @@
        private HydroWorkingTreeCtrl _workingCtrl = null;
        //获取工况控件
        private HydroWorkingTreeCtrl GetWorkingCtrl()
        private async Task<HydroWorkingTreeCtrl> GetWorkingCtrl()
        {
            if (_workingCtrl == null)
            {
                _workingCtrl = new HydroWorkingTreeCtrl();
                _workingCtrl.Dock = DockStyle.Fill;
                var allWorkingList = await GetWorkingList();
                _workingCtrl.SetBindingData(allWorkingList);
                _workingCtrl.FocusedChangedEvent += (vmo) =>
                {
                };
            }
            return _workingCtrl;
        }
        //工况控件是否可见
        private bool IsWorkingCtrlVisible
        {
            get
            {
                if (this.docPnlRight.Visibility == DevExpress.XtraBars.Docking.DockVisibility.Visible)
                {
                    if (this.controlContainerRight.Controls.Count > 0)
                    {
                        if (this.controlContainerRight.Controls[0] is HydroWorkingTreeCtrl)
                        {
                            return true;
                        }
                    }
                }
                return false;
            }
        }
        //显示工况控件
        private async void ShowWorkingCtrl()
        {
            if (IsWorkingCtrlVisible)
            {
                return;
            }
            var workingCtrl = await GetWorkingCtrl();
            this.controlContainerRight.Controls.Clear();
            this.controlContainerRight.Controls.Add(workingCtrl);
            this.docPnlRight.Visibility = DevExpress.XtraBars.Docking.DockVisibility.Visible;
            this.docPnlRight.Text = "工况";
            this.docPnlRight.Width = 300;
        }
        //隐藏工况控件
        private void HideWorkingCtrl()
        {
            if (IsWorkingCtrlVisible)
            {
                this.docPnlRight.Visibility = DevExpress.XtraBars.Docking.DockVisibility.Hidden;
            }
        }
        //更新工况控件
        private async void UpdateWorkingCtrl()
        {
            var workingCtrl = await GetWorkingCtrl();
            var allWorkingList = await GetWorkingList();
            workingCtrl.SetBindingData(allWorkingList);
        }
        //工况列表点击
        private void barBtnWorkingList_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            ShowWorkingCtrl();
        }
        #endregion
        #region 工况评估
        private void barBtnWorkingEvaluation_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            XtraMessageBox.Show("正在开发中,敬请期待!");
        }
        #endregion
        #region 工况并联
        //并联分析
        private void barBtnAnaly_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            if (_hydroInfo == null)
            {
                return;
            }
            if (_hydroInfo.Pumps == null || _hydroInfo.Pumps.Count < 1)
            {
                return;
            }
            var allCalcuResultList = GetCalcuVisualResultList(Yw.EPAnet.CalcuMode.MinorLoss, false);
            var vmList = new List<XhsSinglePumpViewModel>();
            foreach (var pump in _hydroInfo.Pumps)
            {
                if (!pump.RatedN.HasValue)
                {
                    continue;
                }
                var qh = _hydroInfo.Curves?.Find(t => t.Code == pump.CurveQH)?.CurveData;
                var qe = _hydroInfo.Curves?.Find(t => t.Code == pump.CurveQE)?.CurveData;
                var qp = _hydroInfo.Curves?.Find(t => t.Code == pump.CurveQP)?.CurveData;
                if (qh == null)
                {
                    continue;
                }
                var qhPtList = qh.Select(x => new XhsSplinePointViewModel(x.X, x.Y)).ToList();
                var qePtList = qe?.Select(x => new XhsSplinePointViewModel(x.X, x.Y)).ToList();
                var qpPtList = qp?.Select(x => new XhsSplinePointViewModel(x.X, x.Y)).ToList();
                var vm = new XhsSinglePumpViewModel();
                vmList.Add(vm);
                vm.ID = pump.ID;
                vm.Name = pump.Name;
                vm.Code = pump.Code;
                vm.IsBp = true;
                vm.RunStatus = pump.LinkStatus == Yw.Hydro.LinkStatus.Open;
                vm.RatedHz = pump.RatedHz;
                vm.CurrentHz = Math.Round(pump.RatedHz * pump.SpeedRatio, 1);
                vm.RatedSpeed = pump.RatedN.Value;
                vm.CurrentSpeed = Math.Round(pump.RatedN.Value * pump.SpeedRatio);
                vm.CurveQH = qhPtList;
                vm.CurveQE = qePtList;
                vm.CurveQP = qpPtList;
                if (allCalcuResultList != null && allCalcuResultList.Count > 0)
                {
                    var calcuResult = allCalcuResultList.Find(x => x.Code == pump.Code) as HydroCalcuLinkResult;
                    if (calcuResult != null)
                    {
                        if (calcuResult.CalcuFlow.HasValue)
                        {
                            vm.CalcuQ = Math.Abs(calcuResult.CalcuFlow.Value);
                        }
                        var calcuResultStart = allCalcuResultList.Find(x => x.Code == pump.StartCode) as HydroCalcuNodeResult;
                        var calcuResultEnd = allCalcuResultList.Find(x => x.Code == pump.EndCode) as HydroCalcuNodeResult;
                        if (calcuResultStart != null && calcuResultEnd != null)
                        {
                            if (calcuResultStart.CalcuHead.HasValue && calcuResultEnd.CalcuHead.HasValue)
                            {
                                vm.CalcuH = Math.Round(Math.Abs(calcuResultStart.CalcuHead.Value - calcuResultEnd.CalcuHead.Value), 4);
                            }
                        }
                    }
                }
            }
            var dlg = new PumpParallelAnalyDlg();
            dlg.SetBindingData(vmList);
            dlg.ReloadDataEvent += (list) =>
            {
                list?.ForEach(x =>
                {
                    var pump = _hydroInfo.Pumps?.Find(t => t.Code == x.Code);
                    if (pump != null)
                    {
                        pump.LinkStatus = x.RunStatus ? Yw.Hydro.PumpStatus.Open : Yw.Hydro.PumpStatus.Closed;
                        pump.SpeedRatio = Math.Round(x.CurrentHz / pump.RatedHz, 1);
                    }
                });
                ShowSelectedProperty();
                return true;
            };
            dlg.ShowDialog();
        }
        #endregion
        #region 工况能效
        private void barBtnWorkingPower_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            XtraMessageBox.Show("正在开发中,敬请期待!");
        }
        #endregion
        #region 损失曲线
        private void barBtnWorkingLossCurve_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            XtraMessageBox.Show("正在开发中,敬请期待!");
        }
        #endregion
        #region 损失比例
        private void barBtnWorkingLossScale_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            XtraMessageBox.Show("正在开发中,敬请期待!");
        }
        #endregion
        #region 综合分析
        private void barBtnWorkingAnaly_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            XtraMessageBox.Show("正在开发中,敬请期待!");
        }
        #endregion
WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/XhsProjectSimulationCorePage.resx
@@ -348,7 +348,7 @@
        UzE4LjcsMTYsMTcsMTZ6IiBjbGFzcz0iQmx1ZSIgLz4NCiAgPC9nPg0KPC9zdmc+Cw==
</value>
  </data>
  <data name="barBtnCurrentWorkingParallelAnalysis.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
  <data name="barBtnWorkingParallel.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
    <value>
        AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIzLjIsIFZlcnNpb249MjMuMi40
        LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
@@ -534,7 +534,7 @@
        PSJSZWQiIC8+DQogIDwvZz4NCjwvc3ZnPgs=
</value>
  </data>
  <data name="barBtnCurrentWorkingLossCurve.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
  <data name="barBtnWorkingLossCurve.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
    <value>
        AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIzLjIsIFZlcnNpb249MjMuMi40
        LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
@@ -552,7 +552,7 @@
        IGNsYXNzPSJCbHVlIiAvPg0KICA8L2c+DQo8L3N2Zz4L
</value>
  </data>
  <data name="barBtnCurrentWorkingLossScale.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
  <data name="barBtnWorkingLossScale.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
    <value>
        AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIzLjIsIFZlcnNpb249MjMuMi40
        LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
@@ -573,7 +573,7 @@
        IC8+DQogIDwvZz4NCjwvc3ZnPgs=
</value>
  </data>
  <data name="barBtnCurrentWorkingPowerAnalysis.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
  <data name="barBtnWorkingPower.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
    <value>
        AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIzLjIsIFZlcnNpb249MjMuMi40
        LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
@@ -620,7 +620,7 @@
        MjQsOS42LDIzLjYsMTAsMjMsMTB6IiBjbGFzcz0iR3JlZW4iIC8+DQogIDwvZz4NCjwvc3ZnPgs=
</value>
  </data>
  <data name="barBtnCurrentWorkingMultiAnalysis.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
  <data name="barBtnWorkingAnaly.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
    <value>
        AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIzLjIsIFZlcnNpb249MjMuMi40
        LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
@@ -713,6 +713,32 @@
        LDNzMy0xLjMsMy0zUzYuNywyMiw1LDIyeiIgY2xhc3M9IkJsdWUiIC8+DQogIDwvZz4NCjwvc3ZnPgs=
</value>
  </data>
  <data name="barBtnWorkingEvaluation.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
    <value>
        AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIzLjIsIFZlcnNpb249MjMuMi40
        LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
        dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAAGYEAAAC77u/
        PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi
        IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv
        MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh
        Y2U9InByZXNlcnZlIiBpZD0iTGF5ZXJfMSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAg
        MzIgMzIiPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLkJsdWV7ZmlsbDojMTE3N0Q3O30KCS5Z
        ZWxsb3d7ZmlsbDojRkZCMTE1O30KCS5SZWR7ZmlsbDojRDExQzFDO30KCS5HcmVlbntmaWxsOiMwMzlD
        MjM7fQoJLkJsYWNre2ZpbGw6IzcyNzI3Mjt9CgkuV2hpdGV7ZmlsbDojRkZGRkZGO30KCS5zdDB7b3Bh
        Y2l0eTowLjU7fQoJLnN0MXtvcGFjaXR5OjAuNzU7fQoJLnN0MntkaXNwbGF5Om5vbmU7fQoJLnN0M3tk
        aXNwbGF5OmlubGluZTtmaWxsOiNGRkIxMTU7fQoJLnN0NHtkaXNwbGF5OmlubGluZTt9Cgkuc3Q1e2Rp
        c3BsYXk6aW5saW5lO29wYWNpdHk6MC43NTt9Cgkuc3Q2e2Rpc3BsYXk6aW5saW5lO29wYWNpdHk6MC41
        O30KCS5zdDd7ZGlzcGxheTppbmxpbmU7ZmlsbDojMDM5QzIzO30KCS5zdDh7ZGlzcGxheTppbmxpbmU7
        ZmlsbDojRDExQzFDO30KCS5zdDl7ZGlzcGxheTppbmxpbmU7ZmlsbDojMTE3N0Q3O30KCS5zdDEwe2Rp
        c3BsYXk6aW5saW5lO2ZpbGw6I0ZGRkZGRjt9Cjwvc3R5bGU+DQogIDxnIGlkPSJLUElfeDVGX1Njb3Jl
        Y2FyZCI+DQogICAgPGcgY2xhc3M9InN0MSI+DQogICAgICA8cGF0aCBkPSJNOCwxMmgxMnYySDhWMTJ6
        IE04LDE4aDkuMmgxLjdIMjB2LTJIOFYxOHogTTgsMTBoMTJWOEg4VjEweiIgY2xhc3M9IkJsYWNrIiAv
        Pg0KICAgIDwvZz4NCiAgICA8cGF0aCBkPSJNMTEuMiwyNEg0VjJoMjB2MTcuMmwyLTJWMWMwLTAuNS0w
        LjUtMS0xLTFIM0MyLjUsMCwyLDAuNSwyLDF2MjRjMCwwLjUsMC41LDEsMSwxaDYuMkwxMS4yLDI0eiIg
        Y2xhc3M9IkJsYWNrIiAvPg0KICAgIDxwb2x5Z29uIHBvaW50cz0iOCwzMCAxOCwyMCAyMiwyNCAzMiwx
        NCAzMiwzMCAgIiBjbGFzcz0iR3JlZW4iIC8+DQogIDwvZz4NCjwvc3ZnPgs=
</value>
  </data>
  <metadata name="dockManager1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
    <value>179, 21</value>
  </metadata>
WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/05-tree/HydroWorkingTreeCtrl.Designer.cs
@@ -92,7 +92,7 @@
            treeList1.Name = "treeList1";
            treeList1.OptionsMenu.EnableNodeMenu = false;
            treeList1.OptionsSelection.EnableAppearanceFocusedCell = false;
            treeList1.OptionsView.FocusRectStyle = DevExpress.XtraTreeList.DrawFocusRectStyle.None;
            treeList1.OptionsView.FocusRectStyle = DrawFocusRectStyle.None;
            treeList1.ParentFieldName = "ParentId";
            treeList1.RepositoryItems.AddRange(new DevExpress.XtraEditors.Repository.RepositoryItem[] { repositoryItemButtonEdit1 });
            treeList1.Size = new Size(235, 611);
@@ -142,6 +142,7 @@
            barBtnExpandAll.Id = 0;
            barBtnExpandAll.ImageOptions.SvgImage = (DevExpress.Utils.Svg.SvgImage)resources.GetObject("barBtnExpandAll.ImageOptions.SvgImage");
            barBtnExpandAll.Name = "barBtnExpandAll";
            barBtnExpandAll.Visibility = DevExpress.XtraBars.BarItemVisibility.Never;
            barBtnExpandAll.ItemClick += barBtnExpandAll_ItemClick;
            // 
            // barBtnCollpseAll
@@ -150,6 +151,7 @@
            barBtnCollpseAll.Id = 1;
            barBtnCollpseAll.ImageOptions.SvgImage = (DevExpress.Utils.Svg.SvgImage)resources.GetObject("barBtnCollpseAll.ImageOptions.SvgImage");
            barBtnCollpseAll.Name = "barBtnCollpseAll";
            barBtnCollpseAll.Visibility = DevExpress.XtraBars.BarItemVisibility.Never;
            barBtnCollpseAll.ItemClick += barBtnCollpseAll_ItemClick;
            // 
            // barBtnSearchBox
@@ -166,6 +168,7 @@
            barCkTreeLine.Id = 4;
            barCkTreeLine.ImageOptions.SvgImage = (DevExpress.Utils.Svg.SvgImage)resources.GetObject("barCkTreeLine.ImageOptions.SvgImage");
            barCkTreeLine.Name = "barCkTreeLine";
            barCkTreeLine.Visibility = DevExpress.XtraBars.BarItemVisibility.Never;
            barCkTreeLine.CheckedChanged += barCkTreeLine_CheckedChanged;
            // 
            // barDockControlTop
@@ -251,7 +254,7 @@
            layoutControlItem2.TextSize = new Size(0, 0);
            layoutControlItem2.TextVisible = false;
            // 
            // SimpleTreeViewCtrl
            // HydroWorkingTreeCtrl
            // 
            AutoScaleDimensions = new SizeF(7F, 14F);
            AutoScaleMode = AutoScaleMode.Font;
@@ -260,7 +263,7 @@
            Controls.Add(barDockControlRight);
            Controls.Add(barDockControlBottom);
            Controls.Add(barDockControlTop);
            Name = "SimpleTreeViewCtrl";
            Name = "HydroWorkingTreeCtrl";
            Size = new Size(235, 660);
            ((ISupportInitialize)layoutControl1).EndInit();
            layoutControl1.ResumeLayout(false);
WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/05-tree/HydroWorkingTreeCtrl.cs
@@ -1,6 +1,5 @@
using DevExpress.Utils;
using DevExpress.Utils.Design;
using DevExpress.Utils.Extensions;
namespace Yw.WinFrmUI
{
@@ -19,22 +18,23 @@
        /// <summary>
        /// 聚焦改变事件
        /// </summary>
        public event Action<SimpleTreeViewModel> FocusedChangedEvent;
        public event Action<HydroWorkingVmo> FocusedChangedEvent;
        /// <summary>
        /// 所有绑定列表
        /// </summary>
        private List<SimpleTreeViewModel> _allBindingList = null;
        private List<HydroWorkingTreeViewModel> _allBindingList = null;
        /// <summary>
        /// 绑定数据
        /// </summary>
        public void SetBindingData(List<SimpleTreeViewModel> allList)
        public void SetBindingData(List<HydroWorkingVmo> allWorkingList)
        {
            _allBindingList = new List<SimpleTreeViewModel>();
            allList?.ForEach(x =>
            _allBindingList = new List<HydroWorkingTreeViewModel>();
            allWorkingList?.ForEach(x =>
            {
                _allBindingList.Add(x);
                var vm = new HydroWorkingTreeViewModel(x);
                _allBindingList.Add(vm);
            });
            this.treeList1.DataSource = _allBindingList;
            this.treeList1.ForceInitialize();
@@ -138,8 +138,8 @@
        //聚焦节点改变
        private void treeList1_FocusedNodeChanged(object sender, DevExpress.XtraTreeList.FocusedNodeChangedEventArgs e)
        {
            var vm = this.treeList1.GetDataRecordByNode(e.Node) as SimpleTreeViewModel;
            this.FocusedChangedEvent?.Invoke(vm);
            var vm = this.treeList1.GetDataRecordByNode(e.Node) as HydroWorkingTreeViewModel;
            this.FocusedChangedEvent?.Invoke(vm.Vmo);
        }
WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/05-tree/HydroWorkingTreeViewModel.cs
@@ -5,6 +5,25 @@
    /// </summary>
    public class HydroWorkingTreeViewModel
    {
        /// <summary>
        ///
        /// </summary>
        public HydroWorkingTreeViewModel() { }
        /// <summary>
        ///
        /// </summary>
        public HydroWorkingTreeViewModel(HydroWorkingVmo rhs)
        {
            this.Id = rhs.ID.ToString();
            this.ParentId = string.Empty;
            this.Name = rhs.Name;
            this.ImageIndex = -1;
            this.Checked = false;
            this.SortCode = rhs.SortCode;
            this.Description = rhs.Description;
            this.Vmo = rhs;
        }
        /// <summary>
        /// Id