From a5b25c4f314079d293bf159ed6f0d7dcbadadbb7 Mon Sep 17 00:00:00 2001
From: duheng <2784771470@qq.com>
Date: 星期三, 19 二月 2025 10:46:34 +0800
Subject: [PATCH] 冲突

---
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/08-dlg/HydroLossCurveDlg.cs                                   |   51 +
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-statistics/06-control/HydroLossStatisticsCategoryCtrl.Designer.cs   |    2 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/energy-analy/02-pipe/HydroEnergyAnalyPipeItemViewModel.cs                |   49 +
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/01-core/HydroLossCurveViewModel.cs                            |   41 +
 WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/09-energy/SimulationMultiWorkingEnergyDlg.Designer.cs  |    1 
 WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/10-analy/SimulationSingleWorkingAnalyCtrl.cs           |    4 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/energy-analy/03-control/HydroEnergyAnalyTotalCtrl.cs                     |   44 +
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/07-control/HydroLossCurveCtrl.cs                              |   89 -
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/energy-analy/01-total/HydroEnergyAnalyTotalViewModel.cs                  |   56 +
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/01-core/HydroLossCurveHelper.cs                               |   55 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/09-working/HydroLossCurveMultiWorkingDlg.cs                   |  102 ++
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/09-working/HydroLossCurveWorkingDlg.Designer.cs               |   55 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/energy-analy/02-pipe/HydroEnergyAnalyPipeViewModel.cs                    |   51 +
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/07-control/HydroLossCurveCtrl.resx                            |    0 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/09-working/HydroLossCurveWorkingDlg.resx                      |    0 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/energy-analy/03-control/HydroEnergyAnalyTotalCtrl.resx                   |    0 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/energy-analy/01-core/HydroEnergyAnalyHelper.cs                           |  137 +++
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/06-lower/HydroLossCurveLowerViewModel.cs                      |   36 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/07-control/HydroLossCurveCtrl.Designer.cs                     |    6 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/09-working/HydroLossCurveMultiWorkingDlg.Designer.cs          |  255 ++++++
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/07-control/HydroLossCurveInteropCtrl.resx                     |    4 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/01-core/HydroLossCurveItemViewModel.cs                        |   22 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/04-end/HydroLossCurveEndViewModel.cs                          |   31 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/02-elev/HydroLossCurveElevViewModel.cs                        |   31 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/09-working/HydroLossCurveWorkingDlg.cs                        |  111 ++
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/07-control/HydroLossCurveCompareCtrl.cs                       |  304 +++++++
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/07-control/HydroLossCurveInteropCtrl.cs                       |  114 +-
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/09-working/HydroLossCurveMultiWorkingDlg.resx                 |   20 
 WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/XhsProjectSimulationCorePage.cs          |   95 +-
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/07-control/HydroLossCurveCompareCtrl.Designer.cs              |  133 +++
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/Yw.WinFrmUI.Hydro.Core.csproj                                            |   36 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/08-dlg/HydroLossCurveDlg.Designer.cs                          |   24 
 WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/XhsProjectSimulationCorePage.Designer.cs |    2 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/Yw.WinFrmUI.Hydro.Core.csproj.user                                       |   18 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/energy-analy/01-core/HydroEnergyAnalyItemViewModel.cs                    |  142 +++
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/07-control/HydroLossCurveInteropCtrl.Designer.cs              |    6 
 WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/12-report/02-helper/SimulationWorkingReportCtrl.cs     |   16 
 /dev/null                                                                                                |  103 --
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/03-start/HydroLossCurveStartViewModel.cs                      |   31 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/energy-analy/03-control/HydroEnergyAnalyTotalCtrl.Designer.cs            |   74 +
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/energy-analy/01-core/HydroEnergyAnalyViewModel.cs                        |   29 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/08-dlg/HydroLossCurveDlg.resx                                 |    0 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/07-control/HydroLossCurveCompareCtrl.resx                     |    4 
 WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/10-analy/SimulationSingleWorkingAnalyCtrl.Designer.cs  |    8 
 WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/13-print/working/SimulationPrintWorkingViewModel.cs    |    2 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/05-total/HydroLossCurveTotalViewModel.cs                      |   20 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-statistics/06-control/HydroLossStatisticsCatalogCtrl.Designer.cs    |    6 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/01-core/HydroLossCurvePointVieModel.cs                        |   20 
 48 files changed, 1,980 insertions(+), 460 deletions(-)

diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/XhsProjectSimulationCorePage.Designer.cs b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/XhsProjectSimulationCorePage.Designer.cs
index 145a970..97a3f43 100644
--- a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/XhsProjectSimulationCorePage.Designer.cs
+++ b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/XhsProjectSimulationCorePage.Designer.cs
@@ -415,7 +415,7 @@
             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;
+            barBtnWorkingLossCurve.ItemClick += barBtnLossCurve_ItemClick;
             // 
             // barBtnWorkingLossStatistics
             // 
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/XhsProjectSimulationCorePage.cs b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/XhsProjectSimulationCorePage.cs
index c1ddfc3..1f14d3d 100644
--- a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/XhsProjectSimulationCorePage.cs
+++ b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/XhsProjectSimulationCorePage.cs
@@ -2789,7 +2789,7 @@
                 //鎹熷け缁熻
                 printWorking.LossStatistics = HydroLossStatisticsHelper.Create(baseHydroInfoRhs, working, calcuResult, _calcuPressModeIsHead, allEvaluationList);
                 //鎹熷け鏇茬嚎
-                printWorking.LossCurve = SimulationPrintLossCurveHelper.Create(baseHydroInfoRhs, working, selectedNode, calcuResult, _calcuPressModeIsHead, allEvaluationList);
+                printWorking.LossCurve = HydroLossCurveHelper.Create(baseHydroInfoRhs, working, selectedNode, calcuResult, _calcuPressModeIsHead, allEvaluationList);
             }
 
             #endregion
@@ -2820,7 +2820,7 @@
                     //鎹熷け缁熻
                     printWorking.LossStatistics = HydroLossStatisticsHelper.Create(hydroInfoRhs, working, calcuResult, _calcuPressModeIsHead, allEvaluationList);
                     //鎹熷け鏇茬嚎
-                    printWorking.LossCurve = SimulationPrintLossCurveHelper.Create(hydroInfoRhs, working, selectedNode, calcuResult, _calcuPressModeIsHead, allEvaluationList);
+                    printWorking.LossCurve = HydroLossCurveHelper.Create(hydroInfoRhs, working, selectedNode, calcuResult, _calcuPressModeIsHead, allEvaluationList);
                 }
             }
 
@@ -3326,35 +3326,35 @@
 
         #region 鎹熷け鏇茬嚎
 
-        //鍗曞伐鍐垫崯澶辨洸绾挎帶浠�
-        private HydroSingleWorkingLossCurveInteropCtrl _singleWorkingLossCurveCtrl = null;
+        //鎹熷け鏇茬嚎浜や簰鎺т欢
+        private HydroLossCurveInteropCtrl _lossCurveInteropCtrl = null;
 
-        //鑾峰彇鍗曞伐鍐垫崯澶辨洸绾挎帶浠�
-        private HydroSingleWorkingLossCurveInteropCtrl GetSingleWorkingLossCurveCtrl()
+        //鑾峰彇鎹熷け鏇茬嚎浜や簰鎺т欢
+        private HydroLossCurveInteropCtrl GetLossCurveInteropCtrl()
         {
-            if (_singleWorkingLossCurveCtrl == null)
+            if (_lossCurveInteropCtrl == null)
             {
-                _singleWorkingLossCurveCtrl = new HydroSingleWorkingLossCurveInteropCtrl();
-                _singleWorkingLossCurveCtrl.Dock = DockStyle.Fill;
-                _singleWorkingLossCurveCtrl.HydroClickEvent += (code) =>
+                _lossCurveInteropCtrl = new HydroLossCurveInteropCtrl();
+                _lossCurveInteropCtrl.Dock = DockStyle.Fill;
+                _lossCurveInteropCtrl.HydroClickEvent += (code) =>
                 {
                     var visual = GetVisual(code);
                     SelectVisual(visual, eSimulationVisualSource.None);
                 };
-                _singleWorkingLossCurveCtrl.HydroSpecialDisplayEvent += (list) =>
+                _lossCurveInteropCtrl.HydroSpecialDisplayEvent += (list) =>
                 {
                     _bimfaceCtrl?.SetLogicOutlineGlowEffect(list);
                 };
-                _singleWorkingLossCurveCtrl.HydroCancelSpecialDisplayEvent += () =>
+                _lossCurveInteropCtrl.HydroCancelSpecialDisplayEvent += () =>
                 {
                     _bimfaceCtrl?.RemoveLogicOutlineGlowEffect();
                 };
             }
-            return _singleWorkingLossCurveCtrl;
+            return _lossCurveInteropCtrl;
         }
 
-        //鍗曞伐鍐垫崯澶辨洸绾挎帶浠舵槸鍚﹀彲瑙�
-        private bool IsSingleWorkingLossCurveCtrlVisible
+        //鎹熷け鏇茬嚎鎺т欢鏄惁鍙
+        private bool IsLossCurveInteropCtrlVisible
         {
             get
             {
@@ -3362,7 +3362,7 @@
                 {
                     if (this.controlContainerBottom.Controls.Count > 0)
                     {
-                        if (this.controlContainerBottom.Controls[0] is HydroSingleWorkingLossCurveInteropCtrl)
+                        if (this.controlContainerBottom.Controls[0] is HydroLossCurveInteropCtrl)
                         {
                             return true;
                         }
@@ -3372,43 +3372,43 @@
             }
         }
 
-        //鏄剧ず鍗曞伐鍐垫崯澶辨洸绾挎帶浠�
-        private void ShowSingleWorkingLossCurveCtrl(Yw.Model.HydroModelInfo hydroInfo, HydroCalcuResult calcuResult, HydroVisualInfo visual)
+        //鏄剧ず鎹熷け鏇茬嚎鎺т欢
+        private void ShowLossCurveInteropCtrl
+            (
+                Yw.Model.HydroModelInfo hydroInfo,
+                HydroWorkingVmo working,
+                HydroNodeInfo node,
+                HydroCalcuResult calcuResult = null,
+                bool isHead = false,
+                List<HydroEvaluationVmo> allEvaluationList = null
+            )
         {
-            var singleWorkingLossCurveCtrl = GetSingleWorkingLossCurveCtrl();
-            if (!IsSingleWorkingLossCurveCtrlVisible)
+            var ctrl = GetLossCurveInteropCtrl();
+            if (!IsLossCurveInteropCtrlVisible)
             {
                 this.controlContainerBottom.Controls.Clear();
-                this.controlContainerBottom.Controls.Add(singleWorkingLossCurveCtrl);
+                this.controlContainerBottom.Controls.Add(ctrl);
                 this.docPnlBottom.Visibility = DevExpress.XtraBars.Docking.DockVisibility.Visible;
                 this.docPnlBottom.Text = "鎹熷け鏇茬嚎";
                 this.docPnlBottom.Height = 350;
             }
-            singleWorkingLossCurveCtrl.SetBindingData(hydroInfo, calcuResult, visual);
+            ctrl.SetBindingData(hydroInfo, working, node, calcuResult, isHead, allEvaluationList);
         }
 
         //鎹熷け鏇茬嚎
-        private void barBtnWorkingLossCurve_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
+        private async void barBtnLossCurve_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
         {
-            if (_visual == null)
+            var node = GetSelectNode();
+            if (node == null)
             {
-                SelectInputSource();
-                if (_visual == null)
-                {
-                    TipFormHelper.ShowWarn("璇烽�夋嫨鏋勪欢鍚庨噸璇曪紒");
-                    return;
-                }
-            }
-            HydroVisualInfo visual = _visual;
-            if (_visual is HydroLinkInfo linkInfo)
-            {
-                var visualListHelper = GetVisualListHelper();
-                visual = visualListHelper.GetVisual(linkInfo.StartCode);
+                return;
             }
 
-            var workingCheckedListHelper = GetWorkingCheckedListHelper();
-            var allCheckedWorkingList = workingCheckedListHelper.GetCheckedWorkingList();
-            if (allCheckedWorkingList == null || allCheckedWorkingList.Count < 1)
+            var isHead = _calcuPressModeIsHead;
+            var allEvaluationList = await GetEvaluationList();
+
+            var workingList = GetCheckedWorkingList();
+            if (workingList == null || workingList.Count < 1)
             {
                 var workingHelper = GetWorkingHelper();
                 if (!workingHelper.Initialized)
@@ -3416,18 +3416,13 @@
                     TipFormHelper.ShowWarn("璇疯绠楀悗閲嶈瘯锛�");
                     return;
                 }
-                ShowSingleWorkingLossCurveCtrl(workingHelper.HydroInfo, workingHelper.CalcuResult, visual);
+                ShowLossCurveInteropCtrl(workingHelper.HydroInfo, workingHelper.Working, node, workingHelper.CalcuResult, isHead, allEvaluationList);
+                return;
             }
-            else
-            {
-                var dlg = new HydroMultiWorkingLossCurveDlg();
-                dlg.HydroClickEvent += (code) =>
-                {
-                    SelectVisual(code, eSimulationVisualSource.None);
-                };
-                dlg.SetBindingData(_hydroInfo, allCheckedWorkingList, visual);
-                dlg.ShowDialog();
-            }
+
+            var dlg = new HydroLossCurveMultiWorkingDlg();
+            dlg.SetBindingData(_hydroInfo, workingList, node, _calcuPressModeIsHead, allEvaluationList);
+            dlg.ShowDialog();
         }
 
         #endregion
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/09-energy/SimulationMultiWorkingEnergyDlg.Designer.cs b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/09-energy/SimulationMultiWorkingEnergyDlg.Designer.cs
index 5860e53..04115e0 100644
--- a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/09-energy/SimulationMultiWorkingEnergyDlg.Designer.cs
+++ b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/09-energy/SimulationMultiWorkingEnergyDlg.Designer.cs
@@ -193,7 +193,6 @@
         private DevExpress.XtraBars.Ribbon.RibbonPage ribbonPage1;
         private DevExpress.XtraBars.Ribbon.RibbonPageGroup ribbonPageGroup1;
         private DevExpress.XtraLayout.LayoutControl layoutControl1;
-        private HydroSingleWorkingLossStatisticsCtrl hydroSingleWorkingLossStatisticsCtrl1;
         private HydroWorkingListViewCtrl hydroWorkingListViewCtrl1;
         private DevExpress.XtraLayout.LayoutControlGroup Root;
         private DevExpress.XtraLayout.LayoutControlItem layoutControlItem2;
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/10-analy/SimulationSingleWorkingAnalyCtrl.Designer.cs b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/10-analy/SimulationSingleWorkingAnalyCtrl.Designer.cs
index 14a2b87..0618ecc 100644
--- a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/10-analy/SimulationSingleWorkingAnalyCtrl.Designer.cs
+++ b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/10-analy/SimulationSingleWorkingAnalyCtrl.Designer.cs
@@ -35,9 +35,9 @@
             pageForEnergy = new DevExpress.XtraBars.Navigation.TabNavigationPage();
             simulationSingleWorkingEnergyCtrl1 = new SimulationSingleWorkingEnergyCtrl();
             pageForLossCurve = new DevExpress.XtraBars.Navigation.TabNavigationPage();
-            hydroSingleWorkingLossCurveCtrl1 = new HydroSingleWorkingLossCurveCtrl();
+            hydroSingleWorkingLossCurveCtrl1 = new HydroLossCurveCtrl();
             pageForLossStatistics = new DevExpress.XtraBars.Navigation.TabNavigationPage();
-            hydroSingleWorkingLossStatisticsCtrl1 = new HydroSingleWorkingLossStatisticsCtrl();
+            hydroSingleWorkingLossStatisticsCtrl1 = new HydroLossStatisticsCtrl();
             ((ISupportInitialize)tabPane1).BeginInit();
             tabPane1.SuspendLayout();
             pageForEvaluation.SuspendLayout();
@@ -162,8 +162,8 @@
         private DevExpress.XtraBars.Navigation.TabNavigationPage pageForLossCurve;
         private HydroSingleWorkingEvaluationCtrl hydroSingleWorkingEvaluationCtrl1;
         private SimulationSingleWorkingEnergyCtrl simulationSingleWorkingEnergyCtrl1;
-        private HydroSingleWorkingLossCurveCtrl hydroSingleWorkingLossCurveCtrl1;
+        private HydroLossCurveCtrl hydroSingleWorkingLossCurveCtrl1;
         private DevExpress.XtraBars.Navigation.TabNavigationPage pageForLossStatistics;
-        private HydroSingleWorkingLossStatisticsCtrl hydroSingleWorkingLossStatisticsCtrl1;
+        private HydroLossStatisticsCtrl hydroSingleWorkingLossStatisticsCtrl1;
     }
 }
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/10-analy/SimulationSingleWorkingAnalyCtrl.cs b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/10-analy/SimulationSingleWorkingAnalyCtrl.cs
index 59c3c0a..f42ab55 100644
--- a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/10-analy/SimulationSingleWorkingAnalyCtrl.cs
+++ b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/10-analy/SimulationSingleWorkingAnalyCtrl.cs
@@ -23,8 +23,8 @@
         {
             this.hydroSingleWorkingEvaluationCtrl1.SetBindingData(hydroInfo, allMonitorList, working, calcuResult);
             this.simulationSingleWorkingEnergyCtrl1.SetBindingData(working, hydroInfo, allMonitorList, calcuResult);
-            this.hydroSingleWorkingLossCurveCtrl1.SetBindingData(hydroInfo, calcuResult, visual);
-            this.hydroSingleWorkingLossStatisticsCtrl1.SetBindingData(hydroInfo, calcuResult);
+            //this.hydroSingleWorkingLossCurveCtrl1.SetBindingData(hydroInfo, calcuResult, visual);
+            this.hydroSingleWorkingLossStatisticsCtrl1.SetBindingData(hydroInfo, working, calcuResult);
         }
 
 
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/12-report/02-helper/SimulationWorkingReportCtrl.cs b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/12-report/02-helper/SimulationWorkingReportCtrl.cs
index 15b651d..4af2a61 100644
--- a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/12-report/02-helper/SimulationWorkingReportCtrl.cs
+++ b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/12-report/02-helper/SimulationWorkingReportCtrl.cs
@@ -14,8 +14,8 @@
 
         private SimulationProjectTitleCtrl _titleCtrl = null;
         private SimulationPumpSingleWorkingChartCtrl _workingChart = null;
-        private HydroSingleWorkingLossCurveCtrl _lossCurve = null;
-        private HydroSingleWorkingLossStatisticsCtrl _lossStatistics = null;
+        private HydroLossCurveCtrl _lossCurve = null;
+        private HydroLossStatisticsCtrl _lossStatistics = null;
 
         private XhsProjectVmo _project = null;
         private Yw.Model.HydroModelInfo _hydroInfo = null;
@@ -92,8 +92,8 @@
             lossCurveGroup.Expanded = false;
             lossCurveGroup.HeaderButtonsLocation = DevExpress.Utils.GroupElementLocation.AfterText;
             lossCurveGroup.ExpandOnDoubleClick = true;
-            _lossCurve = new HydroSingleWorkingLossCurveCtrl();
-            _lossCurve.SetBindingData(hydroInfo, calcuResult, visual);
+            _lossCurve = new HydroLossCurveCtrl();
+            //_lossCurve.SetBindingData(hydroInfo, calcuResult, visual);
             var lossCurveItem = lossCurveGroup.AddItem("鎹熷け鏇茬嚎", _lossCurve);
             lossCurveItem.TextVisible = false;
             lossCurveItem.Height = 250;
@@ -112,8 +112,8 @@
             lossStatisticsGroup.Expanded = false;
             lossStatisticsGroup.HeaderButtonsLocation = DevExpress.Utils.GroupElementLocation.AfterText;
             lossStatisticsGroup.ExpandOnDoubleClick = true;
-            _lossStatistics = new HydroSingleWorkingLossStatisticsCtrl();
-            _lossStatistics.SetBindingData(hydroInfo, calcuResult);
+            _lossStatistics = new HydroLossStatisticsCtrl();
+            _lossStatistics.SetBindingData(hydroInfo, working, calcuResult);
             var lossStatisticsItem = lossStatisticsGroup.AddItem("鎹熷け缁熻", _lossStatistics);
             lossStatisticsItem.TextVisible = false;
             lossStatisticsItem.Height = 250;
@@ -207,9 +207,9 @@
             vm.Working.EnergyInputImagePath = GetImageFilePath(_energyInputImageFileName);
             _lossStatistics.ExportInputToImage(vm.Working.EnergyInputImagePath);
             vm.Working.EnergyLossImagePath = GetImageFilePath(_energyLossImageFileName);
-            _lossStatistics.ExportLossToImage(vm.Working.EnergyLossImagePath);
+            _lossStatistics.ExportCatalogToImage(vm.Working.EnergyLossImagePath);
             vm.Working.EnergyStatisticsImagePath = GetImageFilePath(_energyStatisticsImageFileName);
-            _lossStatistics.ExportStatisticsToImage(vm.Working.EnergyStatisticsImagePath);
+            _lossStatistics.ExportCategoryToImage(vm.Working.EnergyStatisticsImagePath);
 
             vm.PumpChart = new Yw.DiagramFile.PumpChartViewModel();
 
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/13-print/loss-curve/SimulationPrintLossCurveViewModel.cs b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/13-print/loss-curve/SimulationPrintLossCurveViewModel.cs
deleted file mode 100644
index c8f1047..0000000
--- a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/13-print/loss-curve/SimulationPrintLossCurveViewModel.cs
+++ /dev/null
@@ -1,39 +0,0 @@
-锘縰sing System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace HStation.WinFrmUI
-{
-    /// <summary>
-    /// 鎹熷け鏇茬嚎
-    /// </summary>
-    public class SimulationPrintLossCurveViewModel
-    {
-        /// <summary>
-        /// 鏍囬珮
-        /// </summary>
-        public SimulationPrintLossCurveElevViewModel Elev { get; set; }
-
-        /// <summary>
-        /// 寮�濮�
-        /// </summary>
-        public SimulationPrintLossCurveStartViewModel Start { get; set; }
-
-        /// <summary>
-        /// 缁撴潫
-        /// </summary>
-        public SimulationPrintLossCurveEndViewModel End { get; set; }
-
-        /// <summary>
-        /// 鎬荤粨
-        /// </summary>
-        public SimulationPrintLossCurveTotalViewModel Total { get; set; }
-
-        /// <summary>
-        /// 瀛愮骇闆嗗悎
-        /// </summary>
-        public List<SimulationPrintLossCurveItemViewModel> Items { get; set; }
-    }
-}
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/13-print/loss-curve/elev/SimulationPrintLossCurveElevItemViewModel.cs b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/13-print/loss-curve/elev/SimulationPrintLossCurveElevItemViewModel.cs
deleted file mode 100644
index 593f485..0000000
--- a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/13-print/loss-curve/elev/SimulationPrintLossCurveElevItemViewModel.cs
+++ /dev/null
@@ -1,39 +0,0 @@
-锘縩amespace HStation.WinFrmUI
-{
-    /// <summary>
-    /// 
-    /// </summary>
-    public class SimulationPrintLossCurveElevItemViewModel
-    {
-        /// <summary>
-        /// 
-        /// </summary>
-        public SimulationPrintLossCurveElevItemViewModel(string code, string name, double x, double y)
-        {
-            this.Code = code;
-            this.Name = name;
-            this.X = Math.Round(x, 2);
-            this.Y = Math.Round(y, 2);
-        }
-
-        /// <summary>
-        /// 缂栫爜 
-        /// </summary>
-        public string Code { get; set; }
-
-        /// <summary>
-        /// 鍚嶇О
-        /// </summary>
-        public string Name { get; set; }
-
-        /// <summary>
-        /// X
-        /// </summary>
-        public double X { get; set; }
-
-        /// <summary>
-        /// Y
-        /// </summary>
-        public double Y { get; set; }
-    }
-}
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/13-print/loss-curve/elev/SimulationPrintLossCurveElevViewModel.cs b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/13-print/loss-curve/elev/SimulationPrintLossCurveElevViewModel.cs
deleted file mode 100644
index 9396d42..0000000
--- a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/13-print/loss-curve/elev/SimulationPrintLossCurveElevViewModel.cs
+++ /dev/null
@@ -1,33 +0,0 @@
-锘縰sing DevExpress.Xpo.Helpers;
-
-namespace HStation.WinFrmUI
-{
-    /// <summary>
-    /// 
-    /// </summary>
-    public class SimulationPrintLossCurveElevViewModel
-    {
-        /// <summary>
-        /// 
-        /// </summary>
-        public SimulationPrintLossCurveElevViewModel() { }
-
-        /// <summary>
-        /// 
-        /// </summary>
-        public SimulationPrintLossCurveElevViewModel(List<SimulationPrintLossCurveItemViewModel> allItemList)
-        {
-            if (allItemList == null || allItemList.Count < 1)
-            {
-                return;
-            }
-            this.Items = allItemList?.Select(x => new SimulationPrintLossCurveElevItemViewModel(x.Code, x.Name, x.Distance, x.Elev)).ToList();
-        }
-
-        /// <summary>
-        /// 瀛愮骇闆嗗悎
-        /// </summary>
-        public List<SimulationPrintLossCurveElevItemViewModel> Items { get; set; }
-
-    }
-}
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/13-print/loss-curve/end/SimulationPrintLossCurveEndItemViewModel.cs b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/13-print/loss-curve/end/SimulationPrintLossCurveEndItemViewModel.cs
deleted file mode 100644
index 2412f82..0000000
--- a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/13-print/loss-curve/end/SimulationPrintLossCurveEndItemViewModel.cs
+++ /dev/null
@@ -1,39 +0,0 @@
-锘縩amespace HStation.WinFrmUI
-{
-    /// <summary>
-    /// 
-    /// </summary>
-    public class SimulationPrintLossCurveEndItemViewModel
-    {
-        /// <summary>
-        /// 
-        /// </summary>
-        public SimulationPrintLossCurveEndItemViewModel(string code, string name, double x, double y)
-        {
-            this.Code = code;
-            this.Name = name;
-            this.X = Math.Round(x, 2);
-            this.Y = Math.Round(y, 2);
-        }
-
-        /// <summary>
-        /// 缂栫爜 
-        /// </summary>
-        public string Code { get; set; }
-
-        /// <summary>
-        /// 鍚嶇О
-        /// </summary>
-        public string Name { get; set; }
-
-        /// <summary>
-        /// X
-        /// </summary>
-        public double X { get; set; }
-
-        /// <summary>
-        /// Y
-        /// </summary>
-        public double Y { get; set; }
-    }
-}
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/13-print/loss-curve/end/SimulationPrintLossCurveEndViewModel.cs b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/13-print/loss-curve/end/SimulationPrintLossCurveEndViewModel.cs
deleted file mode 100644
index 2a72b70..0000000
--- a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/13-print/loss-curve/end/SimulationPrintLossCurveEndViewModel.cs
+++ /dev/null
@@ -1,31 +0,0 @@
-锘縩amespace HStation.WinFrmUI
-{
-    /// <summary>
-    /// 
-    /// </summary>
-    public class SimulationPrintLossCurveEndViewModel
-    {
-        /// <summary>
-        /// 
-        /// </summary>
-        public SimulationPrintLossCurveEndViewModel() { }
-
-        /// <summary>
-        /// 
-        /// </summary>
-        public SimulationPrintLossCurveEndViewModel(List<SimulationPrintLossCurveItemViewModel> allItemList)
-        {
-            if (allItemList == null || allItemList.Count < 1)
-            {
-                return;
-            }
-            this.Items = allItemList?.Select(x => new SimulationPrintLossCurveEndItemViewModel(x.Code, x.Name, x.Distance, x.EndHead)).ToList();
-        }
-
-        /// <summary>
-        /// 瀛愮骇闆嗗悎
-        /// </summary>
-        public List<SimulationPrintLossCurveEndItemViewModel> Items { get; set; }
-
-    }
-}
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/13-print/loss-curve/start/SimulationPrintLossCurveStartItemViewModel.cs b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/13-print/loss-curve/start/SimulationPrintLossCurveStartItemViewModel.cs
deleted file mode 100644
index ce6c7bd..0000000
--- a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/13-print/loss-curve/start/SimulationPrintLossCurveStartItemViewModel.cs
+++ /dev/null
@@ -1,45 +0,0 @@
-锘縰sing System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace HStation.WinFrmUI
-{
-    /// <summary>
-    /// 
-    /// </summary>
-    public class SimulationPrintLossCurveStartItemViewModel
-    {
-        /// <summary>
-        /// 
-        /// </summary>
-        public SimulationPrintLossCurveStartItemViewModel(string code, string name, double x, double y)
-        {
-            this.Code = code;
-            this.Name = name;
-            this.X = Math.Round(x, 2);
-            this.Y = Math.Round(y, 2);
-        }
-
-        /// <summary>
-        /// 缂栫爜 
-        /// </summary>
-        public string Code { get; set; }
-
-        /// <summary>
-        /// 鍚嶇О
-        /// </summary>
-        public string Name { get; set; }
-
-        /// <summary>
-        /// X
-        /// </summary>
-        public double X { get; set; }
-
-        /// <summary>
-        /// Y
-        /// </summary>
-        public double Y { get; set; }
-    }
-}
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/13-print/loss-curve/start/SimulationPrintLossCurveStartViewModel.cs b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/13-print/loss-curve/start/SimulationPrintLossCurveStartViewModel.cs
deleted file mode 100644
index ef24945..0000000
--- a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/13-print/loss-curve/start/SimulationPrintLossCurveStartViewModel.cs
+++ /dev/null
@@ -1,31 +0,0 @@
-锘縩amespace HStation.WinFrmUI
-{
-    /// <summary>
-    /// 
-    /// </summary>
-    public class SimulationPrintLossCurveStartViewModel
-    {
-        /// <summary>
-        /// 
-        /// </summary>
-        public SimulationPrintLossCurveStartViewModel() { }
-
-        /// <summary>
-        /// 
-        /// </summary>
-        public SimulationPrintLossCurveStartViewModel(List<SimulationPrintLossCurveItemViewModel> allItemList)
-        {
-            if (allItemList == null || allItemList.Count < 1)
-            {
-                return;
-            }
-            this.Items = allItemList?.Select(x => new SimulationPrintLossCurveStartItemViewModel(x.Code, x.Name, x.Distance, x.StartHead)).ToList();
-        }
-
-        /// <summary>
-        /// 瀛愮骇闆嗗悎
-        /// </summary>
-        public List<SimulationPrintLossCurveStartItemViewModel> Items { get; set; }
-
-    }
-}
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/13-print/working/SimulationPrintWorkingViewModel.cs b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/13-print/working/SimulationPrintWorkingViewModel.cs
index 0504b7a..7a924a2 100644
--- a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/13-print/working/SimulationPrintWorkingViewModel.cs
+++ b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/13-print/working/SimulationPrintWorkingViewModel.cs
@@ -58,7 +58,7 @@
         /// <summary>
         /// 鎹熷け鏇茬嚎
         /// </summary>
-        public SimulationPrintLossCurveViewModel LossCurve { get; set; }
+        public HydroLossCurveViewModel LossCurve { get; set; }
 
         /// <summary>
         /// 鎹熷け缁熻
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/01-curve/HydroMultiWorkingLossCurveDlg.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/01-curve/HydroMultiWorkingLossCurveDlg.cs
deleted file mode 100644
index f3c77d1..0000000
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/01-curve/HydroMultiWorkingLossCurveDlg.cs
+++ /dev/null
@@ -1,94 +0,0 @@
-锘縰sing Mapster;
-
-namespace Yw.WinFrmUI
-{
-    public partial class HydroMultiWorkingLossCurveDlg : DevExpress.XtraBars.Ribbon.RibbonForm
-    {
-        public HydroMultiWorkingLossCurveDlg()
-        {
-            InitializeComponent();
-            this.IconOptions.Icon = Yw.WinFrmUI.GlobalParas.AppIcon;
-            this.layoutControl1.SetupLayoutControl();
-            this.hydroWorkingListViewCtrl1.SelectedChangedEvent += HydroWorkingListViewCtrl1_SelectedChangedEvent;
-            this.hydroSingleWorkingLossCurveCtrl1.HydroClickEvent += HydroSingleWorkingLossCurveCtrl1_HydroClickEvent;
-        }
-
-        /// <summary>
-        /// 
-        /// </summary>
-        public event Action<string> HydroClickEvent;
-
-        private Yw.Model.HydroModelInfo _hydroInfo = null;//姘村姏淇℃伅
-        private Yw.Model.HydroVisualInfo _visual = null;//鍙鏋勪欢
-
-        /// <summary>
-        /// 缁戝畾鏁版嵁
-        /// </summary>
-        public void SetBindingData
-            (
-                Yw.Model.HydroModelInfo hydroInfo,
-                List<HydroWorkingVmo> allWorkingList,
-                Yw.Model.HydroVisualInfo visual
-            )
-        {
-            if (hydroInfo == null)
-            {
-                return;
-            }
-            if (allWorkingList == null || allWorkingList.Count < 1)
-            {
-                return;
-            }
-            if (visual == null)
-            {
-                return;
-            }
-            _hydroInfo = hydroInfo;
-            _visual = visual;
-            this.hydroWorkingListViewCtrl1.SetBindingData(allWorkingList);
-            if (allWorkingList.Count < 2)
-            {
-                var working = allWorkingList[0];
-                this.Text = $"鎹熷け鏇茬嚎({working.Name})";
-                this.groupForWorkingList.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Never;
-                this.splitter.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Never;
-                LoadWorkingLossCurve(working);
-            }
-        }
-
-        //宸ュ喌閫夋嫨鏀瑰彉
-        private void HydroWorkingListViewCtrl1_SelectedChangedEvent(HydroWorkingVmo working)
-        {
-            if (working == null)
-            {
-                return;
-            }
-            LoadWorkingLossCurve(working);
-        }
-
-        //鍔犺浇宸ュ喌鎹熷け鏇茬嚎
-        private void LoadWorkingLossCurve(HydroWorkingVmo working)
-        {
-            if (_hydroInfo == null)
-            {
-                return;
-            }
-            if (_visual == null)
-            {
-                return;
-            }
-            var hydroInfo = _hydroInfo.Adapt<Yw.Model.HydroModelInfo>();
-            hydroInfo.UpdateWorkingInfo(working.WorkingInfo);
-            var calcuResult = hydroInfo.Calcu(Yw.EPAnet.CalcuMode.MinorLoss);
-            this.hydroSingleWorkingLossCurveCtrl1.SetBindingData(hydroInfo, calcuResult, _visual);
-        }
-
-        //
-        private void HydroSingleWorkingLossCurveCtrl1_HydroClickEvent(string obj)
-        {
-            this.HydroClickEvent?.Invoke(obj);
-        }
-
-
-    }
-}
\ No newline at end of file
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/01-curve/HydroNodeLossViewModel.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/01-curve/HydroNodeLossViewModel.cs
deleted file mode 100644
index c8f0bc7..0000000
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/01-curve/HydroNodeLossViewModel.cs
+++ /dev/null
@@ -1,62 +0,0 @@
-锘縩amespace Yw.WinFrmUI
-{
-    /// <summary>
-    /// 
-    /// </summary>
-    public class HydroNodeLossViewModel
-    {
-        /// <summary>
-        /// 
-        /// </summary>
-        public HydroNodeLossViewModel() { }
-
-        /// <summary>
-        /// 
-        /// </summary>
-        public HydroNodeLossViewModel(Yw.EPAnet.LossNode rhs, Yw.Model.HydroVisualInfo visual)
-        {
-            this.Code = rhs.Id;
-            this.Name = visual.Name;
-            this.Elev = Math.Round(rhs.Elev, 2);
-            this.StartHead = Math.Round(rhs.Head, 2);
-            this.EndHead = Math.Round(rhs.Head - rhs.MinorLoss, 2);
-            this.MinorLoss = rhs.MinorLoss;
-            this.Distance = Math.Round(rhs.Distance, 2);
-        }
-
-        /// <summary>
-        /// 缂栫爜
-        /// </summary>
-        public string Code { get; set; }
-
-        /// <summary>
-        /// 鍚嶇О
-        /// </summary>
-        public string Name { get; set; }
-
-        /// <summary>
-        /// 楂樼▼
-        /// </summary>
-        public double Elev { get; set; }
-
-        /// <summary>
-        /// 寮�濮嬫按澶�
-        /// </summary>
-        public double StartHead { get; set; }
-
-        /// <summary>
-        /// 缁撴潫姘村ご
-        /// </summary>
-        public double EndHead { get; set; }
-
-        /// <summary>
-        /// 灞�閮ㄦ崯澶�
-        /// </summary>
-        public double MinorLoss { get; set; }
-
-        /// <summary>
-        /// 璺濈
-        /// </summary>
-        public double Distance { get; set; }
-    }
-}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/01-curve/HydroSingleWorkingLossCurveDlg.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/01-curve/HydroSingleWorkingLossCurveDlg.cs
deleted file mode 100644
index c7876e8..0000000
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/01-curve/HydroSingleWorkingLossCurveDlg.cs
+++ /dev/null
@@ -1,33 +0,0 @@
-锘縩amespace Yw.WinFrmUI
-{
-    public partial class HydroSingleWorkingLossCurveDlg : DevExpress.XtraBars.Ribbon.RibbonForm
-    {
-        public HydroSingleWorkingLossCurveDlg()
-        {
-            InitializeComponent();
-            this.IconOptions.Icon = Yw.WinFrmUI.GlobalParas.AppIcon;
-            this.hydroSingleWorkingLossCurveCtrl1.HydroClickEvent += HydroSingleWorkingLossCurveCtrl1_HydroClickEvent;
-        }
-
-        /// <summary>
-        /// 
-        /// </summary>
-        public event Action<string> HydroClickEvent;
-
-        /// <summary>
-        /// 缁戝畾鏁版嵁
-        /// </summary>
-        public void SetBindingData(Yw.Model.HydroModelInfo hydroInfo, HydroCalcuResult calcuResult, Yw.Model.HydroVisualInfo visual)
-        {
-            this.hydroSingleWorkingLossCurveCtrl1.SetBindingData(hydroInfo, calcuResult, visual);
-        }
-
-        //
-        private void HydroSingleWorkingLossCurveCtrl1_HydroClickEvent(string obj)
-        {
-            this.HydroClickEvent?.Invoke(obj);
-        }
-
-
-    }
-}
\ No newline at end of file
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/02-scale/01-catalog/HydroCatalogLossScaleChartCtrl.Designer.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/02-scale/01-catalog/HydroCatalogLossScaleChartCtrl.Designer.cs
deleted file mode 100644
index d46424b..0000000
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/02-scale/01-catalog/HydroCatalogLossScaleChartCtrl.Designer.cs
+++ /dev/null
@@ -1,92 +0,0 @@
-锘縩amespace Yw.WinFrmUI
-{
-    partial class HydroCatalogLossScaleChartCtrl
-    {
-        /// <summary> 
-        /// Required designer variable.
-        /// </summary>
-        private System.ComponentModel.IContainer components = null;
-
-        /// <summary> 
-        /// Clean up any resources being used.
-        /// </summary>
-        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
-        protected override void Dispose(bool disposing)
-        {
-            if (disposing && (components != null))
-            {
-                components.Dispose();
-            }
-            base.Dispose(disposing);
-        }
-
-        #region Component Designer generated code
-
-        /// <summary> 
-        /// Required method for Designer support - do not modify 
-        /// the contents of this method with the code editor.
-        /// </summary>
-        private void InitializeComponent()
-        {
-            components = new Container();
-            DevExpress.XtraCharts.Series series1 = new DevExpress.XtraCharts.Series();
-            DevExpress.XtraCharts.DoughnutSeriesLabel doughnutSeriesLabel1 = new DevExpress.XtraCharts.DoughnutSeriesLabel();
-            DevExpress.XtraCharts.DoughnutSeriesView doughnutSeriesView1 = new DevExpress.XtraCharts.DoughnutSeriesView();
-            bindingSource1 = new BindingSource(components);
-            chartControl1 = new DevExpress.XtraCharts.ChartControl();
-            ((ISupportInitialize)bindingSource1).BeginInit();
-            ((ISupportInitialize)chartControl1).BeginInit();
-            ((ISupportInitialize)series1).BeginInit();
-            ((ISupportInitialize)doughnutSeriesLabel1).BeginInit();
-            ((ISupportInitialize)doughnutSeriesView1).BeginInit();
-            SuspendLayout();
-            // 
-            // bindingSource1
-            // 
-            bindingSource1.DataSource = typeof(HydroCatalogLossScaleViewModel);
-            // 
-            // chartControl1
-            // 
-            chartControl1.Dock = DockStyle.Fill;
-            chartControl1.Legend.LegendID = -1;
-            chartControl1.Legend.Visibility = DevExpress.Utils.DefaultBoolean.True;
-            chartControl1.Location = new Point(0, 0);
-            chartControl1.Name = "chartControl1";
-            series1.ArgumentDataMember = "CatalogName";
-            series1.DataSource = bindingSource1;
-            doughnutSeriesLabel1.TextPattern = "{A}:{VP:P2}";
-            series1.Label = doughnutSeriesLabel1;
-            series1.Name = "Series 1";
-            series1.SeriesID = 1;
-            series1.ValueDataMembersSerializable = "Loss";
-            doughnutSeriesView1.TotalLabel.TextPattern = "鎬绘崯澶�: {TV:#.##}kW";
-            doughnutSeriesView1.TotalLabel.Visible = true;
-            series1.View = doughnutSeriesView1;
-            chartControl1.SeriesSerializable = new DevExpress.XtraCharts.Series[]
-    {
-    series1
-    };
-            chartControl1.Size = new Size(884, 602);
-            chartControl1.TabIndex = 0;
-            // 
-            // HydroCatalogLossScaleChartCtrl
-            // 
-            AutoScaleDimensions = new SizeF(7F, 14F);
-            AutoScaleMode = AutoScaleMode.Font;
-            Controls.Add(chartControl1);
-            Name = "HydroCatalogLossScaleChartCtrl";
-            Size = new Size(884, 602);
-            ((ISupportInitialize)bindingSource1).EndInit();
-            ((ISupportInitialize)doughnutSeriesLabel1).EndInit();
-            ((ISupportInitialize)doughnutSeriesView1).EndInit();
-            ((ISupportInitialize)series1).EndInit();
-            ((ISupportInitialize)chartControl1).EndInit();
-            ResumeLayout(false);
-        }
-
-        #endregion
-
-        private DevExpress.XtraCharts.ChartControl chartControl1;
-        private BindingSource bindingSource1;
-    }
-}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/02-scale/01-catalog/HydroCatalogLossScaleChartCtrl.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/02-scale/01-catalog/HydroCatalogLossScaleChartCtrl.cs
deleted file mode 100644
index f5019c2..0000000
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/02-scale/01-catalog/HydroCatalogLossScaleChartCtrl.cs
+++ /dev/null
@@ -1,51 +0,0 @@
-锘縩amespace Yw.WinFrmUI
-{
-    public partial class HydroCatalogLossScaleChartCtrl : DevExpress.XtraEditors.XtraUserControl
-    {
-        public HydroCatalogLossScaleChartCtrl()
-        {
-            InitializeComponent();
-        }
-
-        /// <summary>
-        /// 杈规鍙鎬�
-        /// </summary>
-        public bool BorderVisible
-        {
-            get
-            {
-                return this.chartControl1.BorderOptions.Visibility != DevExpress.Utils.DefaultBoolean.False;
-            }
-            set
-            {
-                this.chartControl1.BorderOptions.Visibility = value ? DevExpress.Utils.DefaultBoolean.Default : DevExpress.Utils.DefaultBoolean.False;
-            }
-        }
-
-        /// <summary>
-        /// 缁戝畾鏁版嵁
-        /// </summary>
-        public void SetBindingData(Yw.Model.HydroModelInfo hydroInfo, HydroCalcuResult calcuResult, List<Yw.EPAnet.EnergyPoint> allEnergyList)
-        {
-            var allCatalogLossList = hydroInfo.GetAllCatalogLossScaleList(calcuResult, allEnergyList);
-            SetBindingData(allCatalogLossList);
-        }
-
-        /// <summary>
-        /// 缁戝畾鏁版嵁
-        /// </summary>
-        public void SetBindingData(List<HydroCatalogLossScaleViewModel> allCatalogLossList)
-        {
-            this.bindingSource1.DataSource = allCatalogLossList;
-        }
-
-        /// <summary>
-        /// 瀵煎嚭鍥剧墖
-        /// </summary>
-        public void ExportToImage(string filePath)
-        {
-            this.chartControl1.ExportToImage(filePath, DevExpress.Drawing.DXImageFormat.Png);
-        }
-
-    }
-}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/02-scale/01-catalog/HydroCatalogLossScaleHelper.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/02-scale/01-catalog/HydroCatalogLossScaleHelper.cs
deleted file mode 100644
index a00cbad..0000000
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/02-scale/01-catalog/HydroCatalogLossScaleHelper.cs
+++ /dev/null
@@ -1,179 +0,0 @@
-锘縩amespace Yw.WinFrmUI
-{
-    /// <summary>
-    /// 
-    /// </summary>
-    public static class HydroCatalogLossScaleHelper
-    {
-        /// <summary>
-        /// 鑾峰彇鍒嗙被鎹熷け姣斾緥鍒楄〃
-        /// </summary>
-        public static List<HydroCatalogLossScaleViewModel> GetAllCatalogLossScaleList
-            (
-                this Yw.Model.HydroModelInfo hydroInfo,
-                HydroCalcuResult calcuResult,
-                List<Yw.EPAnet.EnergyPoint> allEnergyList
-            )
-        {
-            if (hydroInfo == null)
-            {
-                return default;
-            }
-            var allCalcuResultVisualDict = calcuResult?.GetVisualDict();
-
-            var allScaleList = new List<HydroCatalogLossScaleViewModel>();
-
-            #region 姘存车
-
-            if (hydroInfo.Pumps != null && hydroInfo.Pumps.Count > 0)
-            {
-                var visualLossScale = new HydroCatalogLossScaleViewModel();
-                visualLossScale.Catalog = Yw.Hydro.ParterCatalog.Pump;
-                visualLossScale.CatalogName = HydroParterCatalogHelper.GetName(Yw.Hydro.ParterCatalog.Pump);
-                foreach (var pump in hydroInfo.Pumps)
-                {
-                    var calcuPumpResult = allCalcuResultVisualDict?.GetValue(pump.Code) as HydroCalcuPumpResult;
-                    if (calcuPumpResult != null)
-                    {
-                        if (calcuPumpResult.CalcuP.HasValue && calcuPumpResult.CalcuE.HasValue)
-                        {
-                            visualLossScale.Loss += calcuPumpResult.CalcuP.Value * 1000 * (1 - calcuPumpResult.CalcuE.Value / 100);
-                        }
-                    }
-                }
-                allScaleList.Add(visualLossScale);
-            }
-
-            #endregion
-
-
-            if (allEnergyList != null && allEnergyList.Count > 0)
-            {
-
-                #region 绠¢亾
-
-                if (hydroInfo.Pipes != null && hydroInfo.Pipes.Count > 0)
-                {
-                    var allVisualIds = hydroInfo.Pipes.Select(x => x.Code).Distinct().ToList();
-                    var allVisualEnergyList = allEnergyList.Where(x => allVisualIds.Contains(x.Id)).ToList();
-                    var visualLossScale = new HydroCatalogLossScaleViewModel();
-                    visualLossScale.Catalog = Yw.Hydro.ParterCatalog.Pipe;
-                    visualLossScale.CatalogName = HydroParterCatalogHelper.GetName(Yw.Hydro.ParterCatalog.Pipe);
-                    visualLossScale.Loss = allVisualEnergyList.Count > 0 ? allVisualEnergyList.Sum(x => x.EnergyPower) : 0;
-                    allScaleList.Add(visualLossScale);
-                }
-
-                #endregion
-
-                #region 杩囨浮浠�
-
-                if (hydroInfo.Translations != null && hydroInfo.Translations.Count > 0)
-                {
-                    var allVisualIds = hydroInfo.Translations.Select(x => x.Code).Distinct().ToList();
-                    var allVisualEnergyList = allEnergyList.Where(x => allVisualIds.Contains(x.Id)).ToList();
-                    var visualLossScale = new HydroCatalogLossScaleViewModel();
-                    visualLossScale.Catalog = Yw.Hydro.ParterCatalog.Translation;
-                    visualLossScale.CatalogName = HydroParterCatalogHelper.GetName(Yw.Hydro.ParterCatalog.Translation);
-                    visualLossScale.Loss = allVisualEnergyList.Count > 0 ? allVisualEnergyList.Sum(x => x.EnergyPower) : 0;
-                    allScaleList.Add(visualLossScale);
-                }
-
-                #endregion
-
-                #region 闃�闂�
-
-                if (hydroInfo.Valves != null && hydroInfo.Valves.Count > 0)
-                {
-                    var allVisualIds = hydroInfo.Valves.Select(x => x.Code).Distinct().ToList();
-                    var allVisualEnergyList = allEnergyList.Where(x => allVisualIds.Contains(x.Id)).ToList();
-                    var visualLossScale = new HydroCatalogLossScaleViewModel();
-                    visualLossScale.Catalog = Yw.Hydro.ParterCatalog.Valve;
-                    visualLossScale.CatalogName = HydroParterCatalogHelper.GetName(Yw.Hydro.ParterCatalog.Valve);
-                    visualLossScale.Loss = allVisualEnergyList.Count > 0 ? allVisualEnergyList.Sum(x => x.EnergyPower) : 0;
-                    allScaleList.Add(visualLossScale);
-                }
-
-                #endregion
-
-                #region 寮ご
-
-                if (hydroInfo.Elbows != null && hydroInfo.Elbows.Count > 0)
-                {
-                    var allVisualIds = hydroInfo.Elbows.Select(x => x.Code).Distinct().ToList();
-                    var allVisualEnergyList = allEnergyList.Where(x => allVisualIds.Contains(x.Id)).ToList();
-                    var visualLossScale = new HydroCatalogLossScaleViewModel();
-                    visualLossScale.Catalog = Yw.Hydro.ParterCatalog.Elbow;
-                    visualLossScale.CatalogName = HydroParterCatalogHelper.GetName(Yw.Hydro.ParterCatalog.Elbow);
-                    visualLossScale.Loss = allVisualEnergyList.Count > 0 ? allVisualEnergyList.Sum(x => x.EnergyPower) : 0;
-                    allScaleList.Add(visualLossScale);
-                }
-
-                #endregion
-
-                #region 涓夐��
-
-                if (hydroInfo.Threelinks != null && hydroInfo.Threelinks.Count > 0)
-                {
-                    var allVisualIds = hydroInfo.Threelinks.Select(x => x.Code).Distinct().ToList();
-                    var allVisualEnergyList = allEnergyList.Where(x => allVisualIds.Contains(x.Id)).ToList();
-                    var visualLossScale = new HydroCatalogLossScaleViewModel();
-                    visualLossScale.Catalog = Yw.Hydro.ParterCatalog.Threelink;
-                    visualLossScale.CatalogName = HydroParterCatalogHelper.GetName(Yw.Hydro.ParterCatalog.Threelink);
-                    visualLossScale.Loss = allVisualEnergyList.Count > 0 ? allVisualEnergyList.Sum(x => x.EnergyPower) : 0;
-                    allScaleList.Add(visualLossScale);
-                }
-                #endregion
-
-                #region 鍥涢��
-
-                if (hydroInfo.Fourlinks != null && hydroInfo.Fourlinks.Count > 0)
-                {
-                    var allVisualIds = hydroInfo.Fourlinks.Select(x => x.Code).Distinct().ToList();
-                    var allVisualEnergyList = allEnergyList.Where(x => allVisualIds.Contains(x.Id)).ToList();
-                    var visualLossScale = new HydroCatalogLossScaleViewModel();
-                    visualLossScale.Catalog = Yw.Hydro.ParterCatalog.Fourlink;
-                    visualLossScale.CatalogName = HydroParterCatalogHelper.GetName(Yw.Hydro.ParterCatalog.Fourlink);
-                    visualLossScale.Loss = allVisualEnergyList.Count > 0 ? allVisualEnergyList.Sum(x => x.EnergyPower) : 0;
-                    allScaleList.Add(visualLossScale);
-                }
-
-                #endregion
-
-                #region 鎹㈢儹鍣�
-
-                if (hydroInfo.Exchangers != null && hydroInfo.Exchangers.Count > 0)
-                {
-                    var allVisualIds = hydroInfo.Exchangers.Select(x => x.Code).Distinct().ToList();
-                    var allVisualEnergyList = allEnergyList.Where(x => allVisualIds.Contains(x.Id)).ToList();
-                    var visualLossScale = new HydroCatalogLossScaleViewModel();
-                    visualLossScale.Catalog = Yw.Hydro.ParterCatalog.Exchanger;
-                    visualLossScale.CatalogName = HydroParterCatalogHelper.GetName(Yw.Hydro.ParterCatalog.Exchanger);
-                    visualLossScale.Loss = allVisualEnergyList.Count > 0 ? allVisualEnergyList.Sum(x => x.EnergyPower) : 0;
-                    allScaleList.Add(visualLossScale);
-                }
-
-                #endregion
-
-                #region 鍘嬬缉鏈�
-
-                if (hydroInfo.Compressors != null && hydroInfo.Compressors.Count > 0)
-                {
-                    var allVisualIds = hydroInfo.Compressors.Select(x => x.Code).Distinct().ToList();
-                    var allVisualEnergyList = allEnergyList.Where(x => allVisualIds.Contains(x.Id)).ToList();
-                    var visualLossScale = new HydroCatalogLossScaleViewModel();
-                    visualLossScale.Catalog = Yw.Hydro.ParterCatalog.Compressor;
-                    visualLossScale.CatalogName = HydroParterCatalogHelper.GetName(Yw.Hydro.ParterCatalog.Compressor);
-                    visualLossScale.Loss = allVisualEnergyList.Count > 0 ? allVisualEnergyList.Sum(x => x.EnergyPower) : 0;
-                    allScaleList.Add(visualLossScale);
-                }
-
-                #endregion
-
-            }
-            allScaleList?.ForEach(x => x.Loss = Math.Round(x.Loss / 1000f, 1));
-            return allScaleList;
-        }
-
-
-    }
-}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/02-scale/01-catalog/HydroCatalogLossScaleViewModel.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/02-scale/01-catalog/HydroCatalogLossScaleViewModel.cs
deleted file mode 100644
index 897c5ab..0000000
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/02-scale/01-catalog/HydroCatalogLossScaleViewModel.cs
+++ /dev/null
@@ -1,24 +0,0 @@
-锘縩amespace Yw.WinFrmUI
-{
-    /// <summary>
-    /// 
-    /// </summary>
-    public class HydroCatalogLossScaleViewModel
-    {
-        /// <summary>
-        /// 鍒嗙被
-        /// </summary>
-        public string Catalog { get; set; }
-
-        /// <summary>
-        /// 鍒嗙被鍚嶇О
-        /// </summary>
-        public string CatalogName { get; set; }
-
-        /// <summary>
-        /// 鎹熷け
-        /// </summary>
-        public double Loss { get; set; }
-
-    }
-}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/02-scale/02-input/HydroInputEnergyScaleChartCtrl.Designer.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/02-scale/02-input/HydroInputEnergyScaleChartCtrl.Designer.cs
deleted file mode 100644
index 9bd374b..0000000
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/02-scale/02-input/HydroInputEnergyScaleChartCtrl.Designer.cs
+++ /dev/null
@@ -1,95 +0,0 @@
-锘縩amespace Yw.WinFrmUI
-{
-    partial class HydroInputEnergyScaleChartCtrl
-    {
-        /// <summary> 
-        /// Required designer variable.
-        /// </summary>
-        private System.ComponentModel.IContainer components = null;
-
-        /// <summary> 
-        /// Clean up any resources being used.
-        /// </summary>
-        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
-        protected override void Dispose(bool disposing)
-        {
-            if (disposing && (components != null))
-            {
-                components.Dispose();
-            }
-            base.Dispose(disposing);
-        }
-
-        #region Component Designer generated code
-
-        /// <summary> 
-        /// Required method for Designer support - do not modify 
-        /// the contents of this method with the code editor.
-        /// </summary>
-        private void InitializeComponent()
-        {
-            components = new Container();
-            DevExpress.XtraCharts.Series series1 = new DevExpress.XtraCharts.Series();
-            DevExpress.XtraCharts.DoughnutSeriesLabel doughnutSeriesLabel1 = new DevExpress.XtraCharts.DoughnutSeriesLabel();
-            DevExpress.XtraCharts.DoughnutSeriesView doughnutSeriesView1 = new DevExpress.XtraCharts.DoughnutSeriesView();
-            bindingSource1 = new BindingSource(components);
-            chartControl1 = new DevExpress.XtraCharts.ChartControl();
-            ((ISupportInitialize)bindingSource1).BeginInit();
-            ((ISupportInitialize)chartControl1).BeginInit();
-            ((ISupportInitialize)series1).BeginInit();
-            ((ISupportInitialize)doughnutSeriesLabel1).BeginInit();
-            ((ISupportInitialize)doughnutSeriesView1).BeginInit();
-            SuspendLayout();
-            // 
-            // bindingSource1
-            // 
-            bindingSource1.DataSource = typeof(HydroInputEnergyScaleViewModel);
-            // 
-            // chartControl1
-            // 
-            chartControl1.Dock = DockStyle.Fill;
-            chartControl1.Legend.AlignmentHorizontal = DevExpress.XtraCharts.LegendAlignmentHorizontal.Center;
-            chartControl1.Legend.AlignmentVertical = DevExpress.XtraCharts.LegendAlignmentVertical.BottomOutside;
-            chartControl1.Legend.Direction = DevExpress.XtraCharts.LegendDirection.LeftToRight;
-            chartControl1.Legend.LegendID = -1;
-            chartControl1.Legend.Visibility = DevExpress.Utils.DefaultBoolean.True;
-            chartControl1.Location = new Point(0, 0);
-            chartControl1.Name = "chartControl1";
-            series1.ArgumentDataMember = "EnergyName";
-            series1.DataSource = bindingSource1;
-            doughnutSeriesLabel1.TextPattern = "{A}:{VP:P2}";
-            series1.Label = doughnutSeriesLabel1;
-            series1.Name = "Series 1";
-            series1.SeriesID = 1;
-            series1.ValueDataMembersSerializable = "EnergyValue";
-            doughnutSeriesView1.TotalLabel.TextPattern = "鎬昏兘閲�: {TV:#.##}kW";
-            doughnutSeriesView1.TotalLabel.Visible = true;
-            series1.View = doughnutSeriesView1;
-            chartControl1.SeriesSerializable = new DevExpress.XtraCharts.Series[]
-    {
-    series1
-    };
-            chartControl1.Size = new Size(884, 602);
-            chartControl1.TabIndex = 0;
-            // 
-            // HydroInputEnergyScaleChartCtrl
-            // 
-            AutoScaleDimensions = new SizeF(7F, 14F);
-            AutoScaleMode = AutoScaleMode.Font;
-            Controls.Add(chartControl1);
-            Name = "HydroInputEnergyScaleChartCtrl";
-            Size = new Size(884, 602);
-            ((ISupportInitialize)bindingSource1).EndInit();
-            ((ISupportInitialize)doughnutSeriesLabel1).EndInit();
-            ((ISupportInitialize)doughnutSeriesView1).EndInit();
-            ((ISupportInitialize)series1).EndInit();
-            ((ISupportInitialize)chartControl1).EndInit();
-            ResumeLayout(false);
-        }
-
-        #endregion
-
-        private DevExpress.XtraCharts.ChartControl chartControl1;
-        private BindingSource bindingSource1;
-    }
-}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/02-scale/02-input/HydroInputEnergyScaleChartCtrl.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/02-scale/02-input/HydroInputEnergyScaleChartCtrl.cs
deleted file mode 100644
index 4afe800..0000000
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/02-scale/02-input/HydroInputEnergyScaleChartCtrl.cs
+++ /dev/null
@@ -1,51 +0,0 @@
-锘縩amespace Yw.WinFrmUI
-{
-    public partial class HydroInputEnergyScaleChartCtrl : DevExpress.XtraEditors.XtraUserControl
-    {
-        public HydroInputEnergyScaleChartCtrl()
-        {
-            InitializeComponent();
-        }
-
-        /// <summary>
-        /// 杈规鍙鎬�
-        /// </summary>
-        public bool BorderVisible
-        {
-            get
-            {
-                return this.chartControl1.BorderOptions.Visibility != DevExpress.Utils.DefaultBoolean.False;
-            }
-            set
-            {
-                this.chartControl1.BorderOptions.Visibility = value ? DevExpress.Utils.DefaultBoolean.Default : DevExpress.Utils.DefaultBoolean.False;
-            }
-        }
-
-        /// <summary>
-        /// 缁戝畾鏁版嵁
-        /// </summary>
-        public void SetBindingData(Yw.Model.HydroModelInfo hydroInfo, HydroCalcuResult calcuResult, List<Yw.EPAnet.EnergyPoint> allEnergyList)
-        {
-            var allEnergyScaleList = hydroInfo.GetAllInputEnergyScaleList(calcuResult, allEnergyList);
-            SetBindingData(allEnergyScaleList);
-        }
-
-        /// <summary>
-        /// 缁戝畾鏁版嵁
-        /// </summary>
-        public void SetBindingData(List<HydroInputEnergyScaleViewModel> allEnergyScaleList)
-        {
-            this.bindingSource1.DataSource = allEnergyScaleList;
-        }
-
-        /// <summary>
-        /// 瀵煎嚭鍥剧墖
-        /// </summary>
-        public void ExportToImage(string filePath)
-        {
-            this.chartControl1.ExportToImage(filePath, DevExpress.Drawing.DXImageFormat.Png);
-        }
-
-    }
-}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/02-scale/02-input/HydroInputEnergyScaleChartCtrl.resx b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/02-scale/02-input/HydroInputEnergyScaleChartCtrl.resx
deleted file mode 100644
index e3e911f..0000000
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/02-scale/02-input/HydroInputEnergyScaleChartCtrl.resx
+++ /dev/null
@@ -1,123 +0,0 @@
-锘�<?xml version="1.0" encoding="utf-8"?>
-<root>
-  <!--
-    Microsoft ResX Schema 
-
-    Version 2.0
-
-    The primary goals of this format is to allow a simple XML format
-    that is mostly human readable. The generation and parsing of the
-    various data types are done through the TypeConverter classes
-    associated with the data types.
-
-    Example:
-
-    ... ado.net/XML headers & schema ...
-    <resheader name="resmimetype">text/microsoft-resx</resheader>
-    <resheader name="version">2.0</resheader>
-    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
-    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
-    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
-    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
-    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
-        <value>[base64 mime encoded serialized .NET Framework object]</value>
-    </data>
-    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
-        <comment>This is a comment</comment>
-    </data>
-
-    There are any number of "resheader" rows that contain simple
-    name/value pairs.
-
-    Each data row contains a name, and value. The row also contains a
-    type or mimetype. Type corresponds to a .NET class that support
-    text/value conversion through the TypeConverter architecture.
-    Classes that don't support this are serialized and stored with the
-    mimetype set.
-
-    The mimetype is used for serialized objects, and tells the
-    ResXResourceReader how to depersist the object. This is currently not
-    extensible. For a given mimetype the value must be set accordingly:
-
-    Note - application/x-microsoft.net.object.binary.base64 is the format
-    that the ResXResourceWriter will generate, however the reader can
-    read any of the formats listed below.
-
-    mimetype: application/x-microsoft.net.object.binary.base64
-    value   : The object must be serialized with
-            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
-            : and then encoded with base64 encoding.
-    
-    mimetype: application/x-microsoft.net.object.soap.base64
-    value   : The object must be serialized with
-            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
-            : and then encoded with base64 encoding.
-
-    mimetype: application/x-microsoft.net.object.bytearray.base64
-    value   : The object must be serialized into a byte array
-            : using a System.ComponentModel.TypeConverter
-            : and then encoded with base64 encoding.
-    -->
-  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
-    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
-    <xsd:element name="root" msdata:IsDataSet="true">
-      <xsd:complexType>
-        <xsd:choice maxOccurs="unbounded">
-          <xsd:element name="metadata">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" />
-              </xsd:sequence>
-              <xsd:attribute name="name" use="required" type="xsd:string" />
-              <xsd:attribute name="type" type="xsd:string" />
-              <xsd:attribute name="mimetype" type="xsd:string" />
-              <xsd:attribute ref="xml:space" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="assembly">
-            <xsd:complexType>
-              <xsd:attribute name="alias" type="xsd:string" />
-              <xsd:attribute name="name" type="xsd:string" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="data">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
-              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
-              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
-              <xsd:attribute ref="xml:space" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="resheader">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" />
-            </xsd:complexType>
-          </xsd:element>
-        </xsd:choice>
-      </xsd:complexType>
-    </xsd:element>
-  </xsd:schema>
-  <resheader name="resmimetype">
-    <value>text/microsoft-resx</value>
-  </resheader>
-  <resheader name="version">
-    <value>2.0</value>
-  </resheader>
-  <resheader name="reader">
-    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <resheader name="writer">
-    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <metadata name="bindingSource1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>17, 17</value>
-  </metadata>
-</root>
\ No newline at end of file
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/02-scale/02-input/HydroInputEnergyScaleHelper.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/02-scale/02-input/HydroInputEnergyScaleHelper.cs
deleted file mode 100644
index b4aeb00..0000000
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/02-scale/02-input/HydroInputEnergyScaleHelper.cs
+++ /dev/null
@@ -1,58 +0,0 @@
-锘縩amespace Yw.WinFrmUI
-{
-    /// <summary>
-    /// 
-    /// </summary>
-    public static class HydroInputEnergyScaleHelper
-    {
-        /// <summary>
-        /// 鑾峰彇鍒嗙被鎹熷け姣斾緥鍒楄〃
-        /// </summary>
-        public static List<HydroInputEnergyScaleViewModel> GetAllInputEnergyScaleList
-            (
-                this Yw.Model.HydroModelInfo hydroInfo,
-                HydroCalcuResult calcuResult,
-                List<Yw.EPAnet.EnergyPoint> allEnergyList
-            )
-        {
-            if (hydroInfo == null)
-            {
-                return default;
-            }
-            var allScaleList = new List<HydroInputEnergyScaleViewModel>();
-            if (allEnergyList != null && allEnergyList.Count > 0)
-            {
-                var allInputEnergyList = allEnergyList.Where(x => x.EnergyType == EPAnet.eEnergyType.Input).ToList();
-                var inputEnergyScale = new HydroInputEnergyScaleViewModel()
-                {
-                    EnergyName = "鍒濆鍔胯兘",
-                    EnergyValue = allInputEnergyList.Count > 0 ? allInputEnergyList.Sum(x => x.EnergyPower) : 0
-                };
-                allScaleList.Add(inputEnergyScale);
-            }
-            if (hydroInfo.Pumps != null && hydroInfo.Pumps.Count > 0)
-            {
-                var allCalcuResultVisualDict = calcuResult?.GetVisualDict();
-                var inputEnergyScale = new HydroInputEnergyScaleViewModel() { EnergyName = "姘存车鎻愬崌" };
-                foreach (var pump in hydroInfo.Pumps)
-                {
-                    var calcuPumpResult = allCalcuResultVisualDict?.GetValue(pump.Code) as HydroCalcuPumpResult;
-                    if (calcuPumpResult != null)
-                    {
-                        if (calcuPumpResult.CalcuP.HasValue)
-                        {
-                            inputEnergyScale.EnergyValue += calcuPumpResult.CalcuP.Value * 1000;
-                        }
-                    }
-                }
-                allScaleList.Add(inputEnergyScale);
-            }
-
-            allScaleList?.ForEach(x => x.EnergyValue = Math.Round(x.EnergyValue / 1000f, 1));
-
-            return allScaleList;
-        }
-
-
-    }
-}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/02-scale/02-input/HydroInputEnergyScaleViewModel.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/02-scale/02-input/HydroInputEnergyScaleViewModel.cs
deleted file mode 100644
index ed0e317..0000000
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/02-scale/02-input/HydroInputEnergyScaleViewModel.cs
+++ /dev/null
@@ -1,19 +0,0 @@
-锘縩amespace Yw.WinFrmUI
-{
-    /// <summary>
-    /// 
-    /// </summary>
-    public class HydroInputEnergyScaleViewModel
-    {
-        /// <summary>
-        /// 鑳介噺鍚嶇О
-        /// </summary>
-        public string EnergyName { get; set; }
-
-        /// <summary>
-        /// 鑳介噺锛堢劍鑰矹=w*s锛�
-        /// </summary>
-        public double EnergyValue { get; set; }
-
-    }
-}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/03-statistics/HydroMultiWorkingLossStatisticsDlg.Designer.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/03-statistics/HydroMultiWorkingLossStatisticsDlg.Designer.cs
deleted file mode 100644
index 6db2d0b..0000000
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/03-statistics/HydroMultiWorkingLossStatisticsDlg.Designer.cs
+++ /dev/null
@@ -1,189 +0,0 @@
-锘縩amespace Yw.WinFrmUI
-{
-    partial class HydroMultiWorkingLossStatisticsDlg
-    {
-        /// <summary>
-        /// Required designer variable.
-        /// </summary>
-        private System.ComponentModel.IContainer components = null;
-
-        /// <summary>
-        /// Clean up any resources being used.
-        /// </summary>
-        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
-        protected override void Dispose(bool disposing)
-        {
-            if (disposing && (components != null))
-            {
-                components.Dispose();
-            }
-            base.Dispose(disposing);
-        }
-
-        #region Windows Form Designer generated code
-
-        /// <summary>
-        /// Required method for Designer support - do not modify
-        /// the contents of this method with the code editor.
-        /// </summary>
-        private void InitializeComponent()
-        {
-            ribbon = new DevExpress.XtraBars.Ribbon.RibbonControl();
-            ribbonPage1 = new DevExpress.XtraBars.Ribbon.RibbonPage();
-            ribbonPageGroup1 = new DevExpress.XtraBars.Ribbon.RibbonPageGroup();
-            layoutControl1 = new DevExpress.XtraLayout.LayoutControl();
-            hydroSingleWorkingLossStatisticsCtrl1 = new HydroSingleWorkingLossStatisticsCtrl();
-            hydroWorkingListViewCtrl1 = new HydroWorkingListViewCtrl();
-            Root = new DevExpress.XtraLayout.LayoutControlGroup();
-            groupForWorkingList = new DevExpress.XtraLayout.LayoutControlGroup();
-            layoutControlItem1 = new DevExpress.XtraLayout.LayoutControlItem();
-            splitter = new DevExpress.XtraLayout.SplitterItem();
-            layoutControlItem2 = new DevExpress.XtraLayout.LayoutControlItem();
-            ((ISupportInitialize)ribbon).BeginInit();
-            ((ISupportInitialize)layoutControl1).BeginInit();
-            layoutControl1.SuspendLayout();
-            ((ISupportInitialize)Root).BeginInit();
-            ((ISupportInitialize)groupForWorkingList).BeginInit();
-            ((ISupportInitialize)layoutControlItem1).BeginInit();
-            ((ISupportInitialize)splitter).BeginInit();
-            ((ISupportInitialize)layoutControlItem2).BeginInit();
-            SuspendLayout();
-            // 
-            // ribbon
-            // 
-            ribbon.ExpandCollapseItem.Id = 0;
-            ribbon.Items.AddRange(new DevExpress.XtraBars.BarItem[] { ribbon.ExpandCollapseItem });
-            ribbon.Location = new Point(0, 0);
-            ribbon.MaxItemId = 1;
-            ribbon.Name = "ribbon";
-            ribbon.Pages.AddRange(new DevExpress.XtraBars.Ribbon.RibbonPage[] { ribbonPage1 });
-            ribbon.RibbonCaptionAlignment = DevExpress.XtraBars.Ribbon.RibbonCaptionAlignment.Left;
-            ribbon.ShowDisplayOptionsMenuButton = DevExpress.Utils.DefaultBoolean.False;
-            ribbon.Size = new Size(994, 32);
-            // 
-            // ribbonPage1
-            // 
-            ribbonPage1.Groups.AddRange(new DevExpress.XtraBars.Ribbon.RibbonPageGroup[] { ribbonPageGroup1 });
-            ribbonPage1.Name = "ribbonPage1";
-            ribbonPage1.Text = "ribbonPage1";
-            // 
-            // ribbonPageGroup1
-            // 
-            ribbonPageGroup1.Name = "ribbonPageGroup1";
-            ribbonPageGroup1.Text = "ribbonPageGroup1";
-            // 
-            // layoutControl1
-            // 
-            layoutControl1.Controls.Add(hydroSingleWorkingLossStatisticsCtrl1);
-            layoutControl1.Controls.Add(hydroWorkingListViewCtrl1);
-            layoutControl1.Dock = DockStyle.Fill;
-            layoutControl1.Location = new Point(0, 32);
-            layoutControl1.Name = "layoutControl1";
-            layoutControl1.OptionsCustomizationForm.DesignTimeCustomizationFormPositionAndSize = new Rectangle(719, 346, 650, 400);
-            layoutControl1.Root = Root;
-            layoutControl1.Size = new Size(994, 573);
-            layoutControl1.TabIndex = 1;
-            layoutControl1.Text = "layoutControl1";
-            // 
-            // hydroSingleWorkingLossStatisticsCtrl1
-            // 
-            hydroSingleWorkingLossStatisticsCtrl1.Location = new Point(177, 2);
-            hydroSingleWorkingLossStatisticsCtrl1.Name = "hydroSingleWorkingLossStatisticsCtrl1";
-            hydroSingleWorkingLossStatisticsCtrl1.Size = new Size(815, 569);
-            hydroSingleWorkingLossStatisticsCtrl1.TabIndex = 2;
-            // 
-            // hydroWorkingListViewCtrl1
-            // 
-            hydroWorkingListViewCtrl1.BorderVisible = false;
-            hydroWorkingListViewCtrl1.Location = new Point(3, 24);
-            hydroWorkingListViewCtrl1.Name = "hydroWorkingListViewCtrl1";
-            hydroWorkingListViewCtrl1.Size = new Size(159, 546);
-            hydroWorkingListViewCtrl1.TabIndex = 0;
-            // 
-            // Root
-            // 
-            Root.EnableIndentsWithoutBorders = DevExpress.Utils.DefaultBoolean.True;
-            Root.GroupBordersVisible = false;
-            Root.Items.AddRange(new DevExpress.XtraLayout.BaseLayoutItem[] { groupForWorkingList, splitter, layoutControlItem2 });
-            Root.Name = "Root";
-            Root.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
-            Root.Size = new Size(994, 573);
-            Root.TextVisible = false;
-            // 
-            // groupForWorkingList
-            // 
-            groupForWorkingList.Items.AddRange(new DevExpress.XtraLayout.BaseLayoutItem[] { layoutControlItem1 });
-            groupForWorkingList.Location = new Point(0, 0);
-            groupForWorkingList.Name = "groupForWorkingList";
-            groupForWorkingList.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
-            groupForWorkingList.Size = new Size(165, 573);
-            groupForWorkingList.Text = "宸ュ喌鍒楄〃";
-            // 
-            // layoutControlItem1
-            // 
-            layoutControlItem1.Control = hydroWorkingListViewCtrl1;
-            layoutControlItem1.Location = new Point(0, 0);
-            layoutControlItem1.Name = "layoutControlItem1";
-            layoutControlItem1.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
-            layoutControlItem1.Size = new Size(159, 546);
-            layoutControlItem1.TextSize = new Size(0, 0);
-            layoutControlItem1.TextVisible = false;
-            // 
-            // splitter
-            // 
-            splitter.AllowHotTrack = true;
-            splitter.Location = new Point(165, 0);
-            splitter.Name = "splitter";
-            splitter.Size = new Size(10, 573);
-            // 
-            // layoutControlItem2
-            // 
-            layoutControlItem2.Control = hydroSingleWorkingLossStatisticsCtrl1;
-            layoutControlItem2.Location = new Point(175, 0);
-            layoutControlItem2.Name = "layoutControlItem2";
-            layoutControlItem2.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
-            layoutControlItem2.Size = new Size(819, 573);
-            layoutControlItem2.Spacing = new DevExpress.XtraLayout.Utils.Padding(2, 2, 2, 2);
-            layoutControlItem2.TextSize = new Size(0, 0);
-            layoutControlItem2.TextVisible = false;
-            // 
-            // HydroMultiWorkingLossStatisticsDlg
-            // 
-            AutoScaleDimensions = new SizeF(7F, 14F);
-            AutoScaleMode = AutoScaleMode.Font;
-            ClientSize = new Size(994, 605);
-            Controls.Add(layoutControl1);
-            Controls.Add(ribbon);
-            FormBorderStyle = FormBorderStyle.SizableToolWindow;
-            Name = "HydroMultiWorkingLossStatisticsDlg";
-            Ribbon = ribbon;
-            RibbonVisibility = DevExpress.XtraBars.Ribbon.RibbonVisibility.Hidden;
-            StartPosition = FormStartPosition.CenterParent;
-            Text = "鎹熷け缁熻";
-            ((ISupportInitialize)ribbon).EndInit();
-            ((ISupportInitialize)layoutControl1).EndInit();
-            layoutControl1.ResumeLayout(false);
-            ((ISupportInitialize)Root).EndInit();
-            ((ISupportInitialize)groupForWorkingList).EndInit();
-            ((ISupportInitialize)layoutControlItem1).EndInit();
-            ((ISupportInitialize)splitter).EndInit();
-            ((ISupportInitialize)layoutControlItem2).EndInit();
-            ResumeLayout(false);
-            PerformLayout();
-        }
-
-        #endregion
-
-        private DevExpress.XtraBars.Ribbon.RibbonControl ribbon;
-        private DevExpress.XtraBars.Ribbon.RibbonPage ribbonPage1;
-        private DevExpress.XtraBars.Ribbon.RibbonPageGroup ribbonPageGroup1;
-        private DevExpress.XtraLayout.LayoutControl layoutControl1;
-        private HydroSingleWorkingLossStatisticsCtrl hydroSingleWorkingLossStatisticsCtrl1;
-        private HydroWorkingListViewCtrl hydroWorkingListViewCtrl1;
-        private DevExpress.XtraLayout.LayoutControlGroup Root;
-        private DevExpress.XtraLayout.LayoutControlGroup groupForWorkingList;
-        private DevExpress.XtraLayout.LayoutControlItem layoutControlItem1;
-        private DevExpress.XtraLayout.SplitterItem splitter;
-        private DevExpress.XtraLayout.LayoutControlItem layoutControlItem2;
-    }
-}
\ No newline at end of file
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/03-statistics/HydroMultiWorkingLossStatisticsDlg.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/03-statistics/HydroMultiWorkingLossStatisticsDlg.cs
deleted file mode 100644
index 1823557..0000000
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/03-statistics/HydroMultiWorkingLossStatisticsDlg.cs
+++ /dev/null
@@ -1,68 +0,0 @@
-锘縰sing Mapster;
-
-namespace Yw.WinFrmUI
-{
-    public partial class HydroMultiWorkingLossStatisticsDlg : DevExpress.XtraBars.Ribbon.RibbonForm
-    {
-        public HydroMultiWorkingLossStatisticsDlg()
-        {
-            InitializeComponent();
-            this.IconOptions.Icon = Yw.WinFrmUI.GlobalParas.AppIcon;
-            this.layoutControl1.SetupLayoutControl();
-            this.hydroWorkingListViewCtrl1.SelectedChangedEvent += HydroWorkingListViewCtrl1_SelectedChangedEvent;
-        }
-
-
-        private Yw.Model.HydroModelInfo _hydroInfo = null;
-
-        /// <summary>
-        /// 缁戝畾鏁版嵁
-        /// </summary>
-        public void SetBindingData(Yw.Model.HydroModelInfo hydroInfo, List<HydroWorkingVmo> allWorkingList)
-        {
-            if (hydroInfo == null)
-            {
-                return;
-            }
-            if (allWorkingList == null || allWorkingList.Count < 1)
-            {
-                return;
-            }
-            _hydroInfo = hydroInfo;
-            this.hydroWorkingListViewCtrl1.SetBindingData(allWorkingList);
-            if (allWorkingList.Count < 2)
-            {
-                var working = allWorkingList[0];
-                this.Text = $"鎹熷け缁熻({working.Name})";
-                this.groupForWorkingList.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Never;
-                this.splitter.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Never;
-                LoadWorkingLossStatistics(working);
-            }
-        }
-
-        //宸ュ喌閫夋嫨鏀瑰彉
-        private void HydroWorkingListViewCtrl1_SelectedChangedEvent(HydroWorkingVmo working)
-        {
-            if (working == null)
-            {
-                return;
-            }
-            LoadWorkingLossStatistics(working);
-        }
-
-        //鍔犺浇宸ュ喌缁熻
-        private void LoadWorkingLossStatistics(HydroWorkingVmo working)
-        {
-            if (_hydroInfo == null)
-            {
-                return;
-            }
-            var hydroInfo = _hydroInfo.Adapt<Yw.Model.HydroModelInfo>();
-            hydroInfo.UpdateWorkingInfo(working.WorkingInfo);
-            var calcuResult = hydroInfo.Calcu(Yw.EPAnet.CalcuMode.MinorLoss);
-            this.hydroSingleWorkingLossStatisticsCtrl1.SetBindingData(hydroInfo, calcuResult);
-        }
-
-
-    }
-}
\ No newline at end of file
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/03-statistics/HydroMultiWorkingLossStatisticsDlg.resx b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/03-statistics/HydroMultiWorkingLossStatisticsDlg.resx
deleted file mode 100644
index af32865..0000000
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/03-statistics/HydroMultiWorkingLossStatisticsDlg.resx
+++ /dev/null
@@ -1,120 +0,0 @@
-锘�<?xml version="1.0" encoding="utf-8"?>
-<root>
-  <!--
-    Microsoft ResX Schema 
-
-    Version 2.0
-
-    The primary goals of this format is to allow a simple XML format
-    that is mostly human readable. The generation and parsing of the
-    various data types are done through the TypeConverter classes
-    associated with the data types.
-
-    Example:
-
-    ... ado.net/XML headers & schema ...
-    <resheader name="resmimetype">text/microsoft-resx</resheader>
-    <resheader name="version">2.0</resheader>
-    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
-    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
-    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
-    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
-    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
-        <value>[base64 mime encoded serialized .NET Framework object]</value>
-    </data>
-    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
-        <comment>This is a comment</comment>
-    </data>
-
-    There are any number of "resheader" rows that contain simple
-    name/value pairs.
-
-    Each data row contains a name, and value. The row also contains a
-    type or mimetype. Type corresponds to a .NET class that support
-    text/value conversion through the TypeConverter architecture.
-    Classes that don't support this are serialized and stored with the
-    mimetype set.
-
-    The mimetype is used for serialized objects, and tells the
-    ResXResourceReader how to depersist the object. This is currently not
-    extensible. For a given mimetype the value must be set accordingly:
-
-    Note - application/x-microsoft.net.object.binary.base64 is the format
-    that the ResXResourceWriter will generate, however the reader can
-    read any of the formats listed below.
-
-    mimetype: application/x-microsoft.net.object.binary.base64
-    value   : The object must be serialized with
-            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
-            : and then encoded with base64 encoding.
-    
-    mimetype: application/x-microsoft.net.object.soap.base64
-    value   : The object must be serialized with
-            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
-            : and then encoded with base64 encoding.
-
-    mimetype: application/x-microsoft.net.object.bytearray.base64
-    value   : The object must be serialized into a byte array
-            : using a System.ComponentModel.TypeConverter
-            : and then encoded with base64 encoding.
-    -->
-  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
-    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
-    <xsd:element name="root" msdata:IsDataSet="true">
-      <xsd:complexType>
-        <xsd:choice maxOccurs="unbounded">
-          <xsd:element name="metadata">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" />
-              </xsd:sequence>
-              <xsd:attribute name="name" use="required" type="xsd:string" />
-              <xsd:attribute name="type" type="xsd:string" />
-              <xsd:attribute name="mimetype" type="xsd:string" />
-              <xsd:attribute ref="xml:space" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="assembly">
-            <xsd:complexType>
-              <xsd:attribute name="alias" type="xsd:string" />
-              <xsd:attribute name="name" type="xsd:string" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="data">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
-              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
-              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
-              <xsd:attribute ref="xml:space" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="resheader">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" />
-            </xsd:complexType>
-          </xsd:element>
-        </xsd:choice>
-      </xsd:complexType>
-    </xsd:element>
-  </xsd:schema>
-  <resheader name="resmimetype">
-    <value>text/microsoft-resx</value>
-  </resheader>
-  <resheader name="version">
-    <value>2.0</value>
-  </resheader>
-  <resheader name="reader">
-    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <resheader name="writer">
-    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-</root>
\ No newline at end of file
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/03-statistics/HydroSingleWorkingLossStatisticsCtrl.Designer.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/03-statistics/HydroSingleWorkingLossStatisticsCtrl.Designer.cs
deleted file mode 100644
index f1d68aa..0000000
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/03-statistics/HydroSingleWorkingLossStatisticsCtrl.Designer.cs
+++ /dev/null
@@ -1,200 +0,0 @@
-锘縩amespace Yw.WinFrmUI
-{
-    partial class HydroSingleWorkingLossStatisticsCtrl
-    {
-        /// <summary> 
-        /// Required designer variable.
-        /// </summary>
-        private System.ComponentModel.IContainer components = null;
-
-        /// <summary> 
-        /// Clean up any resources being used.
-        /// </summary>
-        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
-        protected override void Dispose(bool disposing)
-        {
-            if (disposing && (components != null))
-            {
-                components.Dispose();
-            }
-            base.Dispose(disposing);
-        }
-
-        #region Component Designer generated code
-
-        /// <summary> 
-        /// Required method for Designer support - do not modify 
-        /// the contents of this method with the code editor.
-        /// </summary>
-        private void InitializeComponent()
-        {
-            layoutControl1 = new DevExpress.XtraLayout.LayoutControl();
-            hydroInputEnergyScaleChartCtrl1 = new HydroInputEnergyScaleChartCtrl();
-            hydroEnergyStatisticsBarCtrl1 = new HydroEnergyStatisticsBarCtrl();
-            hydroCatalogLossScaleChartCtrl1 = new HydroCatalogLossScaleChartCtrl();
-            Root = new DevExpress.XtraLayout.LayoutControlGroup();
-            layoutControlGroup1 = new DevExpress.XtraLayout.LayoutControlGroup();
-            layoutControlItem3 = new DevExpress.XtraLayout.LayoutControlItem();
-            layoutControlGroup2 = new DevExpress.XtraLayout.LayoutControlGroup();
-            layoutControlItem1 = new DevExpress.XtraLayout.LayoutControlItem();
-            layoutControlGroup3 = new DevExpress.XtraLayout.LayoutControlGroup();
-            layoutControlItem2 = new DevExpress.XtraLayout.LayoutControlItem();
-            ((ISupportInitialize)layoutControl1).BeginInit();
-            layoutControl1.SuspendLayout();
-            ((ISupportInitialize)Root).BeginInit();
-            ((ISupportInitialize)layoutControlGroup1).BeginInit();
-            ((ISupportInitialize)layoutControlItem3).BeginInit();
-            ((ISupportInitialize)layoutControlGroup2).BeginInit();
-            ((ISupportInitialize)layoutControlItem1).BeginInit();
-            ((ISupportInitialize)layoutControlGroup3).BeginInit();
-            ((ISupportInitialize)layoutControlItem2).BeginInit();
-            SuspendLayout();
-            // 
-            // layoutControl1
-            // 
-            layoutControl1.Controls.Add(hydroInputEnergyScaleChartCtrl1);
-            layoutControl1.Controls.Add(hydroEnergyStatisticsBarCtrl1);
-            layoutControl1.Controls.Add(hydroCatalogLossScaleChartCtrl1);
-            layoutControl1.Dock = DockStyle.Fill;
-            layoutControl1.Location = new Point(0, 0);
-            layoutControl1.Name = "layoutControl1";
-            layoutControl1.OptionsCustomizationForm.DesignTimeCustomizationFormPositionAndSize = new Rectangle(564, 341, 650, 423);
-            layoutControl1.Root = Root;
-            layoutControl1.Size = new Size(918, 674);
-            layoutControl1.TabIndex = 9;
-            layoutControl1.Text = "layoutControl1";
-            // 
-            // hydroInputEnergyScaleChartCtrl1
-            // 
-            hydroInputEnergyScaleChartCtrl1.BorderVisible = false;
-            hydroInputEnergyScaleChartCtrl1.Location = new Point(2, 23);
-            hydroInputEnergyScaleChartCtrl1.Name = "hydroInputEnergyScaleChartCtrl1";
-            hydroInputEnergyScaleChartCtrl1.Size = new Size(377, 425);
-            hydroInputEnergyScaleChartCtrl1.TabIndex = 4;
-            // 
-            // hydroEnergyStatisticsBarCtrl1
-            // 
-            hydroEnergyStatisticsBarCtrl1.BorderVisible = false;
-            hydroEnergyStatisticsBarCtrl1.Location = new Point(2, 473);
-            hydroEnergyStatisticsBarCtrl1.Name = "hydroEnergyStatisticsBarCtrl1";
-            hydroEnergyStatisticsBarCtrl1.Size = new Size(914, 199);
-            hydroEnergyStatisticsBarCtrl1.TabIndex = 2;
-            // 
-            // hydroCatalogLossScaleChartCtrl1
-            // 
-            hydroCatalogLossScaleChartCtrl1.BorderVisible = false;
-            hydroCatalogLossScaleChartCtrl1.Location = new Point(383, 23);
-            hydroCatalogLossScaleChartCtrl1.Name = "hydroCatalogLossScaleChartCtrl1";
-            hydroCatalogLossScaleChartCtrl1.Size = new Size(533, 425);
-            hydroCatalogLossScaleChartCtrl1.TabIndex = 0;
-            // 
-            // Root
-            // 
-            Root.EnableIndentsWithoutBorders = DevExpress.Utils.DefaultBoolean.True;
-            Root.GroupBordersVisible = false;
-            Root.Items.AddRange(new DevExpress.XtraLayout.BaseLayoutItem[] { layoutControlGroup1, layoutControlGroup2, layoutControlGroup3 });
-            Root.Name = "Root";
-            Root.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
-            Root.Size = new Size(918, 674);
-            Root.TextVisible = false;
-            // 
-            // layoutControlGroup1
-            // 
-            layoutControlGroup1.Items.AddRange(new DevExpress.XtraLayout.BaseLayoutItem[] { layoutControlItem3 });
-            layoutControlGroup1.Location = new Point(0, 0);
-            layoutControlGroup1.Name = "layoutControlGroup1";
-            layoutControlGroup1.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
-            layoutControlGroup1.Size = new Size(381, 450);
-            layoutControlGroup1.Spacing = new DevExpress.XtraLayout.Utils.Padding(1, 1, 1, 1);
-            layoutControlGroup1.Text = "鑳介噺杈撳叆";
-            // 
-            // layoutControlItem3
-            // 
-            layoutControlItem3.Control = hydroInputEnergyScaleChartCtrl1;
-            layoutControlItem3.Location = new Point(0, 0);
-            layoutControlItem3.MinSize = new Size(1, 1);
-            layoutControlItem3.Name = "layoutControlItem3";
-            layoutControlItem3.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
-            layoutControlItem3.Size = new Size(377, 425);
-            layoutControlItem3.SizeConstraintsType = DevExpress.XtraLayout.SizeConstraintsType.Custom;
-            layoutControlItem3.TextSize = new Size(0, 0);
-            layoutControlItem3.TextVisible = false;
-            // 
-            // layoutControlGroup2
-            // 
-            layoutControlGroup2.Items.AddRange(new DevExpress.XtraLayout.BaseLayoutItem[] { layoutControlItem1 });
-            layoutControlGroup2.Location = new Point(381, 0);
-            layoutControlGroup2.Name = "layoutControlGroup2";
-            layoutControlGroup2.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
-            layoutControlGroup2.Size = new Size(537, 450);
-            layoutControlGroup2.Spacing = new DevExpress.XtraLayout.Utils.Padding(1, 1, 1, 1);
-            layoutControlGroup2.Text = "鑳介噺鎹熷け";
-            // 
-            // layoutControlItem1
-            // 
-            layoutControlItem1.Control = hydroCatalogLossScaleChartCtrl1;
-            layoutControlItem1.Location = new Point(0, 0);
-            layoutControlItem1.Name = "layoutControlItem1";
-            layoutControlItem1.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
-            layoutControlItem1.Size = new Size(533, 425);
-            layoutControlItem1.Text = "鍒嗙被缁熻";
-            layoutControlItem1.TextLocation = DevExpress.Utils.Locations.Top;
-            layoutControlItem1.TextSize = new Size(0, 0);
-            layoutControlItem1.TextVisible = false;
-            // 
-            // layoutControlGroup3
-            // 
-            layoutControlGroup3.Items.AddRange(new DevExpress.XtraLayout.BaseLayoutItem[] { layoutControlItem2 });
-            layoutControlGroup3.Location = new Point(0, 450);
-            layoutControlGroup3.Name = "layoutControlGroup3";
-            layoutControlGroup3.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
-            layoutControlGroup3.Size = new Size(918, 224);
-            layoutControlGroup3.Spacing = new DevExpress.XtraLayout.Utils.Padding(1, 1, 1, 1);
-            layoutControlGroup3.Text = "鑳介噺缁熻";
-            // 
-            // layoutControlItem2
-            // 
-            layoutControlItem2.Control = hydroEnergyStatisticsBarCtrl1;
-            layoutControlItem2.Location = new Point(0, 0);
-            layoutControlItem2.Name = "layoutControlItem2";
-            layoutControlItem2.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
-            layoutControlItem2.Size = new Size(914, 199);
-            layoutControlItem2.Text = "鑳介噺缁熻";
-            layoutControlItem2.TextLocation = DevExpress.Utils.Locations.Top;
-            layoutControlItem2.TextSize = new Size(0, 0);
-            layoutControlItem2.TextVisible = false;
-            // 
-            // HydroSingleWorkingLossStatisticsCtrl
-            // 
-            AutoScaleDimensions = new SizeF(7F, 14F);
-            AutoScaleMode = AutoScaleMode.Font;
-            Controls.Add(layoutControl1);
-            Name = "HydroSingleWorkingLossStatisticsCtrl";
-            Size = new Size(918, 674);
-            ((ISupportInitialize)layoutControl1).EndInit();
-            layoutControl1.ResumeLayout(false);
-            ((ISupportInitialize)Root).EndInit();
-            ((ISupportInitialize)layoutControlGroup1).EndInit();
-            ((ISupportInitialize)layoutControlItem3).EndInit();
-            ((ISupportInitialize)layoutControlGroup2).EndInit();
-            ((ISupportInitialize)layoutControlItem1).EndInit();
-            ((ISupportInitialize)layoutControlGroup3).EndInit();
-            ((ISupportInitialize)layoutControlItem2).EndInit();
-            ResumeLayout(false);
-        }
-
-        #endregion
-
-        private DevExpress.XtraLayout.LayoutControl layoutControl1;
-        private HydroEnergyStatisticsBarCtrl hydroEnergyStatisticsBarCtrl1;
-        private HydroCatalogLossScaleChartCtrl hydroCatalogLossScaleChartCtrl1;
-        private DevExpress.XtraLayout.LayoutControlGroup Root;
-        private DevExpress.XtraLayout.LayoutControlItem layoutControlItem2;
-        private DevExpress.XtraLayout.LayoutControlItem layoutControlItem1;
-        private HydroInputEnergyScaleChartCtrl hydroInputEnergyScaleChartCtrl1;
-        private DevExpress.XtraLayout.LayoutControlItem layoutControlItem3;
-        private DevExpress.XtraLayout.LayoutControlGroup layoutControlGroup1;
-        private DevExpress.XtraLayout.LayoutControlGroup layoutControlGroup2;
-        private DevExpress.XtraLayout.LayoutControlGroup layoutControlGroup3;
-    }
-}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/03-statistics/HydroSingleWorkingLossStatisticsCtrl.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/03-statistics/HydroSingleWorkingLossStatisticsCtrl.cs
deleted file mode 100644
index 8d4b12a..0000000
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/03-statistics/HydroSingleWorkingLossStatisticsCtrl.cs
+++ /dev/null
@@ -1,77 +0,0 @@
-锘縰sing Yw.EPAnet;
-using Yw.Hydro;
-namespace Yw.WinFrmUI
-{
-    public partial class HydroSingleWorkingLossStatisticsCtrl : DevExpress.XtraEditors.XtraUserControl
-    {
-        public HydroSingleWorkingLossStatisticsCtrl()
-        {
-            InitializeComponent();
-            this.layoutControl1.SetupLayoutControl();
-        }
-
-
-        /// <summary>
-        /// 缁戝畾鏁版嵁
-        /// </summary>
-        public void SetBindingData(Yw.Model.HydroModelInfo hydroInfo, HydroCalcuResult calcuResult)
-        {
-            if (hydroInfo == null)
-            {
-                return;
-            }
-            List<Yw.EPAnet.EnergyPoint> allEnergyList = null;
-            var network = hydroInfo.ToNetwork();
-            if (network != null)
-            {
-                if (calcuResult != null)
-                {
-                    if (calcuResult.EPAnetCalcuResult != null)
-                    {
-                        allEnergyList = network.AnalyzeEnergy(calcuResult.EPAnetCalcuResult);
-                    }
-                }
-            }
-            SetBindingData(hydroInfo, calcuResult, allEnergyList);
-        }
-
-        /// <summary>
-        /// 
-        /// </summary>
-        public void SetBindingData(Yw.Model.HydroModelInfo hydroInfo, HydroCalcuResult calcuResult, List<Yw.EPAnet.EnergyPoint> allEnergyList)
-        {
-            if (hydroInfo == null)
-            {
-                return;
-            }
-            this.hydroInputEnergyScaleChartCtrl1.SetBindingData(hydroInfo, calcuResult, allEnergyList);
-            this.hydroCatalogLossScaleChartCtrl1.SetBindingData(hydroInfo, calcuResult, allEnergyList);
-            this.hydroEnergyStatisticsBarCtrl1.SetBindingData(hydroInfo, calcuResult, allEnergyList);
-        }
-
-        /// <summary>
-        /// 瀵煎嚭鑳介噺杈撳叆鍥剧墖
-        /// </summary>
-        public void ExportInputToImage(string filePath)
-        {
-            this.hydroInputEnergyScaleChartCtrl1.ExportToImage(filePath);
-        }
-
-        /// <summary>
-        /// 瀵煎嚭鎹熷け鍥剧墖
-        /// </summary>
-        public void ExportLossToImage(string filePath)
-        {
-            this.hydroCatalogLossScaleChartCtrl1.ExportToImage(filePath);
-        }
-
-        /// <summary>
-        /// 瀵煎嚭缁熻鍥剧墖
-        /// </summary>
-        public void ExportStatisticsToImage(string filePath)
-        {
-            this.hydroEnergyStatisticsBarCtrl1.ExportToImage(filePath);
-        }
-
-    }
-}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/03-statistics/HydroSingleWorkingLossStatisticsCtrl.resx b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/03-statistics/HydroSingleWorkingLossStatisticsCtrl.resx
deleted file mode 100644
index af32865..0000000
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/03-statistics/HydroSingleWorkingLossStatisticsCtrl.resx
+++ /dev/null
@@ -1,120 +0,0 @@
-锘�<?xml version="1.0" encoding="utf-8"?>
-<root>
-  <!--
-    Microsoft ResX Schema 
-
-    Version 2.0
-
-    The primary goals of this format is to allow a simple XML format
-    that is mostly human readable. The generation and parsing of the
-    various data types are done through the TypeConverter classes
-    associated with the data types.
-
-    Example:
-
-    ... ado.net/XML headers & schema ...
-    <resheader name="resmimetype">text/microsoft-resx</resheader>
-    <resheader name="version">2.0</resheader>
-    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
-    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
-    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
-    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
-    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
-        <value>[base64 mime encoded serialized .NET Framework object]</value>
-    </data>
-    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
-        <comment>This is a comment</comment>
-    </data>
-
-    There are any number of "resheader" rows that contain simple
-    name/value pairs.
-
-    Each data row contains a name, and value. The row also contains a
-    type or mimetype. Type corresponds to a .NET class that support
-    text/value conversion through the TypeConverter architecture.
-    Classes that don't support this are serialized and stored with the
-    mimetype set.
-
-    The mimetype is used for serialized objects, and tells the
-    ResXResourceReader how to depersist the object. This is currently not
-    extensible. For a given mimetype the value must be set accordingly:
-
-    Note - application/x-microsoft.net.object.binary.base64 is the format
-    that the ResXResourceWriter will generate, however the reader can
-    read any of the formats listed below.
-
-    mimetype: application/x-microsoft.net.object.binary.base64
-    value   : The object must be serialized with
-            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
-            : and then encoded with base64 encoding.
-    
-    mimetype: application/x-microsoft.net.object.soap.base64
-    value   : The object must be serialized with
-            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
-            : and then encoded with base64 encoding.
-
-    mimetype: application/x-microsoft.net.object.bytearray.base64
-    value   : The object must be serialized into a byte array
-            : using a System.ComponentModel.TypeConverter
-            : and then encoded with base64 encoding.
-    -->
-  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
-    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
-    <xsd:element name="root" msdata:IsDataSet="true">
-      <xsd:complexType>
-        <xsd:choice maxOccurs="unbounded">
-          <xsd:element name="metadata">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" />
-              </xsd:sequence>
-              <xsd:attribute name="name" use="required" type="xsd:string" />
-              <xsd:attribute name="type" type="xsd:string" />
-              <xsd:attribute name="mimetype" type="xsd:string" />
-              <xsd:attribute ref="xml:space" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="assembly">
-            <xsd:complexType>
-              <xsd:attribute name="alias" type="xsd:string" />
-              <xsd:attribute name="name" type="xsd:string" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="data">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
-              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
-              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
-              <xsd:attribute ref="xml:space" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="resheader">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" />
-            </xsd:complexType>
-          </xsd:element>
-        </xsd:choice>
-      </xsd:complexType>
-    </xsd:element>
-  </xsd:schema>
-  <resheader name="resmimetype">
-    <value>text/microsoft-resx</value>
-  </resheader>
-  <resheader name="version">
-    <value>2.0</value>
-  </resheader>
-  <resheader name="reader">
-    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <resheader name="writer">
-    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-</root>
\ No newline at end of file
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/03-statistics/HydroSingleWorkingLossStatisticsDlg.Designer.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/03-statistics/HydroSingleWorkingLossStatisticsDlg.Designer.cs
deleted file mode 100644
index 0972a56..0000000
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/03-statistics/HydroSingleWorkingLossStatisticsDlg.Designer.cs
+++ /dev/null
@@ -1,94 +0,0 @@
-锘縩amespace Yw.WinFrmUI
-{
-    partial class HydroSingleWorkingLossStatisticsDlg
-    {
-        /// <summary>
-        /// Required designer variable.
-        /// </summary>
-        private System.ComponentModel.IContainer components = null;
-
-        /// <summary>
-        /// Clean up any resources being used.
-        /// </summary>
-        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
-        protected override void Dispose(bool disposing)
-        {
-            if (disposing && (components != null))
-            {
-                components.Dispose();
-            }
-            base.Dispose(disposing);
-        }
-
-        #region Windows Form Designer generated code
-
-        /// <summary>
-        /// Required method for Designer support - do not modify
-        /// the contents of this method with the code editor.
-        /// </summary>
-        private void InitializeComponent()
-        {
-            ribbon = new DevExpress.XtraBars.Ribbon.RibbonControl();
-            ribbonPage1 = new DevExpress.XtraBars.Ribbon.RibbonPage();
-            ribbonPageGroup1 = new DevExpress.XtraBars.Ribbon.RibbonPageGroup();
-            hydroSingleWorkingLossStatisticsCtrl1 = new HydroSingleWorkingLossStatisticsCtrl();
-            ((ISupportInitialize)ribbon).BeginInit();
-            SuspendLayout();
-            // 
-            // ribbon
-            // 
-            ribbon.ExpandCollapseItem.Id = 0;
-            ribbon.Items.AddRange(new DevExpress.XtraBars.BarItem[] { ribbon.ExpandCollapseItem });
-            ribbon.Location = new Point(0, 0);
-            ribbon.MaxItemId = 1;
-            ribbon.Name = "ribbon";
-            ribbon.Pages.AddRange(new DevExpress.XtraBars.Ribbon.RibbonPage[] { ribbonPage1 });
-            ribbon.RibbonCaptionAlignment = DevExpress.XtraBars.Ribbon.RibbonCaptionAlignment.Left;
-            ribbon.ShowDisplayOptionsMenuButton = DevExpress.Utils.DefaultBoolean.False;
-            ribbon.Size = new Size(997, 32);
-            // 
-            // ribbonPage1
-            // 
-            ribbonPage1.Groups.AddRange(new DevExpress.XtraBars.Ribbon.RibbonPageGroup[] { ribbonPageGroup1 });
-            ribbonPage1.Name = "ribbonPage1";
-            ribbonPage1.Text = "ribbonPage1";
-            // 
-            // ribbonPageGroup1
-            // 
-            ribbonPageGroup1.Name = "ribbonPageGroup1";
-            ribbonPageGroup1.Text = "ribbonPageGroup1";
-            // 
-            // hydroSingleLossScaleCtrl1
-            // 
-            hydroSingleWorkingLossStatisticsCtrl1.Dock = DockStyle.Fill;
-            hydroSingleWorkingLossStatisticsCtrl1.Location = new Point(0, 32);
-            hydroSingleWorkingLossStatisticsCtrl1.Name = "hydroSingleLossScaleCtrl1";
-            hydroSingleWorkingLossStatisticsCtrl1.Size = new Size(997, 591);
-            hydroSingleWorkingLossStatisticsCtrl1.TabIndex = 1;
-            // 
-            // HydroSingleLossScaleDlg
-            // 
-            AutoScaleDimensions = new SizeF(7F, 14F);
-            AutoScaleMode = AutoScaleMode.Font;
-            ClientSize = new Size(997, 623);
-            Controls.Add(hydroSingleWorkingLossStatisticsCtrl1);
-            Controls.Add(ribbon);
-            FormBorderStyle = FormBorderStyle.SizableToolWindow;
-            Name = "HydroSingleLossScaleDlg";
-            Ribbon = ribbon;
-            RibbonVisibility = DevExpress.XtraBars.Ribbon.RibbonVisibility.Hidden;
-            StartPosition = FormStartPosition.CenterParent;
-            Text = "鎹熷け姣斾緥";
-            ((ISupportInitialize)ribbon).EndInit();
-            ResumeLayout(false);
-            PerformLayout();
-        }
-
-        #endregion
-
-        private DevExpress.XtraBars.Ribbon.RibbonControl ribbon;
-        private DevExpress.XtraBars.Ribbon.RibbonPage ribbonPage1;
-        private DevExpress.XtraBars.Ribbon.RibbonPageGroup ribbonPageGroup1;
-        private HydroSingleWorkingLossStatisticsCtrl hydroSingleWorkingLossStatisticsCtrl1;
-    }
-}
\ No newline at end of file
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/03-statistics/HydroSingleWorkingLossStatisticsDlg.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/03-statistics/HydroSingleWorkingLossStatisticsDlg.cs
deleted file mode 100644
index 82ab707..0000000
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/03-statistics/HydroSingleWorkingLossStatisticsDlg.cs
+++ /dev/null
@@ -1,52 +0,0 @@
-锘縩amespace Yw.WinFrmUI
-{
-    public partial class HydroSingleWorkingLossStatisticsDlg : DevExpress.XtraBars.Ribbon.RibbonForm
-    {
-        public HydroSingleWorkingLossStatisticsDlg()
-        {
-            InitializeComponent();
-            this.IconOptions.Icon = Yw.WinFrmUI.GlobalParas.AppIcon;
-        }
-
-        /// <summary>
-        /// 缁戝畾鏁版嵁
-        /// </summary>
-        public void SetBindingData(Yw.Model.HydroModelInfo hydroInfo)
-        {
-            if (hydroInfo == null)
-            {
-                return;
-            }
-            var calcuResult = hydroInfo.Calcu(Yw.EPAnet.CalcuMode.MinorLoss);
-            SetBindingData(hydroInfo, calcuResult);
-        }
-
-        /// <summary>
-        /// 缁戝畾鏁版嵁
-        /// </summary>
-        public void SetBindingData(Yw.Model.HydroModelInfo hydroInfo, HydroCalcuResult calcuResult)
-        {
-            if (hydroInfo == null)
-            {
-                return;
-            }
-            this.hydroSingleWorkingLossStatisticsCtrl1.SetBindingData(hydroInfo, calcuResult);
-        }
-
-        /// <summary>
-        /// 缁戝畾鏁版嵁
-        /// </summary>
-        public void SetBindingData(Yw.Model.HydroModelInfo hydroInfo, HydroCalcuResult calcuResult, List<Yw.EPAnet.EnergyPoint> allEnergyList)
-        {
-            if (hydroInfo == null)
-            {
-                return;
-            }
-            this.hydroSingleWorkingLossStatisticsCtrl1.SetBindingData(hydroInfo, calcuResult, allEnergyList);
-        }
-
-
-
-
-    }
-}
\ No newline at end of file
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/03-statistics/HydroSingleWorkingLossStatisticsDlg.resx b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/03-statistics/HydroSingleWorkingLossStatisticsDlg.resx
deleted file mode 100644
index af32865..0000000
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/03-statistics/HydroSingleWorkingLossStatisticsDlg.resx
+++ /dev/null
@@ -1,120 +0,0 @@
-锘�<?xml version="1.0" encoding="utf-8"?>
-<root>
-  <!--
-    Microsoft ResX Schema 
-
-    Version 2.0
-
-    The primary goals of this format is to allow a simple XML format
-    that is mostly human readable. The generation and parsing of the
-    various data types are done through the TypeConverter classes
-    associated with the data types.
-
-    Example:
-
-    ... ado.net/XML headers & schema ...
-    <resheader name="resmimetype">text/microsoft-resx</resheader>
-    <resheader name="version">2.0</resheader>
-    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
-    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
-    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
-    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
-    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
-        <value>[base64 mime encoded serialized .NET Framework object]</value>
-    </data>
-    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
-        <comment>This is a comment</comment>
-    </data>
-
-    There are any number of "resheader" rows that contain simple
-    name/value pairs.
-
-    Each data row contains a name, and value. The row also contains a
-    type or mimetype. Type corresponds to a .NET class that support
-    text/value conversion through the TypeConverter architecture.
-    Classes that don't support this are serialized and stored with the
-    mimetype set.
-
-    The mimetype is used for serialized objects, and tells the
-    ResXResourceReader how to depersist the object. This is currently not
-    extensible. For a given mimetype the value must be set accordingly:
-
-    Note - application/x-microsoft.net.object.binary.base64 is the format
-    that the ResXResourceWriter will generate, however the reader can
-    read any of the formats listed below.
-
-    mimetype: application/x-microsoft.net.object.binary.base64
-    value   : The object must be serialized with
-            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
-            : and then encoded with base64 encoding.
-    
-    mimetype: application/x-microsoft.net.object.soap.base64
-    value   : The object must be serialized with
-            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
-            : and then encoded with base64 encoding.
-
-    mimetype: application/x-microsoft.net.object.bytearray.base64
-    value   : The object must be serialized into a byte array
-            : using a System.ComponentModel.TypeConverter
-            : and then encoded with base64 encoding.
-    -->
-  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
-    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
-    <xsd:element name="root" msdata:IsDataSet="true">
-      <xsd:complexType>
-        <xsd:choice maxOccurs="unbounded">
-          <xsd:element name="metadata">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" />
-              </xsd:sequence>
-              <xsd:attribute name="name" use="required" type="xsd:string" />
-              <xsd:attribute name="type" type="xsd:string" />
-              <xsd:attribute name="mimetype" type="xsd:string" />
-              <xsd:attribute ref="xml:space" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="assembly">
-            <xsd:complexType>
-              <xsd:attribute name="alias" type="xsd:string" />
-              <xsd:attribute name="name" type="xsd:string" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="data">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
-              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
-              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
-              <xsd:attribute ref="xml:space" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="resheader">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" />
-            </xsd:complexType>
-          </xsd:element>
-        </xsd:choice>
-      </xsd:complexType>
-    </xsd:element>
-  </xsd:schema>
-  <resheader name="resmimetype">
-    <value>text/microsoft-resx</value>
-  </resheader>
-  <resheader name="version">
-    <value>2.0</value>
-  </resheader>
-  <resheader name="reader">
-    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <resheader name="writer">
-    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-</root>
\ No newline at end of file
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/20-energy/01-statistics/HydroEnergyStatisticsBarCtrl.Designer.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/20-energy/01-statistics/HydroEnergyStatisticsBarCtrl.Designer.cs
deleted file mode 100644
index 32a2c36..0000000
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/20-energy/01-statistics/HydroEnergyStatisticsBarCtrl.Designer.cs
+++ /dev/null
@@ -1,97 +0,0 @@
-锘縩amespace Yw.WinFrmUI
-{
-    partial class HydroEnergyStatisticsBarCtrl
-    {
-        /// <summary> 
-        /// Required designer variable.
-        /// </summary>
-        private System.ComponentModel.IContainer components = null;
-
-        /// <summary> 
-        /// Clean up any resources being used.
-        /// </summary>
-        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
-        protected override void Dispose(bool disposing)
-        {
-            if (disposing && (components != null))
-            {
-                components.Dispose();
-            }
-            base.Dispose(disposing);
-        }
-
-        #region Component Designer generated code
-
-        /// <summary> 
-        /// Required method for Designer support - do not modify 
-        /// the contents of this method with the code editor.
-        /// </summary>
-        private void InitializeComponent()
-        {
-            components = new Container();
-            DevExpress.XtraCharts.XYDiagram xyDiagram1 = new DevExpress.XtraCharts.XYDiagram();
-            DevExpress.XtraCharts.Series series1 = new DevExpress.XtraCharts.Series();
-            DevExpress.XtraCharts.SideBySideBarSeriesLabel sideBySideBarSeriesLabel1 = new DevExpress.XtraCharts.SideBySideBarSeriesLabel();
-            bindingSource1 = new BindingSource(components);
-            chartControl1 = new DevExpress.XtraCharts.ChartControl();
-            ((ISupportInitialize)bindingSource1).BeginInit();
-            ((ISupportInitialize)chartControl1).BeginInit();
-            ((ISupportInitialize)xyDiagram1).BeginInit();
-            ((ISupportInitialize)series1).BeginInit();
-            ((ISupportInitialize)sideBySideBarSeriesLabel1).BeginInit();
-            SuspendLayout();
-            // 
-            // bindingSource1
-            // 
-            bindingSource1.DataSource = typeof(HydroEnergyStatisticsItemViewModel);
-            // 
-            // chartControl1
-            // 
-            xyDiagram1.AxisX.VisibleInPanesSerializable = "-1";
-            xyDiagram1.AxisY.VisibleInPanesSerializable = "-1";
-            xyDiagram1.AxisY.WholeRange.AutoSideMargins = false;
-            xyDiagram1.AxisY.WholeRange.EndSideMargin = 0.94000000000000006D;
-            xyDiagram1.AxisY.WholeRange.StartSideMargin = 0D;
-            chartControl1.Diagram = xyDiagram1;
-            chartControl1.Dock = DockStyle.Fill;
-            chartControl1.Legend.AlignmentHorizontal = DevExpress.XtraCharts.LegendAlignmentHorizontal.Center;
-            chartControl1.Legend.LegendID = -1;
-            chartControl1.Legend.Visibility = DevExpress.Utils.DefaultBoolean.False;
-            chartControl1.Location = new Point(0, 0);
-            chartControl1.Name = "chartControl1";
-            series1.ArgumentDataMember = "EnergyName";
-            series1.DataSource = bindingSource1;
-            sideBySideBarSeriesLabel1.TextPattern = "{V}kW";
-            series1.Label = sideBySideBarSeriesLabel1;
-            series1.LabelsVisibility = DevExpress.Utils.DefaultBoolean.True;
-            series1.Name = "Series 1";
-            series1.SeriesID = 0;
-            series1.ValueDataMembersSerializable = "EnergyValue";
-            chartControl1.SeriesSerializable = new DevExpress.XtraCharts.Series[]
-    {
-    series1
-    };
-            chartControl1.Size = new Size(1005, 485);
-            chartControl1.TabIndex = 0;
-            // 
-            // HydroEnergyStatisticsBarCtrl
-            // 
-            AutoScaleDimensions = new SizeF(7F, 14F);
-            AutoScaleMode = AutoScaleMode.Font;
-            Controls.Add(chartControl1);
-            Name = "HydroEnergyStatisticsBarCtrl";
-            Size = new Size(1005, 485);
-            ((ISupportInitialize)bindingSource1).EndInit();
-            ((ISupportInitialize)xyDiagram1).EndInit();
-            ((ISupportInitialize)sideBySideBarSeriesLabel1).EndInit();
-            ((ISupportInitialize)series1).EndInit();
-            ((ISupportInitialize)chartControl1).EndInit();
-            ResumeLayout(false);
-        }
-
-        #endregion
-
-        private DevExpress.XtraCharts.ChartControl chartControl1;
-        private BindingSource bindingSource1;
-    }
-}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/20-energy/01-statistics/HydroEnergyStatisticsBarCtrl.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/20-energy/01-statistics/HydroEnergyStatisticsBarCtrl.cs
deleted file mode 100644
index 24b44a9..0000000
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/20-energy/01-statistics/HydroEnergyStatisticsBarCtrl.cs
+++ /dev/null
@@ -1,52 +0,0 @@
-锘縩amespace Yw.WinFrmUI
-{
-    public partial class HydroEnergyStatisticsBarCtrl : DevExpress.XtraEditors.XtraUserControl
-    {
-        public HydroEnergyStatisticsBarCtrl()
-        {
-            InitializeComponent();
-        }
-
-        /// <summary>
-        /// 杈规鍙鎬�
-        /// </summary>
-        public bool BorderVisible
-        {
-            get
-            {
-                return this.chartControl1.BorderOptions.Visibility != DevExpress.Utils.DefaultBoolean.False;
-            }
-            set
-            {
-                this.chartControl1.BorderOptions.Visibility = value ? DevExpress.Utils.DefaultBoolean.Default : DevExpress.Utils.DefaultBoolean.False;
-            }
-        }
-
-        /// <summary>
-        /// 缁戝畾鏁版嵁
-        /// </summary>
-        public void SetBindingData(Yw.Model.HydroModelInfo hydroInfo, HydroCalcuResult calcuResult, List<Yw.EPAnet.EnergyPoint> allEnergyList)
-        {
-            var allStatisticsList = hydroInfo.GetStatisticsList(calcuResult, allEnergyList);
-            SetBindingData(allStatisticsList);
-        }
-
-        /// <summary>
-        /// 缁戝畾鏁版嵁
-        /// </summary>
-        public void SetBindingData(List<HydroEnergyStatisticsItemViewModel> allStatisticsList)
-        {
-            this.bindingSource1.DataSource = allStatisticsList;
-            this.bindingSource1.ResetBindings(false);
-        }
-
-        /// <summary>
-        /// 瀵煎嚭鍥剧墖
-        /// </summary>
-        public void ExportToImage(string filePath)
-        {
-            this.chartControl1.ExportToImage(filePath, DevExpress.Drawing.DXImageFormat.Png);
-        }
-
-    }
-}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/20-energy/01-statistics/HydroEnergyStatisticsBarCtrl.resx b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/20-energy/01-statistics/HydroEnergyStatisticsBarCtrl.resx
deleted file mode 100644
index e3e911f..0000000
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/20-energy/01-statistics/HydroEnergyStatisticsBarCtrl.resx
+++ /dev/null
@@ -1,123 +0,0 @@
-锘�<?xml version="1.0" encoding="utf-8"?>
-<root>
-  <!--
-    Microsoft ResX Schema 
-
-    Version 2.0
-
-    The primary goals of this format is to allow a simple XML format
-    that is mostly human readable. The generation and parsing of the
-    various data types are done through the TypeConverter classes
-    associated with the data types.
-
-    Example:
-
-    ... ado.net/XML headers & schema ...
-    <resheader name="resmimetype">text/microsoft-resx</resheader>
-    <resheader name="version">2.0</resheader>
-    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
-    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
-    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
-    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
-    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
-        <value>[base64 mime encoded serialized .NET Framework object]</value>
-    </data>
-    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
-        <comment>This is a comment</comment>
-    </data>
-
-    There are any number of "resheader" rows that contain simple
-    name/value pairs.
-
-    Each data row contains a name, and value. The row also contains a
-    type or mimetype. Type corresponds to a .NET class that support
-    text/value conversion through the TypeConverter architecture.
-    Classes that don't support this are serialized and stored with the
-    mimetype set.
-
-    The mimetype is used for serialized objects, and tells the
-    ResXResourceReader how to depersist the object. This is currently not
-    extensible. For a given mimetype the value must be set accordingly:
-
-    Note - application/x-microsoft.net.object.binary.base64 is the format
-    that the ResXResourceWriter will generate, however the reader can
-    read any of the formats listed below.
-
-    mimetype: application/x-microsoft.net.object.binary.base64
-    value   : The object must be serialized with
-            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
-            : and then encoded with base64 encoding.
-    
-    mimetype: application/x-microsoft.net.object.soap.base64
-    value   : The object must be serialized with
-            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
-            : and then encoded with base64 encoding.
-
-    mimetype: application/x-microsoft.net.object.bytearray.base64
-    value   : The object must be serialized into a byte array
-            : using a System.ComponentModel.TypeConverter
-            : and then encoded with base64 encoding.
-    -->
-  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
-    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
-    <xsd:element name="root" msdata:IsDataSet="true">
-      <xsd:complexType>
-        <xsd:choice maxOccurs="unbounded">
-          <xsd:element name="metadata">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" />
-              </xsd:sequence>
-              <xsd:attribute name="name" use="required" type="xsd:string" />
-              <xsd:attribute name="type" type="xsd:string" />
-              <xsd:attribute name="mimetype" type="xsd:string" />
-              <xsd:attribute ref="xml:space" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="assembly">
-            <xsd:complexType>
-              <xsd:attribute name="alias" type="xsd:string" />
-              <xsd:attribute name="name" type="xsd:string" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="data">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
-              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
-              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
-              <xsd:attribute ref="xml:space" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="resheader">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" />
-            </xsd:complexType>
-          </xsd:element>
-        </xsd:choice>
-      </xsd:complexType>
-    </xsd:element>
-  </xsd:schema>
-  <resheader name="resmimetype">
-    <value>text/microsoft-resx</value>
-  </resheader>
-  <resheader name="version">
-    <value>2.0</value>
-  </resheader>
-  <resheader name="reader">
-    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <resheader name="writer">
-    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <metadata name="bindingSource1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>17, 17</value>
-  </metadata>
-</root>
\ No newline at end of file
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/20-energy/01-statistics/HydroEnergyStatisticsHelper.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/20-energy/01-statistics/HydroEnergyStatisticsHelper.cs
deleted file mode 100644
index 035bea7..0000000
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/20-energy/01-statistics/HydroEnergyStatisticsHelper.cs
+++ /dev/null
@@ -1,114 +0,0 @@
-锘縩amespace Yw.WinFrmUI
-{
-    /// <summary>
-    /// 
-    /// </summary>
-    public static class HydroEnergyStatisticsHelper
-    {
-
-        /// <summary>
-        /// 鑾峰彇缁熻鍒楄〃
-        /// </summary>
-        public static List<HydroEnergyStatisticsItemViewModel> GetStatisticsList
-            (this Yw.Model.HydroModelInfo hydroInfo, HydroCalcuResult calcuResult, List<Yw.EPAnet.EnergyPoint> allEnergyList)
-        {
-            if (hydroInfo == null)
-            {
-                return default;
-            }
-            var allStatisticsList = allEnergyList.GetStatisticsList();
-            if (allStatisticsList == null || allStatisticsList.Count < 1)
-            {
-                return default;
-            }
-
-            double pumpLoss = 0;
-            if (hydroInfo.Pumps != null && hydroInfo.Pumps.Count > 0)
-            {
-                var allCalcuResultVisualDict = calcuResult?.GetVisualDict();
-                foreach (var pump in hydroInfo.Pumps)
-                {
-                    var calcuPumpResult = allCalcuResultVisualDict?.GetValue(pump.Code) as HydroCalcuPumpResult;
-                    if (calcuPumpResult != null)
-                    {
-                        if (calcuPumpResult.CalcuP.HasValue && calcuPumpResult.CalcuE.HasValue)
-                        {
-                            pumpLoss += calcuPumpResult.CalcuP.Value * 1000 * (1 - calcuPumpResult.CalcuE.Value / 100);
-                        }
-                    }
-                }
-            }
-
-            var promoteEnergy = allStatisticsList.Find(x => x.EnergyType == eEnergyType.Promote);
-            if (promoteEnergy != null)
-            {
-                promoteEnergy.EnergyValue += pumpLoss;
-            }
-
-            var minorLossEnergy = allStatisticsList.Find(x => x.EnergyType == eEnergyType.MinorLoss);
-            if (minorLossEnergy != null)
-            {
-                minorLossEnergy.EnergyValue += pumpLoss;
-            }
-
-            allStatisticsList.ForEach(x => x.EnergyValue = Math.Round(x.EnergyValue / 1000f, 1));
-
-            return allStatisticsList;
-        }
-
-        /// <summary>
-        /// 鑾峰彇缁熻鍒楄〃
-        /// </summary>
-        public static List<HydroEnergyStatisticsItemViewModel> GetStatisticsList(this List<Yw.EPAnet.EnergyPoint> allEnergyList)
-        {
-            var allStatisticsList = new List<HydroEnergyStatisticsItemViewModel>();
-            if (allEnergyList != null && allEnergyList.Count > 0)
-            {
-                var allEnergyGroupList = allEnergyList.GroupBy(x => x.EnergyType).ToList();
-                foreach (var energyGroup in allEnergyGroupList)
-                {
-                    var item = new HydroEnergyStatisticsItemViewModel();
-                    switch (energyGroup.Key)
-                    {
-                        case EPAnet.eEnergyType.Input:
-                            {
-                                item.EnergyType = eEnergyType.Input;
-                                item.EnergyName = eEnergyType.Input.GetDisplayText();
-                            }
-                            break;
-                        case EPAnet.eEnergyType.Output:
-                            {
-                                item.EnergyType = eEnergyType.Output;
-                                item.EnergyName = eEnergyType.Output.GetDisplayText();
-                            }
-                            break;
-                        case EPAnet.eEnergyType.Promote:
-                            {
-                                item.EnergyType = eEnergyType.Promote;
-                                item.EnergyName = eEnergyType.Promote.GetDisplayText();
-                            }
-                            break;
-                        case EPAnet.eEnergyType.MinorLoss:
-                            {
-                                item.EnergyType = eEnergyType.MinorLoss;
-                                item.EnergyName = eEnergyType.MinorLoss.GetDisplayText();
-                            }
-                            break;
-                        case EPAnet.eEnergyType.FrictionalLoss:
-                            {
-                                item.EnergyType = eEnergyType.FrictionalLoss;
-                                item.EnergyName = eEnergyType.FrictionalLoss.GetDisplayText();
-                            }
-                            break;
-                        default: break;
-                    }
-                    item.EnergyValue = Math.Round(energyGroup.Sum(x => x.EnergyPower), 2);
-                    allStatisticsList.Add(item);
-                }
-            }
-            return allStatisticsList.OrderBy(x => x.EnergyType).ToList();
-        }
-
-
-    }
-}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/20-energy/01-statistics/HydroEnergyStatisticsItemViewModel.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/20-energy/01-statistics/HydroEnergyStatisticsItemViewModel.cs
deleted file mode 100644
index 24c1c7d..0000000
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/20-energy/01-statistics/HydroEnergyStatisticsItemViewModel.cs
+++ /dev/null
@@ -1,23 +0,0 @@
-锘縩amespace Yw.WinFrmUI
-{
-    /// <summary>
-    /// 
-    /// </summary>
-    public class HydroEnergyStatisticsItemViewModel
-    {
-        /// <summary>
-        /// 鑳介噺绫诲瀷
-        /// </summary>
-        public eEnergyType EnergyType { get; set; }
-
-        /// <summary>
-        /// 鑳介噺鍚嶇О
-        /// </summary>
-        public string EnergyName { get; set; }
-
-        /// <summary>
-        /// 鑳介噺鍊�
-        /// </summary>
-        public double EnergyValue { get; set; }
-    }
-}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/20-energy/02-total/HydroEnergyTotalViewCtrl.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/20-energy/02-total/HydroEnergyTotalViewCtrl.cs
deleted file mode 100644
index 9831665..0000000
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/20-energy/02-total/HydroEnergyTotalViewCtrl.cs
+++ /dev/null
@@ -1,103 +0,0 @@
-锘縩amespace Yw.WinFrmUI
-{
-    public partial class HydroEnergyTotalViewCtrl : DevExpress.XtraEditors.XtraUserControl
-    {
-        public HydroEnergyTotalViewCtrl()
-        {
-            InitializeComponent();
-            this.layoutControl1.SetupLayoutControl();
-        }
-
-        /// <summary>
-        /// 缁戝畾鏁版嵁
-        /// </summary>
-        public void SetBindingData(Yw.Model.HydroModelInfo hydroInfo, HydroCalcuResult calcuResult)
-        {
-            if (hydroInfo == null)
-            {
-                return;
-            }
-            if (calcuResult == null)
-            {
-                return;
-            }
-            if (!calcuResult.Succeed)
-            {
-                return;
-            }
-
-            var allCalcuResultVisualDict = calcuResult.GetVisualDict();
-            SetBindingData(hydroInfo, allCalcuResultVisualDict);
-        }
-
-        /// <summary>
-        /// 缁戝畾鏁版嵁
-        /// </summary>
-        public void SetBindingData(Yw.Model.HydroModelInfo hydroInfo, Dictionary<string, HydroCalcuVisualResult> allCalcuResultVisualDict)
-        {
-            if (hydroInfo == null)
-            {
-                return;
-            }
-            if (allCalcuResultVisualDict == null || allCalcuResultVisualDict.Count < 1)
-            {
-                return;
-            }
-
-            double? totalQ = null;
-            double? totalP = null;
-            var allEfficiList = new List<double>();
-            if (hydroInfo.Pumps != null && hydroInfo.Pumps.Count > 0)
-            {
-                foreach (var pump in hydroInfo.Pumps)
-                {
-                    if (!allCalcuResultVisualDict.ContainsKey(pump.Code))
-                    {
-                        continue;
-                    }
-                    var calcuResult = allCalcuResultVisualDict[pump.Code] as HydroCalcuPumpResult;
-                    if (calcuResult == null)
-                    {
-                        continue;
-                    }
-                    if (pump.LinkStatus == Yw.Hydro.PumpStatus.Open)
-                    {
-                        if (calcuResult.CalcuQ.HasValue)
-                        {
-                            if (!totalQ.HasValue)
-                            {
-                                totalQ = 0;
-                            }
-                            totalQ += calcuResult.CalcuQ.Value;
-                        }
-                        if (calcuResult.CalcuP.HasValue)
-                        {
-                            if (!totalP.HasValue)
-                            {
-                                totalP = 0;
-                            }
-                            totalP += calcuResult.CalcuP.Value;
-                        }
-                        if (calcuResult.CalcuE.HasValue)
-                        {
-                            allEfficiList.Add(calcuResult.CalcuE.Value);
-                        }
-                    }
-                }
-            }
-            if (totalQ.HasValue)
-            {
-                this.txtQ.EditValue = $"{Math.Round(totalQ.Value, 1)}m鲁/h";
-            }
-            if (totalP.HasValue)
-            {
-                this.txtP.EditValue = $"{Math.Round(totalP.Value, 1)}kW";
-            }
-            if (allEfficiList.Count > 0)
-            {
-                this.txtE.EditValue = $"{Math.Round(allEfficiList.Average(), 1)}%";
-            }
-        }
-
-    }
-}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/Yw.WinFrmUI.Hydro.Core.csproj b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/Yw.WinFrmUI.Hydro.Core.csproj
index 4c568ea..1d2e77d 100644
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/Yw.WinFrmUI.Hydro.Core.csproj
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/Yw.WinFrmUI.Hydro.Core.csproj
@@ -237,24 +237,6 @@
 		<Compile Update="17-warning\HydroCalcuWarningCtrl.cs">
 			<SubType>UserControl</SubType>
 		</Compile>
-		<Compile Update="18-loss\01-curve\HydroMultiWorkingLossCurveDlg.cs">
-			<SubType>Form</SubType>
-		</Compile>
-		<Compile Update="18-loss\01-curve\HydroSingleWorkingLossCurveInteropCtrl.cs">
-		  <SubType>UserControl</SubType>
-		</Compile>
-		<Compile Update="18-loss\01-curve\HydroSingleWorkingLossCurveDlg.cs">
-			<SubType>Form</SubType>
-		</Compile>
-		<Compile Update="18-loss\02-scale\02-input\HydroInputEnergyScaleChartCtrl.cs">
-			<SubType>UserControl</SubType>
-		</Compile>
-		<Compile Update="18-loss\03-statistics\HydroMultiWorkingLossStatisticsDlg.cs">
-			<SubType>Form</SubType>
-		</Compile>
-		<Compile Update="18-loss\03-statistics\HydroSingleWorkingLossStatisticsDlg.cs">
-			<SubType>Form</SubType>
-		</Compile>
 		<Compile Update="19-pump\02-extend\01-single\HydroSinglePumpListExtendGridCtrl.cs">
 			<SubType>UserControl</SubType>
 		</Compile>
@@ -407,6 +389,24 @@
 		<Compile Update="accuracy\scale\HydroAccuracyScaleChartCtrl.cs">
 		  <SubType>UserControl</SubType>
 		</Compile>
+		<Compile Update="energy-analy\03-control\HydroEnergyAnalyTotalCtrl.cs">
+		  <SubType>UserControl</SubType>
+		</Compile>
+		<Compile Update="loss-curve\07-control\HydroLossCurveCtrl.cs">
+		  <SubType>UserControl</SubType>
+		</Compile>
+		<Compile Update="loss-curve\07-control\HydroLossCurveInteropCtrl.cs">
+		  <SubType>UserControl</SubType>
+		</Compile>
+		<Compile Update="loss-curve\08-dlg\HydroLossCurveDlg.cs">
+		  <SubType>Form</SubType>
+		</Compile>
+		<Compile Update="loss-curve\09-working\HydroLossCurveMultiWorkingDlg.cs">
+		  <SubType>Form</SubType>
+		</Compile>
+		<Compile Update="loss-curve\09-working\HydroLossCurveWorkingDlg.cs">
+		  <SubType>Form</SubType>
+		</Compile>
 		<Compile Update="loss-statistics\06-control\HydroLossStatisticsCategoryCtrl.cs">
 		  <SubType>UserControl</SubType>
 		</Compile>
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/Yw.WinFrmUI.Hydro.Core.csproj.user b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/Yw.WinFrmUI.Hydro.Core.csproj.user
index cfd63b1..e20e653 100644
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/Yw.WinFrmUI.Hydro.Core.csproj.user
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/Yw.WinFrmUI.Hydro.Core.csproj.user
@@ -58,15 +58,6 @@
     <Compile Update="16-evaluation\03-total\HydroWorkingTotalEvaluationCtrl.cs">
       <SubType>UserControl</SubType>
     </Compile>
-    <Compile Update="18-loss\01-curve\HydroSingleWorkingLossCurveCtrl.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Update="18-loss\02-scale\01-catalog\HydroCatalogLossScaleChartCtrl.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Update="18-loss\03-statistics\HydroSingleWorkingLossStatisticsCtrl.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
     <Compile Update="19-pump\01-list\HydroPumpListViewCtrl.cs">
       <SubType>UserControl</SubType>
     </Compile>
@@ -86,12 +77,6 @@
       <SubType>UserControl</SubType>
     </Compile>
     <Compile Update="19-pump\08-energy\HydroPumpGroupEnergyListCtrl.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Update="20-energy\01-statistics\HydroEnergyStatisticsBarCtrl.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Update="20-energy\02-total\HydroEnergyTotalViewCtrl.cs">
       <SubType>UserControl</SubType>
     </Compile>
     <Compile Update="21-curve\HydroCurveEditCtrl.cs">
@@ -133,5 +118,8 @@
     <Compile Update="06-visual\01-reservoir\SetHydroReservoirDlg.cs">
       <SubType>Form</SubType>
     </Compile>
+    <Compile Update="loss-curve\07-control\HydroLossCurveCompareCtrl.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
   </ItemGroup>
 </Project>
\ No newline at end of file
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/energy-analy/01-core/HydroEnergyAnalyHelper.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/energy-analy/01-core/HydroEnergyAnalyHelper.cs
new file mode 100644
index 0000000..568a70e
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/energy-analy/01-core/HydroEnergyAnalyHelper.cs
@@ -0,0 +1,137 @@
+锘縩amespace Yw.WinFrmUI
+{
+    /// <summary>
+    /// 鑳芥晥鍒嗘瀽杈呭姪绫�
+    /// </summary>
+    public class HydroEnergyAnalyHelper
+    {
+        /// <summary>
+        /// 鍒涘缓
+        /// </summary>
+        public static HydroEnergyAnalyViewModel Create
+            (
+                Yw.Model.HydroModelInfo hydroInfo,
+                Yw.Vmo.HydroWorkingVmo working,
+                HydroCalcuResult calcuResult = null,
+                bool isHead = false,
+                List<Yw.Vmo.HydroEvaluationVmo> allEvaluationList = null
+            )
+        {
+            //楠岃瘉
+            if (hydroInfo == null)
+            {
+                return default;
+            }
+            if (hydroInfo.Pumps == null || hydroInfo.Pumps.Count < 1)
+            {
+                return default;
+            }
+            if (working == null)
+            {
+                return default;
+            }
+
+            var vm = new HydroEnergyAnalyViewModel();
+
+            //璁$畻缁撴灉
+            if (calcuResult == null)
+            {
+                hydroInfo.UpdateWorkingInfo(working.WorkingInfo);
+                calcuResult = hydroInfo.Calcu(Yw.EPAnet.CalcuMode.MinorLoss, isHead, allEvaluationList);
+                if (!calcuResult.Succeed)
+                {
+                    return vm;
+                }
+            }
+            var allCalcuVisualDict = calcuResult.GetVisualDict();
+
+            //閬嶅巻姘存车
+            vm.Items = new List<HydroEnergyAnalyItemViewModel>();
+            foreach (var pump in hydroInfo.Pumps)
+            {
+                var item = new HydroEnergyAnalyItemViewModel();
+                vm.Items.Add(item);
+                item.BeginGroup = string.IsNullOrEmpty(pump.BeginGroup) ? string.Empty : pump.BeginGroup;
+                item.Name = pump.Name;
+                item.Code = pump.Code;
+                item.RatedQ = pump.RatedQ;
+                item.RatedH = pump.RatedH;
+                item.RatedP = pump.RatedP;
+                item.RatedN = pump.RatedN;
+                item.RatedHz = pump.RatedHz;
+                var curveqh = hydroInfo.Curves?.Find(x => x.Code == pump.CurveQH);
+                if (curveqh != null)
+                {
+                    var qh_pts = curveqh.CurveData?.Select(x => new Yw.Geometry.Point2d(x.X, x.Y)).ToList();
+                    if (qh_pts != null && qh_pts.Count > 3)
+                    {
+                        item.RatedCurveQH = qh_pts;
+                    }
+                }
+                var curveqp = hydroInfo.Curves?.Find(x => x.Code == pump.CurveQP);
+                if (curveqp != null)
+                {
+                    var qp_pts = curveqp.CurveData?.Select(x => new Yw.Geometry.Point2d(x.X, x.Y)).ToList();
+                    if (qp_pts != null && qp_pts.Count > 3)
+                    {
+                        item.RatedCurveQP = qp_pts;
+                    }
+                }
+                var curveqe = hydroInfo.Curves?.Find(x => x.Code == pump.CurveQE);
+                if (curveqe != null)
+                {
+                    var qe_pts = curveqe.CurveData?.Select(x => new Yw.Geometry.Point2d(x.X, x.Y)).ToList();
+                    if (qe_pts != null && qe_pts.Count > 3)
+                    {
+                        item.RatedCurveQE = qe_pts;
+                    }
+                }
+
+                item.LinkStatus = pump.LinkStatus;
+                if (item.LinkStatus == Yw.Hydro.LinkStatus.Open)
+                {
+                    item.CurrentColor = HydroPumpCurveColorHelper.GetRandomColor(hydroInfo.Pumps.IndexOf(pump));
+                    item.CurrentN = Math.Round(item.RatedN * pump.SpeedRatio, 1);
+                    item.CurrentHz = Math.Round(item.RatedHz * pump.SpeedRatio, 1);
+                    var calcuPumpResult = allCalcuVisualDict?.GetValue(pump.Code) as HydroCalcuPumpResult;
+                    if (calcuPumpResult != null)
+                    {
+                        item.CurrentQ = calcuPumpResult.CalcuQ;
+                        item.CurrentH = calcuPumpResult.CalcuH;
+                        item.CurrentPr1 = calcuPumpResult.CalcuPr1;
+                        item.CurrentPr2 = calcuPumpResult.CalcuPr2;
+                        item.CurrentP = calcuPumpResult.CalcuP;
+                        item.CurrentE = calcuPumpResult.CalcuE;
+                    }
+                    if (item.RatedCurveQH != null)
+                    {
+                        var qh_pts = item.RatedCurveQH;
+                        var qh_run_pts = qh_pts.GetQHPointListByN(item.RatedHz, item.CurrentHz);
+                        item.CurrentCurveQH = qh_run_pts;
+                    }
+
+                    if (item.RatedCurveQP != null)
+                    {
+                        var qp_pts = item.RatedCurveQP;
+                        var qp_run_pts = qp_pts.GetQPPointListByN(item.RatedHz, item.CurrentHz);
+                        item.CurrentCurveQP = qp_pts;
+                    }
+
+                    if (item.RatedCurveQE != null)
+                    {
+                        var qe_pts = item.RatedCurveQE;
+                        var qe_run_pts = qe_pts.GetQEPointListByN(item.RatedHz, item.CurrentHz);
+                        item.CurrentCurveQE = qe_run_pts;
+                    }
+                }
+            }
+
+            vm.Total = new HydroEnergyAnalyTotalViewModel(vm.Items);
+            vm.Pipe = new HydroEnergyAnalyPipeViewModel(hydroInfo, allCalcuVisualDict);
+
+            return vm;
+        }
+
+
+    }
+}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/energy-analy/01-core/HydroEnergyAnalyItemViewModel.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/energy-analy/01-core/HydroEnergyAnalyItemViewModel.cs
new file mode 100644
index 0000000..68fb2d9
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/energy-analy/01-core/HydroEnergyAnalyItemViewModel.cs
@@ -0,0 +1,142 @@
+锘縩amespace Yw.WinFrmUI
+{
+    /// <summary>
+    /// 鑳芥晥鍒嗘瀽椤硅鍥�
+    /// </summary>
+    public class HydroEnergyAnalyItemViewModel
+    {
+        /// <summary>
+        /// 
+        /// </summary>
+        public HydroEnergyAnalyItemViewModel() { }
+
+        /// <summary>
+        /// 鍒嗙粍
+        /// </summary>
+        public string BeginGroup { get; set; }
+
+        /// <summary>
+        /// 鍚嶇О
+        /// </summary>
+        public string Name { get; set; }
+
+        /// <summary>
+        /// 缂栫爜
+        /// </summary>
+        public string Code { get; set; }
+
+        /// <summary>
+        /// 鍨嬪彿
+        /// </summary>
+        public string ModelType { get; set; }
+
+        /// <summary>
+        /// 棰濆畾娴侀噺
+        /// </summary>
+        public double RatedQ { get; set; }
+
+        /// <summary>
+        /// 棰濆畾鎵▼
+        /// </summary>
+        public double RatedH { get; set; }
+
+        /// <summary>
+        /// 棰濆畾鍔熺巼
+        /// </summary>
+        public double RatedP { get; set; }
+
+        /// <summary>
+        /// 棰濆畾杞��
+        /// </summary>
+        public double RatedN { get; set; }
+
+        /// <summary>
+        /// 棰濆畾棰戠巼
+        /// </summary>
+        public double RatedHz { get; set; }
+
+
+        /// <summary>
+        /// 棰濆畾娴侀噺鎵▼绾�
+        /// </summary>
+        public List<Yw.Geometry.Point2d> RatedCurveQH { get; set; }
+
+        /// <summary>
+        /// 棰濆畾娴侀噺鏁堢巼绾�
+        /// </summary>
+        public List<Yw.Geometry.Point2d> RatedCurveQE { get; set; }
+
+        /// <summary>
+        /// 棰濆畾娴侀噺鍔熺巼绾�
+        /// </summary>
+        public List<Yw.Geometry.Point2d> RatedCurveQP { get; set; }
+
+        /// <summary>
+        /// 杩愯鐘舵��
+        /// </summary>
+        public string LinkStatus { get; set; }
+
+        /// <summary>
+        /// 杩愯棰滆壊
+        /// </summary>
+        public Color CurrentColor { get; set; }
+
+        /// <summary>
+        /// 杩愯杞��
+        /// </summary>
+        public double CurrentN { get; set; }
+
+        /// <summary>
+        /// 杩愯棰戠巼
+        /// </summary>
+        public double CurrentHz { get; set; }
+
+        /// <summary>
+        /// 杩愯娴侀噺
+        /// </summary>
+        public double? CurrentQ { get; set; }
+
+        /// <summary>
+        /// 杩愯鎵▼
+        /// </summary>
+        public double? CurrentH { get; set; }
+
+        /// <summary>
+        /// 杩涘彛鍘嬪姏
+        /// </summary>
+        public double? CurrentPr1 { get; set; }
+
+        /// <summary>
+        /// 鍑哄彛鍘嬪姏
+        /// </summary>
+        public double? CurrentPr2 { get; set; }
+
+        /// <summary>
+        /// 杩愯鍔熺巼
+        /// </summary>
+        public double? CurrentP { get; set; }
+
+        /// <summary>
+        /// 杩愯鏁堢巼
+        /// </summary>
+        public double? CurrentE { get; set; }
+
+        /// <summary>
+        /// 杩愯娴侀噺鎵▼绾�
+        /// </summary>
+        public List<Yw.Geometry.Point2d> CurrentCurveQH { get; set; }
+
+        /// <summary>
+        /// 杩愯娴侀噺鏁堢巼绾�
+        /// </summary>
+        public List<Yw.Geometry.Point2d> CurrentCurveQE { get; set; }
+
+        /// <summary>
+        /// 杩愯娴侀噺鍔熺巼绾�
+        /// </summary>
+        public List<Yw.Geometry.Point2d> CurrentCurveQP { get; set; }
+
+
+
+    }
+}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/energy-analy/01-core/HydroEnergyAnalyViewModel.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/energy-analy/01-core/HydroEnergyAnalyViewModel.cs
new file mode 100644
index 0000000..639371f
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/energy-analy/01-core/HydroEnergyAnalyViewModel.cs
@@ -0,0 +1,29 @@
+锘縩amespace Yw.WinFrmUI
+{
+    /// <summary>
+    /// 鑳借�楄鍥�
+    /// </summary>
+    public class HydroEnergyAnalyViewModel
+    {
+
+        /// <summary>
+        /// 姹囨��
+        /// </summary>
+        public HydroEnergyAnalyTotalViewModel Total { get; set; }
+
+        /// <summary>
+        /// 绠¢亾
+        /// </summary>
+        public HydroEnergyAnalyPipeViewModel Pipe { get; set; }
+
+        /// <summary>
+        /// 瀛愮骇鍒楄〃
+        /// </summary>
+        public List<HydroEnergyAnalyItemViewModel> Items { get; set; }
+
+
+
+
+
+    }
+}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/energy-analy/01-total/HydroEnergyAnalyTotalViewModel.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/energy-analy/01-total/HydroEnergyAnalyTotalViewModel.cs
new file mode 100644
index 0000000..4bf9766
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/energy-analy/01-total/HydroEnergyAnalyTotalViewModel.cs
@@ -0,0 +1,56 @@
+锘縩amespace Yw.WinFrmUI
+{
+    /// <summary>
+    /// 鑳借�楀垎鏋愭�昏鍥�
+    /// </summary>
+    public class HydroEnergyAnalyTotalViewModel
+    {
+        /// <summary>
+        /// 
+        /// </summary>
+        public HydroEnergyAnalyTotalViewModel() { }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public HydroEnergyAnalyTotalViewModel(List<HydroEnergyAnalyItemViewModel> allItemList)
+        {
+            if (allItemList == null || allItemList.Count < 1)
+            {
+                return;
+            }
+            var qs = allItemList.Where(x => x.CurrentQ.HasValue).ToList();
+            if (qs != null && qs.Count > 0)
+            {
+                this.TotalQ = qs.Sum(x => x.CurrentQ.Value);
+            }
+            var ps = allItemList.Where(x => x.CurrentP.HasValue).ToList();
+            if (ps != null && ps.Count > 0)
+            {
+                this.TotalP = ps.Sum(x => x.CurrentP.Value);
+            }
+            var es = allItemList.Where(x => x.CurrentE.HasValue).ToList();
+            if (es != null && es.Count > 0)
+            {
+                this.TotalE = es.Average(x => x.CurrentE.Value);
+            }
+        }
+
+        /// <summary>
+        /// 鎬绘祦閲�
+        /// </summary>
+        public double? TotalQ { get; set; }
+
+        /// <summary>
+        /// 鎬诲姛鐜�
+        /// </summary>
+        public double? TotalP { get; set; }
+
+        /// <summary>
+        /// 鎬绘晥鐜�
+        /// </summary>
+        public double? TotalE { get; set; }
+
+
+    }
+}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/energy-analy/02-pipe/HydroEnergyAnalyPipeItemViewModel.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/energy-analy/02-pipe/HydroEnergyAnalyPipeItemViewModel.cs
new file mode 100644
index 0000000..1ed5e66
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/energy-analy/02-pipe/HydroEnergyAnalyPipeItemViewModel.cs
@@ -0,0 +1,49 @@
+锘縩amespace Yw.WinFrmUI
+{
+    /// <summary>
+    /// 鑳芥晥鍒嗘瀽绠¢亾椤硅鍥�
+    /// </summary>
+    public class HydroEnergyAnalyPipeItemViewModel
+    {
+        /// <summary>
+        /// 
+        /// </summary>
+        public HydroEnergyAnalyPipeItemViewModel() { }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public HydroEnergyAnalyPipeItemViewModel
+            (
+                Yw.Model.HydroModelInfo hydroInfo,
+                Dictionary<string, HydroCalcuVisualResult> allCalcuVisualDict,
+                string beginGroup
+            )
+        {
+            this.BeginGroup = string.IsNullOrEmpty(beginGroup) ? string.Empty : beginGroup;
+            this.StartH = hydroInfo.GetHead();
+            this.PipeQ = hydroInfo.GetPipeQ(allCalcuVisualDict);
+            this.PipeH = hydroInfo.GetPipeHead(allCalcuVisualDict);
+        }
+
+        /// <summary>
+        /// 鍒嗙粍
+        /// </summary>
+        public string BeginGroup { get; set; }
+
+        /// <summary>
+        /// 寮�濮嬫壃绋�
+        /// </summary>
+        public double StartH { get; set; }
+
+        /// <summary>
+        /// 绠¢亾娴侀噺
+        /// </summary>
+        public double? PipeQ { get; set; }
+
+        /// <summary>
+        /// 绠¢亾鎵▼
+        /// </summary>
+        public double? PipeH { get; set; }
+    }
+}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/energy-analy/02-pipe/HydroEnergyAnalyPipeViewModel.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/energy-analy/02-pipe/HydroEnergyAnalyPipeViewModel.cs
new file mode 100644
index 0000000..a41294f
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/energy-analy/02-pipe/HydroEnergyAnalyPipeViewModel.cs
@@ -0,0 +1,51 @@
+锘縩amespace Yw.WinFrmUI
+{
+    /// <summary>
+    /// 鑳芥晥鍒嗘瀽绠¢亾瑙嗗浘
+    /// </summary>
+    public class HydroEnergyAnalyPipeViewModel
+    {
+        /// <summary>
+        /// 
+        /// </summary>
+        public HydroEnergyAnalyPipeViewModel() { }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public HydroEnergyAnalyPipeViewModel
+            (
+                Yw.Model.HydroModelInfo hydroInfo,
+                Dictionary<string, HydroCalcuVisualResult> allCalcuVisualDict
+            )
+        {
+            if (hydroInfo == null)
+            {
+                return;
+            }
+            if (hydroInfo.Pumps == null || hydroInfo.Pumps.Count < 1)
+            {
+                return;
+            }
+            var beginGroups = hydroInfo.Pumps.Select(x => string.IsNullOrEmpty(x.BeginGroup) ? string.Empty : x.BeginGroup).Distinct().ToList();
+            this.Items = new List<HydroEnergyAnalyPipeItemViewModel>();
+            foreach (var beginGroup in beginGroups)
+            {
+                var item = new HydroEnergyAnalyPipeItemViewModel
+                (
+                    hydroInfo,
+                    allCalcuVisualDict,
+                    beginGroup
+                );
+                this.Items.Add(item);
+            }
+        }
+
+        /// <summary>
+        /// 瀛愮骇鍒楄〃
+        /// </summary>
+        public List<HydroEnergyAnalyPipeItemViewModel> Items { get; set; }
+
+
+    }
+}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/20-energy/02-total/HydroEnergyTotalViewCtrl.Designer.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/energy-analy/03-control/HydroEnergyAnalyTotalCtrl.Designer.cs
similarity index 78%
rename from WinFrmUI/Yw.WinFrmUI.Hydro.Core/20-energy/02-total/HydroEnergyTotalViewCtrl.Designer.cs
rename to WinFrmUI/Yw.WinFrmUI.Hydro.Core/energy-analy/03-control/HydroEnergyAnalyTotalCtrl.Designer.cs
index 5fdc204..1f4c220 100644
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/20-energy/02-total/HydroEnergyTotalViewCtrl.Designer.cs
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/energy-analy/03-control/HydroEnergyAnalyTotalCtrl.Designer.cs
@@ -1,6 +1,6 @@
 锘縩amespace Yw.WinFrmUI
 {
-    partial class HydroEnergyTotalViewCtrl
+    partial class HydroEnergyAnalyTotalCtrl
     {
         /// <summary> 
         /// Required designer variable.
@@ -34,9 +34,9 @@
             txtQ = new DevExpress.XtraEditors.TextEdit();
             Root = new DevExpress.XtraLayout.LayoutControlGroup();
             layoutControlItem1 = new DevExpress.XtraLayout.LayoutControlItem();
-            emptySpaceItem1 = new DevExpress.XtraLayout.EmptySpaceItem();
             layoutControlItem2 = new DevExpress.XtraLayout.LayoutControlItem();
             layoutControlItem3 = new DevExpress.XtraLayout.LayoutControlItem();
+            emptySpaceItem1 = new DevExpress.XtraLayout.EmptySpaceItem();
             ((ISupportInitialize)layoutControl1).BeginInit();
             layoutControl1.SuspendLayout();
             ((ISupportInitialize)txtE.Properties).BeginInit();
@@ -44,9 +44,9 @@
             ((ISupportInitialize)txtQ.Properties).BeginInit();
             ((ISupportInitialize)Root).BeginInit();
             ((ISupportInitialize)layoutControlItem1).BeginInit();
-            ((ISupportInitialize)emptySpaceItem1).BeginInit();
             ((ISupportInitialize)layoutControlItem2).BeginInit();
             ((ISupportInitialize)layoutControlItem3).BeginInit();
+            ((ISupportInitialize)emptySpaceItem1).BeginInit();
             SuspendLayout();
             // 
             // layoutControl1
@@ -57,38 +57,39 @@
             layoutControl1.Dock = DockStyle.Fill;
             layoutControl1.Location = new Point(0, 0);
             layoutControl1.Name = "layoutControl1";
+            layoutControl1.OptionsCustomizationForm.DesignTimeCustomizationFormPositionAndSize = new Rectangle(1177, 0, 650, 400);
             layoutControl1.Root = Root;
-            layoutControl1.Size = new Size(238, 78);
+            layoutControl1.Size = new Size(707, 33);
             layoutControl1.TabIndex = 0;
             layoutControl1.Text = "layoutControl1";
             // 
             // txtE
             // 
-            txtE.Location = new Point(54, 50);
+            txtE.Location = new Point(414, 6);
             txtE.Name = "txtE";
             txtE.Properties.ReadOnly = true;
             txtE.Properties.UseReadOnlyAppearance = false;
-            txtE.Size = new Size(182, 20);
+            txtE.Size = new Size(124, 20);
             txtE.StyleController = layoutControl1;
             txtE.TabIndex = 6;
             // 
             // txtP
             // 
-            txtP.Location = new Point(54, 26);
+            txtP.Location = new Point(234, 6);
             txtP.Name = "txtP";
             txtP.Properties.ReadOnly = true;
             txtP.Properties.UseReadOnlyAppearance = false;
-            txtP.Size = new Size(182, 20);
+            txtP.Size = new Size(124, 20);
             txtP.StyleController = layoutControl1;
             txtP.TabIndex = 5;
             // 
             // txtQ
             // 
-            txtQ.Location = new Point(54, 2);
+            txtQ.Location = new Point(54, 6);
             txtQ.Name = "txtQ";
             txtQ.Properties.ReadOnly = true;
             txtQ.Properties.UseReadOnlyAppearance = false;
-            txtQ.Size = new Size(182, 20);
+            txtQ.Size = new Size(124, 20);
             txtQ.StyleController = layoutControl1;
             txtQ.TabIndex = 4;
             // 
@@ -96,10 +97,10 @@
             // 
             Root.EnableIndentsWithoutBorders = DevExpress.Utils.DefaultBoolean.True;
             Root.GroupBordersVisible = false;
-            Root.Items.AddRange(new DevExpress.XtraLayout.BaseLayoutItem[] { layoutControlItem1, emptySpaceItem1, layoutControlItem2, layoutControlItem3 });
+            Root.Items.AddRange(new DevExpress.XtraLayout.BaseLayoutItem[] { layoutControlItem1, layoutControlItem2, layoutControlItem3, emptySpaceItem1 });
             Root.Name = "Root";
             Root.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
-            Root.Size = new Size(238, 78);
+            Root.Size = new Size(707, 33);
             Root.TextVisible = false;
             // 
             // layoutControlItem1
@@ -107,28 +108,24 @@
             layoutControlItem1.ContentVertAlignment = DevExpress.Utils.VertAlignment.Center;
             layoutControlItem1.Control = txtQ;
             layoutControlItem1.Location = new Point(0, 0);
+            layoutControlItem1.MaxSize = new Size(180, 24);
+            layoutControlItem1.MinSize = new Size(180, 24);
             layoutControlItem1.Name = "layoutControlItem1";
-            layoutControlItem1.Size = new Size(238, 24);
+            layoutControlItem1.Size = new Size(180, 33);
+            layoutControlItem1.SizeConstraintsType = DevExpress.XtraLayout.SizeConstraintsType.Custom;
             layoutControlItem1.Text = "鎬绘祦閲�:";
             layoutControlItem1.TextSize = new Size(40, 14);
-            // 
-            // emptySpaceItem1
-            // 
-            emptySpaceItem1.AllowHotTrack = false;
-            emptySpaceItem1.Location = new Point(0, 72);
-            emptySpaceItem1.MinSize = new Size(1, 1);
-            emptySpaceItem1.Name = "emptySpaceItem1";
-            emptySpaceItem1.Size = new Size(238, 6);
-            emptySpaceItem1.SizeConstraintsType = DevExpress.XtraLayout.SizeConstraintsType.Custom;
-            emptySpaceItem1.TextSize = new Size(0, 0);
             // 
             // layoutControlItem2
             // 
             layoutControlItem2.ContentVertAlignment = DevExpress.Utils.VertAlignment.Center;
             layoutControlItem2.Control = txtP;
-            layoutControlItem2.Location = new Point(0, 24);
+            layoutControlItem2.Location = new Point(180, 0);
+            layoutControlItem2.MaxSize = new Size(180, 24);
+            layoutControlItem2.MinSize = new Size(180, 24);
             layoutControlItem2.Name = "layoutControlItem2";
-            layoutControlItem2.Size = new Size(238, 24);
+            layoutControlItem2.Size = new Size(180, 33);
+            layoutControlItem2.SizeConstraintsType = DevExpress.XtraLayout.SizeConstraintsType.Custom;
             layoutControlItem2.Text = "鎬诲姛鐜�:";
             layoutControlItem2.TextSize = new Size(40, 14);
             // 
@@ -136,19 +133,32 @@
             // 
             layoutControlItem3.ContentVertAlignment = DevExpress.Utils.VertAlignment.Center;
             layoutControlItem3.Control = txtE;
-            layoutControlItem3.Location = new Point(0, 48);
+            layoutControlItem3.Location = new Point(360, 0);
+            layoutControlItem3.MaxSize = new Size(180, 24);
+            layoutControlItem3.MinSize = new Size(180, 24);
             layoutControlItem3.Name = "layoutControlItem3";
-            layoutControlItem3.Size = new Size(238, 24);
+            layoutControlItem3.Size = new Size(180, 33);
+            layoutControlItem3.SizeConstraintsType = DevExpress.XtraLayout.SizeConstraintsType.Custom;
             layoutControlItem3.Text = "鎬绘晥鐜�:";
             layoutControlItem3.TextSize = new Size(40, 14);
             // 
-            // HydroEnergyTotalViewCtrl
+            // emptySpaceItem1
+            // 
+            emptySpaceItem1.AllowHotTrack = false;
+            emptySpaceItem1.Location = new Point(540, 0);
+            emptySpaceItem1.MinSize = new Size(1, 1);
+            emptySpaceItem1.Name = "emptySpaceItem1";
+            emptySpaceItem1.Size = new Size(167, 33);
+            emptySpaceItem1.SizeConstraintsType = DevExpress.XtraLayout.SizeConstraintsType.Custom;
+            emptySpaceItem1.TextSize = new Size(0, 0);
+            // 
+            // HydroEnergyAnalyTotalCtrl
             // 
             AutoScaleDimensions = new SizeF(7F, 14F);
             AutoScaleMode = AutoScaleMode.Font;
             Controls.Add(layoutControl1);
-            Name = "HydroEnergyTotalViewCtrl";
-            Size = new Size(238, 78);
+            Name = "HydroEnergyAnalyTotalCtrl";
+            Size = new Size(707, 33);
             ((ISupportInitialize)layoutControl1).EndInit();
             layoutControl1.ResumeLayout(false);
             ((ISupportInitialize)txtE.Properties).EndInit();
@@ -156,9 +166,9 @@
             ((ISupportInitialize)txtQ.Properties).EndInit();
             ((ISupportInitialize)Root).EndInit();
             ((ISupportInitialize)layoutControlItem1).EndInit();
-            ((ISupportInitialize)emptySpaceItem1).EndInit();
             ((ISupportInitialize)layoutControlItem2).EndInit();
             ((ISupportInitialize)layoutControlItem3).EndInit();
+            ((ISupportInitialize)emptySpaceItem1).EndInit();
             ResumeLayout(false);
         }
 
@@ -169,9 +179,9 @@
         private DevExpress.XtraEditors.TextEdit txtQ;
         private DevExpress.XtraLayout.LayoutControlGroup Root;
         private DevExpress.XtraLayout.LayoutControlItem layoutControlItem1;
-        private DevExpress.XtraLayout.EmptySpaceItem emptySpaceItem1;
         private DevExpress.XtraLayout.LayoutControlItem layoutControlItem2;
         private DevExpress.XtraEditors.TextEdit txtE;
         private DevExpress.XtraLayout.LayoutControlItem layoutControlItem3;
+        private DevExpress.XtraLayout.EmptySpaceItem emptySpaceItem1;
     }
 }
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/energy-analy/03-control/HydroEnergyAnalyTotalCtrl.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/energy-analy/03-control/HydroEnergyAnalyTotalCtrl.cs
new file mode 100644
index 0000000..f2f9c79
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/energy-analy/03-control/HydroEnergyAnalyTotalCtrl.cs
@@ -0,0 +1,44 @@
+锘縩amespace Yw.WinFrmUI
+{
+    public partial class HydroEnergyAnalyTotalCtrl : DevExpress.XtraEditors.XtraUserControl
+    {
+        public HydroEnergyAnalyTotalCtrl()
+        {
+            InitializeComponent();
+            this.layoutControl1.SetupLayoutControl();
+        }
+
+        /// <summary>
+        /// 缁戝畾鏁版嵁
+        /// </summary>
+        public void SetBindingData(List<HydroEnergyAnalyItemViewModel> items)
+        {
+            var vm = new HydroEnergyAnalyTotalViewModel(items);
+            SetBindingData(vm);
+        }
+
+        /// <summary>
+        /// 缁戝畾鏁版嵁
+        /// </summary>
+        public void SetBindingData(HydroEnergyAnalyTotalViewModel vm)
+        {
+            if (vm == null)
+            {
+                return;
+            }
+            if (vm.TotalQ.HasValue)
+            {
+                this.txtQ.EditValue = $"{Math.Round(vm.TotalQ.Value, 1)}m鲁/h";
+            }
+            if (vm.TotalP.HasValue)
+            {
+                this.txtP.EditValue = $"{Math.Round(vm.TotalP.Value, 1)}kW";
+            }
+            if (vm.TotalE.HasValue)
+            {
+                this.txtE.EditValue = $"{Math.Round(vm.TotalE.Value, 1)}%";
+            }
+        }
+
+    }
+}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/20-energy/02-total/HydroEnergyTotalViewCtrl.resx b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/energy-analy/03-control/HydroEnergyAnalyTotalCtrl.resx
similarity index 100%
rename from WinFrmUI/Yw.WinFrmUI.Hydro.Core/20-energy/02-total/HydroEnergyTotalViewCtrl.resx
rename to WinFrmUI/Yw.WinFrmUI.Hydro.Core/energy-analy/03-control/HydroEnergyAnalyTotalCtrl.resx
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/13-print/loss-curve/helper/SimulationPrintLossCurveHelper.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/01-core/HydroLossCurveHelper.cs
similarity index 60%
rename from WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/13-print/loss-curve/helper/SimulationPrintLossCurveHelper.cs
rename to WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/01-core/HydroLossCurveHelper.cs
index 0745633..f8f42d5 100644
--- a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/13-print/loss-curve/helper/SimulationPrintLossCurveHelper.cs
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/01-core/HydroLossCurveHelper.cs
@@ -1,54 +1,48 @@
-锘縰sing Mapster;
-using Yw.EPAnet;
+锘縰sing Yw.EPAnet;
 using Yw.Hydro;
 using Yw.Model;
-using Yw.Vmo;
 
 
-namespace HStation.WinFrmUI
+namespace Yw.WinFrmUI
 {
     /// <summary>
     /// 
     /// </summary>
-    public class SimulationPrintLossCurveHelper
+    public class HydroLossCurveHelper
     {
         /// <summary>
-        /// 
+        /// 鍒涘缓
         /// </summary>
-        /// <returns></returns>
-        public static SimulationPrintLossCurveViewModel Create
+        public static HydroLossCurveViewModel Create
             (
                 Yw.Model.HydroModelInfo hydroInfo,
                 HydroWorkingVmo working,
-                HydroVisualInfo visual,
+                HydroNodeInfo node,
                 HydroCalcuResult calcuResult = null,
                 bool isHead = false,
                 List<HydroEvaluationVmo> allEvaluationList = null
             )
         {
-            var vm = new SimulationPrintLossCurveViewModel();
-
             //楠岃瘉
             if (hydroInfo == null)
             {
-                return vm;
+                return default;
             }
             if (working == null)
             {
-                return vm;
+                return default;
             }
-            if (visual == null)
+            if (node == null)
             {
-                return vm;
+                return default;
             }
 
-            //璧嬪�兼ā鍨嬩俊鎭紝閬垮厤骞叉壈
-            //var newHydroInfo = hydroInfo.Adapt<Yw.Model.HydroModelInfo>();
-            //newHydroInfo.UpdateWorkingInfo(working.WorkingInfo);
+            var vm = new HydroLossCurveViewModel();
 
             //璁$畻缁撴灉
             if (calcuResult == null)
             {
+                hydroInfo.UpdateWorkingInfo(working.WorkingInfo);
                 calcuResult = hydroInfo.Calcu(Yw.EPAnet.CalcuMode.MinorLoss, isHead, allEvaluationList);
                 if (!calcuResult.Succeed)
                 {
@@ -57,25 +51,24 @@
             }
             var allCalcuVisualDict = calcuResult.GetVisualDict();
 
-
-
+            //绠$嚎
             var network = hydroInfo.ToNetwork();
             if (network == null)
             {
                 return vm;
             }
-            var node = network.GetAllNodes()?.Find(x => x.Id == visual.Code);
-            if (node == null)
+            var epaNode = network.GetAllNodes()?.Find(x => x.Id == node.Code);
+            if (epaNode == null)
             {
                 return vm;
             }
-            var allStartPathList = network.AnalyzeUpstreamPath(node, calcuResult.EPAnetCalcuResult);
+            var allStartPathList = network.AnalyzeUpstreamPath(epaNode, calcuResult.EPAnetCalcuResult);
             if (allStartPathList == null)
             {
                 allStartPathList = new List<Link>();
             }
 
-            var allEndPathList = network.AnalyzeDownstreamPath(node, calcuResult.EPAnetCalcuResult);
+            var allEndPathList = network.AnalyzeDownstreamPath(epaNode, calcuResult.EPAnetCalcuResult);
             if (allEndPathList == null)
             {
                 allEndPathList = new List<Link>();
@@ -88,23 +81,25 @@
                 return vm;
             }
             var allVisualDict = hydroInfo.GetVisualDict();
-            vm.Items = new List<SimulationPrintLossCurveItemViewModel>();
+            vm.Items = new List<HydroLossCurveItemViewModel>();
             foreach (var epaLoss in allEpaLossList)
             {
                 var visualNode = allVisualDict.GetValue(epaLoss.Id);
                 if (visualNode != null)
                 {
-                    var item = new SimulationPrintLossCurveItemViewModel(epaLoss, visualNode);
+                    var item = new HydroLossCurveItemViewModel(epaLoss, visualNode);
                     vm.Items.Add(item);
                 }
             }
 
-            vm.Elev = new SimulationPrintLossCurveElevViewModel(vm.Items);
-            vm.Start = new SimulationPrintLossCurveStartViewModel(vm.Items);
-            vm.End = new SimulationPrintLossCurveEndViewModel(vm.Items);
-            vm.Total = new SimulationPrintLossCurveTotalViewModel(vm.Items);
+            vm.Elev = new HydroLossCurveElevViewModel(vm.Items);
+            vm.Start = new HydroLossCurveStartViewModel(vm.Items);
+            vm.End = new HydroLossCurveEndViewModel(vm.Items);
+            vm.Total = new HydroLossCurveTotalViewModel(vm.Items);
+            vm.Lower = new HydroLossCurveLowerViewModel(vm.Items);
 
             return vm;
+
         }
 
 
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/13-print/loss-curve/item/SimulationPrintLossCurveItemViewModel.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/01-core/HydroLossCurveItemViewModel.cs
similarity index 84%
rename from WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/13-print/loss-curve/item/SimulationPrintLossCurveItemViewModel.cs
rename to WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/01-core/HydroLossCurveItemViewModel.cs
index 832c604..257c333 100644
--- a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/13-print/loss-curve/item/SimulationPrintLossCurveItemViewModel.cs
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/01-core/HydroLossCurveItemViewModel.cs
@@ -4,26 +4,26 @@
 using System.Text;
 using System.Threading.Tasks;
 
-namespace HStation.WinFrmUI
+namespace Yw.WinFrmUI
 {
     /// <summary>
-    /// 
+    /// 鎹熷け鏇茬嚎椤硅鍥�
     /// </summary>
-    public class SimulationPrintLossCurveItemViewModel
+    public class HydroLossCurveItemViewModel
     {
 
         /// <summary>
         /// 
         /// </summary>
-        public SimulationPrintLossCurveItemViewModel() { }
+        public HydroLossCurveItemViewModel() { }
 
         /// <summary>
         /// 
         /// </summary>
-        public SimulationPrintLossCurveItemViewModel(Yw.EPAnet.LossNode rhs, Yw.Model.HydroVisualInfo visual)
+        public HydroLossCurveItemViewModel(Yw.EPAnet.LossNode rhs, Yw.Model.HydroVisualInfo visual)
         {
-            this.Code = rhs.Id;
             this.Name = visual.Name;
+            this.Code = rhs.Id;
             this.Elev = Math.Round(rhs.Elev, 2);
             this.StartHead = Math.Round(rhs.Head, 2);
             this.EndHead = Math.Round(rhs.Head - rhs.MinorLoss, 2);
@@ -32,16 +32,16 @@
         }
 
         /// <summary>
-        /// 缂栫爜
-        /// </summary>
-        public string Code { get; set; }
-
-        /// <summary>
         /// 鍚嶇О
         /// </summary>
         public string Name { get; set; }
 
         /// <summary>
+        /// 缂栫爜
+        /// </summary>
+        public string Code { get; set; }
+
+        /// <summary>
         /// 楂樼▼
         /// </summary>
         public double Elev { get; set; }
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/00-core/HydroLossCurvePointVieModel.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/01-core/HydroLossCurvePointVieModel.cs
similarity index 82%
rename from WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/00-core/HydroLossCurvePointVieModel.cs
rename to WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/01-core/HydroLossCurvePointVieModel.cs
index 52fc7a9..804db75 100644
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/00-core/HydroLossCurvePointVieModel.cs
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/01-core/HydroLossCurvePointVieModel.cs
@@ -14,31 +14,31 @@
         /// <summary>
         /// 
         /// </summary>
-        public HydroLossCurvePointVieModel(string code, string name, double x, double y)
+        public HydroLossCurvePointVieModel(string name, string code, double x, double y)
         {
-            this.Code = code;
             this.Name = name;
+            this.Code = code;
             this.X = Math.Round(x, 2);
             this.Y = Math.Round(y, 2);
         }
 
         /// <summary>
-        /// 
-        /// </summary>
-        public string Code { get; set; }
-
-        /// <summary>
-        /// 
+        /// 鍚嶇О
         /// </summary>
         public string Name { get; set; }
 
         /// <summary>
-        /// 
+        /// 缂栫爜
+        /// </summary>
+        public string Code { get; set; }
+
+        /// <summary>
+        /// X鍧愭爣
         /// </summary>
         public double X { get; set; }
 
         /// <summary>
-        /// Y
+        /// Y鍧愭爣
         /// </summary>
         public double Y { get; set; }
 
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/01-core/HydroLossCurveViewModel.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/01-core/HydroLossCurveViewModel.cs
new file mode 100644
index 0000000..da52e98
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/01-core/HydroLossCurveViewModel.cs
@@ -0,0 +1,41 @@
+锘縩amespace Yw.WinFrmUI
+{
+    /// <summary>
+    /// 鎹熷け鏇茬嚎瑙嗗浘
+    /// </summary>
+    public class HydroLossCurveViewModel
+    {
+        /// <summary>
+        /// 鏍囬珮
+        /// </summary>
+        public HydroLossCurveElevViewModel Elev { get; set; }
+
+        /// <summary>
+        /// 寮�濮�
+        /// </summary>
+        public HydroLossCurveStartViewModel Start { get; set; }
+
+        /// <summary>
+        /// 缁撴潫
+        /// </summary>
+        public HydroLossCurveEndViewModel End { get; set; }
+
+        /// <summary>
+        /// 鎬荤粨
+        /// </summary>
+        public HydroLossCurveTotalViewModel Total { get; set; }
+
+        /// <summary>
+        /// 闄嶄綆
+        /// </summary>
+        public HydroLossCurveLowerViewModel Lower { get; set; }
+
+        /// <summary>
+        /// 瀛愮骇闆嗗悎
+        /// </summary>
+        public List<HydroLossCurveItemViewModel> Items { get; set; }
+
+
+
+    }
+}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/02-elev/HydroLossCurveElevViewModel.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/02-elev/HydroLossCurveElevViewModel.cs
new file mode 100644
index 0000000..267ba1e
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/02-elev/HydroLossCurveElevViewModel.cs
@@ -0,0 +1,31 @@
+锘縩amespace Yw.WinFrmUI
+{
+    /// <summary>
+    /// 鎹熷け鏇茬嚎鏍囬珮瑙嗗浘
+    /// </summary>
+    public class HydroLossCurveElevViewModel
+    {
+        /// <summary>
+        /// 
+        /// </summary>
+        public HydroLossCurveElevViewModel() { }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public HydroLossCurveElevViewModel(List<HydroLossCurveItemViewModel> allItemList)
+        {
+            if (allItemList == null || allItemList.Count < 1)
+            {
+                return;
+            }
+            this.Items = allItemList?.Select(x => new HydroLossCurvePointVieModel(x.Name, x.Code, x.Distance, x.Elev)).ToList();
+        }
+
+        /// <summary>
+        /// 瀛愮骇闆嗗悎
+        /// </summary>
+        public List<HydroLossCurvePointVieModel> Items { get; set; }
+
+    }
+}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/03-start/HydroLossCurveStartViewModel.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/03-start/HydroLossCurveStartViewModel.cs
new file mode 100644
index 0000000..e387cde
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/03-start/HydroLossCurveStartViewModel.cs
@@ -0,0 +1,31 @@
+锘縩amespace Yw.WinFrmUI
+{
+    /// <summary>
+    /// 鎹熷け鏇茬嚎寮�濮嬭鍥�
+    /// </summary>
+    public class HydroLossCurveStartViewModel
+    {
+        /// <summary>
+        /// 
+        /// </summary>
+        public HydroLossCurveStartViewModel() { }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public HydroLossCurveStartViewModel(List<HydroLossCurveItemViewModel> allItemList)
+        {
+            if (allItemList == null || allItemList.Count < 1)
+            {
+                return;
+            }
+            this.Items = allItemList?.Select(x => new HydroLossCurvePointVieModel(x.Name, x.Code, x.Distance, x.StartHead)).ToList();
+        }
+
+        /// <summary>
+        /// 瀛愮骇闆嗗悎
+        /// </summary>
+        public List<HydroLossCurvePointVieModel> Items { get; set; }
+
+    }
+}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/04-end/HydroLossCurveEndViewModel.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/04-end/HydroLossCurveEndViewModel.cs
new file mode 100644
index 0000000..a711ff6
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/04-end/HydroLossCurveEndViewModel.cs
@@ -0,0 +1,31 @@
+锘縩amespace Yw.WinFrmUI
+{
+    /// <summary>
+    /// 鎹熷け鏇茬嚎缁撴潫瑙嗗浘
+    /// </summary>
+    public class HydroLossCurveEndViewModel
+    {
+        /// <summary>
+        /// 
+        /// </summary>
+        public HydroLossCurveEndViewModel() { }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public HydroLossCurveEndViewModel(List<HydroLossCurveItemViewModel> allItemList)
+        {
+            if (allItemList == null || allItemList.Count < 1)
+            {
+                return;
+            }
+            this.Items = allItemList?.Select(x => new HydroLossCurvePointVieModel(x.Name, x.Code, x.Distance, x.EndHead)).ToList();
+        }
+
+        /// <summary>
+        /// 瀛愮骇闆嗗悎
+        /// </summary>
+        public List<HydroLossCurvePointVieModel> Items { get; set; }
+
+    }
+}
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/13-print/loss-curve/total/SimulationPrintLossCurveTotalViewModel.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/05-total/HydroLossCurveTotalViewModel.cs
similarity index 61%
rename from WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/13-print/loss-curve/total/SimulationPrintLossCurveTotalViewModel.cs
rename to WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/05-total/HydroLossCurveTotalViewModel.cs
index f07d451..32de334 100644
--- a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/13-print/loss-curve/total/SimulationPrintLossCurveTotalViewModel.cs
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/05-total/HydroLossCurveTotalViewModel.cs
@@ -1,26 +1,20 @@
-锘縰sing System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace HStation.WinFrmUI
+锘縩amespace Yw.WinFrmUI
 {
     /// <summary>
     /// 
     /// </summary>
-    public class SimulationPrintLossCurveTotalViewModel
+    public class HydroLossCurveTotalViewModel
     {
 
         /// <summary>
         /// 
         /// </summary>
-        public SimulationPrintLossCurveTotalViewModel() { }
+        public HydroLossCurveTotalViewModel() { }
 
         /// <summary>
         /// 
         /// </summary>
-        public SimulationPrintLossCurveTotalViewModel(List<SimulationPrintLossCurveItemViewModel> allItemList)
+        public HydroLossCurveTotalViewModel(List<HydroLossCurveItemViewModel> allItemList)
         {
             if (allItemList == null || allItemList.Count < 1)
             {
@@ -36,17 +30,17 @@
         /// <summary>
         /// 姘村ご鎹熷け
         /// </summary>
-        public double? HeadLoss { get; set; }
+        public double HeadLoss { get; set; }
 
         /// <summary>
         /// 灞�閮ㄦ崯澶�
         /// </summary>
-        public double? MinorLoss { get; set; }
+        public double MinorLoss { get; set; }
 
         /// <summary>
         /// 娌跨▼鎹熷け
         /// </summary>
-        public double? FrictionLoss { get; set; }
+        public double FrictionLoss { get; set; }
 
     }
 }
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/06-lower/HydroLossCurveLowerViewModel.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/06-lower/HydroLossCurveLowerViewModel.cs
new file mode 100644
index 0000000..6c63eff
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/06-lower/HydroLossCurveLowerViewModel.cs
@@ -0,0 +1,36 @@
+锘縩amespace Yw.WinFrmUI
+{
+    /// <summary>
+    /// 鎹熷け鏇茬嚎涓嬮檷瑙嗗浘
+    /// </summary>
+    public class HydroLossCurveLowerViewModel
+    {
+        /// <summary>
+        /// 
+        /// </summary>
+        public HydroLossCurveLowerViewModel() { }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public HydroLossCurveLowerViewModel(List<HydroLossCurveItemViewModel> allItemList)
+        {
+            if (allItemList == null || allItemList.Count < 1)
+            {
+                return;
+            }
+            this.Items = new List<HydroLossCurvePointVieModel>();
+            foreach (var item in allItemList)
+            {
+                this.Items.Add(new HydroLossCurvePointVieModel(item.Name, item.Code, item.Distance, item.StartHead));
+                this.Items.Add(new HydroLossCurvePointVieModel(item.Name, item.Code, item.Distance, item.EndHead));
+            }
+        }
+
+        /// <summary>
+        /// 瀛愮骇闆嗗悎
+        /// </summary>
+        public List<HydroLossCurvePointVieModel> Items { get; set; }
+
+    }
+}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/07-control/HydroLossCurveCompareCtrl.Designer.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/07-control/HydroLossCurveCompareCtrl.Designer.cs
new file mode 100644
index 0000000..359327e
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/07-control/HydroLossCurveCompareCtrl.Designer.cs
@@ -0,0 +1,133 @@
+锘縩amespace Yw.WinFrmUI
+{
+    partial class HydroLossCurveCompareCtrl
+    {
+        /// <summary> 
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary> 
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Component Designer generated code
+
+        /// <summary> 
+        /// Required method for Designer support - do not modify 
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            components = new Container();
+            DevExpress.XtraCharts.XYDiagram xyDiagram1 = new DevExpress.XtraCharts.XYDiagram();
+            DevExpress.XtraCharts.Series series1 = new DevExpress.XtraCharts.Series();
+            DevExpress.XtraCharts.AreaSeriesView areaSeriesView1 = new DevExpress.XtraCharts.AreaSeriesView();
+            elevBindingSource = new BindingSource(components);
+            chartControl1 = new DevExpress.XtraCharts.ChartControl();
+            ((ISupportInitialize)elevBindingSource).BeginInit();
+            ((ISupportInitialize)chartControl1).BeginInit();
+            ((ISupportInitialize)xyDiagram1).BeginInit();
+            ((ISupportInitialize)series1).BeginInit();
+            ((ISupportInitialize)areaSeriesView1).BeginInit();
+            SuspendLayout();
+            // 
+            // elevBindingSource
+            // 
+            elevBindingSource.DataSource = typeof(HydroLossCurvePointVieModel);
+            // 
+            // chartControl1
+            // 
+            chartControl1.CrosshairOptions.ContentShowMode = DevExpress.XtraCharts.CrosshairContentShowMode.Label;
+            chartControl1.CrosshairOptions.ShowArgumentLabels = true;
+            chartControl1.CrosshairOptions.ShowValueLabels = true;
+            chartControl1.CrosshairOptions.ShowValueLine = true;
+            xyDiagram1.AxisX.CrosshairAxisLabelOptions.Visibility = DevExpress.Utils.DefaultBoolean.True;
+            xyDiagram1.AxisX.GridLines.Visible = true;
+            xyDiagram1.AxisX.MinorCount = 1;
+            xyDiagram1.AxisX.NumericScaleOptions.AutoGrid = false;
+            xyDiagram1.AxisX.Tickmarks.MinorVisible = false;
+            xyDiagram1.AxisX.Title.Text = "璺濈";
+            xyDiagram1.AxisX.Visibility = DevExpress.Utils.DefaultBoolean.True;
+            xyDiagram1.AxisX.VisibleInPanesSerializable = "-1";
+            xyDiagram1.AxisX.WholeRange.EndSideMargin = 0D;
+            xyDiagram1.AxisX.WholeRange.StartSideMargin = 0D;
+            xyDiagram1.AxisY.GridLines.Visible = false;
+            xyDiagram1.AxisY.MinorCount = 1;
+            xyDiagram1.AxisY.NumericScaleOptions.AutoGrid = false;
+            xyDiagram1.AxisY.Tickmarks.MinorVisible = false;
+            xyDiagram1.AxisY.VisibleInPanesSerializable = "-1";
+            xyDiagram1.EnableAxisXScrolling = true;
+            xyDiagram1.EnableAxisXZooming = true;
+            chartControl1.Diagram = xyDiagram1;
+            chartControl1.Dock = DockStyle.Fill;
+            chartControl1.Legend.AlignmentHorizontal = DevExpress.XtraCharts.LegendAlignmentHorizontal.Center;
+            chartControl1.Legend.Direction = DevExpress.XtraCharts.LegendDirection.LeftToRight;
+            chartControl1.Legend.LegendID = -1;
+            chartControl1.Legend.MarkerMode = DevExpress.XtraCharts.LegendMarkerMode.CheckBox;
+            chartControl1.Location = new Point(0, 0);
+            chartControl1.Name = "chartControl1";
+            chartControl1.Padding.Bottom = 10;
+            chartControl1.Padding.Left = 20;
+            chartControl1.Padding.Right = 10;
+            chartControl1.Padding.Top = 10;
+            series1.ArgumentDataMember = "X";
+            series1.CrosshairEnabled = DevExpress.Utils.DefaultBoolean.True;
+            series1.CrosshairHighlightPoints = DevExpress.Utils.DefaultBoolean.True;
+            series1.CrosshairLabelPattern = "楂樼▼:{V:N1}m";
+            series1.CrosshairLabelVisibility = DevExpress.Utils.DefaultBoolean.True;
+            series1.CrosshairTextOptions.EnableAntialiasing = DevExpress.Utils.DefaultBoolean.True;
+            series1.DataSource = elevBindingSource;
+            series1.LegendTextPattern = "楂樼▼";
+            series1.Name = "SeriesElev";
+            series1.SeriesID = 1;
+            series1.ToolTipHintDataMember = "Name";
+            series1.ToolTipSeriesPattern = "";
+            series1.ValueDataMembersSerializable = "Y";
+            areaSeriesView1.Color = Color.FromArgb(79, 129, 189);
+            areaSeriesView1.EmptyPointOptions.FillStyle.FillMode = DevExpress.XtraCharts.FillMode.Solid;
+            areaSeriesView1.Transparency = 0;
+            series1.View = areaSeriesView1;
+            chartControl1.SeriesSerializable = new DevExpress.XtraCharts.Series[]
+    {
+    series1
+    };
+            chartControl1.SeriesTemplate.ArgumentDataMember = "X";
+            chartControl1.SeriesTemplate.ToolTipHintDataMember = "Name";
+            chartControl1.SeriesTemplate.ValueDataMembersSerializable = "Y";
+            chartControl1.Size = new Size(861, 581);
+            chartControl1.TabIndex = 1;
+            chartControl1.ToolTipEnabled = DevExpress.Utils.DefaultBoolean.True;
+            chartControl1.ToolTipOptions.ShowForSeries = true;
+            chartControl1.CustomPaint += chartControl1_CustomPaint;
+            // 
+            // HydroLossCurveCompareCtrl
+            // 
+            AutoScaleDimensions = new SizeF(7F, 14F);
+            AutoScaleMode = AutoScaleMode.Font;
+            Controls.Add(chartControl1);
+            Name = "HydroLossCurveCompareCtrl";
+            Size = new Size(861, 581);
+            ((ISupportInitialize)elevBindingSource).EndInit();
+            ((ISupportInitialize)xyDiagram1).EndInit();
+            ((ISupportInitialize)areaSeriesView1).EndInit();
+            ((ISupportInitialize)series1).EndInit();
+            ((ISupportInitialize)chartControl1).EndInit();
+            ResumeLayout(false);
+        }
+
+        #endregion
+
+        private DevExpress.XtraCharts.ChartControl chartControl1;
+        private BindingSource elevBindingSource;
+    }
+}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/07-control/HydroLossCurveCompareCtrl.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/07-control/HydroLossCurveCompareCtrl.cs
new file mode 100644
index 0000000..4f9c4a0
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/07-control/HydroLossCurveCompareCtrl.cs
@@ -0,0 +1,304 @@
+锘縰sing DevExpress.Charts.Native;
+using DevExpress.Pdf.Native;
+using DevExpress.Utils.Drawing;
+using DevExpress.XtraCharts;
+using DevExpress.XtraCharts.Native;
+using DevExpress.XtraEditors;
+using Dm.Config;
+using Mapster;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Drawing.Drawing2D;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace Yw.WinFrmUI
+{
+    public partial class HydroLossCurveCompareCtrl : DevExpress.XtraEditors.XtraUserControl
+    {
+        public HydroLossCurveCompareCtrl()
+        {
+            InitializeComponent();
+        }
+
+        /// <summary>
+        /// 姘村姏鐐瑰嚮浜嬩欢
+        /// </summary>
+        public event Action<string> HydroClickEvent;
+
+        private Yw.Model.HydroModelInfo _hydroInfo = null;//姘村姏淇℃伅
+        private Dictionary<HydroWorkingVmo, HydroCalcuResult> _calcuWorkingDict = null;//宸ュ喌璁$畻瀛楀吀
+        private Yw.Model.HydroNodeInfo _node = null;//鑺傜偣
+
+        /// <summary>
+        /// 缁戝畾鏁版嵁
+        /// 璁$畻涓嶄細鏀瑰彉鍘熸湁姘村姏淇℃伅
+        /// </summary>
+        public void SetBindingData
+            (
+                Yw.Model.HydroModelInfo hydroInfo,
+                List<HydroWorkingVmo> allWorkingList,
+                Yw.Model.HydroNodeInfo node,
+                bool isHead = false,
+                List<HydroEvaluationVmo> allEvaluationList = null
+            )
+        {
+            if (hydroInfo == null)
+            {
+                return;
+            }
+            if (allWorkingList == null || allWorkingList.Count < 1)
+            {
+                return;
+            }
+            if (node == null)
+            {
+                return;
+            }
+            var rhs = hydroInfo.Adapt<Yw.Model.HydroModelInfo>();
+
+            var calcuWorkingDict = new Dictionary<HydroWorkingVmo, HydroCalcuResult>();
+            foreach (var working in allWorkingList)
+            {
+                rhs.UpdateWorkingInfo(working.WorkingInfo);
+                var calcuResult = rhs.Calcu(Yw.EPAnet.CalcuMode.MinorLoss, isHead, allEvaluationList);
+                calcuWorkingDict.Add(working, calcuResult);
+            }
+            SetBindingData(rhs, calcuWorkingDict, node);
+        }
+
+        /// <summary>
+        /// 缁戝畾鏁版嵁
+        /// </summary>
+        public void SetBindingData
+            (
+                Yw.Model.HydroModelInfo hydroInfo,
+                Dictionary<HydroWorkingVmo, HydroCalcuResult> calcuWorkingDict,
+                Yw.Model.HydroNodeInfo node
+            )
+        {
+            if (hydroInfo == null)
+            {
+                return;
+            }
+            if (calcuWorkingDict == null || calcuWorkingDict.Count < 1)
+            {
+                return;
+            }
+            if (node == null)
+            {
+                return;
+            }
+            _hydroInfo = hydroInfo;
+            _calcuWorkingDict = calcuWorkingDict;
+            _node = node;
+            List<HydroLossCurvePointVieModel> elevList = null;
+            foreach (var calcuWorking in calcuWorkingDict)
+            {
+                var vm = HydroLossCurveHelper.Create(hydroInfo, calcuWorking.Key, node, calcuWorking.Value);
+                if (vm == null)
+                {
+                    continue;
+                }
+                if (elevList == null)
+                {
+                    elevList = vm.Elev?.Items;
+                    if (elevList != null && elevList.Count > 0)
+                    {
+                        this.elevBindingSource.DataSource = elevList;
+                        this.elevBindingSource.ResetBindings(false);
+                    }
+                }
+                var series = new DevExpress.XtraCharts.Series();
+                var lineSeriesView = new DevExpress.XtraCharts.LineSeriesView();
+                series.View = lineSeriesView;
+                series.LegendTextPattern = calcuWorking.Key.Name;
+                series.Name = calcuWorking.Key.Name;
+                series.CrosshairEnabled = DevExpress.Utils.DefaultBoolean.True;
+                series.CrosshairHighlightPoints = DevExpress.Utils.DefaultBoolean.True;
+                series.CrosshairLabelPattern = calcuWorking.Key.Name + "鎬绘按澶�:{V:N1}m";
+                series.CrosshairLabelVisibility = DevExpress.Utils.DefaultBoolean.True;
+                series.CrosshairTextOptions.EnableAntialiasing = DevExpress.Utils.DefaultBoolean.True;
+                series.ToolTipSeriesPattern = "";
+                this.chartControl1.Series.Add(series);
+                if (vm.Lower != null && vm.Lower.Items != null && vm.Lower.Items.Count > 0)
+                {
+                    foreach (var item in vm.Lower.Items)
+                    {
+                        var seriesPoint = new SeriesPoint(item.X, item.Y);
+                        seriesPoint.Tag = item;
+                        series.Points.Add(seriesPoint);
+                    }
+                }
+                AutoFitAxisesY(vm.Items);
+            }
+            AutoFitAxisesX(elevList);
+
+        }
+
+        //鑷�傚簲鍒诲害X
+        private void AutoFitAxisesX(List<HydroLossCurvePointVieModel> items)
+        {
+            if (items == null || items.Count < 1)
+            {
+                return;
+            }
+            var diagram = this.chartControl1.Diagram as XYDiagram;
+
+            #region X杞�
+
+            var allDistances = items.Select(x => x.X).Distinct().ToList();
+            var distanceMax = allDistances.Max();
+            diagram.AxisX.Tickmarks.MinorVisible = false;
+            diagram.AxisX.WholeRange.SideMarginsValue = 0;
+            if (distanceMax <= 10)
+            {
+                var maxValue = Math.Ceiling(distanceMax);
+                diagram.AxisX.WholeRange.MinValue = 0;
+                diagram.AxisX.WholeRange.MaxValue = maxValue;
+                diagram.AxisX.NumericScaleOptions.GridSpacing = 1;
+            }
+            else if (distanceMax <= 50)
+            {
+                var maxValue = Math.Ceiling(distanceMax / 10);
+                diagram.AxisX.WholeRange.MinValue = 0;
+                diagram.AxisX.WholeRange.MaxValue = maxValue * 10;
+                diagram.AxisX.NumericScaleOptions.GridSpacing = 5;
+            }
+            else if (distanceMax <= 100)
+            {
+                var maxValue = Math.Ceiling(distanceMax / 10);
+                diagram.AxisX.WholeRange.MinValue = 0;
+                diagram.AxisX.WholeRange.MaxValue = maxValue * 10;
+                diagram.AxisX.NumericScaleOptions.GridSpacing = 10;
+            }
+            else if (distanceMax <= 500)
+            {
+                var maxValue = Math.Ceiling(distanceMax / 100);
+                diagram.AxisX.WholeRange.MinValue = 0;
+                diagram.AxisX.WholeRange.MaxValue = maxValue * 100;
+                diagram.AxisX.NumericScaleOptions.GridSpacing = 50;
+            }
+            else if (distanceMax <= 3000)
+            {
+                var maxValue = Math.Ceiling(distanceMax / 100);
+                diagram.AxisX.WholeRange.MinValue = 0;
+                diagram.AxisX.WholeRange.MaxValue = maxValue * 100;
+                diagram.AxisX.NumericScaleOptions.GridSpacing = 100;
+            }
+            else if (distanceMax <= 5000)
+            {
+                var maxValue = Math.Ceiling(distanceMax / 1000);
+                diagram.AxisX.WholeRange.MinValue = 0;
+                diagram.AxisX.WholeRange.MaxValue = maxValue * 1000;
+                diagram.AxisX.NumericScaleOptions.GridSpacing = 200;
+            }
+            else if (distanceMax <= 10000)
+            {
+                var maxValue = Math.Ceiling(distanceMax / 1000);
+                diagram.AxisX.WholeRange.MinValue = 0;
+                diagram.AxisX.WholeRange.MaxValue = maxValue * 1000;
+                diagram.AxisX.NumericScaleOptions.GridSpacing = 1000;
+            }
+            else
+            {
+
+            }
+
+            #endregion
+        }
+
+        //鑷�傚簲鍒诲害Y
+        private void AutoFitAxisesY(List<HydroLossCurveItemViewModel> items)
+        {
+            if (items == null || items.Count < 1)
+            {
+                return;
+            }
+            var diagram = this.chartControl1.Diagram as XYDiagram;
+
+
+            #region 鍘嬪姏
+
+            var allPressMinList = items.Select(x => Math.Min(Math.Min(x.StartHead, x.EndHead), x.Elev)).ToList();
+            var allPressMaxList = items.Select(x => Math.Max(Math.Max(x.StartHead, x.EndHead), x.Elev)).ToList();
+
+            var pressMin = allPressMinList.Min();
+            pressMin = Math.Min(pressMin, (double)diagram.AxisY.WholeRange.MinValue);
+            var pressMax = allPressMaxList.Max();
+            pressMax = Math.Max(pressMax, (double)diagram.AxisY.WholeRange.MaxValue);
+
+            diagram.AxisY.Tickmarks.MinorVisible = false;
+            diagram.AxisY.WholeRange.SideMarginsValue = 0;
+            diagram.AxisY.CrosshairAxisLabelOptions.EnableAntialiasing = DevExpress.Utils.DefaultBoolean.True;
+            if (pressMax <= 10)
+            {
+                diagram.AxisY.WholeRange.MinValue = Math.Floor(pressMin);
+                diagram.AxisY.WholeRange.MaxValue = 10;
+                diagram.AxisY.NumericScaleOptions.GridSpacing = 1;
+                diagram.AxisY.VisualRange.SetMinMaxValues(0, 10);
+            }
+            else if (pressMax <= 100)
+            {
+                var maxValue = Math.Ceiling(pressMax / 10);
+                diagram.AxisY.WholeRange.MinValue = Math.Floor(pressMin);
+                diagram.AxisY.WholeRange.MaxValue = maxValue * 10;
+                diagram.AxisY.NumericScaleOptions.GridSpacing = 5;
+                diagram.AxisY.VisualRange.SetMinMaxValues(0, maxValue * 10);
+            }
+            else if (pressMax <= 3000)
+            {
+                var maxValue = Math.Ceiling(pressMax / 100);
+                diagram.AxisY.WholeRange.MinValue = Math.Floor(pressMin);
+                diagram.AxisY.WholeRange.MaxValue = maxValue * 100;
+                diagram.AxisY.NumericScaleOptions.GridSpacing = 50;
+                diagram.AxisY.VisualRange.SetMinMaxValues(0, maxValue * 100);
+            }
+            else if (pressMax <= 6000)
+            {
+                var maxValue = Math.Ceiling(pressMax / 1000);
+                diagram.AxisY.WholeRange.MinValue = Math.Floor(pressMin);
+                diagram.AxisY.WholeRange.MaxValue = maxValue * 1000;
+                diagram.AxisY.NumericScaleOptions.GridSpacing = 100;
+                diagram.AxisY.VisualRange.SetMinMaxValues(0, maxValue * 1000);
+            }
+            else
+            {
+
+            }
+
+            #endregion
+        }
+
+        //鑷畾涔夌粯鐢�
+        private void chartControl1_CustomPaint(object sender, DevExpress.XtraCharts.CustomPaintEventArgs e)
+        {
+            DXCustomPaintEventArgs args = e as DXCustomPaintEventArgs;
+            if (args == null)
+            {
+                return;
+            }
+            GraphicsCache g = args.Cache;
+
+            var series = this.chartControl1.Series;
+            var lineSeries = series?.Where(x => x.SeriesView is LineSeriesView).ToList();
+            if (lineSeries == null || lineSeries.Count < 2)
+            {
+                return;
+            }
+
+
+
+
+
+
+        }
+
+
+    }
+}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/02-scale/01-catalog/HydroCatalogLossScaleChartCtrl.resx b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/07-control/HydroLossCurveCompareCtrl.resx
similarity index 96%
rename from WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/02-scale/01-catalog/HydroCatalogLossScaleChartCtrl.resx
rename to WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/07-control/HydroLossCurveCompareCtrl.resx
index e3e911f..6087d2e 100644
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/02-scale/01-catalog/HydroCatalogLossScaleChartCtrl.resx
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/07-control/HydroLossCurveCompareCtrl.resx
@@ -117,7 +117,7 @@
   <resheader name="writer">
     <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </resheader>
-  <metadata name="bindingSource1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>17, 17</value>
+  <metadata name="elevBindingSource.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>47, 30</value>
   </metadata>
 </root>
\ No newline at end of file
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/01-curve/HydroSingleWorkingLossCurveCtrl.Designer.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/07-control/HydroLossCurveCtrl.Designer.cs
similarity index 97%
rename from WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/01-curve/HydroSingleWorkingLossCurveCtrl.Designer.cs
rename to WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/07-control/HydroLossCurveCtrl.Designer.cs
index 5022f4c..391d011 100644
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/01-curve/HydroSingleWorkingLossCurveCtrl.Designer.cs
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/07-control/HydroLossCurveCtrl.Designer.cs
@@ -1,6 +1,6 @@
 锘縩amespace Yw.WinFrmUI
 {
-    partial class HydroSingleWorkingLossCurveCtrl
+    partial class HydroLossCurveCtrl
     {
         /// <summary> 
         /// Required designer variable.
@@ -155,12 +155,12 @@
             chartControl1.CustomDrawCrosshair += chartControl1_CustomDrawCrosshair;
             chartControl1.MouseClick += chartControl1_MouseClick;
             // 
-            // HydroSingleWorkingLossCurveCtrl
+            // HydroLossCurveCtrl
             // 
             AutoScaleDimensions = new SizeF(7F, 14F);
             AutoScaleMode = AutoScaleMode.Font;
             Controls.Add(chartControl1);
-            Name = "HydroSingleWorkingLossCurveCtrl";
+            Name = "HydroLossCurveCtrl";
             Size = new Size(848, 569);
             ((ISupportInitialize)lossBindingSource).EndInit();
             ((ISupportInitialize)elevBindingSource).EndInit();
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/01-curve/HydroSingleWorkingLossCurveCtrl.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/07-control/HydroLossCurveCtrl.cs
similarity index 72%
rename from WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/01-curve/HydroSingleWorkingLossCurveCtrl.cs
rename to WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/07-control/HydroLossCurveCtrl.cs
index 6bd3d08..0527ef9 100644
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/01-curve/HydroSingleWorkingLossCurveCtrl.cs
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/07-control/HydroLossCurveCtrl.cs
@@ -3,18 +3,19 @@
 using System.Data;
 using Yw.EPAnet;
 using Yw.Hydro;
+using Yw.Model;
 
 namespace Yw.WinFrmUI
 {
-    public partial class HydroSingleWorkingLossCurveCtrl : DevExpress.XtraEditors.XtraUserControl
+    public partial class HydroLossCurveCtrl : DevExpress.XtraEditors.XtraUserControl
     {
-        public HydroSingleWorkingLossCurveCtrl()
+        public HydroLossCurveCtrl()
         {
             InitializeComponent();
         }
 
         /// <summary>
-        /// 
+        /// 姘村姏鐐瑰嚮浜嬩欢
         /// </summary>
         public event Action<string> HydroClickEvent;
 
@@ -24,68 +25,33 @@
         public void SetBindingData
             (
                 Yw.Model.HydroModelInfo hydroInfo,
-                HydroCalcuResult calcuResult,
-                Yw.Model.HydroVisualInfo visual
+                HydroWorkingVmo working,
+                HydroNodeInfo node,
+                HydroCalcuResult calcuResult = null,
+                bool isHead = false,
+                List<Yw.Vmo.HydroEvaluationVmo> allEvaluationList = null
             )
         {
-            if (hydroInfo == null)
-            {
-                return;
-            }
-            var allVisualDict = hydroInfo.GetVisualDict();
-            var network = hydroInfo.ToNetwork();
-            if (network == null)
-            {
-                return;
-            }
-            var node = network.GetAllNodes()?.Find(x => x.Id == visual.Code);
-            if (node == null)
-            {
-                return;
-            }
-            var allPathList1 = network.AnalyzeUpstreamPath(node, calcuResult.EPAnetCalcuResult);
-            var allPathList2 = network.AnalyzeDownstreamPath(node, calcuResult.EPAnetCalcuResult);
-            var allPathList = allPathList1.Concat(allPathList2).ToList();
-            var allEpaLossList = network.GetChartNodeByPathLinks(allPathList, calcuResult.EPAnetCalcuResult);
-            var allNodeLossList = new List<HydroNodeLossViewModel>();
-            allEpaLossList?.ForEach(x =>
-            {
-                var visualNode = allVisualDict?.GetValue(x.Id);
-                if (visualNode != null)
-                {
-                    allNodeLossList.Add(new HydroNodeLossViewModel(x, visualNode));
-                }
-            });
-            SetBindingData(allNodeLossList);
+            var vm = HydroLossCurveHelper.Create(hydroInfo, working, node, calcuResult, isHead, allEvaluationList);
+            SetBindingData(vm);
         }
 
         /// <summary>
         /// 缁戝畾鏁版嵁
         /// </summary>
-        public void SetBindingData(List<HydroNodeLossViewModel> allNodeLossList)
+        public void SetBindingData(HydroLossCurveViewModel vm)
         {
-            AutoFitAxises(allNodeLossList);
-            var allElevList = allNodeLossList?.Select(x => new HydroLossCurvePointVieModel(x.Code, x.Name, x.Distance, x.Elev)).ToList();
-            this.elevBindingSource.DataSource = allElevList;
-            var allLossList = new List<HydroLossCurvePointVieModel>();
-            allNodeLossList?.ForEach(x =>
+            AutoFitAxises(vm?.Items);
+            this.elevBindingSource.DataSource = vm?.Elev?.Items;
+            this.elevBindingSource.ResetBindings(false);
+            this.lossBindingSource.DataSource = vm?.Lower?.Items;
+            this.lossBindingSource.ResetBindings(false);
+            if (vm?.Total != null)
             {
-                allLossList.Add(new HydroLossCurvePointVieModel(x.Code, x.Name, x.Distance, x.StartHead));
-                allLossList.Add(new HydroLossCurvePointVieModel(x.Code, x.Name, x.Distance, x.EndHead));
-            });
-            this.lossBindingSource.DataSource = allLossList;
-
-            if (allNodeLossList != null && allNodeLossList.Count > 0)
-            {
-                var startHead = allNodeLossList.Max(x => x.StartHead);
-                var endHead = allNodeLossList.Min(x => x.EndHead);
-                var allHeadLoss = startHead - endHead;
-                var allMinorLoss = allNodeLossList.Sum(x => x.MinorLoss);
-                var allForLoss = allHeadLoss - allMinorLoss;
                 var sb = new StringBuilder();
-                sb.AppendLine($"姘村ご鎹熷け:{allHeadLoss:N2}m");
-                sb.AppendLine($"灞�閮ㄦ崯澶�:{allMinorLoss:N2}m");
-                sb.AppendLine($"娌跨▼鎹熷け:{allForLoss:N2}m");
+                sb.AppendLine($"姘村ご鎹熷け:{vm?.Total.HeadLoss:N2}m");
+                sb.AppendLine($"灞�閮ㄦ崯澶�:{vm?.Total.MinorLoss:N2}m");
+                sb.AppendLine($"娌跨▼鎹熷け:{vm?.Total.FrictionLoss:N2}m");
                 var anno = this.chartControl1.AnnotationRepository[0] as DevExpress.XtraCharts.TextAnnotation;
                 anno.Text = sb.ToString();
                 anno.AutoSize = true;
@@ -93,9 +59,9 @@
         }
 
         //鑷姩閫傚簲鍒诲害
-        private void AutoFitAxises(List<HydroNodeLossViewModel> allNodeLossList)
+        private void AutoFitAxises(List<HydroLossCurveItemViewModel> items)
         {
-            if (allNodeLossList == null || allNodeLossList.Count < 1)
+            if (items == null || items.Count < 1)
             {
                 return;
             }
@@ -103,7 +69,7 @@
 
             #region X杞�
 
-            var allDistances = allNodeLossList.Select(x => x.Distance).Distinct().ToList();
+            var allDistances = items.Select(x => x.Distance).Distinct().ToList();
             var distanceMax = allDistances.Max();
             diagram.AxisX.Tickmarks.MinorVisible = false;
             diagram.AxisX.WholeRange.SideMarginsValue = 0;
@@ -165,8 +131,8 @@
 
             #region 鍘嬪姏
 
-            var allPressMinList = allNodeLossList.Select(x => Math.Min(Math.Min(x.StartHead, x.EndHead), x.Elev)).ToList();
-            var allPressMaxList = allNodeLossList.Select(x => Math.Max(Math.Max(x.StartHead, x.EndHead), x.Elev)).ToList();
+            var allPressMinList = items.Select(x => Math.Min(Math.Min(x.StartHead, x.EndHead), x.Elev)).ToList();
+            var allPressMaxList = items.Select(x => Math.Max(Math.Max(x.StartHead, x.EndHead), x.Elev)).ToList();
 
             var pressMin = allPressMinList.Min();
             var pressMax = allPressMaxList.Max();
@@ -222,13 +188,11 @@
             e.CrosshairLineElement.LineStyle.DashStyle = DashStyle.DashDot;
             e.CrosshairLineElement.LineStyle.Thickness = 3;
 
-
             // Specify the back color for the crosshair argument axis label. 
             foreach (CrosshairAxisLabelElement axisLabelElement in e.CrosshairAxisLabelElements)
             {
                 axisLabelElement.BackColor = Color.Blue;
                 axisLabelElement.Text = $"{axisLabelElement.AxisValue:N2}";
-
             }
 
             foreach (CrosshairElementGroup group in e.CrosshairElementGroups)
@@ -253,7 +217,6 @@
                 {
                     ele.AxisLabelElement.Text = $"{ele.AxisLabelElement.AxisValue:N1}";
                     ele.AxisLabelElement.DXFont = new DXFont(this.Font.Name, 6);
-                    //ele.AxisLabelElement.Visible = false; 
                 }
 
 
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/01-curve/HydroSingleWorkingLossCurveCtrl.resx b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/07-control/HydroLossCurveCtrl.resx
similarity index 100%
rename from WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/01-curve/HydroSingleWorkingLossCurveCtrl.resx
rename to WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/07-control/HydroLossCurveCtrl.resx
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/01-curve/HydroSingleWorkingLossCurveInteropCtrl.Designer.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/07-control/HydroLossCurveInteropCtrl.Designer.cs
similarity index 98%
rename from WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/01-curve/HydroSingleWorkingLossCurveInteropCtrl.Designer.cs
rename to WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/07-control/HydroLossCurveInteropCtrl.Designer.cs
index 003048c..004b28e 100644
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/01-curve/HydroSingleWorkingLossCurveInteropCtrl.Designer.cs
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/07-control/HydroLossCurveInteropCtrl.Designer.cs
@@ -1,6 +1,6 @@
 锘縩amespace Yw.WinFrmUI
 {
-    partial class HydroSingleWorkingLossCurveInteropCtrl
+    partial class HydroLossCurveInteropCtrl
     {
         /// <summary> 
         /// Required designer variable.
@@ -298,12 +298,12 @@
             emptySpaceItem1.SizeConstraintsType = DevExpress.XtraLayout.SizeConstraintsType.Custom;
             emptySpaceItem1.TextSize = new Size(0, 0);
             // 
-            // HydroSingleWorkingLossCurveInteropCtrl
+            // HydroLossCurveInteropCtrl
             // 
             AutoScaleDimensions = new SizeF(7F, 14F);
             AutoScaleMode = AutoScaleMode.Font;
             Controls.Add(layoutControl1);
-            Name = "HydroSingleWorkingLossCurveInteropCtrl";
+            Name = "HydroLossCurveInteropCtrl";
             Size = new Size(993, 731);
             ((ISupportInitialize)lossBindingSource).EndInit();
             ((ISupportInitialize)elevBindingSource).EndInit();
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/01-curve/HydroSingleWorkingLossCurveInteropCtrl.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/07-control/HydroLossCurveInteropCtrl.cs
similarity index 79%
rename from WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/01-curve/HydroSingleWorkingLossCurveInteropCtrl.cs
rename to WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/07-control/HydroLossCurveInteropCtrl.cs
index 2b42627..9c04b0e 100644
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/01-curve/HydroSingleWorkingLossCurveInteropCtrl.cs
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/07-control/HydroLossCurveInteropCtrl.cs
@@ -5,12 +5,13 @@
 using Yw.DAL.Basic;
 using Yw.EPAnet;
 using Yw.Hydro;
+using Yw.Model;
 
 namespace Yw.WinFrmUI
 {
-    public partial class HydroSingleWorkingLossCurveInteropCtrl : DevExpress.XtraEditors.XtraUserControl
+    public partial class HydroLossCurveInteropCtrl : DevExpress.XtraEditors.XtraUserControl
     {
-        public HydroSingleWorkingLossCurveInteropCtrl()
+        public HydroLossCurveInteropCtrl()
         {
             InitializeComponent();
             this.layoutControl1.SetupLayoutControl();
@@ -31,10 +32,10 @@
         /// </summary>
         public event Action HydroCancelSpecialDisplayEvent;
 
-
         private Yw.Model.HydroModelInfo _hydroInfo = null;//姘村姏淇℃伅
+        private HydroWorkingVmo _working = null;//宸ュ喌
+        private Yw.Model.HydroNodeInfo _node = null;//鑺傜偣
         private HydroCalcuResult _calcuResult = null;//璁$畻缁撴灉
-        private Yw.Model.HydroVisualInfo _visual = null;//鍙鏋勪欢
 
         /// <summary>
         /// 缁戝畾鏁版嵁
@@ -42,46 +43,53 @@
         public void SetBindingData
             (
                 Yw.Model.HydroModelInfo hydroInfo,
-                HydroCalcuResult calcuResult,
-                Yw.Model.HydroVisualInfo visual
+                HydroWorkingVmo working,
+                HydroNodeInfo node,
+                HydroCalcuResult calcuResult = null,
+                bool isHead = false,
+                List<Yw.Vmo.HydroEvaluationVmo> allEvaluationList = null
             )
         {
+            if (hydroInfo == null)
+            {
+                return;
+            }
+            if (working == null)
+            {
+                return;
+            }
+            if (node == null)
+            {
+                return;
+            }
             _hydroInfo = hydroInfo;
+            _working = working;
+            _node = node;
+            if (calcuResult == null)
+            {
+                hydroInfo.UpdateWorkingInfo(working.WorkingInfo);
+                calcuResult = hydroInfo.Calcu(Yw.EPAnet.CalcuMode.MinorLoss, isHead, allEvaluationList);
+            }
             _calcuResult = calcuResult;
-            _visual = visual;
-
             Analy();
         }
 
         /// <summary>
         /// 缁戝畾鏁版嵁
         /// </summary>
-        public void SetBindingData(List<HydroNodeLossViewModel> allNodeLossList)
+        private void SetBindingData(HydroLossCurveViewModel vm)
         {
-            AutoFitAxises(allNodeLossList);
-            var allElevList = allNodeLossList?.Select(x => new HydroLossCurvePointVieModel(x.Code, x.Name, x.Distance, x.Elev)).ToList();
-            this.elevBindingSource.DataSource = allElevList;
+            AutoFitAxises(vm?.Items);
+            this.elevBindingSource.DataSource = vm?.Elev?.Items;
             this.elevBindingSource.ResetBindings(false);
-            var allLossList = new List<HydroLossCurvePointVieModel>();
-            allNodeLossList?.ForEach(x =>
-            {
-                allLossList.Add(new HydroLossCurvePointVieModel(x.Code, x.Name, x.Distance, x.StartHead));
-                allLossList.Add(new HydroLossCurvePointVieModel(x.Code, x.Name, x.Distance, x.EndHead));
-            });
-            this.lossBindingSource.DataSource = allLossList;
+            this.lossBindingSource.DataSource = vm?.Lower?.Items;
             this.lossBindingSource.ResetBindings(false);
-
-            if (allNodeLossList != null && allNodeLossList.Count > 0)
+            if (vm?.Total != null)
             {
-                var startHead = allNodeLossList.Max(x => x.StartHead);
-                var endHead = allNodeLossList.Min(x => x.EndHead);
-                var allHeadLoss = startHead - endHead;
-                var allMinorLoss = allNodeLossList.Sum(x => x.MinorLoss);
-                var allForLoss = allHeadLoss - allMinorLoss;
                 var sb = new StringBuilder();
-                sb.AppendLine($"姘村ご鎹熷け:{allHeadLoss:N2}m");
-                sb.AppendLine($"灞�閮ㄦ崯澶�:{allMinorLoss:N2}m");
-                sb.AppendLine($"娌跨▼鎹熷け:{allForLoss:N2}m");
+                sb.AppendLine($"姘村ご鎹熷け:{vm?.Total.HeadLoss:N2}m");
+                sb.AppendLine($"灞�閮ㄦ崯澶�:{vm?.Total.MinorLoss:N2}m");
+                sb.AppendLine($"娌跨▼鎹熷け:{vm?.Total.FrictionLoss:N2}m");
                 var anno = this.chartControl1.AnnotationRepository[0] as DevExpress.XtraCharts.TextAnnotation;
                 anno.Text = sb.ToString();
                 anno.AutoSize = true;
@@ -89,9 +97,9 @@
         }
 
         //鑷姩閫傚簲鍒诲害
-        private void AutoFitAxises(List<HydroNodeLossViewModel> allNodeLossList)
+        private void AutoFitAxises(List<HydroLossCurveItemViewModel> items)
         {
-            if (allNodeLossList == null || allNodeLossList.Count < 1)
+            if (items == null || items.Count < 1)
             {
                 return;
             }
@@ -99,7 +107,7 @@
 
             #region X杞�
 
-            var allDistances = allNodeLossList.Select(x => x.Distance).Distinct().ToList();
+            var allDistances = items.Select(x => x.Distance).Distinct().ToList();
             var distanceMax = allDistances.Max();
             diagram.AxisX.Tickmarks.MinorVisible = false;
             diagram.AxisX.WholeRange.SideMarginsValue = 0;
@@ -161,8 +169,8 @@
 
             #region 鍘嬪姏
 
-            var allPressMinList = allNodeLossList.Select(x => Math.Min(Math.Min(x.StartHead, x.EndHead), x.Elev)).ToList();
-            var allPressMaxList = allNodeLossList.Select(x => Math.Max(Math.Max(x.StartHead, x.EndHead), x.Elev)).ToList();
+            var allPressMinList = items.Select(x => Math.Min(Math.Min(x.StartHead, x.EndHead), x.Elev)).ToList();
+            var allPressMaxList = items.Select(x => Math.Max(Math.Max(x.StartHead, x.EndHead), x.Elev)).ToList();
 
             var pressMin = allPressMinList.Min();
             var pressMax = allPressMaxList.Max();
@@ -224,7 +232,6 @@
             {
                 axisLabelElement.BackColor = Color.Blue;
                 axisLabelElement.Text = $"{axisLabelElement.AxisValue:N2}";
-
             }
 
             foreach (CrosshairElementGroup group in e.CrosshairElementGroups)
@@ -249,7 +256,6 @@
                 {
                     ele.AxisLabelElement.Text = $"{ele.AxisLabelElement.AxisValue:N1}";
                     ele.AxisLabelElement.DXFont = new DXFont(this.Font.Name, 6);
-                    //ele.AxisLabelElement.Visible = false; 
                 }
 
 
@@ -322,20 +328,32 @@
             {
                 return;
             }
+            if (_working == null)
+            {
+                return;
+            }
+            if (_node == null)
+            {
+                return;
+            }
+            if (_calcuResult == null)
+            {
+                return;
+            }
             var network = _hydroInfo.ToNetwork();
             if (network == null)
             {
                 return;
             }
-            var node = network.GetAllNodes()?.Find(x => x.Id == _visual?.Code);
-            if (node == null)
+            var epaNode = network.GetAllNodes()?.Find(x => x.Id == _node.Code);
+            if (epaNode == null)
             {
                 return;
             }
             var allStartPathList = new List<Link>();
             if (this.ckStart.Checked)
             {
-                allStartPathList = network.AnalyzeUpstreamPath(node, _calcuResult?.EPAnetCalcuResult);
+                allStartPathList = network.AnalyzeUpstreamPath(epaNode, _calcuResult?.EPAnetCalcuResult);
                 if (allStartPathList == null)
                 {
                     allStartPathList = new List<Link>();
@@ -344,7 +362,7 @@
             var allEndPathList = new List<Link>();
             if (this.ckEnd.Checked)
             {
-                allEndPathList = network.AnalyzeDownstreamPath(node, _calcuResult?.EPAnetCalcuResult);
+                allEndPathList = network.AnalyzeDownstreamPath(epaNode, _calcuResult?.EPAnetCalcuResult);
                 if (allEndPathList == null)
                 {
                     allEndPathList = new List<Link>();
@@ -353,22 +371,30 @@
             var allPathList = allStartPathList.Concat(allEndPathList).ToList();
             var allEpaLossList = network.GetChartNodeByPathLinks(allPathList, _calcuResult?.EPAnetCalcuResult);
             var allVisualDict = _hydroInfo.GetVisualDict();
-            var allNodeLossList = new List<HydroNodeLossViewModel>();
+
+            var vm = new HydroLossCurveViewModel();
+            vm.Items = new List<HydroLossCurveItemViewModel>();
             allEpaLossList?.ForEach(x =>
             {
                 var visualNode = allVisualDict?.GetValue(x.Id);
                 if (visualNode != null)
                 {
-                    allNodeLossList.Add(new HydroNodeLossViewModel(x, visualNode));
+                    vm.Items.Add(new HydroLossCurveItemViewModel(x, visualNode));
                 }
             });
-            SetBindingData(allNodeLossList);
+            vm.Elev = new HydroLossCurveElevViewModel(vm.Items);
+            vm.Start = new HydroLossCurveStartViewModel(vm.Items);
+            vm.End = new HydroLossCurveEndViewModel(vm.Items);
+            vm.Lower = new HydroLossCurveLowerViewModel(vm.Items);
+            vm.Total = new HydroLossCurveTotalViewModel(vm.Items);
+
+            SetBindingData(vm);
 
             if (this.ckSpecial.Checked)
             {
                 var allCodeList = new List<string>();
                 allPathList?.ForEach(x => allCodeList.Add(x.Id));
-                allNodeLossList?.ForEach(x => allCodeList.Add(x.Code));
+                vm.Items?.ForEach(x => allCodeList.Add(x.Code));
                 this.HydroSpecialDisplayEvent?.Invoke(allCodeList);
             }
             else
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/01-curve/HydroSingleWorkingLossCurveInteropCtrl.resx b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/07-control/HydroLossCurveInteropCtrl.resx
similarity index 98%
rename from WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/01-curve/HydroSingleWorkingLossCurveInteropCtrl.resx
rename to WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/07-control/HydroLossCurveInteropCtrl.resx
index e760b41..9471e03 100644
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/01-curve/HydroSingleWorkingLossCurveInteropCtrl.resx
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/07-control/HydroLossCurveInteropCtrl.resx
@@ -1,7 +1,7 @@
 锘�<?xml version="1.0" encoding="utf-8"?>
 <root>
   <!--
-    Microsoft ResX Schema
+    Microsoft ResX Schema 
 
     Version 2.0
 
@@ -48,7 +48,7 @@
     value   : The object must be serialized with
             : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
             : and then encoded with base64 encoding.
-
+    
     mimetype: application/x-microsoft.net.object.soap.base64
     value   : The object must be serialized with
             : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/01-curve/HydroSingleWorkingLossCurveDlg.Designer.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/08-dlg/HydroLossCurveDlg.Designer.cs
similarity index 80%
rename from WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/01-curve/HydroSingleWorkingLossCurveDlg.Designer.cs
rename to WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/08-dlg/HydroLossCurveDlg.Designer.cs
index 577c1b3..20246ac 100644
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/01-curve/HydroSingleWorkingLossCurveDlg.Designer.cs
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/08-dlg/HydroLossCurveDlg.Designer.cs
@@ -1,6 +1,6 @@
 锘縩amespace Yw.WinFrmUI
 {
-    partial class HydroSingleWorkingLossCurveDlg
+    partial class HydroLossCurveDlg
     {
         /// <summary>
         /// Required designer variable.
@@ -31,7 +31,7 @@
             ribbon = new DevExpress.XtraBars.Ribbon.RibbonControl();
             ribbonPage1 = new DevExpress.XtraBars.Ribbon.RibbonPage();
             ribbonPageGroup1 = new DevExpress.XtraBars.Ribbon.RibbonPageGroup();
-            hydroSingleWorkingLossCurveCtrl1 = new HydroSingleWorkingLossCurveCtrl();
+            hydroLossCurveCtrl1 = new HydroLossCurveCtrl();
             ((ISupportInitialize)ribbon).BeginInit();
             SuspendLayout();
             // 
@@ -58,23 +58,23 @@
             ribbonPageGroup1.Name = "ribbonPageGroup1";
             ribbonPageGroup1.Text = "ribbonPageGroup1";
             // 
-            // hydroSingleLossCurveCtrl1
+            // hydroLossCurveCtrl1
             // 
-            hydroSingleWorkingLossCurveCtrl1.Dock = DockStyle.Fill;
-            hydroSingleWorkingLossCurveCtrl1.Location = new Point(0, 32);
-            hydroSingleWorkingLossCurveCtrl1.Name = "hydroSingleLossCurveCtrl1";
-            hydroSingleWorkingLossCurveCtrl1.Size = new Size(886, 555);
-            hydroSingleWorkingLossCurveCtrl1.TabIndex = 4;
+            hydroLossCurveCtrl1.Dock = DockStyle.Fill;
+            hydroLossCurveCtrl1.Location = new Point(0, 32);
+            hydroLossCurveCtrl1.Name = "hydroLossCurveCtrl1";
+            hydroLossCurveCtrl1.Size = new Size(886, 555);
+            hydroLossCurveCtrl1.TabIndex = 6;
             // 
-            // HydroSingleLossCurveDlg
+            // HydroLossCurveDlg
             // 
             AutoScaleDimensions = new SizeF(7F, 14F);
             AutoScaleMode = AutoScaleMode.Font;
             ClientSize = new Size(886, 587);
-            Controls.Add(hydroSingleWorkingLossCurveCtrl1);
+            Controls.Add(hydroLossCurveCtrl1);
             Controls.Add(ribbon);
             FormBorderStyle = FormBorderStyle.SizableToolWindow;
-            Name = "HydroSingleLossCurveDlg";
+            Name = "HydroLossCurveDlg";
             Ribbon = ribbon;
             RibbonVisibility = DevExpress.XtraBars.Ribbon.RibbonVisibility.Hidden;
             StartPosition = FormStartPosition.CenterParent;
@@ -89,6 +89,6 @@
         private DevExpress.XtraBars.Ribbon.RibbonControl ribbon;
         private DevExpress.XtraBars.Ribbon.RibbonPage ribbonPage1;
         private DevExpress.XtraBars.Ribbon.RibbonPageGroup ribbonPageGroup1;
-        private HydroSingleWorkingLossCurveCtrl hydroSingleWorkingLossCurveCtrl1;
+        private HydroLossCurveCtrl hydroLossCurveCtrl1;
     }
 }
\ No newline at end of file
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/08-dlg/HydroLossCurveDlg.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/08-dlg/HydroLossCurveDlg.cs
new file mode 100644
index 0000000..a7eb1c6
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/08-dlg/HydroLossCurveDlg.cs
@@ -0,0 +1,51 @@
+锘縰sing Yw.Model;
+
+namespace Yw.WinFrmUI
+{
+    public partial class HydroLossCurveDlg : DevExpress.XtraBars.Ribbon.RibbonForm
+    {
+        public HydroLossCurveDlg()
+        {
+            InitializeComponent();
+            this.IconOptions.Icon = Yw.WinFrmUI.GlobalParas.AppIcon;
+            this.hydroLossCurveCtrl1.HydroClickEvent += HydroLossCurveCtrl1_HydroClickEvent; ;
+        }
+
+        /// <summary>
+        /// 姘村姏鐐瑰嚮浜嬩欢
+        /// </summary>
+        public event Action<string> HydroClickEvent;
+
+        /// <summary>
+        /// 缁戝畾鏁版嵁
+        /// </summary>
+        public void SetBindingData
+            (
+                Yw.Model.HydroModelInfo hydroInfo,
+                HydroWorkingVmo working,
+                HydroNodeInfo node,
+                HydroCalcuResult calcuResult = null,
+                bool isHead = false,
+                List<Yw.Vmo.HydroEvaluationVmo> allEvaluationList = null
+            )
+        {
+            this.hydroLossCurveCtrl1.SetBindingData(hydroInfo, working, node, calcuResult, isHead, allEvaluationList);
+        }
+
+        /// <summary>
+        /// 缁戝畾鏁版嵁
+        /// </summary>
+        public void SetBindingData(HydroLossCurveViewModel vm)
+        {
+            this.hydroLossCurveCtrl1.SetBindingData(vm);
+        }
+
+        //姘村姏鐐瑰嚮浜嬩欢
+        private void HydroLossCurveCtrl1_HydroClickEvent(string obj)
+        {
+            this.HydroClickEvent?.Invoke(obj);
+        }
+
+
+    }
+}
\ No newline at end of file
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/01-curve/HydroMultiWorkingLossCurveDlg.resx b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/08-dlg/HydroLossCurveDlg.resx
similarity index 100%
rename from WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/01-curve/HydroMultiWorkingLossCurveDlg.resx
rename to WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/08-dlg/HydroLossCurveDlg.resx
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/09-working/HydroLossCurveMultiWorkingDlg.Designer.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/09-working/HydroLossCurveMultiWorkingDlg.Designer.cs
new file mode 100644
index 0000000..3dbc5f9
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/09-working/HydroLossCurveMultiWorkingDlg.Designer.cs
@@ -0,0 +1,255 @@
+锘縩amespace Yw.WinFrmUI
+{
+    partial class HydroLossCurveMultiWorkingDlg
+    {
+        /// <summary>
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary>
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Windows Form Designer generated code
+
+        /// <summary>
+        /// Required method for Designer support - do not modify
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            ComponentResourceManager resources = new ComponentResourceManager(typeof(HydroLossCurveMultiWorkingDlg));
+            ribbon = new DevExpress.XtraBars.Ribbon.RibbonControl();
+            ribbonPage1 = new DevExpress.XtraBars.Ribbon.RibbonPage();
+            ribbonPageGroup1 = new DevExpress.XtraBars.Ribbon.RibbonPageGroup();
+            layoutControl1 = new DevExpress.XtraLayout.LayoutControl();
+            hydroLossCurveCtrl1 = new HydroLossCurveCtrl();
+            hydroWorkingListViewCtrl1 = new HydroWorkingListViewCtrl();
+            Root = new DevExpress.XtraLayout.LayoutControlGroup();
+            groupForWorkingList = new DevExpress.XtraLayout.LayoutControlGroup();
+            layoutControlItem1 = new DevExpress.XtraLayout.LayoutControlItem();
+            splitter = new DevExpress.XtraLayout.SplitterItem();
+            itemForLossCurve = new DevExpress.XtraLayout.LayoutControlItem();
+            navigationFrame1 = new DevExpress.XtraBars.Navigation.NavigationFrame();
+            navigationPage1 = new DevExpress.XtraBars.Navigation.NavigationPage();
+            navigationPage2 = new DevExpress.XtraBars.Navigation.NavigationPage();
+            hydroLossCurveCompareCtrl1 = new HydroLossCurveCompareCtrl();
+            barBtnChange = new DevExpress.XtraBars.BarButtonItem();
+            ((ISupportInitialize)ribbon).BeginInit();
+            ((ISupportInitialize)layoutControl1).BeginInit();
+            layoutControl1.SuspendLayout();
+            ((ISupportInitialize)Root).BeginInit();
+            ((ISupportInitialize)groupForWorkingList).BeginInit();
+            ((ISupportInitialize)layoutControlItem1).BeginInit();
+            ((ISupportInitialize)splitter).BeginInit();
+            ((ISupportInitialize)itemForLossCurve).BeginInit();
+            ((ISupportInitialize)navigationFrame1).BeginInit();
+            navigationFrame1.SuspendLayout();
+            navigationPage1.SuspendLayout();
+            navigationPage2.SuspendLayout();
+            SuspendLayout();
+            // 
+            // ribbon
+            // 
+            ribbon.CaptionBarItemLinks.Add(barBtnChange);
+            ribbon.ExpandCollapseItem.Id = 0;
+            ribbon.Items.AddRange(new DevExpress.XtraBars.BarItem[] { ribbon.ExpandCollapseItem, barBtnChange });
+            ribbon.Location = new Point(0, 0);
+            ribbon.MaxItemId = 2;
+            ribbon.Name = "ribbon";
+            ribbon.Pages.AddRange(new DevExpress.XtraBars.Ribbon.RibbonPage[] { ribbonPage1 });
+            ribbon.RibbonCaptionAlignment = DevExpress.XtraBars.Ribbon.RibbonCaptionAlignment.Left;
+            ribbon.ShowDisplayOptionsMenuButton = DevExpress.Utils.DefaultBoolean.False;
+            ribbon.Size = new Size(994, 32);
+            // 
+            // ribbonPage1
+            // 
+            ribbonPage1.Groups.AddRange(new DevExpress.XtraBars.Ribbon.RibbonPageGroup[] { ribbonPageGroup1 });
+            ribbonPage1.Name = "ribbonPage1";
+            ribbonPage1.Text = "ribbonPage1";
+            // 
+            // ribbonPageGroup1
+            // 
+            ribbonPageGroup1.Name = "ribbonPageGroup1";
+            ribbonPageGroup1.Text = "ribbonPageGroup1";
+            // 
+            // layoutControl1
+            // 
+            layoutControl1.Controls.Add(hydroLossCurveCtrl1);
+            layoutControl1.Controls.Add(hydroWorkingListViewCtrl1);
+            layoutControl1.Dock = DockStyle.Fill;
+            layoutControl1.Location = new Point(0, 0);
+            layoutControl1.Name = "layoutControl1";
+            layoutControl1.OptionsCustomizationForm.DesignTimeCustomizationFormPositionAndSize = new Rectangle(551, 346, 650, 400);
+            layoutControl1.Root = Root;
+            layoutControl1.Size = new Size(994, 573);
+            layoutControl1.TabIndex = 1;
+            layoutControl1.Text = "layoutControl1";
+            // 
+            // hydroLossCurveCtrl1
+            // 
+            hydroLossCurveCtrl1.Location = new Point(177, 2);
+            hydroLossCurveCtrl1.Name = "hydroLossCurveCtrl1";
+            hydroLossCurveCtrl1.Size = new Size(815, 569);
+            hydroLossCurveCtrl1.TabIndex = 5;
+            // 
+            // hydroWorkingListViewCtrl1
+            // 
+            hydroWorkingListViewCtrl1.BorderVisible = false;
+            hydroWorkingListViewCtrl1.Location = new Point(3, 24);
+            hydroWorkingListViewCtrl1.Name = "hydroWorkingListViewCtrl1";
+            hydroWorkingListViewCtrl1.Size = new Size(159, 546);
+            hydroWorkingListViewCtrl1.TabIndex = 0;
+            // 
+            // Root
+            // 
+            Root.EnableIndentsWithoutBorders = DevExpress.Utils.DefaultBoolean.True;
+            Root.GroupBordersVisible = false;
+            Root.Items.AddRange(new DevExpress.XtraLayout.BaseLayoutItem[] { groupForWorkingList, splitter, itemForLossCurve });
+            Root.Name = "Root";
+            Root.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
+            Root.Size = new Size(994, 573);
+            Root.TextVisible = false;
+            // 
+            // groupForWorkingList
+            // 
+            groupForWorkingList.Items.AddRange(new DevExpress.XtraLayout.BaseLayoutItem[] { layoutControlItem1 });
+            groupForWorkingList.Location = new Point(0, 0);
+            groupForWorkingList.Name = "groupForWorkingList";
+            groupForWorkingList.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
+            groupForWorkingList.Size = new Size(165, 573);
+            groupForWorkingList.Text = "宸ュ喌鍒楄〃";
+            // 
+            // layoutControlItem1
+            // 
+            layoutControlItem1.Control = hydroWorkingListViewCtrl1;
+            layoutControlItem1.Location = new Point(0, 0);
+            layoutControlItem1.Name = "layoutControlItem1";
+            layoutControlItem1.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
+            layoutControlItem1.Size = new Size(159, 546);
+            layoutControlItem1.TextSize = new Size(0, 0);
+            layoutControlItem1.TextVisible = false;
+            // 
+            // splitter
+            // 
+            splitter.AllowHotTrack = true;
+            splitter.Location = new Point(165, 0);
+            splitter.Name = "splitter";
+            splitter.Size = new Size(10, 573);
+            // 
+            // itemForLossCurve
+            // 
+            itemForLossCurve.Control = hydroLossCurveCtrl1;
+            itemForLossCurve.Location = new Point(175, 0);
+            itemForLossCurve.Name = "itemForLossCurve";
+            itemForLossCurve.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
+            itemForLossCurve.Size = new Size(819, 573);
+            itemForLossCurve.Spacing = new DevExpress.XtraLayout.Utils.Padding(2, 2, 2, 2);
+            itemForLossCurve.TextSize = new Size(0, 0);
+            itemForLossCurve.TextVisible = false;
+            // 
+            // navigationFrame1
+            // 
+            navigationFrame1.Controls.Add(navigationPage1);
+            navigationFrame1.Controls.Add(navigationPage2);
+            navigationFrame1.Dock = DockStyle.Fill;
+            navigationFrame1.Location = new Point(0, 32);
+            navigationFrame1.Name = "navigationFrame1";
+            navigationFrame1.Pages.AddRange(new DevExpress.XtraBars.Navigation.NavigationPageBase[] { navigationPage1, navigationPage2 });
+            navigationFrame1.SelectedPage = navigationPage1;
+            navigationFrame1.Size = new Size(994, 573);
+            navigationFrame1.TabIndex = 3;
+            navigationFrame1.Text = "navigationFrame1";
+            // 
+            // navigationPage1
+            // 
+            navigationPage1.Caption = "navigationPage1";
+            navigationPage1.Controls.Add(layoutControl1);
+            navigationPage1.Name = "navigationPage1";
+            navigationPage1.Size = new Size(994, 573);
+            // 
+            // navigationPage2
+            // 
+            navigationPage2.Caption = "navigationPage2";
+            navigationPage2.Controls.Add(hydroLossCurveCompareCtrl1);
+            navigationPage2.Name = "navigationPage2";
+            navigationPage2.Size = new Size(994, 573);
+            // 
+            // hydroLossCurveCompareCtrl1
+            // 
+            hydroLossCurveCompareCtrl1.Dock = DockStyle.Fill;
+            hydroLossCurveCompareCtrl1.Location = new Point(0, 0);
+            hydroLossCurveCompareCtrl1.Name = "hydroLossCurveCompareCtrl1";
+            hydroLossCurveCompareCtrl1.Size = new Size(994, 573);
+            hydroLossCurveCompareCtrl1.TabIndex = 0;
+            // 
+            // barBtnChange
+            // 
+            barBtnChange.Caption = "鍒囨崲";
+            barBtnChange.Hint = "鍒囨崲";
+            barBtnChange.Id = 1;
+            barBtnChange.ImageOptions.SvgImage = (DevExpress.Utils.Svg.SvgImage)resources.GetObject("barBtnChange.ImageOptions.SvgImage");
+            barBtnChange.Name = "barBtnChange";
+            barBtnChange.RibbonStyle = DevExpress.XtraBars.Ribbon.RibbonItemStyles.SmallWithText;
+            barBtnChange.ItemClick += barBtnChange_ItemClick;
+            // 
+            // HydroLossCurveMultiWorkingDlg
+            // 
+            AutoScaleDimensions = new SizeF(7F, 14F);
+            AutoScaleMode = AutoScaleMode.Font;
+            ClientSize = new Size(994, 605);
+            Controls.Add(navigationFrame1);
+            Controls.Add(ribbon);
+            FormBorderStyle = FormBorderStyle.SizableToolWindow;
+            Name = "HydroLossCurveMultiWorkingDlg";
+            Ribbon = ribbon;
+            RibbonVisibility = DevExpress.XtraBars.Ribbon.RibbonVisibility.Hidden;
+            StartPosition = FormStartPosition.CenterParent;
+            Text = "鎹熷け鏇茬嚎";
+            ((ISupportInitialize)ribbon).EndInit();
+            ((ISupportInitialize)layoutControl1).EndInit();
+            layoutControl1.ResumeLayout(false);
+            ((ISupportInitialize)Root).EndInit();
+            ((ISupportInitialize)groupForWorkingList).EndInit();
+            ((ISupportInitialize)layoutControlItem1).EndInit();
+            ((ISupportInitialize)splitter).EndInit();
+            ((ISupportInitialize)itemForLossCurve).EndInit();
+            ((ISupportInitialize)navigationFrame1).EndInit();
+            navigationFrame1.ResumeLayout(false);
+            navigationPage1.ResumeLayout(false);
+            navigationPage2.ResumeLayout(false);
+            ResumeLayout(false);
+            PerformLayout();
+        }
+
+        #endregion
+
+        private DevExpress.XtraBars.Ribbon.RibbonControl ribbon;
+        private DevExpress.XtraBars.Ribbon.RibbonPage ribbonPage1;
+        private DevExpress.XtraBars.Ribbon.RibbonPageGroup ribbonPageGroup1;
+        private DevExpress.XtraLayout.LayoutControl layoutControl1;
+        private HydroWorkingListViewCtrl hydroWorkingListViewCtrl1;
+        private DevExpress.XtraLayout.LayoutControlGroup Root;
+        private DevExpress.XtraLayout.LayoutControlGroup groupForWorkingList;
+        private DevExpress.XtraLayout.LayoutControlItem layoutControlItem1;
+        private DevExpress.XtraLayout.LayoutControlItem layoutControlItem2;
+        private DevExpress.XtraLayout.SplitterItem splitter;
+        private HydroLossCurveCtrl hydroLossCurveCtrl1;
+        private DevExpress.XtraLayout.LayoutControlItem itemForLossCurve;
+        private DevExpress.XtraBars.Navigation.NavigationFrame navigationFrame1;
+        private DevExpress.XtraBars.Navigation.NavigationPage navigationPage1;
+        private DevExpress.XtraBars.Navigation.NavigationPage navigationPage2;
+        private DevExpress.XtraBars.BarButtonItem barBtnChange;
+        private HydroLossCurveCompareCtrl hydroLossCurveCompareCtrl1;
+    }
+}
\ No newline at end of file
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/09-working/HydroLossCurveMultiWorkingDlg.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/09-working/HydroLossCurveMultiWorkingDlg.cs
new file mode 100644
index 0000000..2aa83f3
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/09-working/HydroLossCurveMultiWorkingDlg.cs
@@ -0,0 +1,102 @@
+锘縰sing Mapster;
+
+namespace Yw.WinFrmUI
+{
+    public partial class HydroLossCurveMultiWorkingDlg : DevExpress.XtraBars.Ribbon.RibbonForm
+    {
+        public HydroLossCurveMultiWorkingDlg()
+        {
+            InitializeComponent();
+            this.IconOptions.Icon = Yw.WinFrmUI.GlobalParas.AppIcon;
+            this.layoutControl1.SetupLayoutControl();
+            this.hydroWorkingListViewCtrl1.SelectedChangedEvent += HydroWorkingListViewCtrl1_SelectedChangedEvent;
+        }
+
+
+        private Yw.Model.HydroModelInfo _hydroInfo = null;//姘村姏淇℃伅
+        private Dictionary<HydroWorkingVmo, HydroCalcuResult> _calcuWorkingDict = null;//宸ュ喌璁$畻瀛楀吀
+        private Yw.Model.HydroNodeInfo _node = null;//鑺傜偣
+
+        /// <summary>
+        /// 缁戝畾鏁版嵁
+        /// 璁$畻涓嶄細鏀瑰彉鍘熸湁姘村姏淇℃伅
+        /// </summary>
+        public void SetBindingData
+            (
+                Yw.Model.HydroModelInfo hydroInfo,
+                List<HydroWorkingVmo> allWorkingList,
+                Yw.Model.HydroNodeInfo node,
+                bool isHead = false,
+                List<HydroEvaluationVmo> allEvaluationList = null
+            )
+        {
+            if (hydroInfo == null)
+            {
+                return;
+            }
+            if (allWorkingList == null || allWorkingList.Count < 1)
+            {
+                return;
+            }
+            if (node == null)
+            {
+                return;
+            }
+            _hydroInfo = hydroInfo.Adapt<Yw.Model.HydroModelInfo>();
+            _node = node;
+
+            _calcuWorkingDict = new Dictionary<HydroWorkingVmo, HydroCalcuResult>();
+            foreach (var working in allWorkingList)
+            {
+                _hydroInfo.UpdateWorkingInfo(working.WorkingInfo);
+                var calcuResult = _hydroInfo.Calcu(Yw.EPAnet.CalcuMode.MinorLoss, isHead, allEvaluationList);
+                _calcuWorkingDict.Add(working, calcuResult);
+            }
+            if (allWorkingList.Count < 2)
+            {
+                var working = allWorkingList[0];
+                this.Text = $"鎹熷け鏇茬嚎({working.Name})";
+                this.groupForWorkingList.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Never;
+                this.splitter.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Never;
+            }
+            this.hydroWorkingListViewCtrl1.SetBindingData(allWorkingList);
+            this.hydroLossCurveCompareCtrl1.SetBindingData(_hydroInfo, _calcuWorkingDict, _node);
+        }
+
+        //宸ュ喌閫夋嫨鏀瑰彉
+        private void HydroWorkingListViewCtrl1_SelectedChangedEvent(HydroWorkingVmo working)
+        {
+            if (_hydroInfo == null)
+            {
+                return;
+            }
+            if (_node == null)
+            {
+                return;
+            }
+            if (_calcuWorkingDict == null || _calcuWorkingDict.Count < 1)
+            {
+                return;
+            }
+            if (working == null)
+            {
+                return;
+            }
+            if (!_calcuWorkingDict.ContainsKey(working))
+            {
+                return;
+            }
+            this.hydroLossCurveCtrl1.SetBindingData(_hydroInfo, working, _node, _calcuWorkingDict[working]);
+        }
+
+
+        //鍒囨崲
+        private void barBtnChange_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
+        {
+            var index = this.navigationFrame1.SelectedPageIndex == 0 ? 1 : 0;
+            this.navigationFrame1.SelectedPageIndex = index;
+        }
+
+
+    }
+}
\ No newline at end of file
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/01-curve/HydroSingleWorkingLossCurveDlg.resx b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/09-working/HydroLossCurveMultiWorkingDlg.resx
similarity index 77%
rename from WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/01-curve/HydroSingleWorkingLossCurveDlg.resx
rename to WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/09-working/HydroLossCurveMultiWorkingDlg.resx
index af32865..aabf10f 100644
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/01-curve/HydroSingleWorkingLossCurveDlg.resx
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/09-working/HydroLossCurveMultiWorkingDlg.resx
@@ -117,4 +117,24 @@
   <resheader name="writer">
     <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </resheader>
+  <assembly alias="DevExpress.Data.v23.2" name="DevExpress.Data.v23.2, Culture=neutral, PublicKeyToken=b88d1754d700e49a" />
+  <data name="barBtnChange.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIzLjIsIFZlcnNpb249MjMuMi40
+        LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
+        dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAAJkCAAAC77u/
+        PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi
+        IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv
+        MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh
+        Y2U9InByZXNlcnZlIiBpZD0iTGF5ZXJfMSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAg
+        MzIgMzIiPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLkJsdWV7ZmlsbDojMzU3NUJCO30KCS5C
+        bGFja3tmaWxsOiM3MzczNzQ7fQoJLldoaXRle2ZpbGw6I0ZGRkZGRjt9CgkuWWVsbG93e2ZpbGw6I0ZD
+        QjAxQjt9CgkuUmVke2ZpbGw6I0QwMjAyNzt9CgkuR3JlZW57ZmlsbDojMTI5QzQ5O30KCS5zdDB7b3Bh
+        Y2l0eTowLjU7fQo8L3N0eWxlPg0KICA8cGF0aCBkPSJNMzEsMkgxMWMtMC41LDAtMSwwLjUtMSwxdjlo
+        MlY0aDE4djI0SDEydi04aC0ydjljMCwwLjUsMC41LDEsMSwxaDIwYzAuNSwwLDEtMC41LDEtMVYzQzMy
+        LDIuNSwzMS41LDIsMzEsMnogICIgY2xhc3M9IkJsYWNrIiAvPg0KICA8cG9seWdvbiBwb2ludHM9IjQs
+        MTQgMTQsMTQgMTQsOCAyMiwxNiAxNCwyNCAxNCwxOCA0LDE4ICIgY2xhc3M9IkJsdWUiIC8+DQo8L3N2
+        Zz4L
+</value>
+  </data>
 </root>
\ No newline at end of file
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/01-curve/HydroMultiWorkingLossCurveDlg.Designer.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/09-working/HydroLossCurveWorkingDlg.Designer.cs
similarity index 81%
rename from WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/01-curve/HydroMultiWorkingLossCurveDlg.Designer.cs
rename to WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/09-working/HydroLossCurveWorkingDlg.Designer.cs
index ab92d4d..17cc949 100644
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/01-curve/HydroMultiWorkingLossCurveDlg.Designer.cs
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/09-working/HydroLossCurveWorkingDlg.Designer.cs
@@ -1,6 +1,6 @@
 锘縩amespace Yw.WinFrmUI
 {
-    partial class HydroMultiWorkingLossCurveDlg
+    partial class HydroLossCurveWorkingDlg
     {
         /// <summary>
         /// Required designer variable.
@@ -32,13 +32,13 @@
             ribbonPage1 = new DevExpress.XtraBars.Ribbon.RibbonPage();
             ribbonPageGroup1 = new DevExpress.XtraBars.Ribbon.RibbonPageGroup();
             layoutControl1 = new DevExpress.XtraLayout.LayoutControl();
-            hydroSingleWorkingLossCurveCtrl1 = new HydroSingleWorkingLossCurveCtrl();
             hydroWorkingListViewCtrl1 = new HydroWorkingListViewCtrl();
             Root = new DevExpress.XtraLayout.LayoutControlGroup();
             groupForWorkingList = new DevExpress.XtraLayout.LayoutControlGroup();
             layoutControlItem1 = new DevExpress.XtraLayout.LayoutControlItem();
             splitter = new DevExpress.XtraLayout.SplitterItem();
-            itemForChart = new DevExpress.XtraLayout.LayoutControlItem();
+            hydroLossCurveCtrl1 = new HydroLossCurveCtrl();
+            itemForLossCurve = new DevExpress.XtraLayout.LayoutControlItem();
             ((ISupportInitialize)ribbon).BeginInit();
             ((ISupportInitialize)layoutControl1).BeginInit();
             layoutControl1.SuspendLayout();
@@ -46,7 +46,7 @@
             ((ISupportInitialize)groupForWorkingList).BeginInit();
             ((ISupportInitialize)layoutControlItem1).BeginInit();
             ((ISupportInitialize)splitter).BeginInit();
-            ((ISupportInitialize)itemForChart).BeginInit();
+            ((ISupportInitialize)itemForLossCurve).BeginInit();
             SuspendLayout();
             // 
             // ribbon
@@ -74,7 +74,7 @@
             // 
             // layoutControl1
             // 
-            layoutControl1.Controls.Add(hydroSingleWorkingLossCurveCtrl1);
+            layoutControl1.Controls.Add(hydroLossCurveCtrl1);
             layoutControl1.Controls.Add(hydroWorkingListViewCtrl1);
             layoutControl1.Dock = DockStyle.Fill;
             layoutControl1.Location = new Point(0, 32);
@@ -84,13 +84,6 @@
             layoutControl1.Size = new Size(994, 573);
             layoutControl1.TabIndex = 1;
             layoutControl1.Text = "layoutControl1";
-            // 
-            // hydroSingleWorkingLossCurveCtrl1
-            // 
-            hydroSingleWorkingLossCurveCtrl1.Location = new Point(177, 2);
-            hydroSingleWorkingLossCurveCtrl1.Name = "hydroSingleWorkingLossCurveCtrl1";
-            hydroSingleWorkingLossCurveCtrl1.Size = new Size(815, 569);
-            hydroSingleWorkingLossCurveCtrl1.TabIndex = 4;
             // 
             // hydroWorkingListViewCtrl1
             // 
@@ -104,7 +97,7 @@
             // 
             Root.EnableIndentsWithoutBorders = DevExpress.Utils.DefaultBoolean.True;
             Root.GroupBordersVisible = false;
-            Root.Items.AddRange(new DevExpress.XtraLayout.BaseLayoutItem[] { groupForWorkingList, splitter, itemForChart });
+            Root.Items.AddRange(new DevExpress.XtraLayout.BaseLayoutItem[] { groupForWorkingList, splitter, itemForLossCurve });
             Root.Name = "Root";
             Root.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
             Root.Size = new Size(994, 573);
@@ -136,18 +129,25 @@
             splitter.Name = "splitter";
             splitter.Size = new Size(10, 573);
             // 
-            // itemForChart
+            // hydroLossCurveCtrl1
             // 
-            itemForChart.Control = hydroSingleWorkingLossCurveCtrl1;
-            itemForChart.Location = new Point(175, 0);
-            itemForChart.Name = "itemForChart";
-            itemForChart.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
-            itemForChart.Size = new Size(819, 573);
-            itemForChart.Spacing = new DevExpress.XtraLayout.Utils.Padding(2, 2, 2, 2);
-            itemForChart.TextSize = new Size(0, 0);
-            itemForChart.TextVisible = false;
+            hydroLossCurveCtrl1.Location = new Point(177, 2);
+            hydroLossCurveCtrl1.Name = "hydroLossCurveCtrl1";
+            hydroLossCurveCtrl1.Size = new Size(815, 569);
+            hydroLossCurveCtrl1.TabIndex = 5;
             // 
-            // HydroMultiWorkingLossCurveDlg
+            // itemForLossCurve
+            // 
+            itemForLossCurve.Control = hydroLossCurveCtrl1;
+            itemForLossCurve.Location = new Point(175, 0);
+            itemForLossCurve.Name = "itemForLossCurve";
+            itemForLossCurve.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
+            itemForLossCurve.Size = new Size(819, 573);
+            itemForLossCurve.Spacing = new DevExpress.XtraLayout.Utils.Padding(2, 2, 2, 2);
+            itemForLossCurve.TextSize = new Size(0, 0);
+            itemForLossCurve.TextVisible = false;
+            // 
+            // HydroLossCurveWorkingDlg
             // 
             AutoScaleDimensions = new SizeF(7F, 14F);
             AutoScaleMode = AutoScaleMode.Font;
@@ -155,7 +155,7 @@
             Controls.Add(layoutControl1);
             Controls.Add(ribbon);
             FormBorderStyle = FormBorderStyle.SizableToolWindow;
-            Name = "HydroMultiWorkingLossCurveDlg";
+            Name = "HydroLossCurveWorkingDlg";
             Ribbon = ribbon;
             RibbonVisibility = DevExpress.XtraBars.Ribbon.RibbonVisibility.Hidden;
             StartPosition = FormStartPosition.CenterParent;
@@ -167,7 +167,7 @@
             ((ISupportInitialize)groupForWorkingList).EndInit();
             ((ISupportInitialize)layoutControlItem1).EndInit();
             ((ISupportInitialize)splitter).EndInit();
-            ((ISupportInitialize)itemForChart).EndInit();
+            ((ISupportInitialize)itemForLossCurve).EndInit();
             ResumeLayout(false);
             PerformLayout();
         }
@@ -178,14 +178,13 @@
         private DevExpress.XtraBars.Ribbon.RibbonPage ribbonPage1;
         private DevExpress.XtraBars.Ribbon.RibbonPageGroup ribbonPageGroup1;
         private DevExpress.XtraLayout.LayoutControl layoutControl1;
-        private HydroSingleWorkingLossStatisticsCtrl hydroSingleWorkingLossStatisticsCtrl1;
         private HydroWorkingListViewCtrl hydroWorkingListViewCtrl1;
         private DevExpress.XtraLayout.LayoutControlGroup Root;
         private DevExpress.XtraLayout.LayoutControlGroup groupForWorkingList;
         private DevExpress.XtraLayout.LayoutControlItem layoutControlItem1;
         private DevExpress.XtraLayout.LayoutControlItem layoutControlItem2;
         private DevExpress.XtraLayout.SplitterItem splitter;
-        private HydroSingleWorkingLossCurveCtrl hydroSingleWorkingLossCurveCtrl1;
-        private DevExpress.XtraLayout.LayoutControlItem itemForChart;
+        private HydroLossCurveCtrl hydroLossCurveCtrl1;
+        private DevExpress.XtraLayout.LayoutControlItem itemForLossCurve;
     }
 }
\ No newline at end of file
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/09-working/HydroLossCurveWorkingDlg.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/09-working/HydroLossCurveWorkingDlg.cs
new file mode 100644
index 0000000..55c44c5
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/09-working/HydroLossCurveWorkingDlg.cs
@@ -0,0 +1,111 @@
+锘縰sing Mapster;
+
+namespace Yw.WinFrmUI
+{
+    public partial class HydroLossCurveWorkingDlg : DevExpress.XtraBars.Ribbon.RibbonForm
+    {
+        public HydroLossCurveWorkingDlg()
+        {
+            InitializeComponent();
+            this.IconOptions.Icon = Yw.WinFrmUI.GlobalParas.AppIcon;
+            this.layoutControl1.SetupLayoutControl();
+            this.hydroWorkingListViewCtrl1.SelectedChangedEvent += HydroWorkingListViewCtrl1_SelectedChangedEvent;
+            this.hydroLossCurveCtrl1.HydroClickEvent += HydroLossCurveCtrl1_HydroClickEvent;
+        }
+
+        /// <summary>
+        /// 姘村姏鐐瑰嚮浜嬩欢
+        /// </summary>
+        public event Action<string> HydroClickEvent;
+
+        private Yw.Model.HydroModelInfo _hydroInfo = null;//姘村姏淇℃伅
+        private Dictionary<HydroWorkingVmo, HydroCalcuResult> _calcuWorkingDict = null;//宸ュ喌璁$畻瀛楀吀
+        private Yw.Model.HydroNodeInfo _node = null;//鑺傜偣
+
+        /// <summary>
+        /// 缁戝畾鏁版嵁
+        /// 璁$畻涓嶄細鏀瑰彉鍘熸湁姘村姏淇℃伅
+        /// </summary>
+        public void SetBindingData
+            (
+                Yw.Model.HydroModelInfo hydroInfo,
+                List<HydroWorkingVmo> allWorkingList,
+                Yw.Model.HydroNodeInfo node,
+                bool isHead = false,
+                List<HydroEvaluationVmo> allEvaluationList = null
+            )
+        {
+            if (hydroInfo == null)
+            {
+                return;
+            }
+            if (allWorkingList == null || allWorkingList.Count < 1)
+            {
+                return;
+            }
+            if (node == null)
+            {
+                return;
+            }
+            _hydroInfo = hydroInfo.Adapt<Yw.Model.HydroModelInfo>();
+            _node = node;
+
+            _calcuWorkingDict = new Dictionary<HydroWorkingVmo, HydroCalcuResult>();
+            foreach (var working in allWorkingList)
+            {
+                _hydroInfo.UpdateWorkingInfo(working.WorkingInfo);
+                var calcuResult = _hydroInfo.Calcu(Yw.EPAnet.CalcuMode.MinorLoss, isHead, allEvaluationList);
+                _calcuWorkingDict.Add(working, calcuResult);
+            }
+            if (allWorkingList.Count < 2)
+            {
+                var working = allWorkingList[0];
+                this.Text = $"鎹熷け鏇茬嚎({working.Name})";
+                this.groupForWorkingList.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Never;
+                this.splitter.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Never;
+            }
+            this.hydroWorkingListViewCtrl1.SetBindingData(allWorkingList);
+        }
+
+        //宸ュ喌閫夋嫨鏀瑰彉
+        private void HydroWorkingListViewCtrl1_SelectedChangedEvent(HydroWorkingVmo working)
+        {
+            if (_hydroInfo == null)
+            {
+                return;
+            }
+            if (_node == null)
+            {
+                return;
+            }
+            if (_calcuWorkingDict == null || _calcuWorkingDict.Count < 1)
+            {
+                return;
+            }
+            if (working == null)
+            {
+                return;
+            }
+            if (!_calcuWorkingDict.ContainsKey(working))
+            {
+                return;
+            }
+            this.hydroLossCurveCtrl1.SetBindingData(_hydroInfo, working, _node, _calcuWorkingDict[working]);
+        }
+
+        //姘村姏鐐瑰嚮浜嬩欢
+        private void HydroLossCurveCtrl1_HydroClickEvent(string obj)
+        {
+            this.HydroClickEvent?.Invoke(obj);
+        }
+
+
+
+
+
+
+
+
+
+    }
+}
\ No newline at end of file
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/01-curve/HydroMultiWorkingLossCurveDlg.resx b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/09-working/HydroLossCurveWorkingDlg.resx
similarity index 100%
copy from WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/01-curve/HydroMultiWorkingLossCurveDlg.resx
copy to WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/09-working/HydroLossCurveWorkingDlg.resx
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-statistics/06-control/HydroLossStatisticsCatalogCtrl.Designer.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-statistics/06-control/HydroLossStatisticsCatalogCtrl.Designer.cs
index cec025e..a38d4c0 100644
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-statistics/06-control/HydroLossStatisticsCatalogCtrl.Designer.cs
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-statistics/06-control/HydroLossStatisticsCatalogCtrl.Designer.cs
@@ -63,9 +63,9 @@
             doughnutSeriesView1.TotalLabel.Visible = true;
             series1.View = doughnutSeriesView1;
             chartControl1.SeriesSerializable = new DevExpress.XtraCharts.Series[]
-    {
-    series1
-    };
+            {
+                series1
+            };
             chartControl1.Size = new Size(884, 602);
             chartControl1.TabIndex = 0;
             // 
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-statistics/06-control/HydroLossStatisticsCategoryCtrl.Designer.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-statistics/06-control/HydroLossStatisticsCategoryCtrl.Designer.cs
index e91ee0f..96c19ed 100644
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-statistics/06-control/HydroLossStatisticsCategoryCtrl.Designer.cs
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-statistics/06-control/HydroLossStatisticsCategoryCtrl.Designer.cs
@@ -43,7 +43,7 @@
             // 
             // bindingSource1
             // 
-            bindingSource1.DataSource = typeof(HydroEnergyStatisticsItemViewModel);
+            bindingSource1.DataSource = typeof(HydroLossStatisticsCategoryItemViewModel);
             // 
             // chartControl1
             // 

--
Gitblit v1.9.3