From ae45d123c2ee907fd40f7db86f2aac2b21f976b6 Mon Sep 17 00:00:00 2001
From: lixiaojun <1287241240@qq.com>
Date: 星期四, 14 十一月 2024 17:16:21 +0800
Subject: [PATCH] 增加监测点

---
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/06-visual/13-pressmeter/SetHydroPressmeterDlg.cs                                         |    4 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/12-monitor/01-set/SetHydroVisualMonitorCtrl.resx                                         |   22 
 WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/XhsProjectSimulationCorePage.resx                        |   52 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/03-node/03-junction/04-instrument/01-flowmeter/HydroFlowmeterViewModel.cs   |   58 +
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/05-monitor/HydroMonitorWorkingInfoViewModel.cs                                |   26 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/08-grading/03-list/SetHydroGradingModelCtrl.cs                                           |   10 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/02-node/00-core/HydroCalcuNodeResult.cs                                         |    0 
 WinFrmUI/Yw.WinFrmUI.Bimface.Core/bimface/imgs/CalcuDemand.png                                                           |    0 
 Hydro/Yw.Hydro.Core/ParseHelper.cs                                                                                       |    1 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/03-pump/HydroPumpWorkingInfoViewModel.cs                                      |    2 
 WinFrmUI/Yw.WinFrmUI.Bimface.Core/bimface/imgs/CalcuHeadLoss.png                                                         |    0 
 WinFrmUI/Yw.WinFrmUI.Bimface.Core/bimface/imgs/CalcuPr.png                                                               |    0 
 WinFrmUI/Yw.WinFrmUI.Bimface.Core/bimface/imgs/CalcuPress.png                                                            |    0 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/05-extensions/HydroModelInfoExtensions.cs                                        |   26 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/03-link/01-pump/HydroCalcuPumpResult.cs                                         |    0 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/13-fail/HydroCalcuFailedCtrl.resx                                                        |    0 
 WinFrmUI/Yw.WinFrmUI.Bimface.Core/bimface/imgs/CalcuFlow.png                                                             |    0 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/00-core/HydroWorkingInfoViewModel.cs                                          |   37 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/12-monitor/02-value/HydroVisualMonitorValueListCtrl.resx                                 |   32 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/12-monitor/01-set/SetHydroVisualMonitorDlg.resx                                          |   19 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/02-waterbox/SetHydroWaterboxWorkingInfoCtrl.resx                              |    0 
 WinFrmUI/Yw.WinFrmUI.Bimface.Core/bimface/js/Marker3dContainer.js                                                        |   15 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/03-node/03-junction/04-instrument/00-core/HydroFlowmeterViewModel.cs        |   72 +
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/03-helper/HydroParterPropHelper.cs                                               |  144 +-
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/02-node/02-pressmeter/IHydroCalcuPressmeterResult.cs                            |    0 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/01-result/HydroCalcuResult.cs                                                   |    0 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/13-fail/HydroCalcuFailedCtrl.Designer.cs                                                 |    0 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/13-fail/HydroCalcuFailedCtrl.cs                                                          |    0 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/01-visual/ISetHydroVisualWorkingInfoCtrl.cs                                   |   30 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/02-waterbox/SetHydroWaterboxWorkingInfoCtrl.cs                                |   20 
 Hydro/HStation.Hydro.Core/TransferHelper.cs                                                                              |    4 
 WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/XhsProjectSimulationCorePage.cs                          |  376 ++++++
 WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/XhsProjectSimulationCorePage.Designer.cs                 |  122 +
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/Yw.WinFrmUI.Hydro.Core.csproj.user                                                       |    6 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/03-link/00-core/IHydroCalcuLinkResult.cs                                        |    0 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/12-monitor/02-value/HydroVisualMonitorValueListCtrl.cs                                   |   56 +
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/12-monitor/02-value/HydroVisualMonitorValueViewModel.cs                                  |   71 +
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/02-waterbox/SetHydroWaterboxWorkingInfoCtrl.Designer.cs                       |    0 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/03-pump/SetHydroPumpWorkingInfoCtrl.cs                                        |   26 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/00-core/SetHydroWorkingInfoCtrl.cs                                            |    8 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/04-valve/SetHydroValveWorkingInfoCtrl.cs                                      |   10 
 WinFrmUI/Yw.WinFrmUI.Bimface.Core/bimface/html/Interop3d.html                                                            |    3 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/03-node/03-junction/04-instrument/02-pressmeter/HydroPressmeterViewModel.cs |   55 +
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/02-node/02-pressmeter/HydroCalcuPressmeterResult.cs                             |    0 
 WinFrmUI/Yw.WinFrmUI.Bimface.Core/bimface/js/LogicMonitor.js                                                             |  114 ++
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/03-link/01-pump/IHydroCalcuPumpResult.cs                                        |    0 
 WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/02-bimface/XhsProjectSimulationBimfaceCtrl.cs                          |   18 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/04-valve/SetHydroValveWorkingInfoCtrl.resx                                    |    0 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/12-monitor/01-set/SetHydroVisualMonitorDlg.cs                                            |   50 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/12-monitor/01-set/SetHydroVisualMonitorCtrl.cs                                           |   71 +
 WinFrmUI/Yw.WinFrmUI.Bimface.Core/bimface/imgs/CalcuE.png                                                                |    0 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/02-node/00-core/IHydroCalcuNodeResult.cs                                        |    0 
 WinFrmUI/Yw.WinFrmUI.Bimface.Core/Yw.WinFrmUI.Bimface.Core.csproj                                                        |   60 +
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/12-monitor/01-set/SetHydroVisualMonitorDlg.Designer.cs                                   |  165 +++
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/04-valve/SetHydroValveWorkingInfoCtrl.Designer.cs                             |    0 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/Properties/DataSources/Yw.WinFrmUI.SetHydroVisualMonitorViewModel.datasource             |   10 
 WinFrmUI/Yw.WinFrmUI.Bimface.Core/01-interop/01-interop3d/IBimfaceInterop3dContainer.cs                                  |   14 
 WinFrmUI/Yw.WinFrmUI.Bimface.Core/bimface/js/base64.js                                                                   |   20 
 WinFrmUI/Yw.WinFrmUI.Bimface.Core/01-interop/01-interop3d/BimfaceInterop3dContainer.cs                                   |   29 
 WinFrmUI/Yw.WinFrmUI.Bimface.Core/00-core/06-logic-monitor/LogicMonitor.cs                                               |   27 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/03-node/03-junction/03-meter/HydroMeterViewModel.cs                         |    0 
 WinFrmUI/HStation.WinFrmUI.Xhs.Core/02-project/01-import/00-core/ImportXhsProjectHelper.cs                               |   12 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/06-visual/12-flowmeter/SetHydroFlowmeterDlg.cs                                           |    4 
 WinFrmUI/Yw.WinFrmUI.Bimface.Core/bimface/imgs/CalcuQ.png                                                                |    0 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/02-waterbox/HydroWaterboxWorkingInfoViewModel.cs                              |    2 
 WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/04-scheme/XhsProjectSimulationSchemeMgrPage.cs                         |   74 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/03-link/00-core/HydroCalcuLinkResult.cs                                         |    0 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/02-node/01-flowmeter/HydroCalcuFlowmeterResult.cs                               |    0 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/00-core/HydroCalcuProp.cs                                                       |   77 +
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/04-valve/HydroValveWorkingInfoViewModel.cs                                    |    2 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/Yw.WinFrmUI.Hydro.Core.csproj                                                            |   19 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/02-node/01-flowmeter/IHydroCalcuFlowmeterResult.cs                              |    0 
 WinFrmUI/Yw.WinFrmUI.Bimface.Core/bimface/imgs/CalcuHead.png                                                             |    0 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/03-pump/SetHydroPumpWorkingInfoCtrl.resx                                      |    0 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/12-monitor/01-set/SetHydroVisualMonitorViewModel.cs                                      |   56 +
 WinFrmUI/Yw.WinFrmUI.Bimface.Core/bimface/imgs/flowEffect.png                                                            |    0 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/12-monitor/01-set/SetHydroVisualMonitorCtrl.Designer.cs                                  |  125 ++
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/13-fail/HydroCalcuFailedViewModel.cs                                                     |    0 
 /dev/null                                                                                                                |  139 --
 Hydro/Yw.Hydro.Core/Yw.Hydro.Core.csproj                                                                                 |    2 
 WinFrmUI/Yw.WinFrmUI.Bimface.Core/bimface/imgs/CalcuH.png                                                                |    0 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/12-monitor/02-value/HydroVisualMonitorValueListCtrl.Designer.cs                          |  143 ++
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/01-result/IHydroCalcuResult.cs                                                  |    0 
 WinFrmUI/Yw.WinFrmUI.Bimface.Core/bimface/imgs/CalcuVelocity.png                                                         |    0 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/03-pump/SetHydroPumpWorkingInfoCtrl.Designer.cs                               |    0 
 WinFrmUI/Yw.WinFrmUI.Bimface.Core/bimface/imgs/CalcuP.png                                                                |    0 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/Properties/DataSources/Yw.WinFrmUI.HydroVisualMonitorValueViewModel.datasource           |   10 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/00-core/HydroCalcuPropHelper.cs                                                 |  458 ++++++++
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/01-visual/HydroVisualWorkingInfoViewModel.cs                                  |    8 
 89 files changed, 2,504 insertions(+), 512 deletions(-)

diff --git a/Hydro/HStation.Hydro.Core/TransferHelper.cs b/Hydro/HStation.Hydro.Core/TransferHelper.cs
index 3935af8..0157a05 100644
--- a/Hydro/HStation.Hydro.Core/TransferHelper.cs
+++ b/Hydro/HStation.Hydro.Core/TransferHelper.cs
@@ -877,8 +877,6 @@
             flowmeter.UpdatePropStatus(nameof(flowmeter.Position2d), revitFlowmeter, nameof(revitFlowmeter.Position));
             flowmeter.Position3d = new Yw.Model.Hydro.Position3d(revitFlowmeter.Position.X, revitFlowmeter.Position.Y, revitFlowmeter.Position.Z);
             flowmeter.UpdatePropStatus(nameof(flowmeter.Position3d), revitFlowmeter, nameof(revitFlowmeter.Position));
-            flowmeter.CurrentFlow = revitFlowmeter.CurrentFlow;
-            flowmeter.UpdatePropStatus(nameof(flowmeter.CurrentFlow), revitFlowmeter, nameof(revitFlowmeter.CurrentFlow));
             flowmeter.ScenePropValueList = revitFlowmeter.PropValueList?.Select(x => new Yw.Model.HydroParterScenePropValueInfo()
             {
                 Scene = HStation.Revit.ConstParas.Scene,
@@ -923,8 +921,6 @@
             pressmeter.UpdatePropStatus(nameof(pressmeter.Position2d), revitPressmeter, nameof(revitPressmeter.Position));
             pressmeter.Position3d = new Yw.Model.Hydro.Position3d(revitPressmeter.Position.X, revitPressmeter.Position.Y, revitPressmeter.Position.Z);
             pressmeter.UpdatePropStatus(nameof(pressmeter.Position3d), revitPressmeter, nameof(revitPressmeter.Position));
-            pressmeter.CurrentPress = revitPressmeter.CurrentPress;
-            pressmeter.UpdatePropStatus(nameof(pressmeter.CurrentPress), revitPressmeter, nameof(revitPressmeter.CurrentPress));
             pressmeter.ScenePropValueList = revitPressmeter.PropValueList?.Select(x => new Yw.Model.HydroParterScenePropValueInfo()
             {
                 Scene = HStation.Revit.ConstParas.Scene,
diff --git a/Hydro/Yw.Hydro.Core/ParseHelper.cs b/Hydro/Yw.Hydro.Core/ParseHelper.cs
index efad123..b5a602a 100644
--- a/Hydro/Yw.Hydro.Core/ParseHelper.cs
+++ b/Hydro/Yw.Hydro.Core/ParseHelper.cs
@@ -471,7 +471,6 @@
 
             #endregion
 
-
             return netWork;
         }
 
diff --git a/Hydro/Yw.Hydro.Core/Yw.Hydro.Core.csproj b/Hydro/Yw.Hydro.Core/Yw.Hydro.Core.csproj
index 4e2be1e..c0abe76 100644
--- a/Hydro/Yw.Hydro.Core/Yw.Hydro.Core.csproj
+++ b/Hydro/Yw.Hydro.Core/Yw.Hydro.Core.csproj
@@ -8,7 +8,7 @@
 
   <ItemGroup>
     <PackageReference Include="Yw.Geometry.Core" Version="3.2.7" />
-    <PackageReference Include="Yw.Service.Hydro.Core" Version="3.7.0" />
+    <PackageReference Include="Yw.Service.Hydro.Core" Version="3.7.3" />
   </ItemGroup>
 
   <ItemGroup>
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/02-project/01-import/00-core/ImportXhsProjectHelper.cs b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/02-project/01-import/00-core/ImportXhsProjectHelper.cs
index c7038db..e83e3a2 100644
--- a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/02-project/01-import/00-core/ImportXhsProjectHelper.cs
+++ b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/02-project/01-import/00-core/ImportXhsProjectHelper.cs
@@ -234,17 +234,7 @@
                 return true;
             }
 
-            //var hydroId = await BLLFactory<Yw.BLL.HydroModelInfo>.Instance.Save(hydroInfo);
-            //if (hydroId < 1)
-            //{
-            //    feedBackMsg?.Invoke("姘村姏缁撴瀯淇℃伅淇濆瓨澶辫触锛侊紒锛�", Color.Red);
-            //    feedBackMsg?.Invoke("椤圭洰瀵煎叆缁撴潫銆傘�傘��", Color.Blue);
-            //    feedBackProgress?.Invoke(100, 100);
-            //    return true;
-            //}
-
             feedBackMsg?.Invoke("姝e湪杩涜浜у搧鍖归厤...", Color.Black);
-            //hydroInfo = await BLLFactory<Yw.BLL.HydroModelInfo>.Instance.GetByID(hydroId);
             var matchingParas = AssetsMatchingParasHelper.Create(hydroInfo, null);
             if (AssetsMatchingHelper.Matching(matchingParas, out string error))
             {
@@ -261,7 +251,7 @@
             {
                 feedBackMsg?.Invoke("浜у搧鍖归厤澶辫触锛侊紒锛�", Color.Red);
             }
-            feedBackMsg?.Invoke("姝e湪淇濆瓨姘村埄缁撴瀯淇℃伅...", Color.Black);
+            feedBackMsg?.Invoke("姝e湪淇濆瓨姘村姏缁撴瀯淇℃伅...", Color.Black);
             var hydroId = await BLLFactory<Yw.BLL.HydroModelInfo>.Instance.Save(hydroInfo);
             if (hydroId < 1)
             {
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/02-bimface/XhsProjectSimulationBimfaceCtrl.cs b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/02-bimface/XhsProjectSimulationBimfaceCtrl.cs
index 29225f6..94fddd0 100644
--- a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/02-bimface/XhsProjectSimulationBimfaceCtrl.cs
+++ b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/02-bimface/XhsProjectSimulationBimfaceCtrl.cs
@@ -607,7 +607,25 @@
 
         #endregion
 
+        #region 涓氬姟鐩戞祴鐐�
 
+        /// <summary>
+        /// 璁剧疆涓氬姟鐩戞祴鐐�
+        /// </summary>
+        public async Task SetLogicMonitors(List<LogicMonitor> obj)
+        {
+            await _bimfaceInteropContainer?.SetLogicMonitors(obj);
+        }
+
+        /// <summary>
+        /// 娓呴櫎涓氬姟鐩戞祴鐐�
+        /// </summary>
+        public async Task ClearLogicMonitors()
+        {
+            await _bimfaceInteropContainer?.ClearLogicMonitors();
+        }
+
+        #endregion
 
     }
 }
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/04-scheme/XhsProjectSimulationSchemeMgrPage.cs b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/04-scheme/XhsProjectSimulationSchemeMgrPage.cs
index f007f3d..d30191d 100644
--- a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/04-scheme/XhsProjectSimulationSchemeMgrPage.cs
+++ b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/04-scheme/XhsProjectSimulationSchemeMgrPage.cs
@@ -2075,7 +2075,7 @@
                     {
                         Code = Yw.Hydro.ParterCatalog.Pipe,
                         Name = Yw.WinFrmUI.HydroParterCatalogHelper.GetName(Yw.Hydro.ParterCatalog.Pipe),
-                        PropName = Yw.Hydro.ParterProp.CalcuFlow
+                        PropName = HydroCalcuProp.CalcuFlow
                     });
                 }
             }
@@ -2142,9 +2142,9 @@
                                                     }
                                                 }
                                                 break;
-                                            case Yw.Hydro.ParterProp.CalcuFlow:
+                                            case HydroCalcuProp.CalcuFlow:
                                                 {
-                                                    var gradingList = allCatalogGradingList.Where(x => x.PropName == Yw.Hydro.ParterProp.CalcuFlow).OrderBy(t => t.SortCode).ToList();
+                                                    var gradingList = allCatalogGradingList.Where(x => x.PropName == HydroCalcuProp.CalcuFlow).OrderBy(t => t.SortCode).ToList();
                                                     if (gradingList != null && gradingList.Count > 0)
                                                     {
                                                         var calcuResult = allCalcuResultList?.Find(t => t.Code == pump.Code);
@@ -2167,9 +2167,9 @@
                                                     }
                                                 }
                                                 break;
-                                            case Yw.Hydro.ParterProp.CalcuVelocity:
+                                            case HydroCalcuProp.CalcuVelocity:
                                                 {
-                                                    var gradingList = allCatalogGradingList.Where(x => x.PropName == Yw.Hydro.ParterProp.CalcuVelocity).OrderBy(t => t.SortCode).ToList();
+                                                    var gradingList = allCatalogGradingList.Where(x => x.PropName == HydroCalcuProp.CalcuVelocity).OrderBy(t => t.SortCode).ToList();
                                                     if (gradingList != null && gradingList.Count > 0)
                                                     {
                                                         var calcuResult = allCalcuResultList?.Find(t => t.Code == pump.Code);
@@ -2192,9 +2192,9 @@
                                                     }
                                                 }
                                                 break;
-                                            case Yw.Hydro.ParterProp.CalcuHeadLoss:
+                                            case HydroCalcuProp.CalcuHeadLoss:
                                                 {
-                                                    var gradingList = allCatalogGradingList.Where(x => x.PropName == Yw.Hydro.ParterProp.CalcuHeadLoss).OrderBy(t => t.SortCode).ToList();
+                                                    var gradingList = allCatalogGradingList.Where(x => x.PropName == HydroCalcuProp.CalcuHeadLoss).OrderBy(t => t.SortCode).ToList();
                                                     if (gradingList != null && gradingList.Count > 0)
                                                     {
                                                         var calcuResult = allCalcuResultList?.Find(t => t.Code == pump.Code);
@@ -2249,9 +2249,9 @@
                                                     }
                                                 }
                                                 break;
-                                            case Yw.Hydro.ParterProp.CalcuFlow:
+                                            case HydroCalcuProp.CalcuFlow:
                                                 {
-                                                    var gradingList = allCatalogGradingList.Where(x => x.PropName == Yw.Hydro.ParterProp.CalcuFlow).OrderBy(t => t.SortCode).ToList();
+                                                    var gradingList = allCatalogGradingList.Where(x => x.PropName == HydroCalcuProp.CalcuFlow).OrderBy(t => t.SortCode).ToList();
                                                     if (gradingList != null && gradingList.Count > 0)
                                                     {
                                                         var calcuResult = allCalcuResultList?.Find(t => t.Code == valve.Code);
@@ -2274,9 +2274,9 @@
                                                     }
                                                 }
                                                 break;
-                                            case Yw.Hydro.ParterProp.CalcuVelocity:
+                                            case HydroCalcuProp.CalcuVelocity:
                                                 {
-                                                    var gradingList = allCatalogGradingList.Where(x => x.PropName == Yw.Hydro.ParterProp.CalcuVelocity).OrderBy(t => t.SortCode).ToList();
+                                                    var gradingList = allCatalogGradingList.Where(x => x.PropName == HydroCalcuProp.CalcuVelocity).OrderBy(t => t.SortCode).ToList();
                                                     if (gradingList != null && gradingList.Count > 0)
                                                     {
                                                         var calcuResult = allCalcuResultList?.Find(t => t.Code == valve.Code);
@@ -2299,9 +2299,9 @@
                                                     }
                                                 }
                                                 break;
-                                            case Yw.Hydro.ParterProp.CalcuHeadLoss:
+                                            case HydroCalcuProp.CalcuHeadLoss:
                                                 {
-                                                    var gradingList = allCatalogGradingList.Where(x => x.PropName == Yw.Hydro.ParterProp.CalcuHeadLoss).OrderBy(t => t.SortCode).ToList();
+                                                    var gradingList = allCatalogGradingList.Where(x => x.PropName == HydroCalcuProp.CalcuHeadLoss).OrderBy(t => t.SortCode).ToList();
                                                     if (gradingList != null && gradingList.Count > 0)
                                                     {
                                                         var calcuResult = allCalcuResultList?.Find(t => t.Code == valve.Code);
@@ -2338,9 +2338,9 @@
                                     {
                                         switch (x.PropName)
                                         {
-                                            case Yw.Hydro.ParterProp.CalcuFlow:
+                                            case HydroCalcuProp.CalcuFlow:
                                                 {
-                                                    var gradingList = allCatalogGradingList.Where(x => x.PropName == Yw.Hydro.ParterProp.CalcuFlow).OrderBy(t => t.SortCode).ToList();
+                                                    var gradingList = allCatalogGradingList.Where(x => x.PropName == HydroCalcuProp.CalcuFlow).OrderBy(t => t.SortCode).ToList();
                                                     if (gradingList != null && gradingList.Count > 0)
                                                     {
                                                         var calcuResult = allCalcuResultList?.Find(t => t.Code == pipe.Code);
@@ -2363,9 +2363,9 @@
                                                     }
                                                 }
                                                 break;
-                                            case Yw.Hydro.ParterProp.CalcuVelocity:
+                                            case HydroCalcuProp.CalcuVelocity:
                                                 {
-                                                    var gradingList = allCatalogGradingList.Where(x => x.PropName == Yw.Hydro.ParterProp.CalcuVelocity).OrderBy(t => t.SortCode).ToList();
+                                                    var gradingList = allCatalogGradingList.Where(x => x.PropName == HydroCalcuProp.CalcuVelocity).OrderBy(t => t.SortCode).ToList();
                                                     if (gradingList != null && gradingList.Count > 0)
                                                     {
                                                         var calcuResult = allCalcuResultList?.Find(t => t.Code == pipe.Code);
@@ -2388,9 +2388,9 @@
                                                     }
                                                 }
                                                 break;
-                                            case Yw.Hydro.ParterProp.CalcuHeadLoss:
+                                            case HydroCalcuProp.CalcuHeadLoss:
                                                 {
-                                                    var gradingList = allCatalogGradingList.Where(x => x.PropName == Yw.Hydro.ParterProp.CalcuHeadLoss).OrderBy(t => t.SortCode).ToList();
+                                                    var gradingList = allCatalogGradingList.Where(x => x.PropName == HydroCalcuProp.CalcuHeadLoss).OrderBy(t => t.SortCode).ToList();
                                                     if (gradingList != null && gradingList.Count > 0)
                                                     {
                                                         var calcuResult = allCalcuResultList?.Find(t => t.Code == pipe.Code);
@@ -2496,9 +2496,9 @@
                                             }
                                         }
                                         break;
-                                    case Yw.Hydro.ParterProp.CalcuFlow:
+                                    case HydroCalcuProp.CalcuFlow:
                                         {
-                                            var gradingList = currentGradingList.Where(x => x.PropName == Yw.Hydro.ParterProp.CalcuFlow).OrderBy(t => t.SortCode).ToList();
+                                            var gradingList = currentGradingList.Where(x => x.PropName == HydroCalcuProp.CalcuFlow).OrderBy(t => t.SortCode).ToList();
                                             if (gradingList != null && gradingList.Count > 0)
                                             {
                                                 var calcuResult = allCalcuResultList?.Find(t => t.Code == pump.Code);
@@ -2521,9 +2521,9 @@
                                             }
                                         }
                                         break;
-                                    case Yw.Hydro.ParterProp.CalcuVelocity:
+                                    case HydroCalcuProp.CalcuVelocity:
                                         {
-                                            var gradingList = currentGradingList.Where(x => x.PropName == Yw.Hydro.ParterProp.CalcuVelocity).OrderBy(t => t.SortCode).ToList();
+                                            var gradingList = currentGradingList.Where(x => x.PropName == HydroCalcuProp.CalcuVelocity).OrderBy(t => t.SortCode).ToList();
                                             if (gradingList != null && gradingList.Count > 0)
                                             {
                                                 var calcuResult = allCalcuResultList?.Find(t => t.Code == pump.Code);
@@ -2546,9 +2546,9 @@
                                             }
                                         }
                                         break;
-                                    case Yw.Hydro.ParterProp.CalcuHeadLoss:
+                                    case HydroCalcuProp.CalcuHeadLoss:
                                         {
-                                            var gradingList = currentGradingList.Where(x => x.PropName == Yw.Hydro.ParterProp.CalcuHeadLoss).OrderBy(t => t.SortCode).ToList();
+                                            var gradingList = currentGradingList.Where(x => x.PropName == HydroCalcuProp.CalcuHeadLoss).OrderBy(t => t.SortCode).ToList();
                                             if (gradingList != null && gradingList.Count > 0)
                                             {
                                                 var calcuResult = allCalcuResultList?.Find(t => t.Code == pump.Code);
@@ -2603,9 +2603,9 @@
                                             }
                                         }
                                         break;
-                                    case Yw.Hydro.ParterProp.CalcuFlow:
+                                    case HydroCalcuProp.CalcuFlow:
                                         {
-                                            var gradingList = currentGradingList.Where(x => x.PropName == Yw.Hydro.ParterProp.CalcuFlow).OrderBy(t => t.SortCode).ToList();
+                                            var gradingList = currentGradingList.Where(x => x.PropName == HydroCalcuProp.CalcuFlow).OrderBy(t => t.SortCode).ToList();
                                             if (gradingList != null && gradingList.Count > 0)
                                             {
                                                 var calcuResult = allCalcuResultList?.Find(t => t.Code == valve.Code);
@@ -2628,9 +2628,9 @@
                                             }
                                         }
                                         break;
-                                    case Yw.Hydro.ParterProp.CalcuVelocity:
+                                    case HydroCalcuProp.CalcuVelocity:
                                         {
-                                            var gradingList = currentGradingList.Where(x => x.PropName == Yw.Hydro.ParterProp.CalcuVelocity).OrderBy(t => t.SortCode).ToList();
+                                            var gradingList = currentGradingList.Where(x => x.PropName == HydroCalcuProp.CalcuVelocity).OrderBy(t => t.SortCode).ToList();
                                             if (gradingList != null && gradingList.Count > 0)
                                             {
                                                 var calcuResult = allCalcuResultList?.Find(t => t.Code == valve.Code);
@@ -2653,9 +2653,9 @@
                                             }
                                         }
                                         break;
-                                    case Yw.Hydro.ParterProp.CalcuHeadLoss:
+                                    case HydroCalcuProp.CalcuHeadLoss:
                                         {
-                                            var gradingList = currentGradingList.Where(x => x.PropName == Yw.Hydro.ParterProp.CalcuHeadLoss).OrderBy(t => t.SortCode).ToList();
+                                            var gradingList = currentGradingList.Where(x => x.PropName == HydroCalcuProp.CalcuHeadLoss).OrderBy(t => t.SortCode).ToList();
                                             if (gradingList != null && gradingList.Count > 0)
                                             {
                                                 var calcuResult = allCalcuResultList?.Find(t => t.Code == valve.Code);
@@ -2692,9 +2692,9 @@
                             {
                                 switch (propName)
                                 {
-                                    case Yw.Hydro.ParterProp.CalcuFlow:
+                                    case HydroCalcuProp.CalcuFlow:
                                         {
-                                            var gradingList = currentGradingList.Where(x => x.PropName == Yw.Hydro.ParterProp.CalcuFlow).OrderBy(t => t.SortCode).ToList();
+                                            var gradingList = currentGradingList.Where(x => x.PropName == HydroCalcuProp.CalcuFlow).OrderBy(t => t.SortCode).ToList();
                                             if (gradingList != null && gradingList.Count > 0)
                                             {
                                                 var calcuResult = allCalcuResultList?.Find(t => t.Code == pipe.Code);
@@ -2717,9 +2717,9 @@
                                             }
                                         }
                                         break;
-                                    case Yw.Hydro.ParterProp.CalcuVelocity:
+                                    case HydroCalcuProp.CalcuVelocity:
                                         {
-                                            var gradingList = currentGradingList.Where(x => x.PropName == Yw.Hydro.ParterProp.CalcuVelocity).OrderBy(t => t.SortCode).ToList();
+                                            var gradingList = currentGradingList.Where(x => x.PropName == HydroCalcuProp.CalcuVelocity).OrderBy(t => t.SortCode).ToList();
                                             if (gradingList != null && gradingList.Count > 0)
                                             {
                                                 var calcuResult = allCalcuResultList?.Find(t => t.Code == pipe.Code);
@@ -2742,9 +2742,9 @@
                                             }
                                         }
                                         break;
-                                    case Yw.Hydro.ParterProp.CalcuHeadLoss:
+                                    case HydroCalcuProp.CalcuHeadLoss:
                                         {
-                                            var gradingList = currentGradingList.Where(x => x.PropName == Yw.Hydro.ParterProp.CalcuHeadLoss).OrderBy(t => t.SortCode).ToList();
+                                            var gradingList = currentGradingList.Where(x => x.PropName == HydroCalcuProp.CalcuHeadLoss).OrderBy(t => t.SortCode).ToList();
                                             if (gradingList != null && gradingList.Count > 0)
                                             {
                                                 var calcuResult = allCalcuResultList?.Find(t => t.Code == pipe.Code);
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 c6eb9c9..f0d2b79 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
@@ -71,12 +71,16 @@
             barBtnUnloadFlowDirection = new DevExpress.XtraBars.BarButtonItem();
             barBtnClearMark = new DevExpress.XtraBars.BarButtonItem();
             batBtnCancelGradingApply = new DevExpress.XtraBars.BarButtonItem();
+            barBtnSetMonitor = new DevExpress.XtraBars.BarButtonItem();
+            barBtnSetMonitorValue = new DevExpress.XtraBars.BarButtonItem();
+            barCkMonitor = new DevExpress.XtraBars.BarCheckItem();
             ribbonPage1 = new DevExpress.XtraBars.Ribbon.RibbonPage();
             pageGroupMatching = new DevExpress.XtraBars.Ribbon.RibbonPageGroup();
             pageGroupModel = new DevExpress.XtraBars.Ribbon.RibbonPageGroup();
             ribbonPageGroup6 = new DevExpress.XtraBars.Ribbon.RibbonPageGroup();
             ribbonPageGroup5 = new DevExpress.XtraBars.Ribbon.RibbonPageGroup();
             ribbonPageGroup1 = new DevExpress.XtraBars.Ribbon.RibbonPageGroup();
+            ribbonPageGroup7 = new DevExpress.XtraBars.Ribbon.RibbonPageGroup();
             ribbonPageGroup2 = new DevExpress.XtraBars.Ribbon.RibbonPageGroup();
             ribbonPageGroup3 = new DevExpress.XtraBars.Ribbon.RibbonPageGroup();
             ribbonPageGroup4 = new DevExpress.XtraBars.Ribbon.RibbonPageGroup();
@@ -90,6 +94,9 @@
             controlContainerBottom = new DevExpress.XtraBars.Docking.ControlContainer();
             svgImg32 = new DevExpress.Utils.SvgImageCollection(components);
             rmSet = new DevExpress.XtraBars.Ribbon.RadialMenu(components);
+            barEditCurrentWorking = new DevExpress.XtraBars.BarEditItem();
+            repositoryItemImageComboBox1 = new DevExpress.XtraEditors.Repository.RepositoryItemImageComboBox();
+            ribbonPageGroup8 = new DevExpress.XtraBars.Ribbon.RibbonPageGroup();
             ((ISupportInitialize)ribbonControl1).BeginInit();
             ((ISupportInitialize)tabPane1).BeginInit();
             tabPane1.SuspendLayout();
@@ -98,25 +105,24 @@
             docPnlBottom.SuspendLayout();
             ((ISupportInitialize)svgImg32).BeginInit();
             ((ISupportInitialize)rmSet).BeginInit();
+            ((ISupportInitialize)repositoryItemImageComboBox1).BeginInit();
             SuspendLayout();
             // 
             // ribbonControl1
             // 
-            ribbonControl1.EmptyAreaImageOptions.ImagePadding = new Padding(43, 47, 43, 47);
             ribbonControl1.ExpandCollapseItem.Id = 0;
             ribbonControl1.ItemPanelStyle = DevExpress.XtraBars.Ribbon.RibbonItemPanelStyle.Classic;
-            ribbonControl1.Items.AddRange(new DevExpress.XtraBars.BarItem[] { ribbonControl1.ExpandCollapseItem, barBtnHydroCheck, barBtnHydroCalcu, barBtnHydroExportInp, barBtnSave, barBtnHydroVisualList, barBtnFastShowHidden, barBtnMatchingList, barBtnUnMatchingList, barBtnSetList, barBtnSetPumpList, barBtnSetValveList, barBtnSetPipeList, barBtnSetElbowsList, barBtnSetThreelinkList, barBtnSetFourlinkList, barBtnSetTranslationList, barBtnSetExchangerList, barBtnSetJunctionList, barBtnParallelAnaly, barBtnSearch, barBtnGradingSet, barBtnGradingApply, barBtnRefresh, barBtnSetMark, barBtnSetReservoirList, barBtnSetTankList, barBtnSetWaterboxList, barBtnSetBluntheadList, barBtnSetNozzleList, barBtnSetHydrantList, barBtnSetMeterList, barBtnSetCompressorList, barBtnSetFlowmeterList, barBtnSetPressmeterList, barBtnLoadFlowDirection, barBtnUnloadFlowDirection, barBtnClearMark, batBtnCancelGradingApply });
+            ribbonControl1.Items.AddRange(new DevExpress.XtraBars.BarItem[] { ribbonControl1.ExpandCollapseItem, barBtnHydroCheck, barBtnHydroCalcu, barBtnHydroExportInp, barBtnSave, barBtnHydroVisualList, barBtnFastShowHidden, barBtnMatchingList, barBtnUnMatchingList, barBtnSetList, barBtnSetPumpList, barBtnSetValveList, barBtnSetPipeList, barBtnSetElbowsList, barBtnSetThreelinkList, barBtnSetFourlinkList, barBtnSetTranslationList, barBtnSetExchangerList, barBtnSetJunctionList, barBtnParallelAnaly, barBtnSearch, barBtnGradingSet, barBtnGradingApply, barBtnRefresh, barBtnSetMark, barBtnSetReservoirList, barBtnSetTankList, barBtnSetWaterboxList, barBtnSetBluntheadList, barBtnSetNozzleList, barBtnSetHydrantList, barBtnSetMeterList, barBtnSetCompressorList, barBtnSetFlowmeterList, barBtnSetPressmeterList, barBtnLoadFlowDirection, barBtnUnloadFlowDirection, barBtnClearMark, batBtnCancelGradingApply, barBtnSetMonitor, barBtnSetMonitorValue, barCkMonitor, barEditCurrentWorking });
             ribbonControl1.Location = new Point(0, 0);
-            ribbonControl1.Margin = new Padding(4, 5, 4, 5);
-            ribbonControl1.MaxItemId = 55;
+            ribbonControl1.MaxItemId = 64;
             ribbonControl1.Name = "ribbonControl1";
-            ribbonControl1.OptionsMenuMinWidth = 471;
             ribbonControl1.Pages.AddRange(new DevExpress.XtraBars.Ribbon.RibbonPage[] { ribbonPage1 });
+            ribbonControl1.RepositoryItems.AddRange(new DevExpress.XtraEditors.Repository.RepositoryItem[] { repositoryItemImageComboBox1 });
             ribbonControl1.ShowApplicationButton = DevExpress.Utils.DefaultBoolean.False;
             ribbonControl1.ShowPageHeadersMode = DevExpress.XtraBars.Ribbon.ShowPageHeadersMode.ShowOnMultiplePages;
             ribbonControl1.ShowQatLocationSelector = false;
             ribbonControl1.ShowToolbarCustomizeItem = false;
-            ribbonControl1.Size = new Size(1897, 148);
+            ribbonControl1.Size = new Size(1535, 128);
             ribbonControl1.Toolbar.ShowCustomizeItem = false;
             ribbonControl1.ToolbarLocation = DevExpress.XtraBars.Ribbon.RibbonQuickAccessToolbarLocation.Hidden;
             // 
@@ -403,9 +409,33 @@
             batBtnCancelGradingApply.Name = "batBtnCancelGradingApply";
             batBtnCancelGradingApply.ItemClick += batBtnCancelGradingApply_ItemClick;
             // 
+            // barBtnSetMonitor
+            // 
+            barBtnSetMonitor.Caption = "鐩戞祴鐐�";
+            barBtnSetMonitor.Id = 56;
+            barBtnSetMonitor.ImageOptions.SvgImage = (DevExpress.Utils.Svg.SvgImage)resources.GetObject("barBtnSetMonitor.ImageOptions.SvgImage");
+            barBtnSetMonitor.Name = "barBtnSetMonitor";
+            barBtnSetMonitor.ItemClick += barBtnSetMonitor_ItemClick;
+            // 
+            // barBtnSetMonitorValue
+            // 
+            barBtnSetMonitorValue.Caption = "鐩戞祴鍊�";
+            barBtnSetMonitorValue.Id = 57;
+            barBtnSetMonitorValue.ImageOptions.SvgImage = (DevExpress.Utils.Svg.SvgImage)resources.GetObject("barBtnSetMonitorValue.ImageOptions.SvgImage");
+            barBtnSetMonitorValue.Name = "barBtnSetMonitorValue";
+            barBtnSetMonitorValue.ItemClick += barBtnSetMonitorValue_ItemClick;
+            // 
+            // barCkMonitor
+            // 
+            barCkMonitor.Caption = "鏄剧ず";
+            barCkMonitor.CheckBoxVisibility = DevExpress.XtraBars.CheckBoxVisibility.AfterText;
+            barCkMonitor.Id = 58;
+            barCkMonitor.Name = "barCkMonitor";
+            barCkMonitor.CheckedChanged += barCkMonitor_CheckedChanged;
+            // 
             // ribbonPage1
             // 
-            ribbonPage1.Groups.AddRange(new DevExpress.XtraBars.Ribbon.RibbonPageGroup[] { pageGroupMatching, pageGroupModel, ribbonPageGroup6, ribbonPageGroup5, ribbonPageGroup1, ribbonPageGroup2, ribbonPageGroup3 });
+            ribbonPage1.Groups.AddRange(new DevExpress.XtraBars.Ribbon.RibbonPageGroup[] { pageGroupMatching, pageGroupModel, ribbonPageGroup6, ribbonPageGroup5, ribbonPageGroup1, ribbonPageGroup7, ribbonPageGroup2, ribbonPageGroup8, ribbonPageGroup3 });
             ribbonPage1.Name = "ribbonPage1";
             ribbonPage1.Text = "ribbonPage1";
             // 
@@ -447,10 +477,19 @@
             ribbonPageGroup1.Name = "ribbonPageGroup1";
             ribbonPageGroup1.Text = "棰滆壊鍒嗙骇";
             // 
+            // ribbonPageGroup7
+            // 
+            ribbonPageGroup7.ItemLinks.Add(barBtnSetMonitor);
+            ribbonPageGroup7.ItemLinks.Add(barBtnSetMonitorValue);
+            ribbonPageGroup7.ItemLinks.Add(barCkMonitor);
+            ribbonPageGroup7.Name = "ribbonPageGroup7";
+            ribbonPageGroup7.Text = "鐩戞祴";
+            // 
             // ribbonPageGroup2
             // 
-            ribbonPageGroup2.ItemLinks.Add(barBtnParallelAnaly);
             ribbonPageGroup2.ItemLinks.Add(barBtnHydroCheck);
+            ribbonPageGroup2.ItemLinks.Add(barEditCurrentWorking);
+            ribbonPageGroup2.ItemLinks.Add(barBtnParallelAnaly);
             ribbonPageGroup2.ItemLinks.Add(barBtnHydroCalcu);
             ribbonPageGroup2.Name = "ribbonPageGroup2";
             ribbonPageGroup2.Text = "姘村姏";
@@ -473,29 +512,26 @@
             tabPane1.Controls.Add(tabPageBimface);
             tabPane1.Controls.Add(tabPageQ3d);
             tabPane1.Dock = DockStyle.Fill;
-            tabPane1.Location = new Point(0, 148);
-            tabPane1.Margin = new Padding(4, 5, 4, 5);
+            tabPane1.Location = new Point(0, 128);
             tabPane1.Name = "tabPane1";
             tabPane1.Pages.AddRange(new DevExpress.XtraBars.Navigation.NavigationPageBase[] { tabPageBimface, tabPageQ3d });
-            tabPane1.RegularSize = new Size(1504, 693);
+            tabPane1.RegularSize = new Size(1260, 407);
             tabPane1.SelectedPage = tabPageBimface;
-            tabPane1.Size = new Size(1504, 693);
+            tabPane1.Size = new Size(1260, 407);
             tabPane1.TabIndex = 1;
             tabPane1.Text = "tabPane1";
             // 
             // tabPageBimface
             // 
             tabPageBimface.Caption = "涓夌淮妯″瀷";
-            tabPageBimface.Margin = new Padding(4, 5, 4, 5);
             tabPageBimface.Name = "tabPageBimface";
-            tabPageBimface.Size = new Size(1504, 644);
+            tabPageBimface.Size = new Size(1260, 374);
             // 
             // tabPageQ3d
             // 
             tabPageQ3d.Caption = "姘村姏妯″瀷";
-            tabPageQ3d.Margin = new Padding(4, 5, 4, 5);
             tabPageQ3d.Name = "tabPageQ3d";
-            tabPageQ3d.Size = new Size(1330, 588);
+            tabPageQ3d.Size = new Size(931, 374);
             // 
             // dockManager1
             // 
@@ -508,19 +544,17 @@
             docPnlRight.Controls.Add(controlContainerRight);
             docPnlRight.Dock = DevExpress.XtraBars.Docking.DockingStyle.Right;
             docPnlRight.ID = new Guid("cffe2560-3445-4488-83cf-b9e4b936ff18");
-            docPnlRight.Location = new Point(1504, 148);
-            docPnlRight.Margin = new Padding(4, 5, 4, 5);
+            docPnlRight.Location = new Point(1260, 128);
             docPnlRight.Name = "docPnlRight";
             docPnlRight.OriginalSize = new Size(275, 200);
-            docPnlRight.Size = new Size(393, 952);
+            docPnlRight.Size = new Size(275, 572);
             docPnlRight.Text = "灞炴��";
             // 
             // controlContainerRight
             // 
-            controlContainerRight.Location = new Point(7, 38);
-            controlContainerRight.Margin = new Padding(4, 5, 4, 5);
+            controlContainerRight.Location = new Point(4, 26);
             controlContainerRight.Name = "controlContainerRight";
-            controlContainerRight.Size = new Size(382, 910);
+            controlContainerRight.Size = new Size(268, 543);
             controlContainerRight.TabIndex = 0;
             // 
             // docPnlBottom
@@ -528,19 +562,17 @@
             docPnlBottom.Controls.Add(controlContainerBottom);
             docPnlBottom.Dock = DevExpress.XtraBars.Docking.DockingStyle.Bottom;
             docPnlBottom.ID = new Guid("2baf4268-45b9-4b56-9f84-98580a0109e5");
-            docPnlBottom.Location = new Point(0, 841);
-            docPnlBottom.Margin = new Padding(4, 5, 4, 5);
+            docPnlBottom.Location = new Point(0, 535);
             docPnlBottom.Name = "docPnlBottom";
             docPnlBottom.OriginalSize = new Size(200, 165);
-            docPnlBottom.Size = new Size(1504, 259);
+            docPnlBottom.Size = new Size(1260, 165);
             docPnlBottom.Text = "搴曢儴鍔熻兘闈㈡澘";
             // 
             // controlContainerBottom
             // 
-            controlContainerBottom.Location = new Point(4, 41);
-            controlContainerBottom.Margin = new Padding(4, 5, 4, 5);
+            controlContainerBottom.Location = new Point(3, 27);
             controlContainerBottom.Name = "controlContainerBottom";
-            controlContainerBottom.Size = new Size(1496, 214);
+            controlContainerBottom.Size = new Size(1254, 135);
             controlContainerBottom.TabIndex = 0;
             // 
             // svgImg32
@@ -575,19 +607,37 @@
             rmSet.Ribbon = ribbonControl1;
             rmSet.BeforePopup += rmSet_BeforePopup;
             // 
+            // barEditCurrentWorking
+            // 
+            barEditCurrentWorking.Caption = "宸ュ喌";
+            barEditCurrentWorking.Edit = repositoryItemImageComboBox1;
+            barEditCurrentWorking.Id = 63;
+            barEditCurrentWorking.Name = "barEditCurrentWorking";
+            // 
+            // repositoryItemImageComboBox1
+            // 
+            repositoryItemImageComboBox1.AutoHeight = false;
+            repositoryItemImageComboBox1.Buttons.AddRange(new EditorButton[] { new EditorButton(ButtonPredefines.Combo) });
+            repositoryItemImageComboBox1.Name = "repositoryItemImageComboBox1";
+            // 
+            // ribbonPageGroup8
+            // 
+            ribbonPageGroup8.Name = "ribbonPageGroup8";
+            ribbonPageGroup8.Text = "璇勪及";
+            // 
             // XhsProjectSimulationCorePage
             // 
             Appearance.BackColor = SystemColors.Control;
             Appearance.Options.UseBackColor = true;
-            AutoScaleDimensions = new SizeF(10F, 22F);
+            AutoScaleDimensions = new SizeF(7F, 14F);
             AutoScaleMode = AutoScaleMode.Font;
             Controls.Add(tabPane1);
-            Controls.Add(docPnlRight);
             Controls.Add(docPnlBottom);
+            Controls.Add(docPnlRight);
             Controls.Add(ribbonControl1);
-            Margin = new Padding(3, 3, 3, 3);
+            Margin = new Padding(2);
             Name = "XhsProjectSimulationCorePage";
-            Size = new Size(1897, 1100);
+            Size = new Size(1535, 700);
             ((ISupportInitialize)ribbonControl1).EndInit();
             ((ISupportInitialize)tabPane1).EndInit();
             tabPane1.ResumeLayout(false);
@@ -596,6 +646,7 @@
             docPnlBottom.ResumeLayout(false);
             ((ISupportInitialize)svgImg32).EndInit();
             ((ISupportInitialize)rmSet).EndInit();
+            ((ISupportInitialize)repositoryItemImageComboBox1).EndInit();
             ResumeLayout(false);
             PerformLayout();
         }
@@ -660,5 +711,12 @@
         private DevExpress.XtraBars.BarButtonItem barBtnClearMark;
         private DevExpress.XtraBars.Ribbon.RibbonPageGroup ribbonPageGroup6;
         private DevExpress.XtraBars.BarButtonItem batBtnCancelGradingApply;
+        private DevExpress.XtraBars.Ribbon.RibbonPageGroup ribbonPageGroup7;
+        private DevExpress.XtraBars.BarButtonItem barBtnSetMonitor;
+        private DevExpress.XtraBars.BarButtonItem barBtnSetMonitorValue;
+        private DevExpress.XtraBars.BarCheckItem barCkMonitor;
+        private DevExpress.XtraBars.BarEditItem barEditCurrentWorking;
+        private DevExpress.XtraEditors.Repository.RepositoryItemImageComboBox repositoryItemImageComboBox1;
+        private DevExpress.XtraBars.Ribbon.RibbonPageGroup ribbonPageGroup8;
     }
 }
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 dfc94d9..417c85a 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
@@ -1,6 +1,8 @@
 锘縢lobal using Yw.EPAnet;
 using DevExpress.Mvvm.Native;
+using DevExpress.Utils.Extensions;
 using DevExpress.Xpo.Helpers;
+using DevExpress.XtraBars.Ribbon;
 using DevExpress.XtraRichEdit.Layout;
 using DevExpress.XtraSpreadsheet.Commands;
 using HStation.WinFrmUI.PhartRelation;
@@ -1079,7 +1081,7 @@
                 WaitFormHelper.ShowWaitForm(this, "姝e湪璁$畻鍒嗘瀽涓紝璇风◢鍊�...");
 
 
-                await Task.Delay(5000);
+                //await Task.Delay(5000);
 
                 var netWork = Yw.Hydro.ParseHelper.ToNetwork(_hydroInfo);
                 _calcuResult = netWork.CalcuMinorLoss();
@@ -2076,7 +2078,7 @@
                     {
                         Code = Yw.Hydro.ParterCatalog.Pipe,
                         Name = Yw.WinFrmUI.HydroParterCatalogHelper.GetName(Yw.Hydro.ParterCatalog.Pipe),
-                        PropName = Yw.Hydro.ParterProp.CalcuFlow
+                        PropName = HydroCalcuProp.CalcuFlow
                     });
                 }
             }
@@ -2143,9 +2145,9 @@
                                                     }
                                                 }
                                                 break;
-                                            case Yw.Hydro.ParterProp.CalcuFlow:
+                                            case HydroCalcuProp.CalcuFlow:
                                                 {
-                                                    var gradingList = allCatalogGradingList.Where(x => x.PropName == Yw.Hydro.ParterProp.CalcuFlow).OrderBy(t => t.SortCode).ToList();
+                                                    var gradingList = allCatalogGradingList.Where(x => x.PropName == HydroCalcuProp.CalcuFlow).OrderBy(t => t.SortCode).ToList();
                                                     if (gradingList != null && gradingList.Count > 0)
                                                     {
                                                         var calcuResult = allCalcuResultList?.Find(t => t.Code == pump.Code);
@@ -2168,9 +2170,9 @@
                                                     }
                                                 }
                                                 break;
-                                            case Yw.Hydro.ParterProp.CalcuVelocity:
+                                            case HydroCalcuProp.CalcuVelocity:
                                                 {
-                                                    var gradingList = allCatalogGradingList.Where(x => x.PropName == Yw.Hydro.ParterProp.CalcuVelocity).OrderBy(t => t.SortCode).ToList();
+                                                    var gradingList = allCatalogGradingList.Where(x => x.PropName == HydroCalcuProp.CalcuVelocity).OrderBy(t => t.SortCode).ToList();
                                                     if (gradingList != null && gradingList.Count > 0)
                                                     {
                                                         var calcuResult = allCalcuResultList?.Find(t => t.Code == pump.Code);
@@ -2193,9 +2195,9 @@
                                                     }
                                                 }
                                                 break;
-                                            case Yw.Hydro.ParterProp.CalcuHeadLoss:
+                                            case HydroCalcuProp.CalcuHeadLoss:
                                                 {
-                                                    var gradingList = allCatalogGradingList.Where(x => x.PropName == Yw.Hydro.ParterProp.CalcuHeadLoss).OrderBy(t => t.SortCode).ToList();
+                                                    var gradingList = allCatalogGradingList.Where(x => x.PropName == HydroCalcuProp.CalcuHeadLoss).OrderBy(t => t.SortCode).ToList();
                                                     if (gradingList != null && gradingList.Count > 0)
                                                     {
                                                         var calcuResult = allCalcuResultList?.Find(t => t.Code == pump.Code);
@@ -2250,9 +2252,9 @@
                                                     }
                                                 }
                                                 break;
-                                            case Yw.Hydro.ParterProp.CalcuFlow:
+                                            case HydroCalcuProp.CalcuFlow:
                                                 {
-                                                    var gradingList = allCatalogGradingList.Where(x => x.PropName == Yw.Hydro.ParterProp.CalcuFlow).OrderBy(t => t.SortCode).ToList();
+                                                    var gradingList = allCatalogGradingList.Where(x => x.PropName == HydroCalcuProp.CalcuFlow).OrderBy(t => t.SortCode).ToList();
                                                     if (gradingList != null && gradingList.Count > 0)
                                                     {
                                                         var calcuResult = allCalcuResultList?.Find(t => t.Code == valve.Code);
@@ -2275,9 +2277,9 @@
                                                     }
                                                 }
                                                 break;
-                                            case Yw.Hydro.ParterProp.CalcuVelocity:
+                                            case HydroCalcuProp.CalcuVelocity:
                                                 {
-                                                    var gradingList = allCatalogGradingList.Where(x => x.PropName == Yw.Hydro.ParterProp.CalcuVelocity).OrderBy(t => t.SortCode).ToList();
+                                                    var gradingList = allCatalogGradingList.Where(x => x.PropName == HydroCalcuProp.CalcuVelocity).OrderBy(t => t.SortCode).ToList();
                                                     if (gradingList != null && gradingList.Count > 0)
                                                     {
                                                         var calcuResult = allCalcuResultList?.Find(t => t.Code == valve.Code);
@@ -2300,9 +2302,9 @@
                                                     }
                                                 }
                                                 break;
-                                            case Yw.Hydro.ParterProp.CalcuHeadLoss:
+                                            case HydroCalcuProp.CalcuHeadLoss:
                                                 {
-                                                    var gradingList = allCatalogGradingList.Where(x => x.PropName == Yw.Hydro.ParterProp.CalcuHeadLoss).OrderBy(t => t.SortCode).ToList();
+                                                    var gradingList = allCatalogGradingList.Where(x => x.PropName == HydroCalcuProp.CalcuHeadLoss).OrderBy(t => t.SortCode).ToList();
                                                     if (gradingList != null && gradingList.Count > 0)
                                                     {
                                                         var calcuResult = allCalcuResultList?.Find(t => t.Code == valve.Code);
@@ -2339,9 +2341,9 @@
                                     {
                                         switch (x.PropName)
                                         {
-                                            case Yw.Hydro.ParterProp.CalcuFlow:
+                                            case HydroCalcuProp.CalcuFlow:
                                                 {
-                                                    var gradingList = allCatalogGradingList.Where(x => x.PropName == Yw.Hydro.ParterProp.CalcuFlow).OrderBy(t => t.SortCode).ToList();
+                                                    var gradingList = allCatalogGradingList.Where(x => x.PropName == HydroCalcuProp.CalcuFlow).OrderBy(t => t.SortCode).ToList();
                                                     if (gradingList != null && gradingList.Count > 0)
                                                     {
                                                         var calcuResult = allCalcuResultList?.Find(t => t.Code == pipe.Code);
@@ -2364,9 +2366,9 @@
                                                     }
                                                 }
                                                 break;
-                                            case Yw.Hydro.ParterProp.CalcuVelocity:
+                                            case HydroCalcuProp.CalcuVelocity:
                                                 {
-                                                    var gradingList = allCatalogGradingList.Where(x => x.PropName == Yw.Hydro.ParterProp.CalcuVelocity).OrderBy(t => t.SortCode).ToList();
+                                                    var gradingList = allCatalogGradingList.Where(x => x.PropName == HydroCalcuProp.CalcuVelocity).OrderBy(t => t.SortCode).ToList();
                                                     if (gradingList != null && gradingList.Count > 0)
                                                     {
                                                         var calcuResult = allCalcuResultList?.Find(t => t.Code == pipe.Code);
@@ -2389,9 +2391,9 @@
                                                     }
                                                 }
                                                 break;
-                                            case Yw.Hydro.ParterProp.CalcuHeadLoss:
+                                            case HydroCalcuProp.CalcuHeadLoss:
                                                 {
-                                                    var gradingList = allCatalogGradingList.Where(x => x.PropName == Yw.Hydro.ParterProp.CalcuHeadLoss).OrderBy(t => t.SortCode).ToList();
+                                                    var gradingList = allCatalogGradingList.Where(x => x.PropName == HydroCalcuProp.CalcuHeadLoss).OrderBy(t => t.SortCode).ToList();
                                                     if (gradingList != null && gradingList.Count > 0)
                                                     {
                                                         var calcuResult = allCalcuResultList?.Find(t => t.Code == pipe.Code);
@@ -2497,9 +2499,9 @@
                                             }
                                         }
                                         break;
-                                    case Yw.Hydro.ParterProp.CalcuFlow:
+                                    case HydroCalcuProp.CalcuFlow:
                                         {
-                                            var gradingList = currentGradingList.Where(x => x.PropName == Yw.Hydro.ParterProp.CalcuFlow).OrderBy(t => t.SortCode).ToList();
+                                            var gradingList = currentGradingList.Where(x => x.PropName == HydroCalcuProp.CalcuFlow).OrderBy(t => t.SortCode).ToList();
                                             if (gradingList != null && gradingList.Count > 0)
                                             {
                                                 var calcuResult = allCalcuResultList?.Find(t => t.Code == pump.Code);
@@ -2522,9 +2524,9 @@
                                             }
                                         }
                                         break;
-                                    case Yw.Hydro.ParterProp.CalcuVelocity:
+                                    case HydroCalcuProp.CalcuVelocity:
                                         {
-                                            var gradingList = currentGradingList.Where(x => x.PropName == Yw.Hydro.ParterProp.CalcuVelocity).OrderBy(t => t.SortCode).ToList();
+                                            var gradingList = currentGradingList.Where(x => x.PropName == HydroCalcuProp.CalcuVelocity).OrderBy(t => t.SortCode).ToList();
                                             if (gradingList != null && gradingList.Count > 0)
                                             {
                                                 var calcuResult = allCalcuResultList?.Find(t => t.Code == pump.Code);
@@ -2547,9 +2549,9 @@
                                             }
                                         }
                                         break;
-                                    case Yw.Hydro.ParterProp.CalcuHeadLoss:
+                                    case HydroCalcuProp.CalcuHeadLoss:
                                         {
-                                            var gradingList = currentGradingList.Where(x => x.PropName == Yw.Hydro.ParterProp.CalcuHeadLoss).OrderBy(t => t.SortCode).ToList();
+                                            var gradingList = currentGradingList.Where(x => x.PropName == HydroCalcuProp.CalcuHeadLoss).OrderBy(t => t.SortCode).ToList();
                                             if (gradingList != null && gradingList.Count > 0)
                                             {
                                                 var calcuResult = allCalcuResultList?.Find(t => t.Code == pump.Code);
@@ -2604,9 +2606,9 @@
                                             }
                                         }
                                         break;
-                                    case Yw.Hydro.ParterProp.CalcuFlow:
+                                    case HydroCalcuProp.CalcuFlow:
                                         {
-                                            var gradingList = currentGradingList.Where(x => x.PropName == Yw.Hydro.ParterProp.CalcuFlow).OrderBy(t => t.SortCode).ToList();
+                                            var gradingList = currentGradingList.Where(x => x.PropName == HydroCalcuProp.CalcuFlow).OrderBy(t => t.SortCode).ToList();
                                             if (gradingList != null && gradingList.Count > 0)
                                             {
                                                 var calcuResult = allCalcuResultList?.Find(t => t.Code == valve.Code);
@@ -2629,9 +2631,9 @@
                                             }
                                         }
                                         break;
-                                    case Yw.Hydro.ParterProp.CalcuVelocity:
+                                    case HydroCalcuProp.CalcuVelocity:
                                         {
-                                            var gradingList = currentGradingList.Where(x => x.PropName == Yw.Hydro.ParterProp.CalcuVelocity).OrderBy(t => t.SortCode).ToList();
+                                            var gradingList = currentGradingList.Where(x => x.PropName == HydroCalcuProp.CalcuVelocity).OrderBy(t => t.SortCode).ToList();
                                             if (gradingList != null && gradingList.Count > 0)
                                             {
                                                 var calcuResult = allCalcuResultList?.Find(t => t.Code == valve.Code);
@@ -2654,9 +2656,9 @@
                                             }
                                         }
                                         break;
-                                    case Yw.Hydro.ParterProp.CalcuHeadLoss:
+                                    case HydroCalcuProp.CalcuHeadLoss:
                                         {
-                                            var gradingList = currentGradingList.Where(x => x.PropName == Yw.Hydro.ParterProp.CalcuHeadLoss).OrderBy(t => t.SortCode).ToList();
+                                            var gradingList = currentGradingList.Where(x => x.PropName == HydroCalcuProp.CalcuHeadLoss).OrderBy(t => t.SortCode).ToList();
                                             if (gradingList != null && gradingList.Count > 0)
                                             {
                                                 var calcuResult = allCalcuResultList?.Find(t => t.Code == valve.Code);
@@ -2693,9 +2695,9 @@
                             {
                                 switch (propName)
                                 {
-                                    case Yw.Hydro.ParterProp.CalcuFlow:
+                                    case HydroCalcuProp.CalcuFlow:
                                         {
-                                            var gradingList = currentGradingList.Where(x => x.PropName == Yw.Hydro.ParterProp.CalcuFlow).OrderBy(t => t.SortCode).ToList();
+                                            var gradingList = currentGradingList.Where(x => x.PropName == HydroCalcuProp.CalcuFlow).OrderBy(t => t.SortCode).ToList();
                                             if (gradingList != null && gradingList.Count > 0)
                                             {
                                                 var calcuResult = allCalcuResultList?.Find(t => t.Code == pipe.Code);
@@ -2718,9 +2720,9 @@
                                             }
                                         }
                                         break;
-                                    case Yw.Hydro.ParterProp.CalcuVelocity:
+                                    case HydroCalcuProp.CalcuVelocity:
                                         {
-                                            var gradingList = currentGradingList.Where(x => x.PropName == Yw.Hydro.ParterProp.CalcuVelocity).OrderBy(t => t.SortCode).ToList();
+                                            var gradingList = currentGradingList.Where(x => x.PropName == HydroCalcuProp.CalcuVelocity).OrderBy(t => t.SortCode).ToList();
                                             if (gradingList != null && gradingList.Count > 0)
                                             {
                                                 var calcuResult = allCalcuResultList?.Find(t => t.Code == pipe.Code);
@@ -2743,9 +2745,9 @@
                                             }
                                         }
                                         break;
-                                    case Yw.Hydro.ParterProp.CalcuHeadLoss:
+                                    case HydroCalcuProp.CalcuHeadLoss:
                                         {
-                                            var gradingList = currentGradingList.Where(x => x.PropName == Yw.Hydro.ParterProp.CalcuHeadLoss).OrderBy(t => t.SortCode).ToList();
+                                            var gradingList = currentGradingList.Where(x => x.PropName == HydroCalcuProp.CalcuHeadLoss).OrderBy(t => t.SortCode).ToList();
                                             if (gradingList != null && gradingList.Count > 0)
                                             {
                                                 var calcuResult = allCalcuResultList?.Find(t => t.Code == pipe.Code);
@@ -3086,12 +3088,39 @@
 
         #endregion
 
-        #region 鍙瑙嗗浘
+        #region 閫夋嫨鏋勪欢
 
-        //鎵�鏈夊彲瑙佽鍥惧垪琛�
+        //閫夋嫨鏋勪欢
+        private Yw.Model.HydroVisualInfo _selectedVisual = null;
+
+        //閫夋嫨鏋勪欢
+        private Yw.Model.HydroVisualInfo SelectedVisual
+        {
+            get { return _selectedVisual; }
+            set
+            {
+                _selectedVisual = value;
+                if (_selectedVisual == null)
+                {
+                    this.barBtnSetMonitor.Enabled = false;
+                }
+                else
+                {
+                    this.barBtnSetMonitor.Enabled = true;
+                }
+            }
+        }
+
+        #endregion
+
+        #region 鏋勪欢鏄庣粏
+
+        #region 鏋勪欢鍒楄〃
+
+        //鎵�鏈夋瀯浠惰鍥惧垪琛�
         private List<HydroVisualViewModel> _allVisualViewModelList = null;
 
-        //鑾峰彇鍙瑙嗗浘鍒楄〃
+        //鑾峰彇鏋勪欢瑙嗗浘鍒楄〃
         private List<HydroVisualViewModel> GetVisualViewModelList()
         {
             if (_hydroInfo == null)
@@ -3154,6 +3183,17 @@
             }
         }
 
+        //鑾峰彇鏋勪欢瑙嗗浘
+        private HydroVisualViewModel GetVisualViewModel(string code)
+        {
+            if (string.IsNullOrEmpty(code))
+            {
+                return default;
+            }
+            var allVisualViewModelList = GetVisualViewModelList();
+            return allVisualViewModelList?.Find(x => x.Code == code);
+        }
+
         //鑾峰彇鍙瑙嗗浘
         private HydroVisualViewModel GetVisualViewModel(Yw.Model.HydroVisualInfo visual)
         {
@@ -3165,17 +3205,11 @@
             return allVisualViewModelList?.Find(x => x.Code == visual.Code);
         }
 
-        #endregion
-
-        #region 閫夋嫨鏋勪欢
-
-        //閫夋嫨鏋勪欢
-        private Yw.Model.HydroVisualInfo _selectedVisual = null;
 
 
         #endregion
 
-        #region 鏋勪欢鏄庣粏
+        #region 鏋勪欢鏄庣粏鎺т欢
 
         //鏋勪欢鏄庣粏鎺т欢
         private Yw.WinFrmUI.HydroVisualListCtrl _visualListCtrl = null;
@@ -3269,6 +3303,247 @@
 
         #endregion
 
+        #endregion
+
+        #region 鐩戞祴鍒楄〃
+
+        #region 娴嬬偣鍒楄〃
+
+        //鎵�鏈夌洃娴嬬偣鍒楄〃
+        private List<HydroMonitorVmo> _allMonitorList = null;
+
+        //鑾峰彇鐩戞祴鐐瑰垪琛�
+        private async Task<List<HydroMonitorVmo>> GetMonitorList()
+        {
+            if (_hydroInfo == null)
+            {
+                return default;
+            }
+            if (_allMonitorList == null)
+            {
+                _allMonitorList = await BLLFactory<Yw.BLL.HydroMonitor>.Instance.GetByModelID(_hydroInfo.ID);
+                if (_allMonitorList == null)
+                {
+                    _allMonitorList = new List<HydroMonitorVmo>();
+                }
+            }
+            return _allMonitorList;
+        }
+
+        //鏇存柊鐩戞祴鐐瑰垪琛�
+        private async void UpdateMonitorList(string code)
+        {
+            if (_hydroInfo == null)
+            {
+                return;
+            }
+            if (string.IsNullOrEmpty(code))
+            {
+                return;
+            }
+            var allMonitorList = await GetMonitorList();
+            allMonitorList.RemoveAll(x => x.Relation == code);
+            var monitorList = await BLLFactory<Yw.BLL.HydroMonitor>.Instance.GetByRelation(_hydroInfo.ID, code);
+            if (monitorList != null && monitorList.Count > 0)
+            {
+                allMonitorList.AddRange(monitorList);
+            }
+            UpdateMonitorValueList(code, monitorList);
+            SetLogicMonitorList();
+        }
+
+        //璁剧疆閫夋嫨鏋勪欢鐩戞祴鐐瑰垪琛�
+        private async void SetSelectVisualMonitorList()
+        {
+            if (_hydroInfo == null)
+            {
+                return;
+            }
+            if (_selectedVisual == null)
+            {
+                return;
+            }
+            var allMonitorList = await GetMonitorList();
+            var dlg = new SetHydroVisualMonitorDlg();
+            dlg.SetBindingData(_hydroInfo, _selectedVisual, allMonitorList);
+            dlg.ReloadDataEvent += async (hydroInfo, visual, list) =>
+            {
+                if (hydroInfo == null)
+                {
+                    return;
+                }
+                if (visual == null)
+                {
+                    return;
+                }
+                var bol = await BLLFactory<Yw.BLL.HydroMonitor>.Instance.Save(hydroInfo.ID, visual.Code, list);
+                if (!bol)
+                {
+                    TipFormHelper.ShowError("璁剧疆澶辫触");
+                    return;
+                }
+                TipFormHelper.ShowSucceed("璁剧疆鎴愬姛");
+                UpdateMonitorList(visual.Code);
+            };
+            dlg.ShowDialog();
+        }
+
+        //璁剧疆鐩戞祴鐐�
+        private void barBtnSetMonitor_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
+        {
+            SetSelectVisualMonitorList();
+        }
+
+        #endregion
+
+        #region 鐩戞祴鍊煎垪琛�
+
+        //鎵�鏈夌洃娴嬪�煎垪琛�
+        private List<HydroVisualMonitorValueViewModel> _allMonitorValueList = null;
+
+        //鑾峰彇鐩戞祴鍊煎垪琛�
+        private async Task<List<HydroVisualMonitorValueViewModel>> GetMonitorValueList()
+        {
+            if (_allMonitorValueList == null)
+            {
+                _allMonitorValueList = new List<HydroVisualMonitorValueViewModel>();
+                var allMonitorList = await GetMonitorList();
+                var allVisualViewModelList = GetVisualViewModelList();
+                allMonitorList.ForEach(x =>
+                {
+                    var visual = allVisualViewModelList.Find(t => t.Code == x.Relation);
+                    if (visual != null)
+                    {
+                        var vm = new HydroVisualMonitorValueViewModel(visual.Vmo, x);
+                        _allMonitorValueList.Add(vm);
+                    }
+                });
+            }
+            return _allMonitorValueList;
+        }
+
+        //鏇存柊鐩戞祴鍊煎垪琛�
+        private async void UpdateMonitorValueList(string code, List<HydroMonitorVmo> monitorList)
+        {
+            if (string.IsNullOrEmpty(code))
+            {
+                return;
+            }
+            var visual = GetVisualViewModel(code)?.Vmo;
+            if (visual == null)
+            {
+                return;
+            }
+            var allMonitorValueList = await GetMonitorValueList();
+            var monitorValueList = allMonitorValueList.Where(x => x.Vmo.Relation == code).ToList();
+            monitorValueList?.ForEach(x =>
+            {
+                var result = monitorList?.Exists(t => t.Relation == x.Vmo.Relation && t.PropName == x.Vmo.PropName);
+                if (!(result.HasValue && result.Value))
+                {
+                    allMonitorValueList.Remove(x);
+                }
+            });
+            monitorList?.ForEach(x =>
+            {
+                var result = monitorValueList?.Exists(t => t.Vmo.Relation == x.Relation && t.Vmo.PropName == x.PropName);
+                if (!(result.HasValue && result.Value))
+                {
+                    var vm = new HydroVisualMonitorValueViewModel(visual, x);
+                    allMonitorValueList.Add(vm);
+                }
+            });
+        }
+
+        #endregion
+
+        #region 鐩戞祴鍊煎垪琛ㄦ帶浠�
+
+        //鐩戞祴鍊煎垪琛ㄦ帶浠�
+        private HydroVisualMonitorValueListCtrl _monitorValueListCtrl = null;
+
+        //鑾峰彇鐩戞祴鍊煎垪琛ㄦ帶浠�
+        private HydroVisualMonitorValueListCtrl GetMonitorValueListCtrl()
+        {
+            if (_monitorValueListCtrl == null)
+            {
+                _monitorValueListCtrl = new HydroVisualMonitorValueListCtrl();
+                _monitorValueListCtrl.Dock = DockStyle.Fill;
+                _monitorValueListCtrl.HydroViewEvent += (code) =>
+                {
+                    _bimfaceCtrl?.ZoomToComponent(code);
+                };
+            }
+            return _monitorValueListCtrl;
+        }
+
+        //鏄剧ず鐩戞祴鍊煎垪琛ㄦ帶浠�
+        private async void ShowMonitorValueListCtrl()
+        {
+            var monitorValueListCtrl = GetMonitorValueListCtrl();
+            var allMonitorValueList = await GetMonitorValueList();
+            monitorValueListCtrl.SetBindingData(allMonitorValueList);
+            this.controlContainerBottom.Controls.Clear();
+            this.controlContainerBottom.Controls.Add(monitorValueListCtrl);
+            this.docPnlBottom.Visibility = DevExpress.XtraBars.Docking.DockVisibility.Visible;
+            this.docPnlBottom.Text = "鐩戞祴鍊�";
+            this.docPnlBottom.Height = 350;
+        }
+
+        //璁剧疆鐩戞祴鍊�
+        private void barBtnSetMonitorValue_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
+        {
+            ShowMonitorValueListCtrl();
+        }
+
+        #endregion
+
+        #region 鐩戞祴鍒楄〃鏄剧ず
+
+        //鐩戞祴鏄惁鏄剧ず
+        private bool _isMonitorVisible = false;
+
+        //鑾峰彇涓氬姟鐩戞祴鍒楄〃
+        private async Task<List<LogicMonitor>> GetLogicMonitorList()
+        {
+            var allMonitorList = await GetMonitorList();
+            var allLogicMonitorList = allMonitorList.Select(x =>
+            {
+                var logicMonitor = new LogicMonitor();
+                logicMonitor.Id = x.Relation;
+                logicMonitor.PropName = x.PropName;
+                logicMonitor.Description = x.Description;
+                return logicMonitor;
+            }).ToList();
+            return allLogicMonitorList;
+        }
+
+        //璁剧疆涓氬姟鐩戞祴鍒楄〃
+        private async void SetLogicMonitorList()
+        {
+            if (_isMonitorVisible)
+            {
+                var allLogicMonitorList = await GetLogicMonitorList();
+                await _bimfaceCtrl?.SetLogicMonitors(allLogicMonitorList);
+            }
+            else
+            {
+                await _bimfaceCtrl?.ClearLogicMonitors();
+            }
+        }
+
+        //鏄剧ず鐘舵�佹敼鍙�
+        private void barCkMonitor_CheckedChanged(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
+        {
+            _isMonitorVisible = this.barCkMonitor.Checked;
+            SetLogicMonitorList();
+        }
+
+
+        #endregion
+
+        #endregion
+
         #region 姘村姏鏍¢獙
 
         //鏍¢獙鎺т欢
@@ -3339,5 +3614,10 @@
         #endregion
 
 
+
+
+
+
+
     }
 }
\ No newline at end of file
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/XhsProjectSimulationCorePage.resx b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/XhsProjectSimulationCorePage.resx
index 242d4b0..1f1c08d 100644
--- a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/XhsProjectSimulationCorePage.resx
+++ b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/XhsProjectSimulationCorePage.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
@@ -550,6 +550,54 @@
         c3ZnPgs=
 </value>
   </data>
+  <data name="barBtnSetMonitor.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIzLjIsIFZlcnNpb249MjMuMi40
+        LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
+        dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAAMEEAAAC77u/
+        PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi
+        IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv
+        MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh
+        Y2U9InByZXNlcnZlIiBpZD0iTGF5ZXJfMSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAg
+        MzIgMzIiPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLkJsYWNre2ZpbGw6IzcyNzI3Mjt9Cgku
+        WWVsbG93e2ZpbGw6I0ZGQjExNTt9CgkuQmx1ZXtmaWxsOiMxMTc3RDc7fQoJLlJlZHtmaWxsOiNEMTFD
+        MUM7fQoJLldoaXRle2ZpbGw6I0ZGRkZGRjt9CgkuR3JlZW57ZmlsbDojMDM5QzIzO30KCS5zdDB7Zmls
+        bDojNzI3MjcyO30KCS5zdDF7b3BhY2l0eTowLjU7fQoJLnN0MntvcGFjaXR5OjAuNzU7fQo8L3N0eWxl
+        Pg0KICA8ZyBpZD0iUHJvZHVjdFF1aWNrVG9wU2FsZXNwZXJzb24iPg0KICAgIDxwYXRoIGQ9Ik0wLDE0
+        aDZ2MTJIMFYxNHogTTIxLjQsMjMuNWMwLjEsMCwwLjItMC4xLDAuMy0wLjFjLTAuMi0wLjQtMC40LTAu
+        OC0wLjUtMS4yYy0wLjQtMC40LTAuNy0wLjktMC44LTEuNiAgIGMtMC4zLTAuNC0wLjYtMS4yLTAuNC0y
+        LjJsMC4xLTAuMmMtMC4zLTEuNiwwLTMuMiwwLjgtNC4zYzAuMy0wLjMsMC42LTAuNywxLjEtMVYyaC02
+        djI0aDIuNkMxOS4yLDI0LjYsMjAuNCwyNCwyMS40LDIzLjV6IE04LDI2ICAgaDZWOEg4VjI2eiIgY2xh
+        c3M9IkJsdWUiIC8+DQogICAgPHBhdGggZD0iTTMyLDI5LjFWMzBIMjB2LTAuOWMwLTQsMi4zLTMuMywz
+        LjYtNC42YzAuNSwwLjgsMS4zLDEuNSwyLjQsMS41YzEuMSwwLDEuOS0wLjYsMi41LTEuNCAgIEMyOS44
+        LDI1LjgsMzIsMjUuMSwzMiwyOS4xeiBNMjIuOSwyMC44djAuMWMwLjQsMS41LDEuMywzLjEsMy4xLDMu
+        MXMyLjgtMS42LDMuMi0zLjF2LTAuMWMwLjcsMCwwLjQtMC43LDAuNi0xczAuMy0wLjUsMC4yLTAuOSAg
+        IGMtMC4xLTAuMy0wLjMtMC4yLTAuNC0wLjJjMS4yLTMuMS0wLjctMi45LTAuNy0yLjlTMjguNywxNCwy
+        NS4yLDE0Yy0zLjIsMC0zLjYsMi41LTIuOSw0LjdjMCwwLjEtMC4yLDAuMS0wLjMsMC4yICAgYy0wLjEs
+        MC40LDAuMSwwLjYsMC4zLDAuOVMyMi4yLDIwLjgsMjIuOSwyMC44eiIgY2xhc3M9IkJsYWNrIiAvPg0K
+        ICA8L2c+DQo8L3N2Zz4L
+</value>
+  </data>
+  <data name="barBtnSetMonitorValue.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIzLjIsIFZlcnNpb249MjMuMi40
+        LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
+        dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAAOwCAAAC77u/
+        PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi
+        IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv
+        MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh
+        Y2U9InByZXNlcnZlIiBpZD0iTGF5ZXJfMSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAg
+        MzIgMzIiPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLkJsYWNre2ZpbGw6IzcyNzI3Mjt9Cgku
+        Qmx1ZXtmaWxsOiMxMTc3RDc7fQoJLkdyZWVue2ZpbGw6IzAzOUMyMzt9CgkuWWVsbG93e2ZpbGw6I0ZG
+        QjExNTt9CgkuUmVke2ZpbGw6I0QxMUMxQzt9CgkuV2hpdGV7ZmlsbDojRkZGRkZGO30KCS5zdDB7b3Bh
+        Y2l0eTowLjU7fQoJLnN0MXtvcGFjaXR5OjAuNzU7fQoJLnN0MntkaXNwbGF5Om5vbmU7fQoJLnN0M3tk
+        aXNwbGF5OmlubGluZTtmaWxsOiMxMTc3RDc7fQoJLnN0NHtkaXNwbGF5OmlubGluZTtmaWxsOiM3Mjcy
+        NzI7fQo8L3N0eWxlPg0KICA8ZyBpZD0iU3BhcmtsaW5lV2luTG9zcyI+DQogICAgPHBhdGggZD0iTTAs
+        OGg2djhIMFY4eiBNMTIsMTZoNlYyaC02VjE2eiBNMjQsMTZoNlY2aC02VjE2eiIgY2xhc3M9IkJsdWUi
+        IC8+DQogICAgPHBhdGggZD0iTTYsMTZoNnYxMEg2VjE2eiBNMTgsMzBoNlYxNmgtNlYzMHoiIGNsYXNz
+        PSJSZWQiIC8+DQogIDwvZz4NCjwvc3ZnPgs=
+</value>
+  </data>
   <metadata name="dockManager1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
     <value>179, 21</value>
   </metadata>
diff --git a/WinFrmUI/Yw.WinFrmUI.Bimface.Core/00-core/06-logic-monitor/LogicMonitor.cs b/WinFrmUI/Yw.WinFrmUI.Bimface.Core/00-core/06-logic-monitor/LogicMonitor.cs
new file mode 100644
index 0000000..e3564a6
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Bimface.Core/00-core/06-logic-monitor/LogicMonitor.cs
@@ -0,0 +1,27 @@
+锘縩amespace Yw.WinFrmUI.Bimface
+{
+    /// <summary>
+    /// 涓氬姟鐩戞祴鐐�
+    /// </summary>
+    public class LogicMonitor
+    {
+        /// <summary>
+        /// 缂栫爜
+        /// </summary>
+        [JsonProperty("id", NullValueHandling = NullValueHandling.Ignore)]
+        public string Id { get; set; }
+
+        /// <summary>
+        /// 灞炴�у悕绉�
+        /// </summary>
+        [JsonProperty("propName", NullValueHandling = NullValueHandling.Ignore)]
+        public string PropName { get; set; }
+
+        /// <summary>
+        /// 璇存槑
+        /// </summary>
+        [JsonProperty("description", NullValueHandling = NullValueHandling.Ignore)]
+        public string Description { get; set; }
+
+    }
+}
diff --git a/WinFrmUI/Yw.WinFrmUI.Bimface.Core/01-interop/01-interop3d/BimfaceInterop3dContainer.cs b/WinFrmUI/Yw.WinFrmUI.Bimface.Core/01-interop/01-interop3d/BimfaceInterop3dContainer.cs
index 5497fa1..abe5deb 100644
--- a/WinFrmUI/Yw.WinFrmUI.Bimface.Core/01-interop/01-interop3d/BimfaceInterop3dContainer.cs
+++ b/WinFrmUI/Yw.WinFrmUI.Bimface.Core/01-interop/01-interop3d/BimfaceInterop3dContainer.cs
@@ -1,4 +1,5 @@
-锘縰sing NetTaste;
+锘縰sing DevExpress.Xpo.Helpers;
+using NetTaste;
 
 namespace Yw.WinFrmUI
 {
@@ -547,7 +548,33 @@
 
         #endregion
 
+        #region 涓氬姟鐩戞祴鐐�
 
+        /// <summary>
+        /// 璁剧疆涓氬姟鐩戞祴鐐�
+        /// </summary>
+        public async Task SetLogicMonitors(List<LogicMonitor> obj)
+        {
+            if (!_isViewInitialized)
+            {
+                return;
+            }
+            await this.webViewControl1.EvaluateScriptAsync("setLogicMonitors", obj);
+        }
+
+        /// <summary>
+        /// 娓呴櫎涓氬姟鐩戞祴鐐�
+        /// </summary>
+        public async Task ClearLogicMonitors()
+        {
+            if (!_isViewInitialized)
+            {
+                return;
+            }
+            await this.webViewControl1.EvaluateScriptAsync("clearLogicMonitors()");
+        }
+
+        #endregion
 
     }
 }
diff --git a/WinFrmUI/Yw.WinFrmUI.Bimface.Core/01-interop/01-interop3d/IBimfaceInterop3dContainer.cs b/WinFrmUI/Yw.WinFrmUI.Bimface.Core/01-interop/01-interop3d/IBimfaceInterop3dContainer.cs
index 46968c3..ee6368c 100644
--- a/WinFrmUI/Yw.WinFrmUI.Bimface.Core/01-interop/01-interop3d/IBimfaceInterop3dContainer.cs
+++ b/WinFrmUI/Yw.WinFrmUI.Bimface.Core/01-interop/01-interop3d/IBimfaceInterop3dContainer.cs
@@ -212,5 +212,19 @@
 
         #endregion
 
+        #region 涓氬姟鐩戞祴鐐�
+
+        /// <summary>
+        /// 璁剧疆涓氬姟鐩戞祴鐐�
+        /// </summary>
+        Task SetLogicMonitors(List<LogicMonitor> obj);
+
+        /// <summary>
+        /// 娓呴櫎涓氬姟鐩戞祴鐐�
+        /// </summary>
+        Task ClearLogicMonitors();
+
+        #endregion
+
     }
 }
diff --git a/WinFrmUI/Yw.WinFrmUI.Bimface.Core/Yw.WinFrmUI.Bimface.Core.csproj b/WinFrmUI/Yw.WinFrmUI.Bimface.Core/Yw.WinFrmUI.Bimface.Core.csproj
index 2aeca59..90cf954 100644
--- a/WinFrmUI/Yw.WinFrmUI.Bimface.Core/Yw.WinFrmUI.Bimface.Core.csproj
+++ b/WinFrmUI/Yw.WinFrmUI.Bimface.Core/Yw.WinFrmUI.Bimface.Core.csproj
@@ -28,8 +28,20 @@
     <None Remove="bimface\css\Panel.css" />
     <None Remove="bimface\css\Tailwind.css" />
     <None Remove="bimface\html\Interop3d.html" />
-    <None Remove="bimface\img\flowEffect.png" />
+    <None Remove="bimface\imgs\CalcuDemand.png" />
+    <None Remove="bimface\imgs\CalcuE.png" />
+    <None Remove="bimface\imgs\CalcuFlow.png" />
+    <None Remove="bimface\imgs\CalcuH.png" />
+    <None Remove="bimface\imgs\CalcuHead.png" />
+    <None Remove="bimface\imgs\CalcuHeadLoss.png" />
+    <None Remove="bimface\imgs\CalcuP.png" />
+    <None Remove="bimface\imgs\CalcuPr.png" />
+    <None Remove="bimface\imgs\CalcuPress.png" />
+    <None Remove="bimface\imgs\CalcuQ.png" />
+    <None Remove="bimface\imgs\CalcuVelocity.png" />
+    <None Remove="bimface\imgs\flowEffect.png" />
     <None Remove="bimface\js\Background.js" />
+    <None Remove="bimface\js\Base64.js" />
     <None Remove="bimface\js\CameraStatus.js" />
     <None Remove="bimface\js\ComponentsBlink.js" />
     <None Remove="bimface\js\ComponentsColor.js" />
@@ -43,6 +55,8 @@
     <None Remove="bimface\js\LogicCalcuCustomLabel.js" />
     <None Remove="bimface\js\LogicFlowEffect.js" />
     <None Remove="bimface\js\LogicMarkLeadLabel.js" />
+    <None Remove="bimface\js\LogicMonitor.js" />
+    <None Remove="bimface\js\Marker3dContainer.js" />
     <None Remove="bimface\js\Panel.js" />
     <None Remove="bimface\js\SelectedComponents.js" />
     <None Remove="bimface\js\WalkThrough.js" />
@@ -59,10 +73,46 @@
     <Content Include="bimface\html\Interop3d.html">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
-    <Content Include="bimface\img\flowEffect.png">
+    <Content Include="bimface\imgs\CalcuDemand.png">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+    <Content Include="bimface\imgs\CalcuE.png">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+    <Content Include="bimface\imgs\CalcuFlow.png">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+    <Content Include="bimface\imgs\CalcuH.png">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+    <Content Include="bimface\imgs\CalcuHead.png">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+    <Content Include="bimface\imgs\CalcuHeadLoss.png">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+    <Content Include="bimface\imgs\CalcuP.png">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+    <Content Include="bimface\imgs\CalcuPr.png">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+    <Content Include="bimface\imgs\CalcuPress.png">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+    <Content Include="bimface\imgs\CalcuQ.png">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+    <Content Include="bimface\imgs\CalcuVelocity.png">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+    <Content Include="bimface\imgs\flowEffect.png">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     <Content Include="bimface\js\Background.js">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+    <Content Include="bimface\js\Base64.js">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
     <Content Include="bimface\js\CameraStatus.js">
@@ -98,6 +148,12 @@
     <Content Include="bimface\js\Layer.js">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
+    <Content Include="bimface\js\LogicMonitor.js">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
+    <Content Include="bimface\js\Marker3dContainer.js">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
     <Content Include="bimface\js\LogicMarkLeadLabel.js">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
diff --git a/WinFrmUI/Yw.WinFrmUI.Bimface.Core/bimface/html/Interop3d.html b/WinFrmUI/Yw.WinFrmUI.Bimface.Core/bimface/html/Interop3d.html
index 39ad935..5f4cce4 100644
--- a/WinFrmUI/Yw.WinFrmUI.Bimface.Core/bimface/html/Interop3d.html
+++ b/WinFrmUI/Yw.WinFrmUI.Bimface.Core/bimface/html/Interop3d.html
@@ -120,6 +120,7 @@
     </script>
 </body>
 </html>
+<script src="../js/Base64.js"></script>
 <script src="../js/Background.js"></script>
 <script src="../js/ContextMenu.js"></script>
 <script src="../js/DrawableContainer.js"></script>
@@ -133,6 +134,8 @@
 <script src="../js/LogicMarkLeadLabel.js"></script>
 <script src="../js/LogicCalcuCustomLabel.js"></script>
 <script src="../js/LogicFlowEffect.js"></script>
+<script src="../js/Marker3dContainer.js"></script>
+<script src="../js/LogicMonitor.js"></script>
 
 <script src="js/CameraStatus.js"></script>
 <script src="js/GetComponents.js"></script>
diff --git a/WinFrmUI/Yw.WinFrmUI.Bimface.Core/bimface/imgs/CalcuDemand.png b/WinFrmUI/Yw.WinFrmUI.Bimface.Core/bimface/imgs/CalcuDemand.png
new file mode 100644
index 0000000..6aa2cae
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Bimface.Core/bimface/imgs/CalcuDemand.png
Binary files differ
diff --git a/WinFrmUI/Yw.WinFrmUI.Bimface.Core/bimface/imgs/CalcuE.png b/WinFrmUI/Yw.WinFrmUI.Bimface.Core/bimface/imgs/CalcuE.png
new file mode 100644
index 0000000..be574ea
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Bimface.Core/bimface/imgs/CalcuE.png
Binary files differ
diff --git a/WinFrmUI/Yw.WinFrmUI.Bimface.Core/bimface/imgs/CalcuFlow.png b/WinFrmUI/Yw.WinFrmUI.Bimface.Core/bimface/imgs/CalcuFlow.png
new file mode 100644
index 0000000..1c13196
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Bimface.Core/bimface/imgs/CalcuFlow.png
Binary files differ
diff --git a/WinFrmUI/Yw.WinFrmUI.Bimface.Core/bimface/imgs/CalcuH.png b/WinFrmUI/Yw.WinFrmUI.Bimface.Core/bimface/imgs/CalcuH.png
new file mode 100644
index 0000000..087c644
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Bimface.Core/bimface/imgs/CalcuH.png
Binary files differ
diff --git a/WinFrmUI/Yw.WinFrmUI.Bimface.Core/bimface/imgs/CalcuHead.png b/WinFrmUI/Yw.WinFrmUI.Bimface.Core/bimface/imgs/CalcuHead.png
new file mode 100644
index 0000000..a5b2232
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Bimface.Core/bimface/imgs/CalcuHead.png
Binary files differ
diff --git a/WinFrmUI/Yw.WinFrmUI.Bimface.Core/bimface/imgs/CalcuHeadLoss.png b/WinFrmUI/Yw.WinFrmUI.Bimface.Core/bimface/imgs/CalcuHeadLoss.png
new file mode 100644
index 0000000..dfe80b3
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Bimface.Core/bimface/imgs/CalcuHeadLoss.png
Binary files differ
diff --git a/WinFrmUI/Yw.WinFrmUI.Bimface.Core/bimface/imgs/CalcuP.png b/WinFrmUI/Yw.WinFrmUI.Bimface.Core/bimface/imgs/CalcuP.png
new file mode 100644
index 0000000..8a7604e
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Bimface.Core/bimface/imgs/CalcuP.png
Binary files differ
diff --git a/WinFrmUI/Yw.WinFrmUI.Bimface.Core/bimface/imgs/CalcuPr.png b/WinFrmUI/Yw.WinFrmUI.Bimface.Core/bimface/imgs/CalcuPr.png
new file mode 100644
index 0000000..a6a8426
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Bimface.Core/bimface/imgs/CalcuPr.png
Binary files differ
diff --git a/WinFrmUI/Yw.WinFrmUI.Bimface.Core/bimface/imgs/CalcuPress.png b/WinFrmUI/Yw.WinFrmUI.Bimface.Core/bimface/imgs/CalcuPress.png
new file mode 100644
index 0000000..01b8b0f
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Bimface.Core/bimface/imgs/CalcuPress.png
Binary files differ
diff --git a/WinFrmUI/Yw.WinFrmUI.Bimface.Core/bimface/imgs/CalcuQ.png b/WinFrmUI/Yw.WinFrmUI.Bimface.Core/bimface/imgs/CalcuQ.png
new file mode 100644
index 0000000..78a73b4
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Bimface.Core/bimface/imgs/CalcuQ.png
Binary files differ
diff --git a/WinFrmUI/Yw.WinFrmUI.Bimface.Core/bimface/imgs/CalcuVelocity.png b/WinFrmUI/Yw.WinFrmUI.Bimface.Core/bimface/imgs/CalcuVelocity.png
new file mode 100644
index 0000000..9a9d7e8
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Bimface.Core/bimface/imgs/CalcuVelocity.png
Binary files differ
diff --git a/WinFrmUI/Yw.WinFrmUI.Bimface.Core/bimface/img/flowEffect.png b/WinFrmUI/Yw.WinFrmUI.Bimface.Core/bimface/imgs/flowEffect.png
similarity index 100%
rename from WinFrmUI/Yw.WinFrmUI.Bimface.Core/bimface/img/flowEffect.png
rename to WinFrmUI/Yw.WinFrmUI.Bimface.Core/bimface/imgs/flowEffect.png
Binary files differ
diff --git a/WinFrmUI/Yw.WinFrmUI.Bimface.Core/bimface/js/LogicMonitor.js b/WinFrmUI/Yw.WinFrmUI.Bimface.Core/bimface/js/LogicMonitor.js
new file mode 100644
index 0000000..6046a63
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Bimface.Core/bimface/js/LogicMonitor.js
@@ -0,0 +1,114 @@
+锘�//涓氬姟鐩戞祴鐐�
+
+
+//涓氬姟鐩戞祴鐐筰d鍒楄〃
+let _logicMonitorIds = new Set();
+
+//璁剧疆涓氬姟鐩戞祴鐐�
+function setLogicMonitors(data) {
+    initialMarker3dContainer();
+    clearLogicMonitors();
+    if (data == null || data.length < 1) {
+        return;
+    }
+    data.forEach(item => {
+        let marker3d = createLogicMonitor(item);
+        let logicMonitorId = marker3d.getId();
+        _logicMonitorIds.add(logicMonitorId);
+        _marker3dContainer.addItem(marker3d);
+    });
+    _viewer.render();
+}
+
+//娣诲姞涓氬姟鐩戞祴鐐�
+function addLogicMonitor(item) {
+    let marker3d = createLogicMonitor(item);
+    if (marker3d == null) {
+        return;
+    }
+    var logicMonitorId = marker3d.getId();
+    _logicMonitorIds.add(logicMonitorId);
+    _marker3dContainer.addItem(marker3d);
+    _viewer.render();
+}
+
+//鍒涘缓涓氬姟鐩戞祴鐐�
+function createLogicMonitor(item) {
+    let marker3dConfig = new Glodon.Bimface.Plugins.Marker3D.Marker3DConfig();
+    marker3dConfig.viewer = _viewer;
+    marker3dConfig.src = "../imgs/" + item.propName + ".png";
+    if (item.propName == "CalcuPress") {
+        marker3dConfig.src = _base64_monitor.CalcuPress;
+    }
+    else if (item.propName == "CalcuHead") {
+        marker3dConfig.src = _base64_monitor.CalcuHead;
+    }
+    else if (item.propName == "CalcuDemand") {
+        marker3dConfig.src = _base64_monitor.CalcuDemand;
+    }
+    else if (item.propName == "CalcuFlow") {
+        marker3dConfig.src = _base64_monitor.CalcuFlow;
+    }
+    else if (item.propName == "CalcuVelocity") {
+        marker3dConfig.src = _base64_monitor.CalcuVelocity;
+    }
+    else if (item.propName == "CalcuHeadLoss") {
+        marker3dConfig.src = _base64_monitor.CalcuHeadLoss;
+    }
+    else if (item.propName == "CalcuQ") {
+        marker3dConfig.src = _base64_monitor.CalcuQ;
+    }
+    else if (item.propName == "CalcuPr") {
+        marker3dConfig.src = _base64_monitor.CalcuPr;
+    }
+    else if (item.propName == "CalcuH") {
+        marker3dConfig.src = _base64_monitor.CalcuH;
+    }
+    else if (item.propName == "CalcuP") {
+        marker3dConfig.src = _base64_monitor.CalcuP;
+    }
+    else if (item.propName == "CalcuE") {
+        marker3dConfig.src = _base64_monitor.CalcuE;
+    }
+    let boundingBox = _modeler.getBoundingBoxById(item.id);
+    let boundingBoxMin = boundingBox.min;
+    let boundingBoxMax = boundingBox.max;
+    marker3dConfig.worldPosition = {
+        x: (boundingBoxMin.x + boundingBoxMax.x) / 2,
+        y: (boundingBoxMin.y + boundingBoxMax.y) / 2,
+        z: (boundingBoxMin.z + boundingBoxMax.z) / 2 + 30
+    };
+    marker3dConfig.objectId = item.id;
+    marker3dConfig.tooltip = item.description;
+    marker3dConfig.id = getLogicMonitorId(item);
+    let marker3d = new Glodon.Bimface.Plugins.Marker3D.Marker3D(marker3dConfig);
+    return marker3d;
+}
+
+//绉婚櫎涓氬姟鐩戞祴鐐�
+function removeLogicMonitor(item) {
+    if (_logicMonitorIds.size > 0) {
+        let logicMonitorId = getLogicMonitorId(item);
+        _logicMonitorIds.delete(logicMonitorId);
+        _marker3dContainer.removeItemById(logicMonitorId);
+    }
+}
+
+//娓呴櫎涓氬姟鐩戞祴鐐�
+function clearLogicMonitors() {
+    if (_marker3dContainer == null) {
+        return;
+    }
+    if (_logicMonitorIds.size > 0) {
+        _logicMonitorIds.forEach(x => _marker3dContainer.removeItemById(x));
+        _logicMonitorIds.clear();
+    }
+}
+
+//鑾峰彇涓氬姟鐩戞祴鐐筰d
+function getLogicMonitorId(item) {
+    return "LogicMonitor" + item.id + item.propName;;
+}
+
+
+
diff --git a/WinFrmUI/Yw.WinFrmUI.Bimface.Core/bimface/js/Marker3dContainer.js b/WinFrmUI/Yw.WinFrmUI.Bimface.Core/bimface/js/Marker3dContainer.js
new file mode 100644
index 0000000..f89ab22
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Bimface.Core/bimface/js/Marker3dContainer.js
@@ -0,0 +1,15 @@
+锘�//涓夌淮鏍囩瀹瑰櫒
+
+var _marker3dContainer = null;//涓夌淮鏍囩瀹瑰櫒
+
+// 鍒濆鍖朚arker3dContainer
+function initialMarker3dContainer() {
+    if (_marker3dContainer == null) {
+        let marker3dContainerConfig = new Glodon.Bimface.Plugins.Marker3D.Marker3DContainerConfig();
+        marker3dContainerConfig.viewer = _viewer;
+        _marker3dContainer = new Glodon.Bimface.Plugins.Marker3D.Marker3DContainer(marker3dContainerConfig);
+    }
+}
+
+
+
diff --git a/WinFrmUI/Yw.WinFrmUI.Bimface.Core/bimface/js/base64.js b/WinFrmUI/Yw.WinFrmUI.Bimface.Core/bimface/js/base64.js
new file mode 100644
index 0000000..5350dae
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Bimface.Core/bimface/js/base64.js
@@ -0,0 +1,20 @@
+锘�//Base64
+
+let _base64_monitor = {
+    CalcuFlow: 'data: image / png; base64, iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAASBJREFUWEdjZBhgwDjA9jMMLgc4Fx6po0eI7O23aYLZgxICIAcwMjLQ1BH//zM0jTpgNASoGgISwhzwjCMuyM548c7H//hyEsWJsDRClUlPmY9RQghhMczCF+9+MMS2nv1Lcwe4mYoxLt71GOzTl+9+gukX738wvHz/8/+Ltz/wFiUUh4C7qThjSYQKk2vxUbw+xeUKih0Q5y7HFOsmyziyHeBqIsq4+8zr/+KC7AygxCgmyAYu0gklQJAaqkXBpbuf/oNS/cv3P8HRffHux/+EsiBVHTCy08DIzgX6KvyMPZk6TCXTr/wjJtGhF0gU5wKQgaAKiFCRS7OSkNI2I1VCgBJHjDpg8IcAJfFLrF6cbUJiDaCmusHVN6Smz4g1CwCGXw4woGJRPgAAAABJRU5ErkJggg==',
+    CalcuPress: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAWxJREFUWEdjZBhgwDjA9jMMLgc4Fx6po0eI7O23aYLZgxICIAcwMjLQ1BH//zM0jTpgNAQoCgEJYQ6GF29/MIBoEBAXZGe8eOfjf2JzD8WJcHevNfOLdz8YJIQgDgABEH/3mdf/F+189I+QQ6jiAJAli3c9hlvobirOWBKhwoQshsshFDkAFOyLq4yZsVkEckSMmwxTbOvZv/hCgSIH6KvwM/Zk6jDFtp39C0oHyADmuJLpV/7hSxMUOQAW1K7FR7H6EpQ+elbc+bfz9EuciZJmDoA5DlvoIIcUTRwACv7ScFUmkEXF0y7jzQkUOQCWBkDZ7tLdT/9fvv8J9lysmywjSKx0xlWMtIGeIKniAFBC01fmZxQXZGcAOeLlu5//8cU71aKA2JROs2w44A4A+aw3S5fp4t2PDMQUu9hCgqI0ADIQVhkRKvNpUhSTaynVEuGoA0ZGCFDDl4TMwNkmJKSRFvKDq29ICx8SMhMAc91MMFffAkoAAAAASUVORK5CYII=',
+    CalcuDemand: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAlhJREFUWEfNl1FOwzAMhm2XB6RxhU3jJGy3gIqH7SRsJ2GTUOEWlJMQxhVWiYetRg7NSLu0SToE9GmrEvuLf+dPitDjOb8ej8+onDHzFSAqBHjbZptFj1CAsZMu0tGCAe4c8wRkHQsSDHBxO55wWd4DwNgDrQB4WWTvq5DFeQGk3Anu7wFxEhLwMIY533My/3hSqmteK8BBZ3e5Q1m8sjgBOnQOTdwc1wpSA4jQuT8I0Xz7oHIT4ABQJX/uGzlinkIL4gAwSEfcEqTZRL5dIGHsOa7xqsg2lzJQAwzS4QwAZYu5HgXMSgwHgF+QErXbgdJG1GhQBFjaPjBIRxJz5gqKRFORIgRAr0hMBohyo9/R9mTOi8f3qUnml5Tn4hWhAHZZcyRaC4iGoPJVAE1JDcAgHcn7Drn6ADSkEAjZsnZltKQ3w2e/ccUDADDn+vAhWksfuFzOX3pToz4A391UNSasbc+3JAnYlf0BqkOGX/Q2okSZxgwr/akVYM4RUSdnYLUvk9xI8TsAXwvokkDc1GtWsT5g6qbLb7ah/Bbd7WYM7YM+AHrVpvy7klaSWMou7+oO2OmsejEnAYj20v2WhdcOmC97b7fhWAB9sIgVm1Wb0lcuaOSpuWElRWs/1CrgMY+j0kvGhEpX8FWRbeaGqKsf9iVdioT6LAhoHN/xGmA89SFFttG5rfuAv3Gis7RMMOWvAcifP72S2bq5Lhsnrj7sUmon+aFruWhcuyU1F/J/P0yapJXpyDehz+ePTKlLPm8FImTxfgW5QKIAjhpVPs9lLzfOgpiG/QSZOK0wctqsZwAAAABJRU5ErkJggg==',
+    CalcuHead: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAdJJREFUWEfFl8F1wjAMhqWcSKeASQpbxD3BJKWTwKnOFs0mpUsAp5jKxXmO48jCoS++8ADZ+vh/SQ4IMy9M5V9Ueg0AS4orir/XcLUtNEUBFJdcFHutVeMCWYBFpZeI8J049XTRalUqTXFRwMj+xhjYXWt1SgGsEeGLA0CEj/On2t9hKVYKcTIGNizAy5veGwPvEgCKkcT7Z5EKLECptEmZetGqd8YjEGjgOArwiP8hpLQeyL5RAMkvcf6HANJ64AEqfTAIW84CKiK/pfzYUmkqSLY1jYHVqAI5/j8IYNs3CjDFfweRUsDZFwWY4r8HwHaQsy8KkKKnJJz/AgWt/HTOAECwmfZ1B8SKNKWg3z0xgOT4/a3u5qLVJif5Xb0V3QNRBVL0dpM3/12rFQCvBm3bsXdBODsGCkinWGpEj3w/sK4HIPQ/MzfY289JH30ekMifk31sZA9qQAJAN1gPooAf975twRZWsOgJKPa5DetZIBi/bPtlqeM2SfznpMxJ3lNAIj83/SYDSMZv+PSTm9Tf19XAHP53Fszlfwcwl/8dgMD/p7dfNwlF8hs4nmu1e0bRhWfgotJbRDhwh/9H//fuAlKBA+BG6VRVkv+OpyZI7b8BIKYIo8ZPDc4AAAAASUVORK5CYII=',
+    CalcuVelocity: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAA61JREFUWEfFl11IU2EYx//HoosKBWVTcOHHzMyPMAyOZOBsGBQ6C2+TZnXRTUR1kUSldWMUFQXdlZtdFlJ+XEjDjyBzi6RgTjF1WzkhZ4qbrS7CnXjfszPPcWcfHhMP7GbnPc/zez7e9/m/DLb4YWT9v3ZlYxt04ILZYJjKjTFybiDpHVYwiFM57rW2IgG6XEaAMyHgB5xj/Prfy8oZVJnA7mRArXGD49pRp20RG5MCdDkHEPDrwo5LypU7Fr4UB0LtcWYYtI3C61UAIXKbBShmgV3JG3cutkBArBZAXw+AaYQhx0xeiwCcHPo6gBKWpOv/OhdnY9QGsNVurDBVpCd4ABK9d8aEX34gt3BznAtWSV/RnthDsxACmDbBbjNS57FSL9Qz1jqvBzQQspbYStdIbQo2itnbpCFDAE4XbJZssNXy0YfqZywrQH1pPp7229CLVGm2QmsusvtxSV+OLFUqekcncfpFD3xleikEKbW+fhCG3Kr4AF4PNFOfMNN6WQJXcOMxJlhD+L/0z/3w3DyL7Yx0Y017F3C8ewST6r2r35NGZ6sTAPB6ULHkxPurZyIyc88yjGsLO/nI7FZ015ahpiRfNoMZd55j7uDRdQLEcE4s9di/orZ/ktbY+HcGpoaaqM2rDKCvA1PXGzE+t0ANy0WX9egVvidn8Ps7XYOmw0VoPVEhASElyHv2FhAfagmVIOBHykgffJp9SPFMYOn+lYgIKUDeIUkf/Lh1TrKOZsrxR9qECQGIzditmDp/DFp1msT4kQftGMos5Y0H/LKlqGvrRJfqgBR+3QAAjEuOiDrTRhxb5LejDKRs+gmKEoBCxyAcTeEZEo5I6APjDl8EYNFdE8aKdJHNqQRALkJimZTh28/FiHOC1v7jnPxcUQTg9UAuSrm9R1P/pIMcNvJbUxEAgGhlWOslauqFhUoBopVBDECdq/Jij3TFAHHKkJBzpbtAiJIMnaELJyVnAqm5oa0rfuQxSjAAm0UXtWnWFFnz4Q3MDTXQqtLw8ssEHg6PSYdN1KkQemG3kqNZPA0TFCRiw0R4uMYBonrXq6IoAEvFKT+8O6dbMD/bvHWSjF5EOBfp8riyLF56Y70nqokXpcAKk7MqSslHRJgGfCY6WsurN0eWC85lZTnNQrAZgWUj5jy8qPyfFxPvbOhOANp8QqKkAo5AJAWNYJhmejuan91Iwnl1rA41KRnZHEeVsNho7MspgpUAkw2A/JQ95D5InmCSObHLqTI3ir/6By0E+zC6TIr1AAAAAElFTkSuQmCC',
+    CalcuHeadLoss: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAOZJREFUWEftl00OgjAQhd9wCXWHJ1FOIl5EKxfBm4gnsTvFQ3SwFgwLkmZMsTHprJpmfh4fXcwjjIKrZwmYHUDb8X2gswZYg+lKx4UaepI9sLrnyKieafCUfg1jClIr7QRUj8sPh/eCuKHDsiCHnetAmIVtaE9ctXZ4KawMlM6NFXADkAfqKG2jrQAWVOk+N5hgmQBj1vblhvxtSUAikAgkAolAIpAIfEXAtz+4JTezi443/kyA93vkCTIC8v7eithLKSiOKfmAOcc1JvSyZ9GtWRxz6nyhnf0mMASfWgXizUxGddKed+OZBbu8QFaIAAAAAElFTkSuQmCC',
+    CalcuQ: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAo5JREFUWEfFV11SIjEQ7h7mALu4BxgfoGpPoZwEeAQPoR5CeGQ8CXAKq+DBHEBZD6BpN8lkSEL+xpLdvCk9nS/dX3/djdDh/Fg+VQUvJ4RwhUAVAFYAxIQLAmSIxArAx5fZYJPrFlOG+lJAuE3ZHn8nBoSPvHiv32a/JcDQiQLoP+zvul3sXqOAHG4Gd50AiFcjlSsEuM5/dcySGMePkS8aJxGQIafy+XsuNr34QVgA1OW9tSLXOc4pCAvAz8V+nQ47Mcl4gi0CMSrgigir9Hf6QcQO8+Gl/qsFkCYcsQJxGiqxTrxBqg+z4VSAOAJY7CkYdIJ7zeQTLUDYmLWffohUjZaUEkB/uVsB4cQLwEAbJqhdbhcPuwkhrqIsavwqAMHX2/mKc8S2jT5KIlP2GENbIIx0znPKE4mmrzfDWrjPsRf+MYb0MB+0HMkJKwFs/swHIx36ZFUh1Rg0MnIv05Qhyy6A1DfCHvuL3bNXeAzmJ4nass3mwa/l/poTrMNkJIZBAv5vAF3DKXntcCCHN+EUNGWiw3d0pmq+KEAOHcSp4ohjKcUub2L60pRimIQA4CtD838anFZH0Rt0GSp9CfCr+VCRMMpunxCJUUyK+IbDx73u8QKE2e9TFaB8UI1Jpkal2AaoI5L02RhKIcpRrL8Tp92MoHerWjBVbofMvVxgEEKXbkZGjcfasckHc5wTl3jV1mxGWVEwgIj8I4etKj01PZmDp/BXQlnpPuIjI8f3S8GZTlofU7RQdLwpMVLaAug00XiR2DNBaJ9wxeqfD6XmPKiq2Tnnm4z9M6V3M/puEG7YzTcHV7Ov7YQecjhd1bU463Ia2wk1kCQAU2BEbXOgsVbBk/WcYCu6ZJf1/BNtNvsnw+ByJAAAAABJRU5ErkJggg==',
+    CalcuPr: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAglJREFUWEe9V+1twkAMtVVWCFL/hQnIBm0maZiAbFC6AZkAOgnpBmQC+FeJrEDl4iQXXUI+7OZofiHh87179/zsQ1B833HgzwAiIHohAB8BfAI4cwoEOPNvRPz0tsdUmhbHAq1N38dizf8GyBVg/7w9FgD7vkEAeRxsgEi8cXsTi5GNCkBxaqIdALxKTz0Ux0B+EMMuNu4YqDY/udjYztEHogGAN38iOrC4XAPgfF0gGgDy9fLgiva+AzCIeZItzP81gKmC0zB2K+H9PMlWVfmWS/P1kjRJpsTaV1EwcFkvdzcjiaYk1a41LBQANKf3kqzTOyrD8onoTXIYowW8xEGEZc2LPgMgj4OGR9j2K9YTYoha+msALc3Yrif1Er4G1JZeH4CaPsSQ2RDmTZmBk8Z4xgBcERdsuZK8BWsaAfIphwDY9S3JOwkAi9dWLc8DRohiEfIcIaHK3qivDDlGOzsYBlT+bwAw8BYDf2lgKWroGtOAyEisoLIM2VCImAXRN1YFoiR1K8QQpaZh1rgEwLnUzcgVgEYz0rDAC6s+Pql7GsOqO5u2Kanuuh2M+OFtj8WkXANwPQkPAEy9JAtrHdqB/zGU2vNggwED5FEgqna9aj/beqcbx+N5g/aWg3bfltbXe+/cElxXzEMfp0bpQxUzCsDWxoyf4+XQyc/yu+c5IH7dHjap5nn+C+pURGGgB0eBAAAAAElFTkSuQmCC',
+    CalcuH: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAvpJREFUWEfVlz1MU1EUx//ntYk6IGKiuGAwxEHjF0YHbUkkNMCmTDKIxriogx8VJgfjYGJCeX4M6mJMZHHyY6PwGklK4yCJiEZNDEEhJrQk0MogxPKOuY8+0497Xx8FUm3Spffj/O75n/O/t4Qyf6jM8fF/ArReeVObpnQjiHYzaJLYnIMH40aoYXC5GXWdASuotniTgTYCfoGxBZTJIIOJkGQgDvB3aLjtFqYogB0Y4OMAVbo84QRAn72mdr7v7pFvTmscAUTw35r5msC1LgPnT0t6TU+9E4QSYCn44igBFSUGt5f9gManVJIoAZqCsfEVnNx1JqQAgWCsD+CWUk6+v64S78dSkqUUNnRfa/5AAUCgM3oMJl6qCk4EqN68Dv1vEwVButp3Yl9dJToffkB8ZiF/PA6N2/OlKAQIRvsAUp7eDtJxa7gAIHRxD6qr1kM2Zk0mGjF6fPXZCwsAmoJDP50Kr/f6IYyOpdD97KsUQPzY+eCjSr0vhu7fpQQQ6SeTnjNQpdphoMdnBZdJIDIgUi+Dy+yXgMYns2XIyUDgavQsQI//OpyEYkUADAb4nHGn4Ym9dQ5AUzB2icD3nKpfAIgUZ1e6KErxCV3Yq5Qna8+Qofu7pACB4FC3kFAFcLplOzqaazA1s4D47LxVcNsywe01QhoHCcCgyxHdd1+RgcFGYm9EJoE4pWhB0QUiiJ0BofnU7LylfdEaKCaB2yLs7Z/E0/DEsruAgFmP6TmYfTfk1IAb/xdtODCcKAmAgbmI7t/o6AOBa7F3YD6gqgORZlWvO40t7cdhQ2/IseMCI1q6/9MjKituPrwV4iszG1EfolbkRsQpaDhR1IoFZ6mXkd2OkntA+LC7y0gArMJDJF/BpKH7pe767z5IVikTSWjc5vRAXaNHKacAemXo/jNOtm7d0MUm2OOZ7njEoKMakGbGpuxnOQjTDGwg4IXX9Nwo9hqWWrEbGAvEm67FInYwaRUErgHzpzX/Y+IGrpQ5riUoZXM3a8oO8AdZY20wdLeQJgAAAABJRU5ErkJggg==',
+    CalcuP: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAyJJREFUWEfVl01IVFEUx//nzYC0UDNIV4YhLoqwDFvUjJA4fuzKVS60iDbRoo9RVy2iRRA4vj4W0SaCbOGqj50fTxJ0aJGQSVQgYilBY2CjLkIa58QZfcOb9+57M46KdZdv7rnnd//nf8+9Q9jlQbucH/8nQMv1txUJStSD6DCD5omTK/Bh1ojUjW5W0ZwVSCXV1m4z0ErAbzD2gzYUZDAR4gzEAP4GDXdzhckKYCYG+AxAxTnucA6gz/6kdnng/smvXjGeAJL8j5Z8Q+CKHBPbp8X9SV+NF4QrwHrytSkCCvNMboZ9h8btbiVxBWgIR2e3sPOclVAChMLRAYCb89l52b4CxBZXFaE0aOiBFvsPDoBQ19hpJPHKbrijlcXoaqtCpH8aH2aWXNmGewPoG5rHs8E5+5wYNG6zl8IJEB4bAMix+/PNB9DRVI7GzqinMH03azE8saACAIgmjd5AjXUBB0BDeHxZZbzutqpUXE//dDpe5JZhlTxy5UjqW9ejjyrQL4YePOQKIPJTkl4wUGKPloUlkRVAoATCmkz1zbLWAjQ+Zy1DhgKhG2MXAXqS7nCWSAGYmlnOkFaVTEpVXVmkVoDBAF8y7tU9NZfOAGgIR68S+IFKOxWA1FtGx52JdIgANNaWZnyzrRcx9GC3EiAUHu+R8uUKII7/sbjqAHBVAACDro3ogYcuCozWE/tHVCWwy910ohSmMcUD5tHcUgm8TGiXVgCkN4gJrd5QnRbLbn/5kr7j1rshwwNe/V+SiQ/M3ZqnIvZrNaPm4ou+oTkMvVtwVJKBlRE9WOTZB0Kd0fdgPubmA/PciwLtG+Z7nko6j7KSAlRXFnsYkAcNvS6jHTsa0fr9n5hU3f0itySTYW23ZpcUQ7q3al6ChrNZW7Es7nUZqbqfxLhfQmkH5HYZyfRteIjYKxg39KCju8qkf/dBsk1KxKFxq9cDdYcepbwE0GtDD15QnSbPY+gWsHE6HjPolAYkmLHX+iwH4ScDewh46U/6bmV7DStbcTZasywJf6ICazjIpBUSuBzMn3b8j0kucPnMyeqBfBbdTMyuA/wF8T2OML1AlBsAAAAASUVORK5CYII=',
+    CalcuE: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAtpJREFUWEfVlz1oE2EYx//PXQQ/yDVKEuhgGzcVBOsoCnbSQTCdFBQvooM66FKhTtLJgF10EIeKucFVIzjoIAp2tyhotpqKhCZBLxf8gObukTfmwuVyX01borckcO/7Pr/n//zf532PMOSHhhwf/ydAJZfIgM3JGKT9DP5igpsxkpdSBf3NWhWNrIAIKrM1C2AKwC8wUqCOggwmgs7ACghlgpSPChMK4Ah8CsBIlAwZtEzEn0xIl0cL+uegOYEAneCvAWSiBPYYo5skTQRB+AJ0gr8HEB8weGcafyWSz/mVxBegqipL68jczeyrhCdANae8AON41Mzl5Fh7qJQcw2ppwXsa4WW6YJxwv+wDqOUSx5itop/h4pfuY8veo7CDuhf8WczjR/G2F8QKkXTGXYo+gLDsd2RvYnt2Bs35qzDr5W4gq77c/m92fr0ICFhMacaE810/gKoYQcbbeuQshAq1XKQd6eYopTVjny+AkB9sPWFgp1/91wlQJZJOO8vQo0BFjV+QmR52O5wHhV2CgRRgsEl8cVRrPrKX7gGoqso1AHf9shfGs024WnrbHiYMadf+2/SB0I1DoLmU1rjhCVBTR+4weDpIfmFAASLcbgcWZhQmDDKgY83rac245wlQOZ+YlGG9CiqBUEAA6PmTodn2DQgrQRQTJmaetzMV23CtDwHfWyQdcp4NvSb8e+QG9v9dcx9g1cuDKQA005qhBPaBmqq8Y+CgX3ZCASk5jub8lW7bFSURbVhOjuP3wmN/YTzacV8j6pyCi36tWAQTRhT9wOsRpfGBaBBJ2dBWLBYNa8dijJ21DRG6C6IeRmLBDbiIuMXR05rh2V3/3QvJBimhE0lTQRfUTbmUAmgAeJbWDDWsV4QC2Au0fQHrARiHCWgxI+G8loNQA7ANwFOTpFtht2HPVhxGa5clBmRabO6RQXEC7W7B+rjpHyZR4AYZE7kEgyweZc7QAf4Ax0c9MJI8BhIAAAAASUVORK5CYII='
+};
+
+
+
+
+
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/03-helper/HydroParterPropHelper.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/03-helper/HydroParterPropHelper.cs
index 8d12f64..e4a402f 100644
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/03-helper/HydroParterPropHelper.cs
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/03-helper/HydroParterPropHelper.cs
@@ -15,12 +15,12 @@
         private static readonly Dictionary<string, string> _dict = new Dictionary<string, string>()
         {
             { Yw.Hydro.ParterProp.LinkStatus,"鐘舵��"},
-            { Yw.Hydro.ParterProp.CalcuPress,"鑷敱鍘嬪姏"},
-            { Yw.Hydro.ParterProp.CalcuHead,"缁濆鍘嬪姏"},
-            { Yw.Hydro.ParterProp.CalcuDemand,"闇�姘撮噺"},
-            { Yw.Hydro.ParterProp.CalcuFlow,"娴侀噺"},
-            { Yw.Hydro.ParterProp.CalcuVelocity,"娴侀��"},
-            { Yw.Hydro.ParterProp.CalcuHeadLoss,"姘村ご鎹熷け"}
+            { HydroCalcuProp.CalcuPress,"鑷敱鍘嬪姏"},
+            { HydroCalcuProp.CalcuHead,"缁濆鍘嬪姏"},
+            { HydroCalcuProp.CalcuDemand,"闇�姘撮噺"},
+            { HydroCalcuProp.CalcuFlow,"娴侀噺"},
+            { HydroCalcuProp.CalcuVelocity,"娴侀��"},
+            { HydroCalcuProp.CalcuHeadLoss,"姘村ご鎹熷け"}
         };
 
         /// <summary>
@@ -33,159 +33,159 @@
             {
                 case Yw.Hydro.ParterCatalog.Node:
                     {
-                        dict.Add(Yw.Hydro.ParterProp.CalcuPress, "鑷敱鍘嬪姏");
-                        dict.Add(Yw.Hydro.ParterProp.CalcuHead, "缁濆鍘嬪姏");
-                        dict.Add(Yw.Hydro.ParterProp.CalcuDemand, "闇�姘撮噺");
+                        dict.Add(HydroCalcuProp.CalcuPress, "鑷敱鍘嬪姏");
+                        dict.Add(HydroCalcuProp.CalcuHead, "缁濆鍘嬪姏");
+                        dict.Add(HydroCalcuProp.CalcuDemand, "闇�姘撮噺");
                     }
                     break;
                 case Yw.Hydro.ParterCatalog.Reservoir:
                     {
-                        dict.Add(Yw.Hydro.ParterProp.CalcuPress, "鑷敱鍘嬪姏");
-                        dict.Add(Yw.Hydro.ParterProp.CalcuHead, "缁濆鍘嬪姏");
-                        dict.Add(Yw.Hydro.ParterProp.CalcuDemand, "闇�姘撮噺");
+                        dict.Add(HydroCalcuProp.CalcuPress, "鑷敱鍘嬪姏");
+                        dict.Add(HydroCalcuProp.CalcuHead, "缁濆鍘嬪姏");
+                        dict.Add(HydroCalcuProp.CalcuDemand, "闇�姘撮噺");
                     }
                     break;
                 case Yw.Hydro.ParterCatalog.Tank:
                     {
-                        dict.Add(Yw.Hydro.ParterProp.CalcuPress, "鑷敱鍘嬪姏");
-                        dict.Add(Yw.Hydro.ParterProp.CalcuHead, "缁濆鍘嬪姏");
-                        dict.Add(Yw.Hydro.ParterProp.CalcuDemand, "闇�姘撮噺");
+                        dict.Add(HydroCalcuProp.CalcuPress, "鑷敱鍘嬪姏");
+                        dict.Add(HydroCalcuProp.CalcuHead, "缁濆鍘嬪姏");
+                        dict.Add(HydroCalcuProp.CalcuDemand, "闇�姘撮噺");
                     }
                     break;
                 case Yw.Hydro.ParterCatalog.Waterbox:
                     {
-                        dict.Add(Yw.Hydro.ParterProp.CalcuPress, "鑷敱鍘嬪姏");
-                        dict.Add(Yw.Hydro.ParterProp.CalcuHead, "缁濆鍘嬪姏");
-                        dict.Add(Yw.Hydro.ParterProp.CalcuDemand, "闇�姘撮噺");
+                        dict.Add(HydroCalcuProp.CalcuPress, "鑷敱鍘嬪姏");
+                        dict.Add(HydroCalcuProp.CalcuHead, "缁濆鍘嬪姏");
+                        dict.Add(HydroCalcuProp.CalcuDemand, "闇�姘撮噺");
                     }
                     break;
                 case Yw.Hydro.ParterCatalog.Junction:
                     {
-                        dict.Add(Yw.Hydro.ParterProp.CalcuPress, "鑷敱鍘嬪姏");
-                        dict.Add(Yw.Hydro.ParterProp.CalcuHead, "缁濆鍘嬪姏");
-                        dict.Add(Yw.Hydro.ParterProp.CalcuDemand, "闇�姘撮噺");
+                        dict.Add(HydroCalcuProp.CalcuPress, "鑷敱鍘嬪姏");
+                        dict.Add(HydroCalcuProp.CalcuHead, "缁濆鍘嬪姏");
+                        dict.Add(HydroCalcuProp.CalcuDemand, "闇�姘撮噺");
                     }
                     break;
                 case Yw.Hydro.ParterCatalog.Blunthead:
                     {
-                        dict.Add(Yw.Hydro.ParterProp.CalcuPress, "鑷敱鍘嬪姏");
-                        dict.Add(Yw.Hydro.ParterProp.CalcuHead, "缁濆鍘嬪姏");
-                        dict.Add(Yw.Hydro.ParterProp.CalcuDemand, "闇�姘撮噺");
+                        dict.Add(HydroCalcuProp.CalcuPress, "鑷敱鍘嬪姏");
+                        dict.Add(HydroCalcuProp.CalcuHead, "缁濆鍘嬪姏");
+                        dict.Add(HydroCalcuProp.CalcuDemand, "闇�姘撮噺");
                     }
                     break;
                 case Yw.Hydro.ParterCatalog.Elbow:
                     {
-                        dict.Add(Yw.Hydro.ParterProp.CalcuPress, "鑷敱鍘嬪姏");
-                        dict.Add(Yw.Hydro.ParterProp.CalcuHead, "缁濆鍘嬪姏");
-                        dict.Add(Yw.Hydro.ParterProp.CalcuDemand, "闇�姘撮噺");
+                        dict.Add(HydroCalcuProp.CalcuPress, "鑷敱鍘嬪姏");
+                        dict.Add(HydroCalcuProp.CalcuHead, "缁濆鍘嬪姏");
+                        dict.Add(HydroCalcuProp.CalcuDemand, "闇�姘撮噺");
                     }
                     break;
                 case Yw.Hydro.ParterCatalog.Threelink:
                     {
-                        dict.Add(Yw.Hydro.ParterProp.CalcuPress, "鑷敱鍘嬪姏");
-                        dict.Add(Yw.Hydro.ParterProp.CalcuHead, "缁濆鍘嬪姏");
-                        dict.Add(Yw.Hydro.ParterProp.CalcuDemand, "闇�姘撮噺");
+                        dict.Add(HydroCalcuProp.CalcuPress, "鑷敱鍘嬪姏");
+                        dict.Add(HydroCalcuProp.CalcuHead, "缁濆鍘嬪姏");
+                        dict.Add(HydroCalcuProp.CalcuDemand, "闇�姘撮噺");
                     }
                     break;
                 case Yw.Hydro.ParterCatalog.Fourlink:
                     {
-                        dict.Add(Yw.Hydro.ParterProp.CalcuPress, "鑷敱鍘嬪姏");
-                        dict.Add(Yw.Hydro.ParterProp.CalcuHead, "缁濆鍘嬪姏");
-                        dict.Add(Yw.Hydro.ParterProp.CalcuDemand, "闇�姘撮噺");
+                        dict.Add(HydroCalcuProp.CalcuPress, "鑷敱鍘嬪姏");
+                        dict.Add(HydroCalcuProp.CalcuHead, "缁濆鍘嬪姏");
+                        dict.Add(HydroCalcuProp.CalcuDemand, "闇�姘撮噺");
                     }
                     break;
                 case Yw.Hydro.ParterCatalog.Emitter:
                     {
-                        dict.Add(Yw.Hydro.ParterProp.CalcuPress, "鑷敱鍘嬪姏");
-                        dict.Add(Yw.Hydro.ParterProp.CalcuHead, "缁濆鍘嬪姏");
-                        dict.Add(Yw.Hydro.ParterProp.CalcuDemand, "闇�姘撮噺");
+                        dict.Add(HydroCalcuProp.CalcuPress, "鑷敱鍘嬪姏");
+                        dict.Add(HydroCalcuProp.CalcuHead, "缁濆鍘嬪姏");
+                        dict.Add(HydroCalcuProp.CalcuDemand, "闇�姘撮噺");
                     }
                     break;
                 case Yw.Hydro.ParterCatalog.Nozzle:
                     {
-                        dict.Add(Yw.Hydro.ParterProp.CalcuPress, "鑷敱鍘嬪姏");
-                        dict.Add(Yw.Hydro.ParterProp.CalcuHead, "缁濆鍘嬪姏");
-                        dict.Add(Yw.Hydro.ParterProp.CalcuDemand, "闇�姘撮噺");
+                        dict.Add(HydroCalcuProp.CalcuPress, "鑷敱鍘嬪姏");
+                        dict.Add(HydroCalcuProp.CalcuHead, "缁濆鍘嬪姏");
+                        dict.Add(HydroCalcuProp.CalcuDemand, "闇�姘撮噺");
                     }
                     break;
                 case Yw.Hydro.ParterCatalog.Hydrant:
                     {
-                        dict.Add(Yw.Hydro.ParterProp.CalcuPress, "鑷敱鍘嬪姏");
-                        dict.Add(Yw.Hydro.ParterProp.CalcuHead, "缁濆鍘嬪姏");
-                        dict.Add(Yw.Hydro.ParterProp.CalcuDemand, "闇�姘撮噺");
+                        dict.Add(HydroCalcuProp.CalcuPress, "鑷敱鍘嬪姏");
+                        dict.Add(HydroCalcuProp.CalcuHead, "缁濆鍘嬪姏");
+                        dict.Add(HydroCalcuProp.CalcuDemand, "闇�姘撮噺");
                     }
                     break;
                 case Yw.Hydro.ParterCatalog.Meter:
                     {
-                        dict.Add(Yw.Hydro.ParterProp.CalcuPress, "鑷敱鍘嬪姏");
-                        dict.Add(Yw.Hydro.ParterProp.CalcuHead, "缁濆鍘嬪姏");
-                        dict.Add(Yw.Hydro.ParterProp.CalcuDemand, "闇�姘撮噺");
+                        dict.Add(HydroCalcuProp.CalcuPress, "鑷敱鍘嬪姏");
+                        dict.Add(HydroCalcuProp.CalcuHead, "缁濆鍘嬪姏");
+                        dict.Add(HydroCalcuProp.CalcuDemand, "闇�姘撮噺");
                     }
                     break;
                 case Yw.Hydro.ParterCatalog.Flowmeter:
                     {
-                        dict.Add(Yw.Hydro.ParterProp.CalcuPress, "鑷敱鍘嬪姏");
-                        dict.Add(Yw.Hydro.ParterProp.CalcuHead, "缁濆鍘嬪姏");
-                        dict.Add(Yw.Hydro.ParterProp.CalcuDemand, "闇�姘撮噺");
+                        dict.Add(HydroCalcuProp.CalcuPress, "鑷敱鍘嬪姏");
+                        dict.Add(HydroCalcuProp.CalcuHead, "缁濆鍘嬪姏");
+                        dict.Add(HydroCalcuProp.CalcuDemand, "闇�姘撮噺");
                     }
                     break;
                 case Yw.Hydro.ParterCatalog.Pressmeter:
                     {
-                        dict.Add(Yw.Hydro.ParterProp.CalcuPress, "鑷敱鍘嬪姏");
-                        dict.Add(Yw.Hydro.ParterProp.CalcuHead, "缁濆鍘嬪姏");
-                        dict.Add(Yw.Hydro.ParterProp.CalcuDemand, "闇�姘撮噺");
+                        dict.Add(HydroCalcuProp.CalcuPress, "鑷敱鍘嬪姏");
+                        dict.Add(HydroCalcuProp.CalcuHead, "缁濆鍘嬪姏");
+                        dict.Add(HydroCalcuProp.CalcuDemand, "闇�姘撮噺");
                     }
                     break;
                 case Yw.Hydro.ParterCatalog.Link:
                     {
-                        dict.Add(Yw.Hydro.ParterProp.CalcuFlow, "娴侀噺");
-                        dict.Add(Yw.Hydro.ParterProp.CalcuVelocity, "娴侀��");
-                        dict.Add(Yw.Hydro.ParterProp.CalcuHeadLoss, "姘村ご鎹熷け");
+                        dict.Add(HydroCalcuProp.CalcuFlow, "娴侀噺");
+                        dict.Add(HydroCalcuProp.CalcuVelocity, "娴侀��");
+                        dict.Add(HydroCalcuProp.CalcuHeadLoss, "姘村ご鎹熷け");
                     }
                     break;
                 case Yw.Hydro.ParterCatalog.Pipe:
                     {
                         dict.Add(Yw.Hydro.ParterProp.LinkStatus, "鐘舵��");
-                        dict.Add(Yw.Hydro.ParterProp.CalcuFlow, "娴侀噺");
-                        dict.Add(Yw.Hydro.ParterProp.CalcuVelocity, "娴侀��");
-                        dict.Add(Yw.Hydro.ParterProp.CalcuHeadLoss, "姘村ご鎹熷け");
+                        dict.Add(HydroCalcuProp.CalcuFlow, "娴侀噺");
+                        dict.Add(HydroCalcuProp.CalcuVelocity, "娴侀��");
+                        dict.Add(HydroCalcuProp.CalcuHeadLoss, "姘村ご鎹熷け");
                     }
                     break;
                 case Yw.Hydro.ParterCatalog.Translation:
                     {
-                        dict.Add(Yw.Hydro.ParterProp.CalcuFlow, "娴侀噺");
-                        dict.Add(Yw.Hydro.ParterProp.CalcuVelocity, "娴侀��");
-                        dict.Add(Yw.Hydro.ParterProp.CalcuHeadLoss, "姘村ご鎹熷け");
+                        dict.Add(HydroCalcuProp.CalcuFlow, "娴侀噺");
+                        dict.Add(HydroCalcuProp.CalcuVelocity, "娴侀��");
+                        dict.Add(HydroCalcuProp.CalcuHeadLoss, "姘村ご鎹熷け");
                     }
                     break;
                 case Yw.Hydro.ParterCatalog.Exchanger:
                     {
-                        dict.Add(Yw.Hydro.ParterProp.CalcuFlow, "娴侀噺");
-                        dict.Add(Yw.Hydro.ParterProp.CalcuVelocity, "娴侀��");
-                        dict.Add(Yw.Hydro.ParterProp.CalcuHeadLoss, "姘村ご鎹熷け");
+                        dict.Add(HydroCalcuProp.CalcuFlow, "娴侀噺");
+                        dict.Add(HydroCalcuProp.CalcuVelocity, "娴侀��");
+                        dict.Add(HydroCalcuProp.CalcuHeadLoss, "姘村ご鎹熷け");
                     }
                     break;
                 case Yw.Hydro.ParterCatalog.Compressor:
                     {
-                        dict.Add(Yw.Hydro.ParterProp.CalcuFlow, "娴侀噺");
-                        dict.Add(Yw.Hydro.ParterProp.CalcuVelocity, "娴侀��");
-                        dict.Add(Yw.Hydro.ParterProp.CalcuHeadLoss, "姘村ご鎹熷け");
+                        dict.Add(HydroCalcuProp.CalcuFlow, "娴侀噺");
+                        dict.Add(HydroCalcuProp.CalcuVelocity, "娴侀��");
+                        dict.Add(HydroCalcuProp.CalcuHeadLoss, "姘村ご鎹熷け");
                     }
                     break;
                 case Yw.Hydro.ParterCatalog.Pump:
                     {
                         dict.Add(Yw.Hydro.ParterProp.LinkStatus, "鐘舵��");
-                        dict.Add(Yw.Hydro.ParterProp.CalcuFlow, "娴侀噺");
-                        dict.Add(Yw.Hydro.ParterProp.CalcuVelocity, "娴侀��");
-                        dict.Add(Yw.Hydro.ParterProp.CalcuHeadLoss, "姘村ご鎹熷け");
+                        dict.Add(HydroCalcuProp.CalcuFlow, "娴侀噺");
+                        dict.Add(HydroCalcuProp.CalcuVelocity, "娴侀��");
+                        dict.Add(HydroCalcuProp.CalcuHeadLoss, "姘村ご鎹熷け");
                     }
                     break;
                 case Yw.Hydro.ParterCatalog.Valve:
                     {
                         dict.Add(Yw.Hydro.ParterProp.LinkStatus, "鐘舵��");
-                        dict.Add(Yw.Hydro.ParterProp.CalcuFlow, "娴侀噺");
-                        dict.Add(Yw.Hydro.ParterProp.CalcuVelocity, "娴侀��");
-                        dict.Add(Yw.Hydro.ParterProp.CalcuHeadLoss, "姘村ご鎹熷け");
+                        dict.Add(HydroCalcuProp.CalcuFlow, "娴侀噺");
+                        dict.Add(HydroCalcuProp.CalcuVelocity, "娴侀��");
+                        dict.Add(HydroCalcuProp.CalcuHeadLoss, "姘村ご鎹熷け");
                     }
                     break;
                 default: break;
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/05-extensions/HydroModelInfoExtensions.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/05-extensions/HydroModelInfoExtensions.cs
index 9817041..4afc890 100644
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/05-extensions/HydroModelInfoExtensions.cs
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/05-extensions/HydroModelInfoExtensions.cs
@@ -40,7 +40,7 @@
                     if (parterWorkingInfo != null)
                     {
                         parter.LinkStatus = parterWorkingInfo.LinkStatus;
-                        parter.SpeedRatio = Math.Round(parterWorkingInfo.CurrentHz / parter.RatedHz, 1);
+                        parter.SpeedRatio = parterWorkingInfo.CurrentHz / parter.RatedHz;
                     }
                 }
             }
@@ -59,31 +59,7 @@
                 }
             }
 
-            //娴侀噺璁�
-            if (hydroInfo.Flowmeters != null && hydroInfo.Flowmeters.Count > 0)
-            {
-                foreach (var parter in hydroInfo.Flowmeters)
-                {
-                    var parterWorkingInfo = workingInfo.Flowmeters?.Find(x => x.Code == parter.Code);
-                    if (parterWorkingInfo != null)
-                    {
-                        parter.CurrentFlow = parterWorkingInfo.CurrentFlow;
-                    }
-                }
-            }
 
-            //鍘嬪姏琛�
-            if (hydroInfo.Pressmeters != null && hydroInfo.Pressmeters.Count > 0)
-            {
-                foreach (var parter in hydroInfo.Pressmeters)
-                {
-                    var parterWorkingInfo = workingInfo.Pressmeters?.Find(x => x.Code == parter.Code);
-                    if (parterWorkingInfo != null)
-                    {
-                        parter.CurrentPress = parterWorkingInfo.CurrentPress;
-                    }
-                }
-            }
 
         }
 
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/00-core/HydroCalcuProp.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/00-core/HydroCalcuProp.cs
new file mode 100644
index 0000000..5537048
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/00-core/HydroCalcuProp.cs
@@ -0,0 +1,77 @@
+锘縩amespace Yw.WinFrmUI
+{
+    /// <summary>
+    /// 
+    /// </summary>
+    public class HydroCalcuProp
+    {
+        /// <summary>
+        /// 鑷敱鍘嬪姏(鍘婚櫎楂樼▼ m)
+        /// 鑺傜偣
+        /// </summary>
+        public const string CalcuPress = "CalcuPress";
+
+        /// <summary>
+        /// 缁濆鍘嬪姏(鍖呭惈楂樼▼ m)
+        /// 鑺傜偣
+        /// </summary>
+        public const string CalcuHead = "CalcuHead";
+
+        /// <summary>
+        /// 闇�姘撮噺锛坢鲁/h锛�
+        /// 鑺傜偣
+        /// </summary>
+        public const string CalcuDemand = "CalcuDemand";
+
+
+        /// <summary>
+        /// 娴侀噺 锛坢鲁/h锛�
+        /// 绠℃
+        /// </summary>
+        public const string CalcuFlow = "CalcuFlow";
+
+        /// <summary>
+        /// 娴侀�燂紙m/s锛�
+        /// 绠℃
+        /// </summary>
+        public const string CalcuVelocity = "CalcuVelocity";
+
+        /// <summary>
+        /// 姘村ご鎹熷け锛坢锛�
+        /// 绠℃
+        /// </summary>
+        public const string CalcuHeadLoss = "CalcuHeadLoss";
+
+        /// <summary>
+        /// 璁$畻娴侀噺锛坢鲁/h锛�
+        /// 娴侀噺璁°�佹按娉�
+        /// </summary>
+        public const string CalcuQ = "CalcuQ";
+
+        /// <summary>
+        /// 璁$畻鍘嬪姏( m)
+        /// 鍘嬪姏琛�
+        /// </summary>
+        public const string CalcuPr = "CalcuPr";
+
+        /// <summary>
+        /// 璁$畻鎵▼( m)
+        /// 姘存车
+        /// </summary>
+        public const string CalcuH = "CalcuH";
+
+        /// <summary>
+        /// 璁$畻鍔熺巼锛坘W锛�
+        /// 姘存车
+        /// </summary>
+        public const string CalcuP = "CalcuP";
+
+        /// <summary>
+        /// 璁$畻鏁堢巼 (%)
+        /// 姘存车
+        /// </summary>
+        public const string CalcuE = "CalcuE";
+
+
+    }
+}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/00-core/HydroCalcuPropHelper.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/00-core/HydroCalcuPropHelper.cs
new file mode 100644
index 0000000..9c0fb2c
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/00-core/HydroCalcuPropHelper.cs
@@ -0,0 +1,458 @@
+锘縩amespace Yw.WinFrmUI
+{
+    /// <summary>
+    /// 姘村姏璁$畻灞炴�ц緟鍔╃被
+    /// </summary>
+    public class HydroCalcuPropHelper
+    {
+        //鍚嶇О瀛楀吀
+        private static Dictionary<string, string> _nameDict = new Dictionary<string, string>()
+        {
+            { HydroCalcuProp.CalcuPress,"鑷敱鍘嬪姏"},
+            { HydroCalcuProp.CalcuHead,"缁濆鍘嬪姏"},
+            { HydroCalcuProp.CalcuDemand,"闇�姘撮噺"},
+            { HydroCalcuProp.CalcuFlow,"娴侀噺"},
+            { HydroCalcuProp.CalcuVelocity,"娴侀��"},
+            { HydroCalcuProp.CalcuHeadLoss,"姘村ご鎹熷け"},
+            { HydroCalcuProp.CalcuQ,"娴侀噺"},
+            { HydroCalcuProp.CalcuPr,"鍘嬪姏"},
+            { HydroCalcuProp.CalcuH,"鎵▼"},
+            { HydroCalcuProp.CalcuP,"鍔熺巼"},
+            { HydroCalcuProp.CalcuE,"鏁堢巼"}
+        };
+
+        //鍗曚綅瀛楀吀
+        private static Dictionary<string, string> _unitDict = new Dictionary<string, string>()
+        {
+            { HydroCalcuProp.CalcuPress,"m"},
+            { HydroCalcuProp.CalcuHead,"m"},
+            { HydroCalcuProp.CalcuDemand,"m鲁/h"},
+            { HydroCalcuProp.CalcuFlow,"m鲁/h"},
+            { HydroCalcuProp.CalcuVelocity,"m/s"},
+            { HydroCalcuProp.CalcuHeadLoss,"m"},
+            { HydroCalcuProp.CalcuQ,"m鲁/h"},
+            { HydroCalcuProp.CalcuPr,"m"},
+            { HydroCalcuProp.CalcuH,"m"},
+            { HydroCalcuProp.CalcuP,"kW"},
+            { HydroCalcuProp.CalcuE,"%"}
+        };
+
+        /// <summary>
+        /// 鑾峰彇鍚嶇О瀛楀吀
+        /// </summary>
+        public static Dictionary<string, string> GetNameDict(string catalog)
+        {
+            if (string.IsNullOrEmpty(catalog))
+            {
+                return default;
+            }
+            var dict = new Dictionary<string, string>();
+            switch (catalog)
+            {
+                case Yw.Hydro.ParterCatalog.Node:
+                    {
+                        dict.Add(HydroCalcuProp.CalcuPress, GetName(HydroCalcuProp.CalcuPress));
+                        dict.Add(HydroCalcuProp.CalcuHead, GetName(HydroCalcuProp.CalcuHead));
+                        dict.Add(HydroCalcuProp.CalcuDemand, GetName(HydroCalcuProp.CalcuDemand));
+                    }
+                    break;
+                case Yw.Hydro.ParterCatalog.Source:
+                    {
+                        dict.Add(HydroCalcuProp.CalcuPress, GetName(HydroCalcuProp.CalcuPress));
+                        dict.Add(HydroCalcuProp.CalcuHead, GetName(HydroCalcuProp.CalcuHead));
+                        dict.Add(HydroCalcuProp.CalcuDemand, GetName(HydroCalcuProp.CalcuDemand));
+                    }
+                    break;
+                case Yw.Hydro.ParterCatalog.Reservoir:
+                    {
+                        dict.Add(HydroCalcuProp.CalcuPress, GetName(HydroCalcuProp.CalcuPress));
+                        dict.Add(HydroCalcuProp.CalcuHead, GetName(HydroCalcuProp.CalcuHead));
+                        dict.Add(HydroCalcuProp.CalcuDemand, GetName(HydroCalcuProp.CalcuDemand));
+                    }
+                    break;
+                case Yw.Hydro.ParterCatalog.Tank:
+                    {
+                        dict.Add(HydroCalcuProp.CalcuPress, GetName(HydroCalcuProp.CalcuPress));
+                        dict.Add(HydroCalcuProp.CalcuHead, GetName(HydroCalcuProp.CalcuHead));
+                        dict.Add(HydroCalcuProp.CalcuDemand, GetName(HydroCalcuProp.CalcuDemand));
+                    }
+                    break;
+                case Yw.Hydro.ParterCatalog.Waterbox:
+                    {
+                        dict.Add(HydroCalcuProp.CalcuPress, GetName(HydroCalcuProp.CalcuPress));
+                        dict.Add(HydroCalcuProp.CalcuHead, GetName(HydroCalcuProp.CalcuHead));
+                        dict.Add(HydroCalcuProp.CalcuDemand, GetName(HydroCalcuProp.CalcuDemand));
+                    }
+                    break;
+                case Yw.Hydro.ParterCatalog.Junction:
+                    {
+                        dict.Add(HydroCalcuProp.CalcuPress, GetName(HydroCalcuProp.CalcuPress));
+                        dict.Add(HydroCalcuProp.CalcuHead, GetName(HydroCalcuProp.CalcuHead));
+                        dict.Add(HydroCalcuProp.CalcuDemand, GetName(HydroCalcuProp.CalcuDemand));
+                    }
+                    break;
+                case Yw.Hydro.ParterCatalog.Coupling:
+                    {
+                        dict.Add(HydroCalcuProp.CalcuPress, GetName(HydroCalcuProp.CalcuPress));
+                        dict.Add(HydroCalcuProp.CalcuHead, GetName(HydroCalcuProp.CalcuHead));
+                        dict.Add(HydroCalcuProp.CalcuDemand, GetName(HydroCalcuProp.CalcuDemand));
+                    }
+                    break;
+                case Yw.Hydro.ParterCatalog.Blunthead:
+                    {
+                        dict.Add(HydroCalcuProp.CalcuPress, GetName(HydroCalcuProp.CalcuPress));
+                        dict.Add(HydroCalcuProp.CalcuHead, GetName(HydroCalcuProp.CalcuHead));
+                        dict.Add(HydroCalcuProp.CalcuDemand, GetName(HydroCalcuProp.CalcuDemand));
+                    }
+                    break;
+                case Yw.Hydro.ParterCatalog.Elbow:
+                    {
+                        dict.Add(HydroCalcuProp.CalcuPress, GetName(HydroCalcuProp.CalcuPress));
+                        dict.Add(HydroCalcuProp.CalcuHead, GetName(HydroCalcuProp.CalcuHead));
+                        dict.Add(HydroCalcuProp.CalcuDemand, GetName(HydroCalcuProp.CalcuDemand));
+                    }
+                    break;
+                case Yw.Hydro.ParterCatalog.Threelink:
+                    {
+                        dict.Add(HydroCalcuProp.CalcuPress, GetName(HydroCalcuProp.CalcuPress));
+                        dict.Add(HydroCalcuProp.CalcuHead, GetName(HydroCalcuProp.CalcuHead));
+                        dict.Add(HydroCalcuProp.CalcuDemand, GetName(HydroCalcuProp.CalcuDemand));
+                    }
+                    break;
+                case Yw.Hydro.ParterCatalog.Fourlink:
+                    {
+                        dict.Add(HydroCalcuProp.CalcuPress, GetName(HydroCalcuProp.CalcuPress));
+                        dict.Add(HydroCalcuProp.CalcuHead, GetName(HydroCalcuProp.CalcuHead));
+                        dict.Add(HydroCalcuProp.CalcuDemand, GetName(HydroCalcuProp.CalcuDemand));
+                    }
+                    break;
+                case Yw.Hydro.ParterCatalog.Emitter:
+                    {
+                        dict.Add(HydroCalcuProp.CalcuPress, GetName(HydroCalcuProp.CalcuPress));
+                        dict.Add(HydroCalcuProp.CalcuHead, GetName(HydroCalcuProp.CalcuHead));
+                        dict.Add(HydroCalcuProp.CalcuDemand, GetName(HydroCalcuProp.CalcuDemand));
+                    }
+                    break;
+                case Yw.Hydro.ParterCatalog.Nozzle:
+                    {
+                        dict.Add(HydroCalcuProp.CalcuPress, GetName(HydroCalcuProp.CalcuPress));
+                        dict.Add(HydroCalcuProp.CalcuHead, GetName(HydroCalcuProp.CalcuHead));
+                        dict.Add(HydroCalcuProp.CalcuDemand, GetName(HydroCalcuProp.CalcuDemand));
+                    }
+                    break;
+                case Yw.Hydro.ParterCatalog.Hydrant:
+                    {
+                        dict.Add(HydroCalcuProp.CalcuPress, GetName(HydroCalcuProp.CalcuPress));
+                        dict.Add(HydroCalcuProp.CalcuHead, GetName(HydroCalcuProp.CalcuHead));
+                        dict.Add(HydroCalcuProp.CalcuDemand, GetName(HydroCalcuProp.CalcuDemand));
+                    }
+                    break;
+                case Yw.Hydro.ParterCatalog.Meter:
+                    {
+                        dict.Add(HydroCalcuProp.CalcuPress, GetName(HydroCalcuProp.CalcuPress));
+                        dict.Add(HydroCalcuProp.CalcuHead, GetName(HydroCalcuProp.CalcuHead));
+                        dict.Add(HydroCalcuProp.CalcuDemand, GetName(HydroCalcuProp.CalcuDemand));
+                    }
+                    break;
+                case Yw.Hydro.ParterCatalog.Instrument:
+                    {
+                        dict.Add(HydroCalcuProp.CalcuPress, GetName(HydroCalcuProp.CalcuPress));
+                        dict.Add(HydroCalcuProp.CalcuHead, GetName(HydroCalcuProp.CalcuHead));
+                        dict.Add(HydroCalcuProp.CalcuDemand, GetName(HydroCalcuProp.CalcuDemand));
+                    }
+                    break;
+                case Yw.Hydro.ParterCatalog.Flowmeter:
+                    {
+                        dict.Add(HydroCalcuProp.CalcuQ, GetName(HydroCalcuProp.CalcuQ));
+                    }
+                    break;
+                case Yw.Hydro.ParterCatalog.Pressmeter:
+                    {
+                        dict.Add(HydroCalcuProp.CalcuPr, GetName(HydroCalcuProp.CalcuPr));
+                    }
+                    break;
+                case Yw.Hydro.ParterCatalog.Link:
+                    {
+                        dict.Add(HydroCalcuProp.CalcuFlow, GetName(HydroCalcuProp.CalcuFlow));
+                        dict.Add(HydroCalcuProp.CalcuVelocity, GetName(HydroCalcuProp.CalcuVelocity));
+                        dict.Add(HydroCalcuProp.CalcuHeadLoss, GetName(HydroCalcuProp.CalcuHeadLoss));
+                    }
+                    break;
+                case Yw.Hydro.ParterCatalog.Pipe:
+                    {
+                        dict.Add(HydroCalcuProp.CalcuFlow, GetName(HydroCalcuProp.CalcuFlow));
+                        dict.Add(HydroCalcuProp.CalcuVelocity, GetName(HydroCalcuProp.CalcuVelocity));
+                        dict.Add(HydroCalcuProp.CalcuHeadLoss, GetName(HydroCalcuProp.CalcuHeadLoss));
+                    }
+                    break;
+                case Yw.Hydro.ParterCatalog.Translation:
+                    {
+                        dict.Add(HydroCalcuProp.CalcuFlow, GetName(HydroCalcuProp.CalcuFlow));
+                        dict.Add(HydroCalcuProp.CalcuVelocity, GetName(HydroCalcuProp.CalcuVelocity));
+                        dict.Add(HydroCalcuProp.CalcuHeadLoss, GetName(HydroCalcuProp.CalcuHeadLoss));
+                    }
+                    break;
+                case Yw.Hydro.ParterCatalog.Pump:
+                    {
+                        dict.Add(HydroCalcuProp.CalcuQ, GetName(HydroCalcuProp.CalcuQ));
+                        dict.Add(HydroCalcuProp.CalcuH, GetName(HydroCalcuProp.CalcuH));
+                        dict.Add(HydroCalcuProp.CalcuP, GetName(HydroCalcuProp.CalcuP));
+                        dict.Add(HydroCalcuProp.CalcuE, GetName(HydroCalcuProp.CalcuE));
+                    }
+                    break;
+                case Yw.Hydro.ParterCatalog.Valve:
+                    {
+                        dict.Add(HydroCalcuProp.CalcuFlow, GetName(HydroCalcuProp.CalcuFlow));
+                        dict.Add(HydroCalcuProp.CalcuVelocity, GetName(HydroCalcuProp.CalcuVelocity));
+                        dict.Add(HydroCalcuProp.CalcuHeadLoss, GetName(HydroCalcuProp.CalcuHeadLoss));
+                    }
+                    break;
+                case Yw.Hydro.ParterCatalog.Resistance:
+                    {
+                        dict.Add(HydroCalcuProp.CalcuFlow, GetName(HydroCalcuProp.CalcuFlow));
+                        dict.Add(HydroCalcuProp.CalcuVelocity, GetName(HydroCalcuProp.CalcuVelocity));
+                        dict.Add(HydroCalcuProp.CalcuHeadLoss, GetName(HydroCalcuProp.CalcuHeadLoss));
+                    }
+                    break;
+                case Yw.Hydro.ParterCatalog.Exchanger:
+                    {
+                        dict.Add(HydroCalcuProp.CalcuFlow, GetName(HydroCalcuProp.CalcuFlow));
+                        dict.Add(HydroCalcuProp.CalcuVelocity, GetName(HydroCalcuProp.CalcuVelocity));
+                        dict.Add(HydroCalcuProp.CalcuHeadLoss, GetName(HydroCalcuProp.CalcuHeadLoss));
+                    }
+                    break;
+                case Yw.Hydro.ParterCatalog.Compressor:
+                    {
+                        dict.Add(HydroCalcuProp.CalcuFlow, GetName(HydroCalcuProp.CalcuFlow));
+                        dict.Add(HydroCalcuProp.CalcuVelocity, GetName(HydroCalcuProp.CalcuVelocity));
+                        dict.Add(HydroCalcuProp.CalcuHeadLoss, GetName(HydroCalcuProp.CalcuHeadLoss));
+                    }
+                    break;
+                default: break;
+            }
+            return dict;
+        }
+
+        /// <summary>
+        /// 鑾峰彇鍗曚綅瀛楀吀
+        /// </summary>
+        public static Dictionary<string, string> GetUnitDict(string catalog)
+        {
+            if (string.IsNullOrEmpty(catalog))
+            {
+                return default;
+            }
+            var dict = new Dictionary<string, string>();
+            switch (catalog)
+            {
+                case Yw.Hydro.ParterCatalog.Node:
+                    {
+                        dict.Add(HydroCalcuProp.CalcuPress, GetUnit(HydroCalcuProp.CalcuPress));
+                        dict.Add(HydroCalcuProp.CalcuHead, GetUnit(HydroCalcuProp.CalcuHead));
+                        dict.Add(HydroCalcuProp.CalcuDemand, GetUnit(HydroCalcuProp.CalcuDemand));
+                    }
+                    break;
+                case Yw.Hydro.ParterCatalog.Source:
+                    {
+                        dict.Add(HydroCalcuProp.CalcuPress, GetUnit(HydroCalcuProp.CalcuPress));
+                        dict.Add(HydroCalcuProp.CalcuHead, GetUnit(HydroCalcuProp.CalcuHead));
+                        dict.Add(HydroCalcuProp.CalcuDemand, GetUnit(HydroCalcuProp.CalcuDemand));
+                    }
+                    break;
+                case Yw.Hydro.ParterCatalog.Reservoir:
+                    {
+                        dict.Add(HydroCalcuProp.CalcuPress, GetUnit(HydroCalcuProp.CalcuPress));
+                        dict.Add(HydroCalcuProp.CalcuHead, GetUnit(HydroCalcuProp.CalcuHead));
+                        dict.Add(HydroCalcuProp.CalcuDemand, GetUnit(HydroCalcuProp.CalcuDemand));
+                    }
+                    break;
+                case Yw.Hydro.ParterCatalog.Tank:
+                    {
+                        dict.Add(HydroCalcuProp.CalcuPress, GetUnit(HydroCalcuProp.CalcuPress));
+                        dict.Add(HydroCalcuProp.CalcuHead, GetUnit(HydroCalcuProp.CalcuHead));
+                        dict.Add(HydroCalcuProp.CalcuDemand, GetUnit(HydroCalcuProp.CalcuDemand));
+                    }
+                    break;
+                case Yw.Hydro.ParterCatalog.Waterbox:
+                    {
+                        dict.Add(HydroCalcuProp.CalcuPress, GetUnit(HydroCalcuProp.CalcuPress));
+                        dict.Add(HydroCalcuProp.CalcuHead, GetUnit(HydroCalcuProp.CalcuHead));
+                        dict.Add(HydroCalcuProp.CalcuDemand, GetUnit(HydroCalcuProp.CalcuDemand));
+                    }
+                    break;
+                case Yw.Hydro.ParterCatalog.Junction:
+                    {
+                        dict.Add(HydroCalcuProp.CalcuPress, GetUnit(HydroCalcuProp.CalcuPress));
+                        dict.Add(HydroCalcuProp.CalcuHead, GetUnit(HydroCalcuProp.CalcuHead));
+                        dict.Add(HydroCalcuProp.CalcuDemand, GetUnit(HydroCalcuProp.CalcuDemand));
+                    }
+                    break;
+                case Yw.Hydro.ParterCatalog.Coupling:
+                    {
+                        dict.Add(HydroCalcuProp.CalcuPress, GetUnit(HydroCalcuProp.CalcuPress));
+                        dict.Add(HydroCalcuProp.CalcuHead, GetUnit(HydroCalcuProp.CalcuHead));
+                        dict.Add(HydroCalcuProp.CalcuDemand, GetUnit(HydroCalcuProp.CalcuDemand));
+                    }
+                    break;
+                case Yw.Hydro.ParterCatalog.Blunthead:
+                    {
+                        dict.Add(HydroCalcuProp.CalcuPress, GetUnit(HydroCalcuProp.CalcuPress));
+                        dict.Add(HydroCalcuProp.CalcuHead, GetUnit(HydroCalcuProp.CalcuHead));
+                        dict.Add(HydroCalcuProp.CalcuDemand, GetUnit(HydroCalcuProp.CalcuDemand));
+                    }
+                    break;
+                case Yw.Hydro.ParterCatalog.Elbow:
+                    {
+                        dict.Add(HydroCalcuProp.CalcuPress, GetUnit(HydroCalcuProp.CalcuPress));
+                        dict.Add(HydroCalcuProp.CalcuHead, GetUnit(HydroCalcuProp.CalcuHead));
+                        dict.Add(HydroCalcuProp.CalcuDemand, GetUnit(HydroCalcuProp.CalcuDemand));
+                    }
+                    break;
+                case Yw.Hydro.ParterCatalog.Threelink:
+                    {
+                        dict.Add(HydroCalcuProp.CalcuPress, GetUnit(HydroCalcuProp.CalcuPress));
+                        dict.Add(HydroCalcuProp.CalcuHead, GetUnit(HydroCalcuProp.CalcuHead));
+                        dict.Add(HydroCalcuProp.CalcuDemand, GetUnit(HydroCalcuProp.CalcuDemand));
+                    }
+                    break;
+                case Yw.Hydro.ParterCatalog.Fourlink:
+                    {
+                        dict.Add(HydroCalcuProp.CalcuPress, GetUnit(HydroCalcuProp.CalcuPress));
+                        dict.Add(HydroCalcuProp.CalcuHead, GetUnit(HydroCalcuProp.CalcuHead));
+                        dict.Add(HydroCalcuProp.CalcuDemand, GetUnit(HydroCalcuProp.CalcuDemand));
+                    }
+                    break;
+                case Yw.Hydro.ParterCatalog.Emitter:
+                    {
+                        dict.Add(HydroCalcuProp.CalcuPress, GetUnit(HydroCalcuProp.CalcuPress));
+                        dict.Add(HydroCalcuProp.CalcuHead, GetUnit(HydroCalcuProp.CalcuHead));
+                        dict.Add(HydroCalcuProp.CalcuDemand, GetUnit(HydroCalcuProp.CalcuDemand));
+                    }
+                    break;
+                case Yw.Hydro.ParterCatalog.Nozzle:
+                    {
+                        dict.Add(HydroCalcuProp.CalcuPress, GetUnit(HydroCalcuProp.CalcuPress));
+                        dict.Add(HydroCalcuProp.CalcuHead, GetUnit(HydroCalcuProp.CalcuHead));
+                        dict.Add(HydroCalcuProp.CalcuDemand, GetUnit(HydroCalcuProp.CalcuDemand));
+                    }
+                    break;
+                case Yw.Hydro.ParterCatalog.Hydrant:
+                    {
+                        dict.Add(HydroCalcuProp.CalcuPress, GetUnit(HydroCalcuProp.CalcuPress));
+                        dict.Add(HydroCalcuProp.CalcuHead, GetUnit(HydroCalcuProp.CalcuHead));
+                        dict.Add(HydroCalcuProp.CalcuDemand, GetUnit(HydroCalcuProp.CalcuDemand));
+                    }
+                    break;
+                case Yw.Hydro.ParterCatalog.Meter:
+                    {
+                        dict.Add(HydroCalcuProp.CalcuPress, GetUnit(HydroCalcuProp.CalcuPress));
+                        dict.Add(HydroCalcuProp.CalcuHead, GetUnit(HydroCalcuProp.CalcuHead));
+                        dict.Add(HydroCalcuProp.CalcuDemand, GetUnit(HydroCalcuProp.CalcuDemand));
+                    }
+                    break;
+                case Yw.Hydro.ParterCatalog.Instrument:
+                    {
+                        dict.Add(HydroCalcuProp.CalcuPress, GetUnit(HydroCalcuProp.CalcuPress));
+                        dict.Add(HydroCalcuProp.CalcuHead, GetUnit(HydroCalcuProp.CalcuHead));
+                        dict.Add(HydroCalcuProp.CalcuDemand, GetUnit(HydroCalcuProp.CalcuDemand));
+                    }
+                    break;
+                case Yw.Hydro.ParterCatalog.Flowmeter:
+                    {
+                        dict.Add(HydroCalcuProp.CalcuQ, GetUnit(HydroCalcuProp.CalcuQ));
+                    }
+                    break;
+                case Yw.Hydro.ParterCatalog.Pressmeter:
+                    {
+                        dict.Add(HydroCalcuProp.CalcuPr, GetUnit(HydroCalcuProp.CalcuPr));
+                    }
+                    break;
+                case Yw.Hydro.ParterCatalog.Link:
+                    {
+                        dict.Add(HydroCalcuProp.CalcuFlow, GetUnit(HydroCalcuProp.CalcuFlow));
+                        dict.Add(HydroCalcuProp.CalcuVelocity, GetUnit(HydroCalcuProp.CalcuVelocity));
+                        dict.Add(HydroCalcuProp.CalcuHeadLoss, GetUnit(HydroCalcuProp.CalcuHeadLoss));
+                    }
+                    break;
+                case Yw.Hydro.ParterCatalog.Pipe:
+                    {
+                        dict.Add(HydroCalcuProp.CalcuFlow, GetUnit(HydroCalcuProp.CalcuFlow));
+                        dict.Add(HydroCalcuProp.CalcuVelocity, GetUnit(HydroCalcuProp.CalcuVelocity));
+                        dict.Add(HydroCalcuProp.CalcuHeadLoss, GetUnit(HydroCalcuProp.CalcuHeadLoss));
+                    }
+                    break;
+                case Yw.Hydro.ParterCatalog.Translation:
+                    {
+                        dict.Add(HydroCalcuProp.CalcuFlow, GetUnit(HydroCalcuProp.CalcuFlow));
+                        dict.Add(HydroCalcuProp.CalcuVelocity, GetUnit(HydroCalcuProp.CalcuVelocity));
+                        dict.Add(HydroCalcuProp.CalcuHeadLoss, GetUnit(HydroCalcuProp.CalcuHeadLoss));
+                    }
+                    break;
+                case Yw.Hydro.ParterCatalog.Pump:
+                    {
+                        dict.Add(HydroCalcuProp.CalcuQ, GetUnit(HydroCalcuProp.CalcuQ));
+                        dict.Add(HydroCalcuProp.CalcuH, GetUnit(HydroCalcuProp.CalcuH));
+                        dict.Add(HydroCalcuProp.CalcuP, GetUnit(HydroCalcuProp.CalcuP));
+                        dict.Add(HydroCalcuProp.CalcuE, GetUnit(HydroCalcuProp.CalcuE));
+                    }
+                    break;
+                case Yw.Hydro.ParterCatalog.Valve:
+                    {
+                        dict.Add(HydroCalcuProp.CalcuFlow, GetUnit(HydroCalcuProp.CalcuFlow));
+                        dict.Add(HydroCalcuProp.CalcuVelocity, GetUnit(HydroCalcuProp.CalcuVelocity));
+                        dict.Add(HydroCalcuProp.CalcuHeadLoss, GetUnit(HydroCalcuProp.CalcuHeadLoss));
+                    }
+                    break;
+                case Yw.Hydro.ParterCatalog.Resistance:
+                    {
+                        dict.Add(HydroCalcuProp.CalcuFlow, GetUnit(HydroCalcuProp.CalcuFlow));
+                        dict.Add(HydroCalcuProp.CalcuVelocity, GetUnit(HydroCalcuProp.CalcuVelocity));
+                        dict.Add(HydroCalcuProp.CalcuHeadLoss, GetUnit(HydroCalcuProp.CalcuHeadLoss));
+                    }
+                    break;
+                case Yw.Hydro.ParterCatalog.Exchanger:
+                    {
+                        dict.Add(HydroCalcuProp.CalcuFlow, GetUnit(HydroCalcuProp.CalcuFlow));
+                        dict.Add(HydroCalcuProp.CalcuVelocity, GetUnit(HydroCalcuProp.CalcuVelocity));
+                        dict.Add(HydroCalcuProp.CalcuHeadLoss, GetUnit(HydroCalcuProp.CalcuHeadLoss));
+                    }
+                    break;
+                case Yw.Hydro.ParterCatalog.Compressor:
+                    {
+                        dict.Add(HydroCalcuProp.CalcuFlow, GetUnit(HydroCalcuProp.CalcuFlow));
+                        dict.Add(HydroCalcuProp.CalcuVelocity, GetUnit(HydroCalcuProp.CalcuVelocity));
+                        dict.Add(HydroCalcuProp.CalcuHeadLoss, GetUnit(HydroCalcuProp.CalcuHeadLoss));
+                    }
+                    break;
+                default: break;
+            }
+            return dict;
+        }
+
+        /// <summary>
+        /// 鑾峰彇鍚嶇О
+        /// </summary>
+        public static string GetName(string code)
+        {
+            if (_nameDict.ContainsKey(code))
+            {
+                return _nameDict[code];
+            }
+            return default;
+        }
+
+        /// <summary>
+        /// 鑾峰彇鍗曚綅
+        /// </summary>
+        public static string GetUnit(string code)
+        {
+            if (_unitDict.ContainsKey(code))
+            {
+                return _unitDict[code];
+            }
+            return default;
+        }
+
+
+    }
+}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/00-core/HydroCalcuResult.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/01-result/HydroCalcuResult.cs
similarity index 100%
rename from WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/00-core/HydroCalcuResult.cs
rename to WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/01-result/HydroCalcuResult.cs
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/00-core/IHydroCalcuResult.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/01-result/IHydroCalcuResult.cs
similarity index 100%
rename from WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/00-core/IHydroCalcuResult.cs
rename to WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/01-result/IHydroCalcuResult.cs
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/01-node/00-core/HydroCalcuNodeResult.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/02-node/00-core/HydroCalcuNodeResult.cs
similarity index 100%
rename from WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/01-node/00-core/HydroCalcuNodeResult.cs
rename to WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/02-node/00-core/HydroCalcuNodeResult.cs
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/01-node/00-core/IHydroCalcuNodeResult.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/02-node/00-core/IHydroCalcuNodeResult.cs
similarity index 100%
rename from WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/01-node/00-core/IHydroCalcuNodeResult.cs
rename to WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/02-node/00-core/IHydroCalcuNodeResult.cs
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/01-node/01-flowmeter/HydroCalcuFlowmeterResult.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/02-node/01-flowmeter/HydroCalcuFlowmeterResult.cs
similarity index 100%
rename from WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/01-node/01-flowmeter/HydroCalcuFlowmeterResult.cs
rename to WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/02-node/01-flowmeter/HydroCalcuFlowmeterResult.cs
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/01-node/01-flowmeter/IHydroCalcuFlowmeterResult.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/02-node/01-flowmeter/IHydroCalcuFlowmeterResult.cs
similarity index 100%
rename from WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/01-node/01-flowmeter/IHydroCalcuFlowmeterResult.cs
rename to WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/02-node/01-flowmeter/IHydroCalcuFlowmeterResult.cs
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/01-node/02-pressmeter/HydroCalcuPressmeterResult.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/02-node/02-pressmeter/HydroCalcuPressmeterResult.cs
similarity index 100%
rename from WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/01-node/02-pressmeter/HydroCalcuPressmeterResult.cs
rename to WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/02-node/02-pressmeter/HydroCalcuPressmeterResult.cs
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/01-node/02-pressmeter/IHydroCalcuPressmeterResult.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/02-node/02-pressmeter/IHydroCalcuPressmeterResult.cs
similarity index 100%
rename from WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/01-node/02-pressmeter/IHydroCalcuPressmeterResult.cs
rename to WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/02-node/02-pressmeter/IHydroCalcuPressmeterResult.cs
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/02-link/00-core/HydroCalcuLinkResult.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/03-link/00-core/HydroCalcuLinkResult.cs
similarity index 100%
rename from WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/02-link/00-core/HydroCalcuLinkResult.cs
rename to WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/03-link/00-core/HydroCalcuLinkResult.cs
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/02-link/00-core/IHydroCalcuLinkResult.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/03-link/00-core/IHydroCalcuLinkResult.cs
similarity index 100%
rename from WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/02-link/00-core/IHydroCalcuLinkResult.cs
rename to WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/03-link/00-core/IHydroCalcuLinkResult.cs
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/02-link/01-pump/HydroCalcuPumpResult.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/03-link/01-pump/HydroCalcuPumpResult.cs
similarity index 100%
rename from WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/02-link/01-pump/HydroCalcuPumpResult.cs
rename to WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/03-link/01-pump/HydroCalcuPumpResult.cs
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/02-link/01-pump/IHydroCalcuPumpResult.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/03-link/01-pump/IHydroCalcuPumpResult.cs
similarity index 100%
rename from WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/02-link/01-pump/IHydroCalcuPumpResult.cs
rename to WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/03-link/01-pump/IHydroCalcuPumpResult.cs
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/03-node/03-junction/03-meter/02-flowmeter/HydroFlowmeterViewModel.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/03-node/03-junction/03-meter/02-flowmeter/HydroFlowmeterViewModel.cs
deleted file mode 100644
index 9799557..0000000
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/03-node/03-junction/03-meter/02-flowmeter/HydroFlowmeterViewModel.cs
+++ /dev/null
@@ -1,127 +0,0 @@
-锘縰sing System.Runtime.CompilerServices;
-
-namespace Yw.WinFrmUI
-{
-    /// <summary>
-    /// 娴侀噺璁¤鍥�
-    /// </summary>
-    public class HydroFlowmeterViewModel : HydroJunctionViewModel, IHydroCalcuFlowmeterResult
-    {
-        /// <summary>
-        /// 
-        /// </summary>
-        public HydroFlowmeterViewModel() { }
-
-        /// <summary>
-        /// 
-        /// </summary>
-        public HydroFlowmeterViewModel(Yw.Model.HydroFlowmeterInfo rhs, Yw.Model.HydroModelInfo hydroInfo) : base(rhs, hydroInfo)
-        {
-            this.CurrentFlow = rhs.CurrentFlow.HasValue ? Math.Round(rhs.CurrentFlow.Value, 1) : null;
-            this.UpdatePropStatus(nameof(this.CurrentFlow), rhs, nameof(rhs.CurrentFlow));
-
-            this.Vmo = rhs;
-        }
-
-
-        /// <summary>
-        /// 娴侀噺
-        /// </summary>
-        [Category("鏁版嵁")]
-        [DisplayName("娴侀噺")]
-        [Display(Name = "娴侀噺(m鲁/h)")]
-        [DisplayUnit("m鲁/h")]
-        [PropertyOrder(3001)]
-        [Browsable(true)]
-        public double? CurrentFlow { get; set; }
-
-        /// <summary>
-        /// 鑷敱鍘嬪姏
-        /// </summary>
-        [Category("璁$畻缁撴灉")]
-        [DisplayName("鑷敱鍘嬪姏")]
-        [Display(Name = "鑷敱鍘嬪姏(m)")]
-        [DisplayUnit("m")]
-        [HydroCalcuPro]
-        [PropertyOrder(10001)]
-        [ShowEditor(false)]
-        [Browsable(false)]
-        public override double? CalcuPress { get; set; }
-
-        /// <summary>
-        /// 缁濆鍘嬪姏
-        /// </summary>
-        [Category("璁$畻缁撴灉")]
-        [DisplayName("缁濆鍘嬪姏")]
-        [PropertyOrder(10002)]
-        [DisplayUnit("m")]
-        [HydroCalcuPro]
-        [ShowEditor(false)]
-        [Browsable(false)]
-        public override double? CalcuHead { get; set; }
-
-        /// <summary>
-        /// 闇�姘撮噺
-        /// </summary>
-        [Category("璁$畻缁撴灉")]
-        [DisplayName("闇�姘撮噺")]
-        [PropertyOrder(10003)]
-        [DisplayUnit("m鲁/h")]
-        [HydroCalcuPro]
-        [ShowEditor(false)]
-        [Browsable(false)]
-        public override double? CalcuDemand { get; set; }
-
-        /// <summary>
-        /// 娴侀噺
-        /// </summary>
-        [Category("璁$畻缁撴灉")]
-        [DisplayName("璁$畻娴侀噺")]
-        [Display(Name = "璁$畻娴侀噺(m鲁/h)")]
-        [DisplayUnit("m鲁/h")]
-        [HydroCalcuPro]
-        [PropertyOrder(11001)]
-        [ShowEditor(false)]
-        [Browsable(true)]
-        public double? CalcuQ { get; set; }
-
-
-        /// <summary>
-        /// 
-        /// </summary>
-        [Browsable(false)]
-        public new Yw.Model.HydroFlowmeterInfo Vmo { get; set; }
-
-        /// <summary>
-        /// 
-        /// </summary>
-        public override void UpdateProperty()
-        {
-            base.UpdateProperty();
-            this.CurrentFlow = this.Vmo.CurrentFlow;
-            this.UpdatePropStatus(nameof(this.CurrentFlow), this.Vmo, nameof(this.Vmo.CurrentFlow));
-        }
-
-        public override void UpdateVmoProperty()
-        {
-            base.UpdateVmoProperty();
-            this.Vmo.CurrentFlow = this.CurrentFlow;
-            this.Vmo.UpdatePropStatus(nameof(this.Vmo.CurrentFlow), this, nameof(this.CurrentFlow));
-        }
-
-        /// <summary>
-        /// 鏇存柊璁$畻灞炴��
-        /// </summary>
-        public override void UpdateCalcuProperty(HydroCalcuResult rhs)
-        {
-            base.UpdateCalcuProperty(rhs);
-            if (rhs is HydroCalcuFlowmeterResult calcuFlowmeterProperty)
-            {
-                this.CalcuQ = calcuFlowmeterProperty.CalcuQ.HasValue ? Math.Round(calcuFlowmeterProperty.CalcuQ.Value, 1) : null;
-            }
-        }
-
-
-
-    }
-}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/03-node/03-junction/03-meter/03-pressmeter/HydroPressmeterViewModel.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/03-node/03-junction/03-meter/03-pressmeter/HydroPressmeterViewModel.cs
deleted file mode 100644
index 0ad059e..0000000
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/03-node/03-junction/03-meter/03-pressmeter/HydroPressmeterViewModel.cs
+++ /dev/null
@@ -1,124 +0,0 @@
-锘縩amespace Yw.WinFrmUI
-{
-    /// <summary>
-    /// 鍘嬪姏琛ㄨ鍥�
-    /// </summary>
-    public class HydroPressmeterViewModel : HydroJunctionViewModel
-    {
-        /// <summary>
-        /// 
-        /// </summary>
-        public HydroPressmeterViewModel() { }
-
-        /// <summary>
-        /// 
-        /// </summary>
-        public HydroPressmeterViewModel(Yw.Model.HydroPressmeterInfo rhs, Yw.Model.HydroModelInfo hydroInfo) : base(rhs, hydroInfo)
-        {
-            this.CurrentPress = rhs.CurrentPress.HasValue ? Math.Round(rhs.CurrentPress.Value, 2) : null;
-            this.UpdatePropStatus(nameof(this.CurrentPress), rhs, nameof(rhs.CurrentPress));
-
-            this.Vmo = rhs;
-        }
-
-        /// <summary>
-        /// 褰撳墠鍘嬪姏
-        /// </summary>
-        [Category("鏁版嵁")]
-        [DisplayName("褰撳墠鍘嬪姏")]
-        [Display(Name = "褰撳墠鍘嬪姏(m)")]
-        [DisplayUnit("m")]
-        [PropertyOrder(3001)]
-        [Browsable(true)]
-        public double? CurrentPress { get; set; }
-
-        /// <summary>
-        /// 鑷敱鍘嬪姏
-        /// </summary>
-        [Category("璁$畻缁撴灉")]
-        [DisplayName("鑷敱鍘嬪姏")]
-        [PropertyOrder(10001)]
-        [DisplayUnit("m")]
-        [HydroCalcuPro]
-        [ShowEditor(false)]
-        [Browsable(false)]
-        public override double? CalcuPress { get; set; }
-
-        /// <summary>
-        /// 缁濆鍘嬪姏
-        /// </summary>
-        [Category("璁$畻缁撴灉")]
-        [DisplayName("缁濆鍘嬪姏")]
-        [PropertyOrder(10002)]
-        [DisplayUnit("m")]
-        [HydroCalcuPro]
-        [ShowEditor(false)]
-        [Browsable(false)]
-        public override double? CalcuHead { get; set; }
-
-        /// <summary>
-        /// 闇�姘撮噺
-        /// </summary>
-        [Category("璁$畻缁撴灉")]
-        [DisplayName("闇�姘撮噺")]
-        [PropertyOrder(10003)]
-        [DisplayUnit("m鲁/h")]
-        [HydroCalcuPro]
-        [ShowEditor(false)]
-        [Browsable(false)]
-        public override double? CalcuDemand { get; set; }
-
-        /// <summary>
-        /// 璁$畻鍘嬪姏
-        /// </summary>
-        [Category("璁$畻缁撴灉")]
-        [DisplayName("璁$畻鍘嬪姏")]
-        [Display(Name = "璁$畻鍘嬪姏(m)")]
-        [DisplayUnit("m")]
-        [HydroCalcuPro]
-        [PropertyOrder(11001)]
-        [ShowEditor(false)]
-        [Browsable(true)]
-        public double? CalcuPr { get; set; }
-
-        /// <summary>
-        /// 
-        /// </summary>
-        [Browsable(false)]
-        public new Yw.Model.HydroPressmeterInfo Vmo { get; set; }
-
-        /// <summary>
-        /// 鏇存柊灞炴��
-        /// </summary>
-        public override void UpdateProperty()
-        {
-            base.UpdateProperty();
-            this.CurrentPress = this.Vmo.CurrentPress;
-            this.UpdatePropStatus(nameof(this.CurrentPress), this.Vmo, nameof(this.Vmo.CurrentPress));
-        }
-
-        /// <summary>
-        /// 
-        /// </summary>
-        public override void UpdateVmoProperty()
-        {
-            base.UpdateVmoProperty();
-            this.Vmo.CurrentPress = this.CurrentPress;
-            this.Vmo.UpdatePropStatus(nameof(this.Vmo.CurrentPress), this, nameof(this.CurrentPress));
-        }
-
-
-        /// <summary>
-        /// 鏇存柊璁$畻灞炴��
-        /// </summary>
-        public override void UpdateCalcuProperty(HydroCalcuResult rhs)
-        {
-            base.UpdateCalcuProperty(rhs);
-            if (rhs is IHydroCalcuPressmeterResult calcuPressmeterProperty)
-            {
-                this.CalcuPr = calcuPressmeterProperty.CalcuPr.HasValue ? Math.Round(calcuPressmeterProperty.CalcuPr.Value, 2) : null;
-            }
-        }
-
-    }
-}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/03-node/03-junction/03-meter/01-meter/HydroMeterViewModel.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/03-node/03-junction/03-meter/HydroMeterViewModel.cs
similarity index 100%
rename from WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/03-node/03-junction/03-meter/01-meter/HydroMeterViewModel.cs
rename to WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/03-node/03-junction/03-meter/HydroMeterViewModel.cs
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/03-node/03-junction/04-instrument/00-core/HydroFlowmeterViewModel.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/03-node/03-junction/04-instrument/00-core/HydroFlowmeterViewModel.cs
new file mode 100644
index 0000000..c1be137
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/03-node/03-junction/04-instrument/00-core/HydroFlowmeterViewModel.cs
@@ -0,0 +1,72 @@
+锘縩amespace Yw.WinFrmUI
+{
+    /// <summary>
+    /// 浠〃瑙嗗浘
+    /// </summary>
+    public class HydroInstrumentViewModel : HydroJunctionViewModel
+    {
+        /// <summary>
+        /// 
+        /// </summary>
+        public HydroInstrumentViewModel() { }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public HydroInstrumentViewModel(Yw.Model.HydroInstrumentInfo rhs, Yw.Model.HydroModelInfo hydroInfo) : base(rhs, hydroInfo)
+        {
+            this.Vmo = rhs;
+        }
+
+
+        /// <summary>
+        /// 鑷敱鍘嬪姏
+        /// </summary>
+        [Category("璁$畻缁撴灉")]
+        [DisplayName("鑷敱鍘嬪姏")]
+        [Display(Name = "鑷敱鍘嬪姏(m)")]
+        [DisplayUnit("m")]
+        [HydroCalcuPro]
+        [PropertyOrder(10001)]
+        [ShowEditor(false)]
+        [Browsable(false)]
+        public override double? CalcuPress { get; set; }
+
+        /// <summary>
+        /// 缁濆鍘嬪姏
+        /// </summary>
+        [Category("璁$畻缁撴灉")]
+        [DisplayName("缁濆鍘嬪姏")]
+        [PropertyOrder(10002)]
+        [DisplayUnit("m")]
+        [HydroCalcuPro]
+        [ShowEditor(false)]
+        [Browsable(false)]
+        public override double? CalcuHead { get; set; }
+
+        /// <summary>
+        /// 闇�姘撮噺
+        /// </summary>
+        [Category("璁$畻缁撴灉")]
+        [DisplayName("闇�姘撮噺")]
+        [PropertyOrder(10003)]
+        [DisplayUnit("m鲁/h")]
+        [HydroCalcuPro]
+        [ShowEditor(false)]
+        [Browsable(false)]
+        public override double? CalcuDemand { get; set; }
+
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [Browsable(false)]
+        public new Yw.Model.HydroInstrumentInfo Vmo { get; set; }
+
+
+
+
+
+
+    }
+}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/03-node/03-junction/04-instrument/01-flowmeter/HydroFlowmeterViewModel.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/03-node/03-junction/04-instrument/01-flowmeter/HydroFlowmeterViewModel.cs
new file mode 100644
index 0000000..93cc3e2
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/03-node/03-junction/04-instrument/01-flowmeter/HydroFlowmeterViewModel.cs
@@ -0,0 +1,58 @@
+锘縩amespace Yw.WinFrmUI
+{
+    /// <summary>
+    /// 娴侀噺璁¤鍥�
+    /// </summary>
+    public class HydroFlowmeterViewModel : HydroInstrumentViewModel, IHydroCalcuFlowmeterResult
+    {
+        /// <summary>
+        /// 
+        /// </summary>
+        public HydroFlowmeterViewModel() { }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public HydroFlowmeterViewModel(Yw.Model.HydroFlowmeterInfo rhs, Yw.Model.HydroModelInfo hydroInfo) : base(rhs, hydroInfo)
+        {
+            this.Vmo = rhs;
+        }
+
+
+        /// <summary>
+        /// 娴侀噺
+        /// </summary>
+        [Category("璁$畻缁撴灉")]
+        [DisplayName("璁$畻娴侀噺")]
+        [Display(Name = "璁$畻娴侀噺(m鲁/h)")]
+        [DisplayUnit("m鲁/h")]
+        [HydroCalcuPro]
+        [PropertyOrder(11001)]
+        [ShowEditor(false)]
+        [Browsable(true)]
+        public double? CalcuQ { get; set; }
+
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [Browsable(false)]
+        public new Yw.Model.HydroFlowmeterInfo Vmo { get; set; }
+
+
+        /// <summary>
+        /// 鏇存柊璁$畻灞炴��
+        /// </summary>
+        public override void UpdateCalcuProperty(HydroCalcuResult rhs)
+        {
+            base.UpdateCalcuProperty(rhs);
+            if (rhs is HydroCalcuFlowmeterResult calcuFlowmeterProperty)
+            {
+                this.CalcuQ = calcuFlowmeterProperty.CalcuQ.HasValue ? Math.Round(calcuFlowmeterProperty.CalcuQ.Value, 1) : null;
+            }
+        }
+
+
+
+    }
+}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/03-node/03-junction/04-instrument/02-pressmeter/HydroPressmeterViewModel.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/03-node/03-junction/04-instrument/02-pressmeter/HydroPressmeterViewModel.cs
new file mode 100644
index 0000000..42bde9e
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/03-node/03-junction/04-instrument/02-pressmeter/HydroPressmeterViewModel.cs
@@ -0,0 +1,55 @@
+锘縩amespace Yw.WinFrmUI
+{
+    /// <summary>
+    /// 鍘嬪姏琛ㄨ鍥�
+    /// </summary>
+    public class HydroPressmeterViewModel : HydroInstrumentViewModel, IHydroCalcuPressmeterResult
+    {
+        /// <summary>
+        /// 
+        /// </summary>
+        public HydroPressmeterViewModel() { }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public HydroPressmeterViewModel(Yw.Model.HydroPressmeterInfo rhs, Yw.Model.HydroModelInfo hydroInfo) : base(rhs, hydroInfo)
+        {
+            this.Vmo = rhs;
+        }
+
+
+        /// <summary>
+        /// 璁$畻鍘嬪姏
+        /// </summary>
+        [Category("璁$畻缁撴灉")]
+        [DisplayName("璁$畻鍘嬪姏")]
+        [Display(Name = "璁$畻鍘嬪姏(m)")]
+        [DisplayUnit("m")]
+        [HydroCalcuPro]
+        [PropertyOrder(11001)]
+        [ShowEditor(false)]
+        [Browsable(true)]
+        public double? CalcuPr { get; set; }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        [Browsable(false)]
+        public new Yw.Model.HydroPressmeterInfo Vmo { get; set; }
+
+
+        /// <summary>
+        /// 鏇存柊璁$畻灞炴��
+        /// </summary>
+        public override void UpdateCalcuProperty(HydroCalcuResult rhs)
+        {
+            base.UpdateCalcuProperty(rhs);
+            if (rhs is HydroCalcuPressmeterResult calcuPressmeterProperty)
+            {
+                this.CalcuPr = calcuPressmeterProperty.CalcuPr.HasValue ? Math.Round(calcuPressmeterProperty.CalcuPr.Value, 2) : null;
+            }
+        }
+
+    }
+}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/06-visual/12-flowmeter/SetHydroFlowmeterDlg.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/06-visual/12-flowmeter/SetHydroFlowmeterDlg.cs
index f2c4438..e06d185 100644
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/06-visual/12-flowmeter/SetHydroFlowmeterDlg.cs
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/06-visual/12-flowmeter/SetHydroFlowmeterDlg.cs
@@ -38,7 +38,7 @@
                 var meter = _allParterList.First();
                 this.txtElev.EditValue = meter.Elev;
                 this.txtMinorLoss.EditValue = meter.MinorLoss;
-                this.txtCurrentFlow.EditValue = meter.CurrentFlow;
+                //this.txtCurrentFlow.EditValue = meter.CurrentFlow;
             }
         }
 
@@ -71,7 +71,7 @@
             {
                 x.Elev = elev;
                 x.MinorLoss = minorLoss;
-                x.CurrentFlow = currentFlow;
+                //x.CurrentFlow = currentFlow;
             });
             this.ReloadDataEvent?.Invoke(_allParterList);
             this.DialogResult = DialogResult.OK;
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/06-visual/13-pressmeter/SetHydroPressmeterDlg.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/06-visual/13-pressmeter/SetHydroPressmeterDlg.cs
index 2fc0e75..a24e2e1 100644
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/06-visual/13-pressmeter/SetHydroPressmeterDlg.cs
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/06-visual/13-pressmeter/SetHydroPressmeterDlg.cs
@@ -38,7 +38,7 @@
                 var meter = _allParterList.First();
                 this.txtElev.EditValue = meter.Elev;
                 this.txtMinorLoss.EditValue = meter.MinorLoss;
-                this.txtCurrentPress.EditValue = meter.CurrentPress;
+                //this.txtCurrentPress.EditValue = meter.CurrentPress;
             }
         }
 
@@ -71,7 +71,7 @@
             {
                 x.Elev = elev;
                 x.MinorLoss = minorLoss;
-                x.CurrentPress = currentPress;
+                //x.CurrentPress = currentPress;
             });
             this.ReloadDataEvent?.Invoke(_allParterList);
             this.DialogResult = DialogResult.OK;
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/08-grading/03-list/SetHydroGradingModelCtrl.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/08-grading/03-list/SetHydroGradingModelCtrl.cs
index cfc25cf..2688f65 100644
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/08-grading/03-list/SetHydroGradingModelCtrl.cs
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/08-grading/03-list/SetHydroGradingModelCtrl.cs
@@ -65,27 +65,27 @@
                         ResetColumns(false);
                     }
                     break;
-                case Yw.Hydro.ParterProp.CalcuPress:
+                case HydroCalcuProp.CalcuPress:
                     {
                         ResetColumns(true);
                     }
                     break;
-                case Yw.Hydro.ParterProp.CalcuHead:
+                case HydroCalcuProp.CalcuHead:
                     {
                         ResetColumns(true);
                     }
                     break;
-                case Yw.Hydro.ParterProp.CalcuFlow:
+                case HydroCalcuProp.CalcuFlow:
                     {
                         ResetColumns(true);
                     }
                     break;
-                case Yw.Hydro.ParterProp.CalcuVelocity:
+                case HydroCalcuProp.CalcuVelocity:
                     {
                         ResetColumns(true);
                     }
                     break;
-                case Yw.Hydro.ParterProp.CalcuHeadLoss:
+                case HydroCalcuProp.CalcuHeadLoss:
                     {
                         ResetColumns(true);
                     }
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/00-core/HydroWorkingInfoViewModel.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/00-core/HydroWorkingInfoViewModel.cs
index c764b29..549e20f 100644
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/00-core/HydroWorkingInfoViewModel.cs
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/00-core/HydroWorkingInfoViewModel.cs
@@ -13,8 +13,7 @@
             this.Waterboxs = new List<HydroWaterboxWorkingInfoViewModel>();
             this.Pumps = new List<HydroPumpWorkingInfoViewModel>();
             this.Valves = new List<HydroValveWorkingInfoViewModel>();
-            this.Flowmeters = new List<HydroFlowmeterWorkingInfoViewModel>();
-            this.Pressmeters = new List<HydroPressmeterWorkingInfoViewModel>();
+            this.Monitors = new List<HydroMonitorWorkingInfoViewModel>();
         }
 
         /// <summary>
@@ -33,33 +32,27 @@
         public List<HydroValveWorkingInfoViewModel> Valves { get; set; }
 
         /// <summary>
-        /// 娴侀噺璁�
+        /// 鐩戞祴
         /// </summary>
-        public List<HydroFlowmeterWorkingInfoViewModel> Flowmeters { get; set; }
+        public List<HydroMonitorWorkingInfoViewModel> Monitors { get; set; }
 
-        /// <summary>
-        /// 鍘嬪姏琛�
-        /// </summary>
-        public List<HydroPressmeterWorkingInfoViewModel> Pressmeters { get; set; }
 
         /// <summary>
         /// 鑾峰彇鎵�鏈夌粍浠跺伐鍐典俊鎭垪琛�
         /// </summary>
-        public List<HydroParterWorkingInfoViewModel> GetAllParterWorkingInfoList()
+        public List<HydroVisualWorkingInfoViewModel> GetAllVisualWorkingInfoList()
         {
-            var list = new List<HydroParterWorkingInfoViewModel>();
+            var list = new List<HydroVisualWorkingInfoViewModel>();
             this.Waterboxs?.ForEach(x => list.Add(x));
             this.Pumps?.ForEach(x => list.Add(x));
             this.Valves?.ForEach(x => list.Add(x));
-            this.Flowmeters?.ForEach(x => list.Add(x));
-            this.Pressmeters?.ForEach(x => list.Add(x));
             return list;
         }
 
         /// <summary>
         /// 娣诲姞缁勪欢宸ュ喌淇℃伅
         /// </summary>
-        public bool AppendParterWorkingInfo(HydroParterWorkingInfoViewModel workingInfo)
+        public bool AppendVisualWorkingInfo(HydroVisualWorkingInfoViewModel workingInfo)
         {
             if (workingInfo == null)
             {
@@ -90,24 +83,6 @@
                     return false;
                 }
                 this.Valves.Add(valve);
-                return true;
-            }
-            else if (workingInfo is HydroFlowmeterWorkingInfoViewModel flowmeter)
-            {
-                if (this.Flowmeters.Exists(x => x.Code == flowmeter.Code))
-                {
-                    return false;
-                }
-                this.Flowmeters.Add(flowmeter);
-                return true;
-            }
-            else if (workingInfo is HydroPressmeterWorkingInfoViewModel pressmeter)
-            {
-                if (this.Pressmeters.Exists(x => x.Code == pressmeter.Code))
-                {
-                    return false;
-                }
-                this.Pressmeters.Add(pressmeter);
                 return true;
             }
             return false;
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/00-core/ISetHydroParterWorkingInfoCtrl.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/00-core/ISetHydroParterWorkingInfoCtrl.cs
deleted file mode 100644
index 71aebe4..0000000
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/00-core/ISetHydroParterWorkingInfoCtrl.cs
+++ /dev/null
@@ -1,30 +0,0 @@
-锘縩amespace Yw.WinFrmUI
-{
-    /// <summary>
-    /// 
-    /// </summary>
-    public interface ISetHydroParterWorkingInfoCtrl
-    {
-        /// <summary>
-        /// 鏌ョ湅缁勪欢浜嬩欢
-        /// </summary>
-        event Action<Yw.Model.HydroParterInfo> HydroViewEvent;
-
-        /// <summary>
-        /// 缁戝畾鏁版嵁
-        /// </summary>
-        void SetBindingData(Yw.Model.HydroParterInfo parter);
-
-        /// <summary>
-        /// 鏇存柊缁戝畾
-        /// </summary>
-        void UpdateBindingData(HydroParterWorkingInfoViewModel workingInfo);
-
-        /// <summary>
-        /// 鑾峰彇宸ュ喌
-        /// </summary>
-        HydroParterWorkingInfoViewModel GetWorkingInfo();
-
-
-    }
-}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/00-core/SetHydroWorkingInfoCtrl.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/00-core/SetHydroWorkingInfoCtrl.cs
index f0038f1..4c503cc 100644
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/00-core/SetHydroWorkingInfoCtrl.cs
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/00-core/SetHydroWorkingInfoCtrl.cs
@@ -17,7 +17,7 @@
         public event Action<Yw.Model.HydroParterInfo> HydroViewEvent;
 
         private Yw.Model.HydroModelInfo _hydroInfo = null;//姘村姏淇℃伅
-        private Dictionary<Yw.Model.HydroParterInfo, ISetHydroParterWorkingInfoCtrl> _parterWorkingInfoDict = null;//缁勪欢涓庣粍浠跺伐鍐垫槧灏勫瓧鍏�
+        private Dictionary<Yw.Model.HydroParterInfo, ISetHydroVisualWorkingInfoCtrl> _parterWorkingInfoDict = null;//缁勪欢涓庣粍浠跺伐鍐垫槧灏勫瓧鍏�
 
         /// <summary>
         /// 缁戝畾鏁版嵁
@@ -29,7 +29,7 @@
             {
                 return;
             }
-            _parterWorkingInfoDict = new Dictionary<Model.HydroParterInfo, ISetHydroParterWorkingInfoCtrl>();
+            _parterWorkingInfoDict = new Dictionary<Model.HydroParterInfo, ISetHydroVisualWorkingInfoCtrl>();
             //姘寸
             if (hydroInfo.Waterboxs != null && hydroInfo.Waterboxs.Count > 0)
             {
@@ -189,7 +189,7 @@
             {
                 return;
             }
-            var all = workingInfo.GetAllParterWorkingInfoList();
+            var all = workingInfo.GetAllVisualWorkingInfoList();
             if (all == null || all.Count < 1)
             {
                 return;
@@ -232,7 +232,7 @@
                     var singleWorkingInfo = parterWorkingInfoCtrl.GetWorkingInfo();
                     if (singleWorkingInfo != null)
                     {
-                        workingInfo.AppendParterWorkingInfo(singleWorkingInfo);
+                        workingInfo.AppendVisualWorkingInfo(singleWorkingInfo);
                     }
                 }
             }
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/00-core/HydroParterWorkingInfoViewModel.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/01-visual/HydroVisualWorkingInfoViewModel.cs
similarity index 64%
rename from WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/00-core/HydroParterWorkingInfoViewModel.cs
rename to WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/01-visual/HydroVisualWorkingInfoViewModel.cs
index 052fc82..5b165c8 100644
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/00-core/HydroParterWorkingInfoViewModel.cs
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/01-visual/HydroVisualWorkingInfoViewModel.cs
@@ -1,19 +1,19 @@
 锘縩amespace Yw.WinFrmUI
 {
     /// <summary>
-    /// 缁勪欢宸ュ喌淇℃伅
+    /// 鍙缁勪欢宸ュ喌淇℃伅
     /// </summary>
-    public class HydroParterWorkingInfoViewModel
+    public class HydroVisualWorkingInfoViewModel
     {
         /// <summary>
         /// 
         /// </summary>
-        public HydroParterWorkingInfoViewModel() { }
+        public HydroVisualWorkingInfoViewModel() { }
 
         /// <summary>
         /// 
         /// </summary>
-        public HydroParterWorkingInfoViewModel(Yw.Model.HydroParterInfo rhs)
+        public HydroVisualWorkingInfoViewModel(Yw.Model.HydroParterInfo rhs)
         {
             this.Code = rhs.Code;
         }
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/01-visual/ISetHydroVisualWorkingInfoCtrl.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/01-visual/ISetHydroVisualWorkingInfoCtrl.cs
new file mode 100644
index 0000000..cdbfadc
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/01-visual/ISetHydroVisualWorkingInfoCtrl.cs
@@ -0,0 +1,30 @@
+锘縩amespace Yw.WinFrmUI
+{
+    /// <summary>
+    /// 璁剧疆鍙宸ュ喌淇℃伅鎺т欢鎺ュ彛
+    /// </summary>
+    public interface ISetHydroVisualWorkingInfoCtrl
+    {
+        /// <summary>
+        /// 鏌ョ湅鍙缁勪欢浜嬩欢
+        /// </summary>
+        event Action<Yw.Model.HydroVisualInfo> HydroViewEvent;
+
+        /// <summary>
+        /// 缁戝畾鏁版嵁
+        /// </summary>
+        void SetBindingData(Yw.Model.HydroVisualInfo visual);
+
+        /// <summary>
+        /// 鏇存柊缁戝畾
+        /// </summary>
+        void UpdateBindingData(HydroVisualWorkingInfoViewModel workingInfo);
+
+        /// <summary>
+        /// 鑾峰彇宸ュ喌
+        /// </summary>
+        HydroVisualWorkingInfoViewModel GetWorkingInfo();
+
+
+    }
+}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/01-waterbox/HydroWaterboxWorkingInfoViewModel.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/02-waterbox/HydroWaterboxWorkingInfoViewModel.cs
similarity index 89%
rename from WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/01-waterbox/HydroWaterboxWorkingInfoViewModel.cs
rename to WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/02-waterbox/HydroWaterboxWorkingInfoViewModel.cs
index be0ffc0..6c9a49c 100644
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/01-waterbox/HydroWaterboxWorkingInfoViewModel.cs
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/02-waterbox/HydroWaterboxWorkingInfoViewModel.cs
@@ -3,7 +3,7 @@
     /// <summary>
     /// 
     /// </summary>
-    public class HydroWaterboxWorkingInfoViewModel : HydroParterWorkingInfoViewModel
+    public class HydroWaterboxWorkingInfoViewModel : HydroVisualWorkingInfoViewModel
     {
         /// <summary>
         /// 
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/01-waterbox/SetHydroWaterboxWorkingInfoCtrl.Designer.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/02-waterbox/SetHydroWaterboxWorkingInfoCtrl.Designer.cs
similarity index 100%
rename from WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/01-waterbox/SetHydroWaterboxWorkingInfoCtrl.Designer.cs
rename to WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/02-waterbox/SetHydroWaterboxWorkingInfoCtrl.Designer.cs
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/01-waterbox/SetHydroWaterboxWorkingInfoCtrl.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/02-waterbox/SetHydroWaterboxWorkingInfoCtrl.cs
similarity index 78%
rename from WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/01-waterbox/SetHydroWaterboxWorkingInfoCtrl.cs
rename to WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/02-waterbox/SetHydroWaterboxWorkingInfoCtrl.cs
index c1bfefe..2d6c15c 100644
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/01-waterbox/SetHydroWaterboxWorkingInfoCtrl.cs
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/02-waterbox/SetHydroWaterboxWorkingInfoCtrl.cs
@@ -1,6 +1,6 @@
 锘縩amespace Yw.WinFrmUI
 {
-    public partial class SetHydroWaterboxWorkingInfoCtrl : DevExpress.XtraEditors.XtraUserControl, ISetHydroParterWorkingInfoCtrl
+    public partial class SetHydroWaterboxWorkingInfoCtrl : DevExpress.XtraEditors.XtraUserControl, ISetHydroVisualWorkingInfoCtrl
     {
         public SetHydroWaterboxWorkingInfoCtrl()
         {
@@ -12,22 +12,22 @@
         /// <summary>
         /// 鏌ョ湅缁勪欢浜嬩欢
         /// </summary>
-        public event Action<Yw.Model.HydroParterInfo> HydroViewEvent;
+        public event Action<Yw.Model.HydroVisualInfo> HydroViewEvent;
 
-        private Yw.Model.HydroParterInfo _parter = null;//鏋勪欢
+        private Yw.Model.HydroVisualInfo _visual = null;//鏋勪欢
         private HydroWaterboxWorkingInfoViewModel _workingInfo = null;//宸ュ喌淇℃伅
 
         /// <summary>
         /// 缁戝畾鏁版嵁
         /// </summary>
-        public void SetBindingData(Yw.Model.HydroParterInfo parter)
+        public void SetBindingData(Yw.Model.HydroVisualInfo parter)
         {
             var waterbox = parter as Yw.Model.HydroWaterboxInfo;
             if (waterbox == null)
             {
                 return;
             }
-            _parter = waterbox;
+            _visual = waterbox;
             this.layoutGroupCaption.Text = HydroParterCatalogHelper.GetName(Yw.Hydro.ParterCatalog.Waterbox);
             if (!string.IsNullOrEmpty(parter.Name))
             {
@@ -40,9 +40,9 @@
         /// <summary>
         /// 鏇存柊缁戝畾
         /// </summary>
-        public void UpdateBindingData(HydroParterWorkingInfoViewModel workingInfo)
+        public void UpdateBindingData(HydroVisualWorkingInfoViewModel workingInfo)
         {
-            if (_parter == null)
+            if (_visual == null)
             {
                 return;
             }
@@ -57,7 +57,7 @@
         /// <summary>
         /// 鑾峰彇宸ュ喌
         /// </summary>
-        public HydroParterWorkingInfoViewModel GetWorkingInfo()
+        public HydroVisualWorkingInfoViewModel GetWorkingInfo()
         {
             if (_workingInfo == null)
             {
@@ -71,11 +71,11 @@
         //鏌ョ湅缁勪欢
         private void layoutGroupCaption_CustomButtonClick(object sender, DevExpress.XtraBars.Docking2010.BaseButtonEventArgs e)
         {
-            if (_parter == null)
+            if (_visual == null)
             {
                 return;
             }
-            this.HydroViewEvent?.Invoke(_parter);
+            this.HydroViewEvent?.Invoke(_visual);
         }
 
 
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/01-waterbox/SetHydroWaterboxWorkingInfoCtrl.resx b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/02-waterbox/SetHydroWaterboxWorkingInfoCtrl.resx
similarity index 100%
rename from WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/01-waterbox/SetHydroWaterboxWorkingInfoCtrl.resx
rename to WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/02-waterbox/SetHydroWaterboxWorkingInfoCtrl.resx
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/02-pump/HydroPumpWorkingInfoViewModel.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/03-pump/HydroPumpWorkingInfoViewModel.cs
similarity index 91%
rename from WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/02-pump/HydroPumpWorkingInfoViewModel.cs
rename to WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/03-pump/HydroPumpWorkingInfoViewModel.cs
index e4bc518..41afd56 100644
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/02-pump/HydroPumpWorkingInfoViewModel.cs
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/03-pump/HydroPumpWorkingInfoViewModel.cs
@@ -3,7 +3,7 @@
     /// <summary>
     /// 
     /// </summary>
-    public class HydroPumpWorkingInfoViewModel : HydroParterWorkingInfoViewModel
+    public class HydroPumpWorkingInfoViewModel : HydroVisualWorkingInfoViewModel
     {
         /// <summary>
         /// 
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/02-pump/SetHydroPumpWorkingInfoCtrl.Designer.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/03-pump/SetHydroPumpWorkingInfoCtrl.Designer.cs
similarity index 100%
rename from WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/02-pump/SetHydroPumpWorkingInfoCtrl.Designer.cs
rename to WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/03-pump/SetHydroPumpWorkingInfoCtrl.Designer.cs
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/02-pump/SetHydroPumpWorkingInfoCtrl.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/03-pump/SetHydroPumpWorkingInfoCtrl.cs
similarity index 81%
rename from WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/02-pump/SetHydroPumpWorkingInfoCtrl.cs
rename to WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/03-pump/SetHydroPumpWorkingInfoCtrl.cs
index aff0b08..eb90d5f 100644
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/02-pump/SetHydroPumpWorkingInfoCtrl.cs
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/03-pump/SetHydroPumpWorkingInfoCtrl.cs
@@ -1,6 +1,6 @@
 锘縩amespace Yw.WinFrmUI
 {
-    public partial class SetHydroPumpWorkingInfoCtrl : DevExpress.XtraEditors.XtraUserControl, ISetHydroParterWorkingInfoCtrl
+    public partial class SetHydroPumpWorkingInfoCtrl : DevExpress.XtraEditors.XtraUserControl, ISetHydroVisualWorkingInfoCtrl
     {
         public SetHydroPumpWorkingInfoCtrl()
         {
@@ -12,26 +12,26 @@
         /// <summary>
         /// 鏌ョ湅缁勪欢浜嬩欢
         /// </summary>
-        public event Action<Yw.Model.HydroParterInfo> HydroViewEvent;
+        public event Action<Yw.Model.HydroVisualInfo> HydroViewEvent;
 
-        private Yw.Model.HydroPumpInfo _parter = null;//缁勪欢
+        private Yw.Model.HydroVisualInfo _visual = null;//缁勪欢
         private HydroPumpWorkingInfoViewModel _workingInfo = null;//宸ュ喌
 
         /// <summary>
         /// 缁戝畾鏁版嵁
         /// </summary>
-        public void SetBindingData(Yw.Model.HydroParterInfo parter)
+        public void SetBindingData(Yw.Model.HydroVisualInfo visual)
         {
-            var pump = parter as Yw.Model.HydroPumpInfo;
+            var pump = visual as Yw.Model.HydroPumpInfo;
             if (pump == null)
             {
                 return;
             }
-            _parter = pump;
+            _visual = pump;
             this.layoutGroupCaption.Text = HydroParterCatalogHelper.GetName(Yw.Hydro.ParterCatalog.Pump);
-            if (!string.IsNullOrEmpty(parter.Name))
+            if (!string.IsNullOrEmpty(visual.Name))
             {
-                this.layoutGroupCaption.Text = parter.Name;
+                this.layoutGroupCaption.Text = visual.Name;
             }
             _workingInfo = new HydroPumpWorkingInfoViewModel(pump);
             UpdateBindingData(_workingInfo);
@@ -40,9 +40,9 @@
         /// <summary>
         /// 鏇存柊缁戝畾
         /// </summary>
-        public void UpdateBindingData(HydroParterWorkingInfoViewModel workingInfo)
+        public void UpdateBindingData(HydroVisualWorkingInfoViewModel workingInfo)
         {
-            if (_parter == null)
+            if (_visual == null)
             {
                 return;
             }
@@ -58,7 +58,7 @@
         /// <summary>
         /// 鑾峰彇宸ュ喌
         /// </summary>
-        public HydroParterWorkingInfoViewModel GetWorkingInfo()
+        public HydroVisualWorkingInfoViewModel GetWorkingInfo()
         {
             if (_workingInfo == null)
             {
@@ -82,11 +82,11 @@
         //鏌ョ湅閮ㄤ欢
         private void layoutGroupCaption_CustomButtonClick(object sender, DevExpress.XtraBars.Docking2010.BaseButtonEventArgs e)
         {
-            if (_parter == null)
+            if (_visual == null)
             {
                 return;
             }
-            this.HydroViewEvent?.Invoke(_parter);
+            this.HydroViewEvent?.Invoke(_visual);
         }
 
         //寮�鍏崇姸鎬佸喅瀹氳瀹氶鐜囩殑鍙敤鎬�
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/02-pump/SetHydroPumpWorkingInfoCtrl.resx b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/03-pump/SetHydroPumpWorkingInfoCtrl.resx
similarity index 100%
rename from WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/02-pump/SetHydroPumpWorkingInfoCtrl.resx
rename to WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/03-pump/SetHydroPumpWorkingInfoCtrl.resx
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/04-flowmeter/HydroFlowmeterWorkingInfoViewModel.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/04-flowmeter/HydroFlowmeterWorkingInfoViewModel.cs
deleted file mode 100644
index f9b3fd3..0000000
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/04-flowmeter/HydroFlowmeterWorkingInfoViewModel.cs
+++ /dev/null
@@ -1,27 +0,0 @@
-锘縩amespace Yw.WinFrmUI
-{
-    /// <summary>
-    /// 
-    /// </summary>
-    public class HydroFlowmeterWorkingInfoViewModel : HydroParterWorkingInfoViewModel
-    {
-        /// <summary>
-        /// 
-        /// </summary>
-        public HydroFlowmeterWorkingInfoViewModel() { }
-
-        /// <summary>
-        /// 
-        /// </summary>
-        public HydroFlowmeterWorkingInfoViewModel(Yw.Model.HydroFlowmeterInfo rhs) : base(rhs)
-        {
-            this.CurrentFlow = rhs.CurrentFlow;
-        }
-
-        /// <summary>
-        /// 褰撳墠娴侀噺
-        /// </summary>
-        public double? CurrentFlow { get; set; }
-
-    }
-}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/04-flowmeter/SetHydroFlowmeterWorkingInfoCtrl.Designer.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/04-flowmeter/SetHydroFlowmeterWorkingInfoCtrl.Designer.cs
deleted file mode 100644
index e2c4c26..0000000
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/04-flowmeter/SetHydroFlowmeterWorkingInfoCtrl.Designer.cs
+++ /dev/null
@@ -1,131 +0,0 @@
-锘縩amespace Yw.WinFrmUI
-{
-    partial class SetHydroFlowmeterWorkingInfoCtrl
-    {
-        /// <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()
-        {
-            DevExpress.XtraEditors.ButtonsPanelControl.ButtonImageOptions buttonImageOptions1 = new DevExpress.XtraEditors.ButtonsPanelControl.ButtonImageOptions();
-            ComponentResourceManager resources = new ComponentResourceManager(typeof(SetHydroFlowmeterWorkingInfoCtrl));
-            layoutControl1 = new DevExpress.XtraLayout.LayoutControl();
-            txtCurrentFlow = new DevExpress.XtraEditors.TextEdit();
-            Root = new DevExpress.XtraLayout.LayoutControlGroup();
-            layoutGroupCaption = new DevExpress.XtraLayout.LayoutControlGroup();
-            layoutControlItem2 = new DevExpress.XtraLayout.LayoutControlItem();
-            ((ISupportInitialize)layoutControl1).BeginInit();
-            layoutControl1.SuspendLayout();
-            ((ISupportInitialize)txtCurrentFlow.Properties).BeginInit();
-            ((ISupportInitialize)Root).BeginInit();
-            ((ISupportInitialize)layoutGroupCaption).BeginInit();
-            ((ISupportInitialize)layoutControlItem2).BeginInit();
-            SuspendLayout();
-            // 
-            // layoutControl1
-            // 
-            layoutControl1.Controls.Add(txtCurrentFlow);
-            layoutControl1.Dock = DockStyle.Fill;
-            layoutControl1.Location = new Point(0, 0);
-            layoutControl1.Name = "layoutControl1";
-            layoutControl1.Root = Root;
-            layoutControl1.Size = new Size(199, 74);
-            layoutControl1.TabIndex = 0;
-            layoutControl1.Text = "layoutControl1";
-            // 
-            // txtCurrentFlow
-            // 
-            txtCurrentFlow.Location = new Point(78, 38);
-            txtCurrentFlow.Name = "txtCurrentFlow";
-            txtCurrentFlow.Properties.AllowNullInput = DevExpress.Utils.DefaultBoolean.True;
-            txtCurrentFlow.Properties.DisplayFormat.FormatString = "{0}m鲁/h";
-            txtCurrentFlow.Properties.DisplayFormat.FormatType = DevExpress.Utils.FormatType.Custom;
-            txtCurrentFlow.Properties.MaskSettings.Set("MaskManagerType", typeof(DevExpress.Data.Mask.NumericMaskManager));
-            txtCurrentFlow.Properties.NullValuePrompt = "m鲁/h";
-            txtCurrentFlow.Size = new Size(107, 20);
-            txtCurrentFlow.StyleController = layoutControl1;
-            txtCurrentFlow.TabIndex = 6;
-            // 
-            // Root
-            // 
-            Root.AppearanceItemCaption.Options.UseTextOptions = true;
-            Root.AppearanceItemCaption.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Far;
-            Root.EnableIndentsWithoutBorders = DevExpress.Utils.DefaultBoolean.True;
-            Root.GroupBordersVisible = false;
-            Root.Items.AddRange(new DevExpress.XtraLayout.BaseLayoutItem[] { layoutGroupCaption });
-            Root.Name = "Root";
-            Root.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
-            Root.Size = new Size(199, 74);
-            Root.TextVisible = false;
-            // 
-            // layoutGroupCaption
-            // 
-            buttonImageOptions1.SvgImage = (DevExpress.Utils.Svg.SvgImage)resources.GetObject("buttonImageOptions1.SvgImage");
-            buttonImageOptions1.SvgImageSize = new Size(20, 20);
-            layoutGroupCaption.CustomHeaderButtons.AddRange(new DevExpress.XtraEditors.ButtonPanel.IBaseButton[] { new DevExpress.XtraEditors.ButtonsPanelControl.GroupBoxButton("鏌ョ湅", false, buttonImageOptions1, DevExpress.XtraBars.Docking2010.ButtonStyle.PushButton, "", -1, true, null, true, false, true, null, -1) });
-            layoutGroupCaption.HeaderButtonsLocation = DevExpress.Utils.GroupElementLocation.AfterText;
-            layoutGroupCaption.Items.AddRange(new DevExpress.XtraLayout.BaseLayoutItem[] { layoutControlItem2 });
-            layoutGroupCaption.Location = new Point(0, 0);
-            layoutGroupCaption.Name = "layoutGroupCaption";
-            layoutGroupCaption.Size = new Size(199, 74);
-            layoutGroupCaption.Text = "娴侀噺璁�";
-            layoutGroupCaption.CustomButtonClick += layoutGroupCaption_CustomButtonClick;
-            // 
-            // layoutControlItem2
-            // 
-            layoutControlItem2.ContentHorzAlignment = DevExpress.Utils.HorzAlignment.Center;
-            layoutControlItem2.ContentVertAlignment = DevExpress.Utils.VertAlignment.Center;
-            layoutControlItem2.Control = txtCurrentFlow;
-            layoutControlItem2.Location = new Point(0, 0);
-            layoutControlItem2.Name = "layoutControlItem2";
-            layoutControlItem2.OptionsTableLayoutItem.RowIndex = 2;
-            layoutControlItem2.Size = new Size(175, 27);
-            layoutControlItem2.Text = "褰撳墠娴侀噺:";
-            layoutControlItem2.TextSize = new Size(52, 14);
-            // 
-            // SetHydroFlowmeterWorkingInfoCtrl
-            // 
-            AutoScaleDimensions = new SizeF(7F, 14F);
-            AutoScaleMode = AutoScaleMode.Font;
-            Controls.Add(layoutControl1);
-            Name = "SetHydroFlowmeterWorkingInfoCtrl";
-            Size = new Size(199, 74);
-            ((ISupportInitialize)layoutControl1).EndInit();
-            layoutControl1.ResumeLayout(false);
-            ((ISupportInitialize)txtCurrentFlow.Properties).EndInit();
-            ((ISupportInitialize)Root).EndInit();
-            ((ISupportInitialize)layoutGroupCaption).EndInit();
-            ((ISupportInitialize)layoutControlItem2).EndInit();
-            ResumeLayout(false);
-        }
-
-        #endregion
-
-        private DevExpress.XtraLayout.LayoutControl layoutControl1;
-        private DevExpress.XtraLayout.LayoutControlGroup Root;
-        private DevExpress.XtraEditors.TextEdit txtCurrentFlow;
-        private DevExpress.XtraLayout.LayoutControlItem layoutControlItem2;
-        private DevExpress.XtraLayout.LayoutControlGroup layoutGroupCaption;
-    }
-}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/04-flowmeter/SetHydroFlowmeterWorkingInfoCtrl.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/04-flowmeter/SetHydroFlowmeterWorkingInfoCtrl.cs
deleted file mode 100644
index 6527bdb..0000000
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/04-flowmeter/SetHydroFlowmeterWorkingInfoCtrl.cs
+++ /dev/null
@@ -1,83 +0,0 @@
-锘縩amespace Yw.WinFrmUI
-{
-    public partial class SetHydroFlowmeterWorkingInfoCtrl : DevExpress.XtraEditors.XtraUserControl, ISetHydroParterWorkingInfoCtrl
-    {
-        public SetHydroFlowmeterWorkingInfoCtrl()
-        {
-            InitializeComponent();
-            this.layoutControl1.SetupLayoutControl();
-        }
-        //200,80
-
-        /// <summary>
-        /// 鏌ョ湅缁勪欢浜嬩欢
-        /// </summary>
-        public event Action<Yw.Model.HydroParterInfo> HydroViewEvent;
-
-        private Yw.Model.HydroParterInfo _parter = null;//鏋勪欢
-        private HydroFlowmeterWorkingInfoViewModel _workingInfo = null;//宸ュ喌淇℃伅
-
-        /// <summary>
-        /// 缁戝畾鏁版嵁
-        /// </summary>
-        public void SetBindingData(Yw.Model.HydroParterInfo parter)
-        {
-            var flowmeter = parter as Yw.Model.HydroFlowmeterInfo;
-            if (flowmeter == null)
-            {
-                return;
-            }
-            _parter = flowmeter;
-            this.layoutGroupCaption.Text = HydroParterCatalogHelper.GetName(Yw.Hydro.ParterCatalog.Flowmeter);
-            if (!string.IsNullOrEmpty(parter.Name))
-            {
-                this.layoutGroupCaption.Text = parter.Name;
-            }
-            _workingInfo = new HydroFlowmeterWorkingInfoViewModel(flowmeter);
-            UpdateBindingData(_workingInfo);
-        }
-
-        /// <summary>
-        /// 鏇存柊缁戝畾
-        /// </summary>
-        public void UpdateBindingData(HydroParterWorkingInfoViewModel workingInfo)
-        {
-            if (_parter == null)
-            {
-                return;
-            }
-            _workingInfo = workingInfo as HydroFlowmeterWorkingInfoViewModel;
-            if (_workingInfo == null)
-            {
-                return;
-            }
-            this.txtCurrentFlow.EditValue = _workingInfo.CurrentFlow;
-        }
-
-        /// <summary>
-        /// 鑾峰彇宸ュ喌
-        /// </summary>
-        public HydroParterWorkingInfoViewModel GetWorkingInfo()
-        {
-            if (_workingInfo == null)
-            {
-                return default;
-            }
-            _workingInfo.CurrentFlow = this.txtCurrentFlow.EditValue == null ? null : double.Parse(this.txtCurrentFlow.EditValue.ToString());
-            return _workingInfo;
-        }
-
-
-        //鏌ョ湅缁勪欢
-        private void layoutGroupCaption_CustomButtonClick(object sender, DevExpress.XtraBars.Docking2010.BaseButtonEventArgs e)
-        {
-            if (_parter == null)
-            {
-                return;
-            }
-            this.HydroViewEvent?.Invoke(_parter);
-        }
-
-
-    }
-}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/03-valve/HydroValveWorkingInfoViewModel.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/04-valve/HydroValveWorkingInfoViewModel.cs
similarity index 91%
rename from WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/03-valve/HydroValveWorkingInfoViewModel.cs
rename to WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/04-valve/HydroValveWorkingInfoViewModel.cs
index 7777196..6bc2f9a 100644
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/03-valve/HydroValveWorkingInfoViewModel.cs
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/04-valve/HydroValveWorkingInfoViewModel.cs
@@ -3,7 +3,7 @@
     /// <summary>
     /// 
     /// </summary>
-    public class HydroValveWorkingInfoViewModel : HydroParterWorkingInfoViewModel
+    public class HydroValveWorkingInfoViewModel : HydroVisualWorkingInfoViewModel
     {
         /// <summary>
         /// 
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/03-valve/SetHydroValveWorkingInfoCtrl.Designer.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/04-valve/SetHydroValveWorkingInfoCtrl.Designer.cs
similarity index 100%
rename from WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/03-valve/SetHydroValveWorkingInfoCtrl.Designer.cs
rename to WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/04-valve/SetHydroValveWorkingInfoCtrl.Designer.cs
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/03-valve/SetHydroValveWorkingInfoCtrl.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/04-valve/SetHydroValveWorkingInfoCtrl.cs
similarity index 91%
rename from WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/03-valve/SetHydroValveWorkingInfoCtrl.cs
rename to WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/04-valve/SetHydroValveWorkingInfoCtrl.cs
index 61c7c9f..dac97fa 100644
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/03-valve/SetHydroValveWorkingInfoCtrl.cs
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/04-valve/SetHydroValveWorkingInfoCtrl.cs
@@ -1,6 +1,6 @@
 锘縩amespace Yw.WinFrmUI
 {
-    public partial class SetHydroValveWorkingInfoCtrl : DevExpress.XtraEditors.XtraUserControl, ISetHydroParterWorkingInfoCtrl
+    public partial class SetHydroValveWorkingInfoCtrl : DevExpress.XtraEditors.XtraUserControl, ISetHydroVisualWorkingInfoCtrl
     {
         public SetHydroValveWorkingInfoCtrl()
         {
@@ -12,7 +12,7 @@
         /// <summary>
         /// 鏌ョ湅缁勪欢浜嬩欢
         /// </summary>
-        public event Action<Yw.Model.HydroParterInfo> HydroViewEvent;
+        public event Action<Yw.Model.HydroVisualInfo> HydroViewEvent;
 
         private Yw.Model.HydroValveInfo _parter = null;//缁勪欢
         private HydroValveWorkingInfoViewModel _workingInfo = null;//宸ュ喌
@@ -20,7 +20,7 @@
         /// <summary>
         /// 缁戝畾鏁版嵁
         /// </summary>
-        public void SetBindingData(Yw.Model.HydroParterInfo parter)
+        public void SetBindingData(Yw.Model.HydroVisualInfo parter)
         {
             var valve = parter as Yw.Model.HydroValveInfo;
             if (valve == null)
@@ -40,7 +40,7 @@
         /// <summary>
         /// 鏇存柊缁戝畾
         /// </summary>
-        public void UpdateBindingData(HydroParterWorkingInfoViewModel workingInfo)
+        public void UpdateBindingData(HydroVisualWorkingInfoViewModel workingInfo)
         {
             if (_parter == null)
             {
@@ -66,7 +66,7 @@
         /// <summary>
         /// 鑾峰彇宸ュ喌
         /// </summary>
-        public HydroParterWorkingInfoViewModel GetWorkingInfo()
+        public HydroVisualWorkingInfoViewModel GetWorkingInfo()
         {
             if (_workingInfo == null)
             {
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/03-valve/SetHydroValveWorkingInfoCtrl.resx b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/04-valve/SetHydroValveWorkingInfoCtrl.resx
similarity index 100%
rename from WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/03-valve/SetHydroValveWorkingInfoCtrl.resx
rename to WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/04-valve/SetHydroValveWorkingInfoCtrl.resx
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/05-monitor/HydroMonitorWorkingInfoViewModel.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/05-monitor/HydroMonitorWorkingInfoViewModel.cs
new file mode 100644
index 0000000..d6b84d8
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/05-monitor/HydroMonitorWorkingInfoViewModel.cs
@@ -0,0 +1,26 @@
+锘縩amespace Yw.WinFrmUI
+{
+    /// <summary>
+    /// 鐩戞祴鐐�
+    /// </summary>
+    public class HydroMonitorWorkingInfoViewModel
+    {
+        /// <summary>
+        /// 鍏宠仈鏋勪欢
+        /// Code
+        /// </summary>
+        public string Relation { get; set; }
+
+        /// <summary>
+        /// 灞炴�у悕绉�
+        /// </summary>
+        public string PropName { get; set; }
+
+        /// <summary>
+        /// 灞炴�у��
+        /// </summary>
+        public double PropValue { get; set; }
+
+    }
+
+}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/05-pressmeter/HydroPressmeterWorkingInfoViewModel.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/05-pressmeter/HydroPressmeterWorkingInfoViewModel.cs
deleted file mode 100644
index f63c181..0000000
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/05-pressmeter/HydroPressmeterWorkingInfoViewModel.cs
+++ /dev/null
@@ -1,27 +0,0 @@
-锘縩amespace Yw.WinFrmUI
-{
-    /// <summary>
-    /// 
-    /// </summary>
-    public class HydroPressmeterWorkingInfoViewModel : HydroParterWorkingInfoViewModel
-    {
-        /// <summary>
-        /// 
-        /// </summary>
-        public HydroPressmeterWorkingInfoViewModel() { }
-
-        /// <summary>
-        /// 
-        /// </summary>
-        public HydroPressmeterWorkingInfoViewModel(Yw.Model.HydroPressmeterInfo rhs) : base(rhs)
-        {
-            this.CurrentPress = rhs.CurrentPress;
-        }
-
-        /// <summary>
-        /// 褰撳墠鍘嬪姏
-        /// </summary>
-        public double? CurrentPress { get; set; }
-
-    }
-}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/05-pressmeter/SetHydroPressmeterWorkingInfoCtrl.Designer.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/05-pressmeter/SetHydroPressmeterWorkingInfoCtrl.Designer.cs
deleted file mode 100644
index b1575e7..0000000
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/05-pressmeter/SetHydroPressmeterWorkingInfoCtrl.Designer.cs
+++ /dev/null
@@ -1,131 +0,0 @@
-锘縩amespace Yw.WinFrmUI
-{
-    partial class SetHydroPressmeterWorkingInfoCtrl
-    {
-        /// <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()
-        {
-            DevExpress.XtraEditors.ButtonsPanelControl.ButtonImageOptions buttonImageOptions1 = new DevExpress.XtraEditors.ButtonsPanelControl.ButtonImageOptions();
-            ComponentResourceManager resources = new ComponentResourceManager(typeof(SetHydroPressmeterWorkingInfoCtrl));
-            layoutControl1 = new DevExpress.XtraLayout.LayoutControl();
-            txtCurrentPress = new DevExpress.XtraEditors.TextEdit();
-            Root = new DevExpress.XtraLayout.LayoutControlGroup();
-            layoutGroupCaption = new DevExpress.XtraLayout.LayoutControlGroup();
-            layoutControlItem2 = new DevExpress.XtraLayout.LayoutControlItem();
-            ((ISupportInitialize)layoutControl1).BeginInit();
-            layoutControl1.SuspendLayout();
-            ((ISupportInitialize)txtCurrentPress.Properties).BeginInit();
-            ((ISupportInitialize)Root).BeginInit();
-            ((ISupportInitialize)layoutGroupCaption).BeginInit();
-            ((ISupportInitialize)layoutControlItem2).BeginInit();
-            SuspendLayout();
-            // 
-            // layoutControl1
-            // 
-            layoutControl1.Controls.Add(txtCurrentPress);
-            layoutControl1.Dock = DockStyle.Fill;
-            layoutControl1.Location = new Point(0, 0);
-            layoutControl1.Name = "layoutControl1";
-            layoutControl1.Root = Root;
-            layoutControl1.Size = new Size(199, 74);
-            layoutControl1.TabIndex = 0;
-            layoutControl1.Text = "layoutControl1";
-            // 
-            // txtCurrentPress
-            // 
-            txtCurrentPress.Location = new Point(78, 38);
-            txtCurrentPress.Name = "txtCurrentPress";
-            txtCurrentPress.Properties.AllowNullInput = DevExpress.Utils.DefaultBoolean.True;
-            txtCurrentPress.Properties.DisplayFormat.FormatString = "{0}m";
-            txtCurrentPress.Properties.DisplayFormat.FormatType = DevExpress.Utils.FormatType.Custom;
-            txtCurrentPress.Properties.MaskSettings.Set("MaskManagerType", typeof(DevExpress.Data.Mask.NumericMaskManager));
-            txtCurrentPress.Properties.NullValuePrompt = "m";
-            txtCurrentPress.Size = new Size(107, 20);
-            txtCurrentPress.StyleController = layoutControl1;
-            txtCurrentPress.TabIndex = 6;
-            // 
-            // Root
-            // 
-            Root.AppearanceItemCaption.Options.UseTextOptions = true;
-            Root.AppearanceItemCaption.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Far;
-            Root.EnableIndentsWithoutBorders = DevExpress.Utils.DefaultBoolean.True;
-            Root.GroupBordersVisible = false;
-            Root.Items.AddRange(new DevExpress.XtraLayout.BaseLayoutItem[] { layoutGroupCaption });
-            Root.Name = "Root";
-            Root.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
-            Root.Size = new Size(199, 74);
-            Root.TextVisible = false;
-            // 
-            // layoutGroupCaption
-            // 
-            buttonImageOptions1.SvgImage = (DevExpress.Utils.Svg.SvgImage)resources.GetObject("buttonImageOptions1.SvgImage");
-            buttonImageOptions1.SvgImageSize = new Size(20, 20);
-            layoutGroupCaption.CustomHeaderButtons.AddRange(new DevExpress.XtraEditors.ButtonPanel.IBaseButton[] { new DevExpress.XtraEditors.ButtonsPanelControl.GroupBoxButton("鏌ョ湅", false, buttonImageOptions1, DevExpress.XtraBars.Docking2010.ButtonStyle.PushButton, "", -1, true, null, true, false, true, null, -1) });
-            layoutGroupCaption.HeaderButtonsLocation = DevExpress.Utils.GroupElementLocation.AfterText;
-            layoutGroupCaption.Items.AddRange(new DevExpress.XtraLayout.BaseLayoutItem[] { layoutControlItem2 });
-            layoutGroupCaption.Location = new Point(0, 0);
-            layoutGroupCaption.Name = "layoutGroupCaption";
-            layoutGroupCaption.Size = new Size(199, 74);
-            layoutGroupCaption.Text = "鍘嬪姏琛�";
-            layoutGroupCaption.CustomButtonClick += layoutGroupCaption_CustomButtonClick;
-            // 
-            // layoutControlItem2
-            // 
-            layoutControlItem2.ContentHorzAlignment = DevExpress.Utils.HorzAlignment.Center;
-            layoutControlItem2.ContentVertAlignment = DevExpress.Utils.VertAlignment.Center;
-            layoutControlItem2.Control = txtCurrentPress;
-            layoutControlItem2.Location = new Point(0, 0);
-            layoutControlItem2.Name = "layoutControlItem2";
-            layoutControlItem2.OptionsTableLayoutItem.RowIndex = 2;
-            layoutControlItem2.Size = new Size(175, 27);
-            layoutControlItem2.Text = "褰撳墠鍘嬪姏:";
-            layoutControlItem2.TextSize = new Size(52, 14);
-            // 
-            // SetHydroPressmeterWorkingInfoCtrl
-            // 
-            AutoScaleDimensions = new SizeF(7F, 14F);
-            AutoScaleMode = AutoScaleMode.Font;
-            Controls.Add(layoutControl1);
-            Name = "SetHydroPressmeterWorkingInfoCtrl";
-            Size = new Size(199, 74);
-            ((ISupportInitialize)layoutControl1).EndInit();
-            layoutControl1.ResumeLayout(false);
-            ((ISupportInitialize)txtCurrentPress.Properties).EndInit();
-            ((ISupportInitialize)Root).EndInit();
-            ((ISupportInitialize)layoutGroupCaption).EndInit();
-            ((ISupportInitialize)layoutControlItem2).EndInit();
-            ResumeLayout(false);
-        }
-
-        #endregion
-
-        private DevExpress.XtraLayout.LayoutControl layoutControl1;
-        private DevExpress.XtraLayout.LayoutControlGroup Root;
-        private DevExpress.XtraEditors.TextEdit txtCurrentPress;
-        private DevExpress.XtraLayout.LayoutControlItem layoutControlItem2;
-        private DevExpress.XtraLayout.LayoutControlGroup layoutGroupCaption;
-    }
-}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/05-pressmeter/SetHydroPressmeterWorkingInfoCtrl.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/05-pressmeter/SetHydroPressmeterWorkingInfoCtrl.cs
deleted file mode 100644
index e5f28fb..0000000
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/05-pressmeter/SetHydroPressmeterWorkingInfoCtrl.cs
+++ /dev/null
@@ -1,83 +0,0 @@
-锘縩amespace Yw.WinFrmUI
-{
-    public partial class SetHydroPressmeterWorkingInfoCtrl : DevExpress.XtraEditors.XtraUserControl, ISetHydroParterWorkingInfoCtrl
-    {
-        public SetHydroPressmeterWorkingInfoCtrl()
-        {
-            InitializeComponent();
-            this.layoutControl1.SetupLayoutControl();
-        }
-        //200,80
-
-        /// <summary>
-        /// 鏌ョ湅缁勪欢浜嬩欢
-        /// </summary>
-        public event Action<Yw.Model.HydroParterInfo> HydroViewEvent;
-
-        private Yw.Model.HydroParterInfo _parter = null;//鏋勪欢
-        private HydroPressmeterWorkingInfoViewModel _workingInfo = null;//宸ュ喌淇℃伅
-
-        /// <summary>
-        /// 缁戝畾鏁版嵁
-        /// </summary>
-        public void SetBindingData(Yw.Model.HydroParterInfo parter)
-        {
-            var pressmeter = parter as Yw.Model.HydroPressmeterInfo;
-            if (pressmeter == null)
-            {
-                return;
-            }
-            _parter = pressmeter;
-            this.layoutGroupCaption.Text = HydroParterCatalogHelper.GetName(Yw.Hydro.ParterCatalog.Pressmeter);
-            if (!string.IsNullOrEmpty(parter.Name))
-            {
-                this.layoutGroupCaption.Text = parter.Name;
-            }
-            _workingInfo = new HydroPressmeterWorkingInfoViewModel(pressmeter);
-            UpdateBindingData(_workingInfo);
-        }
-
-        /// <summary>
-        /// 鏇存柊缁戝畾
-        /// </summary>
-        public void UpdateBindingData(HydroParterWorkingInfoViewModel workingInfo)
-        {
-            if (_parter == null)
-            {
-                return;
-            }
-            _workingInfo = workingInfo as HydroPressmeterWorkingInfoViewModel;
-            if (_workingInfo == null)
-            {
-                return;
-            }
-            this.txtCurrentPress.EditValue = _workingInfo.CurrentPress;
-        }
-
-        /// <summary>
-        /// 鑾峰彇宸ュ喌
-        /// </summary>
-        public HydroParterWorkingInfoViewModel GetWorkingInfo()
-        {
-            if (_workingInfo == null)
-            {
-                return default;
-            }
-            _workingInfo.CurrentPress = this.txtCurrentPress.EditValue == null ? null : double.Parse(this.txtCurrentPress.EditValue.ToString());
-            return _workingInfo;
-        }
-
-
-        //鏌ョ湅缁勪欢
-        private void layoutGroupCaption_CustomButtonClick(object sender, DevExpress.XtraBars.Docking2010.BaseButtonEventArgs e)
-        {
-            if (_parter == null)
-            {
-                return;
-            }
-            this.HydroViewEvent?.Invoke(_parter);
-        }
-
-
-    }
-}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/05-pressmeter/SetHydroPressmeterWorkingInfoCtrl.resx b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/05-pressmeter/SetHydroPressmeterWorkingInfoCtrl.resx
deleted file mode 100644
index 5062616..0000000
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/05-pressmeter/SetHydroPressmeterWorkingInfoCtrl.resx
+++ /dev/null
@@ -1,139 +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>
-  <assembly alias="DevExpress.Data.v23.2" name="DevExpress.Data.v23.2, Culture=neutral, PublicKeyToken=b88d1754d700e49a" />
-  <data name="buttonImageOptions1.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
-    <value>
-        AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIzLjIsIFZlcnNpb249MjMuMi40
-        LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
-        dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAAGQCAAAC77u/
-        PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi
-        IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv
-        MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh
-        Y2U9InByZXNlcnZlIiBpZD0iTGF5ZXJfMSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAg
-        MzIgMzIiPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLkJsYWNre2ZpbGw6IzcyNzI3Mjt9Cgku
-        UmVke2ZpbGw6I0QxMUMxQzt9CgkuWWVsbG93e2ZpbGw6I0ZGQjExNTt9CgkuR3JlZW57ZmlsbDojMDM5
-        QzIzO30KPC9zdHlsZT4NCiAgPGcgaWQ9IlZpc2liaWxpdHkiPg0KICAgIDxjaXJjbGUgY3g9IjE2IiBj
-        eT0iMTYiIHI9IjQiIGNsYXNzPSJCbGFjayIgLz4NCiAgICA8cGF0aCBkPSJNMTYsOEM4LDgsMiwxNiwy
-        LDE2czYsOCwxNCw4czE0LTgsMTQtOFMyNCw4LDE2LDh6IE0xNiwyMmMtMy4zLDAtNi0yLjctNi02czIu
-        Ny02LDYtNnM2LDIuNyw2LDYgICBTMTkuMywyMiwxNiwyMnoiIGNsYXNzPSJCbGFjayIgLz4NCiAgPC9n
-        Pg0KPC9zdmc+Cw==
-</value>
-  </data>
-</root>
\ No newline at end of file
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/12-monitor/01-set/SetHydroVisualMonitorCtrl.Designer.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/12-monitor/01-set/SetHydroVisualMonitorCtrl.Designer.cs
new file mode 100644
index 0000000..618c91a
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/12-monitor/01-set/SetHydroVisualMonitorCtrl.Designer.cs
@@ -0,0 +1,125 @@
+锘縩amespace Yw.WinFrmUI
+{
+    partial class SetHydroVisualMonitorCtrl
+    {
+        /// <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();
+            gridControl1 = new DevExpress.XtraGrid.GridControl();
+            gridView1 = new DevExpress.XtraGrid.Views.Grid.GridView();
+            setHydroVisualMonitorViewModelBindingSource = new BindingSource(components);
+            colChecked = new DevExpress.XtraGrid.Columns.GridColumn();
+            colRelation = new DevExpress.XtraGrid.Columns.GridColumn();
+            colPropName = new DevExpress.XtraGrid.Columns.GridColumn();
+            colDescription = new DevExpress.XtraGrid.Columns.GridColumn();
+            ((ISupportInitialize)gridControl1).BeginInit();
+            ((ISupportInitialize)gridView1).BeginInit();
+            ((ISupportInitialize)setHydroVisualMonitorViewModelBindingSource).BeginInit();
+            SuspendLayout();
+            // 
+            // gridControl1
+            // 
+            gridControl1.DataSource = setHydroVisualMonitorViewModelBindingSource;
+            gridControl1.Dock = DockStyle.Fill;
+            gridControl1.Location = new Point(0, 0);
+            gridControl1.MainView = gridView1;
+            gridControl1.Name = "gridControl1";
+            gridControl1.Size = new Size(683, 307);
+            gridControl1.TabIndex = 0;
+            gridControl1.ViewCollection.AddRange(new DevExpress.XtraGrid.Views.Base.BaseView[] { gridView1 });
+            // 
+            // gridView1
+            // 
+            gridView1.Columns.AddRange(new DevExpress.XtraGrid.Columns.GridColumn[] { colChecked, colRelation, colPropName, colDescription });
+            gridView1.GridControl = gridControl1;
+            gridView1.Name = "gridView1";
+            // 
+            // setHydroVisualMonitorViewModelBindingSource
+            // 
+            setHydroVisualMonitorViewModelBindingSource.DataSource = typeof(SetHydroVisualMonitorViewModel);
+            // 
+            // colChecked
+            // 
+            colChecked.FieldName = "Checked";
+            colChecked.MaxWidth = 60;
+            colChecked.MinWidth = 60;
+            colChecked.Name = "colChecked";
+            colChecked.Visible = true;
+            colChecked.VisibleIndex = 0;
+            colChecked.Width = 60;
+            // 
+            // colRelation
+            // 
+            colRelation.FieldName = "Relation";
+            colRelation.MaxWidth = 150;
+            colRelation.MinWidth = 100;
+            colRelation.Name = "colRelation";
+            colRelation.Visible = true;
+            colRelation.VisibleIndex = 1;
+            colRelation.Width = 100;
+            // 
+            // colPropName
+            // 
+            colPropName.FieldName = "PropName";
+            colPropName.MaxWidth = 100;
+            colPropName.MinWidth = 100;
+            colPropName.Name = "colPropName";
+            colPropName.Visible = true;
+            colPropName.VisibleIndex = 2;
+            colPropName.Width = 100;
+            // 
+            // colDescription
+            // 
+            colDescription.FieldName = "Description";
+            colDescription.Name = "colDescription";
+            colDescription.Visible = true;
+            colDescription.VisibleIndex = 3;
+            // 
+            // SetHydroVisualMonitorCtrl
+            // 
+            AutoScaleDimensions = new SizeF(7F, 14F);
+            AutoScaleMode = AutoScaleMode.Font;
+            Controls.Add(gridControl1);
+            Name = "SetHydroVisualMonitorCtrl";
+            Size = new Size(683, 307);
+            ((ISupportInitialize)gridControl1).EndInit();
+            ((ISupportInitialize)gridView1).EndInit();
+            ((ISupportInitialize)setHydroVisualMonitorViewModelBindingSource).EndInit();
+            ResumeLayout(false);
+        }
+
+        #endregion
+
+        private DevExpress.XtraGrid.GridControl gridControl1;
+        private DevExpress.XtraGrid.Views.Grid.GridView gridView1;
+        private BindingSource setHydroVisualMonitorViewModelBindingSource;
+        private DevExpress.XtraGrid.Columns.GridColumn colChecked;
+        private DevExpress.XtraGrid.Columns.GridColumn colRelation;
+        private DevExpress.XtraGrid.Columns.GridColumn colPropName;
+        private DevExpress.XtraGrid.Columns.GridColumn colDescription;
+    }
+}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/12-monitor/01-set/SetHydroVisualMonitorCtrl.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/12-monitor/01-set/SetHydroVisualMonitorCtrl.cs
new file mode 100644
index 0000000..d96479b
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/12-monitor/01-set/SetHydroVisualMonitorCtrl.cs
@@ -0,0 +1,71 @@
+锘縩amespace Yw.WinFrmUI
+{
+    public partial class SetHydroVisualMonitorCtrl : DevExpress.XtraEditors.XtraUserControl
+    {
+        public SetHydroVisualMonitorCtrl()
+        {
+            InitializeComponent();
+            this.gridView1.SetNormalEditView(30);
+            this.colRelation.OptionsColumn.AllowEdit = false;
+            this.colPropName.OptionsColumn.AllowEdit = false;
+        }
+
+        private Yw.Model.HydroModelInfo _hydroInfo = null;//姘村姏淇℃伅
+        private Yw.Model.HydroVisualInfo _visualInfo = null;//鏋勪欢淇℃伅
+        private BindingList<SetHydroVisualMonitorViewModel> _allBindingList = null;//鎵�鏈夌粦瀹氬垪琛�
+
+        /// <summary>
+        /// 缁戝畾鏁版嵁
+        /// </summary>
+        public void SetBindingData(Yw.Model.HydroModelInfo hydroInfo, Yw.Model.HydroVisualInfo visualInfo, List<HydroMonitorVmo> allMonitorList)
+        {
+            _hydroInfo = hydroInfo;
+            _visualInfo = visualInfo;
+            _allBindingList = new BindingList<SetHydroVisualMonitorViewModel>();
+            if (hydroInfo != null)
+            {
+                if (visualInfo != null)
+                {
+                    var propList = HydroCalcuPropHelper.GetNameDict(visualInfo.Catalog);
+                    if (propList != null && propList.Count > 0)
+                    {
+                        foreach (var prop in propList)
+                        {
+                            var maxSortCode = allMonitorList == null || allMonitorList.Count < 1 ? 0 : allMonitorList.Max(x => x.SortCode);
+                            var vmo = allMonitorList?.Find(x => x.ModelID == hydroInfo.ID && x.Relation == visualInfo.Code);
+                            if (vmo == null)
+                            {
+                                maxSortCode++;
+                                vmo = new HydroMonitorVmo()
+                                {
+                                    ID = 0,
+                                    ModelID = hydroInfo.ID,
+                                    Relation = visualInfo.Code,
+                                    PropName = prop.Key,
+                                    SortCode = maxSortCode,
+                                    Description = string.Empty
+                                };
+                            }
+                            var vm = new SetHydroVisualMonitorViewModel(vmo, visualInfo);
+                            _allBindingList.Add(vm);
+                        }
+                    }
+                }
+            }
+            this.setHydroVisualMonitorViewModelBindingSource.DataSource = _allBindingList;
+            this.setHydroVisualMonitorViewModelBindingSource.ResetBindings(false);
+        }
+
+        /// <summary>
+        /// 鑾峰彇鐩戞祴鍒楄〃
+        /// </summary>
+        public List<HydroMonitorVmo> GetMonitorList()
+        {
+            var list = _allBindingList?.Where(x => x.Checked).ToList();
+            list?.ForEach(x => x.Vmo.Description = x.Description);
+            return list?.Select(x => x.Vmo).ToList();
+        }
+
+
+    }
+}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/04-flowmeter/SetHydroFlowmeterWorkingInfoCtrl.resx b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/12-monitor/01-set/SetHydroVisualMonitorCtrl.resx
similarity index 78%
rename from WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/04-flowmeter/SetHydroFlowmeterWorkingInfoCtrl.resx
rename to WinFrmUI/Yw.WinFrmUI.Hydro.Core/12-monitor/01-set/SetHydroVisualMonitorCtrl.resx
index 5062616..47762b3 100644
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/04-flowmeter/SetHydroFlowmeterWorkingInfoCtrl.resx
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/12-monitor/01-set/SetHydroVisualMonitorCtrl.resx
@@ -117,23 +117,7 @@
   <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="buttonImageOptions1.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
-    <value>
-        AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIzLjIsIFZlcnNpb249MjMuMi40
-        LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
-        dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAAGQCAAAC77u/
-        PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi
-        IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv
-        MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh
-        Y2U9InByZXNlcnZlIiBpZD0iTGF5ZXJfMSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAg
-        MzIgMzIiPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLkJsYWNre2ZpbGw6IzcyNzI3Mjt9Cgku
-        UmVke2ZpbGw6I0QxMUMxQzt9CgkuWWVsbG93e2ZpbGw6I0ZGQjExNTt9CgkuR3JlZW57ZmlsbDojMDM5
-        QzIzO30KPC9zdHlsZT4NCiAgPGcgaWQ9IlZpc2liaWxpdHkiPg0KICAgIDxjaXJjbGUgY3g9IjE2IiBj
-        eT0iMTYiIHI9IjQiIGNsYXNzPSJCbGFjayIgLz4NCiAgICA8cGF0aCBkPSJNMTYsOEM4LDgsMiwxNiwy
-        LDE2czYsOCwxNCw4czE0LTgsMTQtOFMyNCw4LDE2LDh6IE0xNiwyMmMtMy4zLDAtNi0yLjctNi02czIu
-        Ny02LDYtNnM2LDIuNyw2LDYgICBTMTkuMywyMiwxNiwyMnoiIGNsYXNzPSJCbGFjayIgLz4NCiAgPC9n
-        Pg0KPC9zdmc+Cw==
-</value>
-  </data>
+  <metadata name="setHydroVisualMonitorViewModelBindingSource.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/12-monitor/01-set/SetHydroVisualMonitorDlg.Designer.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/12-monitor/01-set/SetHydroVisualMonitorDlg.Designer.cs
new file mode 100644
index 0000000..6f2a68f
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/12-monitor/01-set/SetHydroVisualMonitorDlg.Designer.cs
@@ -0,0 +1,165 @@
+锘縩amespace Yw.WinFrmUI
+{
+    partial class SetHydroVisualMonitorDlg
+    {
+        /// <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();
+            Root = new DevExpress.XtraLayout.LayoutControlGroup();
+            setHydroVisualMonitorCtrl1 = new SetHydroVisualMonitorCtrl();
+            layoutControlItem1 = new DevExpress.XtraLayout.LayoutControlItem();
+            generalOkAndCancelCtrl1 = new GeneralOkAndCancelCtrl();
+            layoutControlItem2 = new DevExpress.XtraLayout.LayoutControlItem();
+            ((ISupportInitialize)ribbon).BeginInit();
+            ((ISupportInitialize)layoutControl1).BeginInit();
+            layoutControl1.SuspendLayout();
+            ((ISupportInitialize)Root).BeginInit();
+            ((ISupportInitialize)layoutControlItem1).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(591, 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(generalOkAndCancelCtrl1);
+            layoutControl1.Controls.Add(setHydroVisualMonitorCtrl1);
+            layoutControl1.Dock = DockStyle.Fill;
+            layoutControl1.Location = new Point(0, 32);
+            layoutControl1.Name = "layoutControl1";
+            layoutControl1.OptionsCustomizationForm.DesignTimeCustomizationFormPositionAndSize = new Rectangle(976, 355, 650, 400);
+            layoutControl1.Root = Root;
+            layoutControl1.Size = new Size(591, 214);
+            layoutControl1.TabIndex = 2;
+            layoutControl1.Text = "layoutControl1";
+            // 
+            // Root
+            // 
+            Root.EnableIndentsWithoutBorders = DevExpress.Utils.DefaultBoolean.True;
+            Root.GroupBordersVisible = false;
+            Root.Items.AddRange(new DevExpress.XtraLayout.BaseLayoutItem[] { layoutControlItem1, layoutControlItem2 });
+            Root.Name = "Root";
+            Root.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
+            Root.Size = new Size(591, 214);
+            Root.TextVisible = false;
+            // 
+            // setHydroVisualMonitorCtrl1
+            // 
+            setHydroVisualMonitorCtrl1.Location = new Point(2, 2);
+            setHydroVisualMonitorCtrl1.Name = "setHydroVisualMonitorCtrl1";
+            setHydroVisualMonitorCtrl1.Size = new Size(587, 169);
+            setHydroVisualMonitorCtrl1.TabIndex = 7;
+            // 
+            // layoutControlItem1
+            // 
+            layoutControlItem1.Control = setHydroVisualMonitorCtrl1;
+            layoutControlItem1.Location = new Point(0, 0);
+            layoutControlItem1.Name = "layoutControlItem1";
+            layoutControlItem1.Size = new Size(591, 173);
+            layoutControlItem1.TextSize = new Size(0, 0);
+            layoutControlItem1.TextVisible = false;
+            // 
+            // generalOkAndCancelCtrl1
+            // 
+            generalOkAndCancelCtrl1.ButtonCancelMaxSize = new Size(100, 26);
+            generalOkAndCancelCtrl1.ButtonCancelMinSize = new Size(100, 26);
+            generalOkAndCancelCtrl1.ButtonOkMaxSize = new Size(100, 26);
+            generalOkAndCancelCtrl1.ButtonOkMinSize = new Size(100, 26);
+            generalOkAndCancelCtrl1.Location = new Point(2, 175);
+            generalOkAndCancelCtrl1.Name = "generalOkAndCancelCtrl1";
+            generalOkAndCancelCtrl1.Size = new Size(587, 37);
+            generalOkAndCancelCtrl1.TabIndex = 8;
+            // 
+            // layoutControlItem2
+            // 
+            layoutControlItem2.Control = generalOkAndCancelCtrl1;
+            layoutControlItem2.Location = new Point(0, 173);
+            layoutControlItem2.Name = "layoutControlItem2";
+            layoutControlItem2.Size = new Size(591, 41);
+            layoutControlItem2.TextSize = new Size(0, 0);
+            layoutControlItem2.TextVisible = false;
+            // 
+            // SetHydroVisualMonitorDlg
+            // 
+            AutoScaleDimensions = new SizeF(7F, 14F);
+            AutoScaleMode = AutoScaleMode.Font;
+            ClientSize = new Size(591, 246);
+            Controls.Add(layoutControl1);
+            Controls.Add(ribbon);
+            FormBorderStyle = FormBorderStyle.SizableToolWindow;
+            Name = "SetHydroVisualMonitorDlg";
+            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)layoutControlItem1).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 DevExpress.XtraLayout.LayoutControlGroup Root;
+        private SetHydroVisualMonitorCtrl setHydroVisualMonitorCtrl1;
+        private DevExpress.XtraLayout.LayoutControlItem layoutControlItem1;
+        private GeneralOkAndCancelCtrl generalOkAndCancelCtrl1;
+        private DevExpress.XtraLayout.LayoutControlItem layoutControlItem2;
+    }
+}
\ No newline at end of file
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/12-monitor/01-set/SetHydroVisualMonitorDlg.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/12-monitor/01-set/SetHydroVisualMonitorDlg.cs
new file mode 100644
index 0000000..9c31daa
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/12-monitor/01-set/SetHydroVisualMonitorDlg.cs
@@ -0,0 +1,50 @@
+锘縩amespace Yw.WinFrmUI
+{
+    public partial class SetHydroVisualMonitorDlg : DevExpress.XtraBars.Ribbon.RibbonForm
+    {
+        public SetHydroVisualMonitorDlg()
+        {
+            InitializeComponent();
+            this.IconOptions.Icon = Yw.WinFrmUI.GlobalParas.AppIcon;
+            this.layoutControl1.SetupLayoutControl();
+            this.generalOkAndCancelCtrl1.OkEvent += GeneralOkAndCancelCtrl1_OkEvent;
+        }
+
+        /// <summary>
+        /// 閲嶈浇鏁版嵁浜嬩欢
+        /// </summary>
+        public event Action<Yw.Model.HydroModelInfo, Yw.Model.HydroVisualInfo, List<HydroMonitorVmo>> ReloadDataEvent;
+
+        private Yw.Model.HydroModelInfo _hydroInfo = null;//姘村姏淇℃伅
+        private Yw.Model.HydroVisualInfo _visualInfo = null;//鏋勪欢淇℃伅
+
+        /// <summary>
+        /// 缁戝畾鏁版嵁
+        /// </summary>
+        public void SetBindingData(Yw.Model.HydroModelInfo hydroInfo, Yw.Model.HydroVisualInfo visualInfo, List<HydroMonitorVmo> allMonitorList)
+        {
+            _hydroInfo = hydroInfo;
+            _visualInfo = visualInfo;
+            this.setHydroVisualMonitorCtrl1.SetBindingData(hydroInfo, visualInfo, allMonitorList);
+        }
+
+        //纭畾
+        private void GeneralOkAndCancelCtrl1_OkEvent()
+        {
+            if (_hydroInfo == null)
+            {
+                return;
+            }
+            if (_visualInfo == null)
+            {
+                return;
+            }
+            var monitorList = this.setHydroVisualMonitorCtrl1.GetMonitorList();
+            this.ReloadDataEvent?.Invoke(_hydroInfo, _visualInfo, monitorList);
+            this.DialogResult = DialogResult.OK;
+            this.Close();
+        }
+
+
+    }
+}
\ No newline at end of file
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/04-flowmeter/SetHydroFlowmeterWorkingInfoCtrl.resx b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/12-monitor/01-set/SetHydroVisualMonitorDlg.resx
similarity index 78%
copy from WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/04-flowmeter/SetHydroFlowmeterWorkingInfoCtrl.resx
copy to WinFrmUI/Yw.WinFrmUI.Hydro.Core/12-monitor/01-set/SetHydroVisualMonitorDlg.resx
index 5062616..af32865 100644
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/04-flowmeter/SetHydroFlowmeterWorkingInfoCtrl.resx
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/12-monitor/01-set/SetHydroVisualMonitorDlg.resx
@@ -117,23 +117,4 @@
   <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="buttonImageOptions1.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
-    <value>
-        AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIzLjIsIFZlcnNpb249MjMuMi40
-        LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
-        dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAAGQCAAAC77u/
-        PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi
-        IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv
-        MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh
-        Y2U9InByZXNlcnZlIiBpZD0iTGF5ZXJfMSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAg
-        MzIgMzIiPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLkJsYWNre2ZpbGw6IzcyNzI3Mjt9Cgku
-        UmVke2ZpbGw6I0QxMUMxQzt9CgkuWWVsbG93e2ZpbGw6I0ZGQjExNTt9CgkuR3JlZW57ZmlsbDojMDM5
-        QzIzO30KPC9zdHlsZT4NCiAgPGcgaWQ9IlZpc2liaWxpdHkiPg0KICAgIDxjaXJjbGUgY3g9IjE2IiBj
-        eT0iMTYiIHI9IjQiIGNsYXNzPSJCbGFjayIgLz4NCiAgICA8cGF0aCBkPSJNMTYsOEM4LDgsMiwxNiwy
-        LDE2czYsOCwxNCw4czE0LTgsMTQtOFMyNCw4LDE2LDh6IE0xNiwyMmMtMy4zLDAtNi0yLjctNi02czIu
-        Ny02LDYtNnM2LDIuNyw2LDYgICBTMTkuMywyMiwxNiwyMnoiIGNsYXNzPSJCbGFjayIgLz4NCiAgPC9n
-        Pg0KPC9zdmc+Cw==
-</value>
-  </data>
 </root>
\ No newline at end of file
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/12-monitor/01-set/SetHydroVisualMonitorViewModel.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/12-monitor/01-set/SetHydroVisualMonitorViewModel.cs
new file mode 100644
index 0000000..2ce2599
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/12-monitor/01-set/SetHydroVisualMonitorViewModel.cs
@@ -0,0 +1,56 @@
+锘縩amespace Yw.WinFrmUI
+{
+    /// <summary>
+    /// 
+    /// </summary>
+    public class SetHydroVisualMonitorViewModel
+    {
+        /// <summary>
+        /// 
+        /// </summary>
+        public SetHydroVisualMonitorViewModel() { }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public SetHydroVisualMonitorViewModel(Yw.Vmo.HydroMonitorVmo vmo, Yw.Model.HydroVisualInfo visual)
+        {
+            this.Checked = vmo.ID > 0;
+            this.Relation = visual.Name;
+            this.PropName = HydroCalcuPropHelper.GetName(vmo.PropName);
+            this.Description = vmo.Description;
+            this.Vmo = vmo;
+        }
+
+        /// <summary>
+        /// 閫夋嫨
+        /// </summary>
+        [DisplayName("閫夋嫨")]
+        public bool Checked { get; set; }
+
+        /// <summary>
+        /// 鏋勪欢
+        /// </summary>
+        [DisplayName("鏋勪欢")]
+        public string Relation { get; set; }
+
+        /// <summary>
+        /// 灞炴��
+        /// </summary>
+        [DisplayName("灞炴��")]
+        public string PropName { get; set; }
+
+        /// <summary>
+        /// 璇存槑
+        /// </summary>	
+        [DisplayName("璇存槑")]
+        public string Description { get; set; }
+
+        /// <summary>
+        /// vmo
+        /// </summary>
+        public Yw.Vmo.HydroMonitorVmo Vmo { get; set; }
+
+
+    }
+}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/12-monitor/02-value/HydroVisualMonitorValueListCtrl.Designer.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/12-monitor/02-value/HydroVisualMonitorValueListCtrl.Designer.cs
new file mode 100644
index 0000000..3b3bcbd
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/12-monitor/02-value/HydroVisualMonitorValueListCtrl.Designer.cs
@@ -0,0 +1,143 @@
+锘縩amespace Yw.WinFrmUI
+{
+    partial class HydroVisualMonitorValueListCtrl
+    {
+        /// <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();
+            ComponentResourceManager resources = new ComponentResourceManager(typeof(HydroVisualMonitorValueListCtrl));
+            gridControl1 = new DevExpress.XtraGrid.GridControl();
+            hydroVisualMonitorValueViewModelBindingSource = new BindingSource(components);
+            gridView1 = new DevExpress.XtraGrid.Views.Grid.GridView();
+            colRelation = new DevExpress.XtraGrid.Columns.GridColumn();
+            colPropName = new DevExpress.XtraGrid.Columns.GridColumn();
+            colMonitorValue = new DevExpress.XtraGrid.Columns.GridColumn();
+            colUnitName = new DevExpress.XtraGrid.Columns.GridColumn();
+            colDescription = new DevExpress.XtraGrid.Columns.GridColumn();
+            ((ISupportInitialize)gridControl1).BeginInit();
+            ((ISupportInitialize)hydroVisualMonitorValueViewModelBindingSource).BeginInit();
+            ((ISupportInitialize)gridView1).BeginInit();
+            SuspendLayout();
+            // 
+            // gridControl1
+            // 
+            gridControl1.DataSource = hydroVisualMonitorValueViewModelBindingSource;
+            gridControl1.Dock = DockStyle.Fill;
+            gridControl1.Location = new Point(0, 0);
+            gridControl1.MainView = gridView1;
+            gridControl1.Name = "gridControl1";
+            gridControl1.Size = new Size(913, 394);
+            gridControl1.TabIndex = 0;
+            gridControl1.ViewCollection.AddRange(new DevExpress.XtraGrid.Views.Base.BaseView[] { gridView1 });
+            // 
+            // hydroVisualMonitorValueViewModelBindingSource
+            // 
+            hydroVisualMonitorValueViewModelBindingSource.DataSource = typeof(HydroVisualMonitorValueViewModel);
+            // 
+            // gridView1
+            // 
+            gridView1.Columns.AddRange(new DevExpress.XtraGrid.Columns.GridColumn[] { colRelation, colPropName, colMonitorValue, colUnitName, colDescription });
+            gridView1.GridControl = gridControl1;
+            gridView1.Name = "gridView1";
+            gridView1.RowClick += gridView1_RowClick;
+            // 
+            // colRelation
+            // 
+            colRelation.FieldName = "Relation";
+            colRelation.MaxWidth = 250;
+            colRelation.MinWidth = 150;
+            colRelation.Name = "colRelation";
+            colRelation.Visible = true;
+            colRelation.VisibleIndex = 0;
+            colRelation.Width = 150;
+            // 
+            // colPropName
+            // 
+            colPropName.FieldName = "PropName";
+            colPropName.MaxWidth = 250;
+            colPropName.MinWidth = 150;
+            colPropName.Name = "colPropName";
+            colPropName.Visible = true;
+            colPropName.VisibleIndex = 1;
+            colPropName.Width = 150;
+            // 
+            // colMonitorValue
+            // 
+            colMonitorValue.FieldName = "MonitorValue";
+            colMonitorValue.ImageOptions.SvgImage = (DevExpress.Utils.Svg.SvgImage)resources.GetObject("colMonitorValue.ImageOptions.SvgImage");
+            colMonitorValue.ImageOptions.SvgImageSize = new Size(16, 16);
+            colMonitorValue.MaxWidth = 150;
+            colMonitorValue.MinWidth = 150;
+            colMonitorValue.Name = "colMonitorValue";
+            colMonitorValue.Visible = true;
+            colMonitorValue.VisibleIndex = 2;
+            colMonitorValue.Width = 150;
+            // 
+            // colUnitName
+            // 
+            colUnitName.FieldName = "UnitName";
+            colUnitName.MaxWidth = 100;
+            colUnitName.MinWidth = 100;
+            colUnitName.Name = "colUnitName";
+            colUnitName.Visible = true;
+            colUnitName.VisibleIndex = 3;
+            colUnitName.Width = 100;
+            // 
+            // colDescription
+            // 
+            colDescription.FieldName = "Description";
+            colDescription.MinWidth = 100;
+            colDescription.Name = "colDescription";
+            colDescription.Visible = true;
+            colDescription.VisibleIndex = 4;
+            colDescription.Width = 100;
+            // 
+            // HydroVisualMonitorValueListCtrl
+            // 
+            AutoScaleDimensions = new SizeF(7F, 14F);
+            AutoScaleMode = AutoScaleMode.Font;
+            Controls.Add(gridControl1);
+            Name = "HydroVisualMonitorValueListCtrl";
+            Size = new Size(913, 394);
+            ((ISupportInitialize)gridControl1).EndInit();
+            ((ISupportInitialize)hydroVisualMonitorValueViewModelBindingSource).EndInit();
+            ((ISupportInitialize)gridView1).EndInit();
+            ResumeLayout(false);
+        }
+
+        #endregion
+
+        private DevExpress.XtraGrid.GridControl gridControl1;
+        private DevExpress.XtraGrid.Views.Grid.GridView gridView1;
+        private BindingSource hydroVisualMonitorValueViewModelBindingSource;
+        private DevExpress.XtraGrid.Columns.GridColumn colRelation;
+        private DevExpress.XtraGrid.Columns.GridColumn colPropName;
+        private DevExpress.XtraGrid.Columns.GridColumn colMonitorValue;
+        private DevExpress.XtraGrid.Columns.GridColumn colDescription;
+        private DevExpress.XtraGrid.Columns.GridColumn colUnitName;
+    }
+}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/12-monitor/02-value/HydroVisualMonitorValueListCtrl.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/12-monitor/02-value/HydroVisualMonitorValueListCtrl.cs
new file mode 100644
index 0000000..4be4e3f
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/12-monitor/02-value/HydroVisualMonitorValueListCtrl.cs
@@ -0,0 +1,56 @@
+锘縰sing DevExpress.Mvvm.Native;
+using DevExpress.XtraEditors;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace Yw.WinFrmUI
+{
+    public partial class HydroVisualMonitorValueListCtrl : DevExpress.XtraEditors.XtraUserControl
+    {
+        public HydroVisualMonitorValueListCtrl()
+        {
+            InitializeComponent();
+            this.gridView1.SetNormalEditView(30);
+            this.gridView1.RegistCustomDrawRowIndicator(40);
+            this.colRelation.OptionsColumn.AllowEdit = false;
+            this.colPropName.OptionsColumn.AllowEdit = false;
+            this.colDescription.OptionsColumn.AllowEdit = false;
+        }
+
+        /// <summary>
+        /// 鏌ョ湅姘村姏浜嬩欢
+        /// </summary>
+        public event Action<string> HydroViewEvent;
+
+        private BindingList<HydroVisualMonitorValueViewModel> _allBindingList = null;//鎵�鏈夌粦瀹氬垪琛�
+
+        /// <summary>
+        /// 缁戝畾鏁版嵁
+        /// </summary>
+        public void SetBindingData(List<HydroVisualMonitorValueViewModel> allValueList)
+        {
+            _allBindingList = new BindingList<HydroVisualMonitorValueViewModel>();
+            allValueList?.OrderBy(x => x.SortCode).ForEach(x => _allBindingList.Add(x));
+            this.hydroVisualMonitorValueViewModelBindingSource.DataSource = _allBindingList;
+            this.hydroVisualMonitorValueViewModelBindingSource.ResetBindings(false);
+        }
+
+        //琛岀偣鍑�
+        private void gridView1_RowClick(object sender, DevExpress.XtraGrid.Views.Grid.RowClickEventArgs e)
+        {
+            var row = this.gridView1.GetRow(e.RowHandle) as HydroVisualMonitorValueViewModel;
+            if (row == null)
+            {
+                return;
+            }
+            this.HydroViewEvent?.Invoke(row.Vmo.Relation);
+        }
+    }
+}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/04-flowmeter/SetHydroFlowmeterWorkingInfoCtrl.resx b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/12-monitor/02-value/HydroVisualMonitorValueListCtrl.resx
similarity index 75%
copy from WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/04-flowmeter/SetHydroFlowmeterWorkingInfoCtrl.resx
copy to WinFrmUI/Yw.WinFrmUI.Hydro.Core/12-monitor/02-value/HydroVisualMonitorValueListCtrl.resx
index 5062616..b67f241 100644
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/04-flowmeter/SetHydroFlowmeterWorkingInfoCtrl.resx
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/12-monitor/02-value/HydroVisualMonitorValueListCtrl.resx
@@ -117,23 +117,37 @@
   <resheader name="writer">
     <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </resheader>
+  <metadata name="hydroVisualMonitorValueViewModelBindingSource.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
   <assembly alias="DevExpress.Data.v23.2" name="DevExpress.Data.v23.2, Culture=neutral, PublicKeyToken=b88d1754d700e49a" />
-  <data name="buttonImageOptions1.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
+  <data name="colMonitorValue.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
     <value>
         AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIzLjIsIFZlcnNpb249MjMuMi40
         LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
-        dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAAGQCAAAC77u/
+        dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAABwFAAAC77u/
         PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi
         IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv
         MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh
         Y2U9InByZXNlcnZlIiBpZD0iTGF5ZXJfMSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAg
-        MzIgMzIiPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLkJsYWNre2ZpbGw6IzcyNzI3Mjt9Cgku
-        UmVke2ZpbGw6I0QxMUMxQzt9CgkuWWVsbG93e2ZpbGw6I0ZGQjExNTt9CgkuR3JlZW57ZmlsbDojMDM5
-        QzIzO30KPC9zdHlsZT4NCiAgPGcgaWQ9IlZpc2liaWxpdHkiPg0KICAgIDxjaXJjbGUgY3g9IjE2IiBj
-        eT0iMTYiIHI9IjQiIGNsYXNzPSJCbGFjayIgLz4NCiAgICA8cGF0aCBkPSJNMTYsOEM4LDgsMiwxNiwy
-        LDE2czYsOCwxNCw4czE0LTgsMTQtOFMyNCw4LDE2LDh6IE0xNiwyMmMtMy4zLDAtNi0yLjctNi02czIu
-        Ny02LDYtNnM2LDIuNyw2LDYgICBTMTkuMywyMiwxNiwyMnoiIGNsYXNzPSJCbGFjayIgLz4NCiAgPC9n
-        Pg0KPC9zdmc+Cw==
+        MzIgMzIiPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLlllbGxvd3tmaWxsOiNGRkIxMTU7fQoJ
+        LlJlZHtmaWxsOiNEMTFDMUM7fQoJLkJsYWNre2ZpbGw6IzcyNzI3Mjt9CgkuQmx1ZXtmaWxsOiMxMTc3
+        RDc7fQoJLldoaXRle2ZpbGw6I0ZGRkZGRjt9CgkuR3JlZW57ZmlsbDojMDM5QzIzO30KCS5zdDB7b3Bh
+        Y2l0eTowLjc1O30KCS5zdDF7b3BhY2l0eTowLjU7fQoJLnN0MntvcGFjaXR5OjAuMjU7fQoJLnN0M3tm
+        aWxsOiNGRkIxMTU7fQo8L3N0eWxlPg0KICA8ZyAvPg0KICA8ZyBpZD0iUmVuYW1lXzFfIj4NCiAgICA8
+        cGF0aCBkPSJNMi4xLDE2aDIuMmwwLjYtMi4zaDMuMkw4LjgsMTZIMTFMNy44LDZINS40TDIuMSwxNnog
+        TTYuNCw4LjdjMC4xLTAuMywwLjEtMC42LDAuMS0wLjloMC4xICAgYzAsMC4zLDAuMSwwLjYsMC4xLDAu
+        OWwxLDMuM0g1LjRMNi40LDguN3ogTTE3LjUsMTAuNmMwLjYtMC4yLDEuMS0wLjUsMS41LTAuOWMwLjQt
+        MC40LDAuNi0wLjksMC42LTEuNGMwLTAuNy0wLjMtMS4zLTAuOS0xLjcgICBDMTguMSw2LjIsMTcuMSw2
+        LDE1LjksNkgxMnY5LjlWMTZoNGMxLjIsMCwyLjItMC4yLDIuOS0wLjhDMTkuNywxNC42LDIwLDE0LDIw
+        LDEzYzAtMC42LTAuMi0xLjItMC43LTEuNiAgIEMxOC45LDExLDE4LjMsMTAuNywxNy41LDEwLjZ6IE0x
+        NC40LDcuN2gwLjljMS4xLDAsMS43LDAuNCwxLjcsMS4xYzAsMC40LTAuMSwwLjctMC40LDAuOUMxNi40
+        LDkuOSwxNiwxMCwxNS41LDEwaC0xLjFWNy43eiAgICBNMTcsMTMuOGMtMC4zLDAuMi0wLjgsMC40LTEu
+        MywwLjRoLTEuM3YtMi42aDEuM2MwLjUsMCwwLjksMC4xLDEuMywwLjNjMC4zLDAuMiwwLjUsMC42LDAu
+        NSwwLjlDMTcuNSwxMy4zLDE3LjQsMTMuNiwxNywxMy44eiIgY2xhc3M9IkJsYWNrIiAvPg0KICAgIDxw
+        YXRoIGQ9Ik0yNywxOWwtOCw4bC00LTRsOC04TDI3LDE5eiBNMjgsMThsMS43LTEuN2MwLjQtMC40LDAu
+        NC0xLDAtMS4zTDI3LDEyLjNjLTAuNC0wLjQtMS0wLjQtMS4zLDBMMjQsMTRMMjgsMTh6ICAgIE0xNCwy
+        NHY0aDRMMTQsMjR6IiBjbGFzcz0iQmx1ZSIgLz4NCiAgPC9nPg0KPC9zdmc+Cw==
 </value>
   </data>
 </root>
\ No newline at end of file
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/12-monitor/02-value/HydroVisualMonitorValueViewModel.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/12-monitor/02-value/HydroVisualMonitorValueViewModel.cs
new file mode 100644
index 0000000..1436264
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/12-monitor/02-value/HydroVisualMonitorValueViewModel.cs
@@ -0,0 +1,71 @@
+锘縩amespace Yw.WinFrmUI
+{
+    /// <summary>
+    /// 
+    /// </summary>
+    public class HydroVisualMonitorValueViewModel
+    {
+        /// <summary>
+        /// 
+        /// </summary>
+        public HydroVisualMonitorValueViewModel() { }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public HydroVisualMonitorValueViewModel(Yw.Model.HydroVisualInfo visual, Yw.Vmo.HydroMonitorVmo vmo)
+        {
+            this.Relation = visual.Name;
+            this.PropName = HydroCalcuPropHelper.GetName(vmo.PropName);
+            this.MonitorValue = null;
+            this.UnitName = HydroCalcuPropHelper.GetUnit(vmo.PropName);
+            this.SortCode = vmo.SortCode;
+            this.Description = vmo.Description;
+
+            this.Vmo = vmo;
+        }
+
+        /// <summary>
+        /// 鏋勪欢
+        /// </summary>
+        [DisplayName("鏋勪欢")]
+        public string Relation { get; set; }
+
+        /// <summary>
+        /// 灞炴��
+        /// </summary>
+        [DisplayName("灞炴��")]
+        public string PropName { get; set; }
+
+        /// <summary>
+        /// 鍊�
+        /// </summary>
+        [DisplayName("鍊�")]
+        public double? MonitorValue { get; set; }
+
+        /// <summary>
+        /// 鍗曚綅
+        /// </summary>
+        [DisplayName("鍗曚綅")]
+        public string UnitName { get; set; }
+
+        /// <summary>
+        /// 鎺掑簭鐮�
+        /// </summary>
+        public int SortCode { get; set; }
+
+        /// <summary>
+        /// 璇存槑
+        /// </summary>	
+        [DisplayName("璇存槑")]
+        public string Description { get; set; }
+
+        /// <summary>
+        /// vmo
+        /// </summary>
+        public Yw.Vmo.HydroMonitorVmo Vmo { get; set; }
+
+
+
+    }
+}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/99-failed/HydroCalcuFailedCtrl.Designer.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/13-fail/HydroCalcuFailedCtrl.Designer.cs
similarity index 100%
rename from WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/99-failed/HydroCalcuFailedCtrl.Designer.cs
rename to WinFrmUI/Yw.WinFrmUI.Hydro.Core/13-fail/HydroCalcuFailedCtrl.Designer.cs
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/99-failed/HydroCalcuFailedCtrl.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/13-fail/HydroCalcuFailedCtrl.cs
similarity index 100%
rename from WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/99-failed/HydroCalcuFailedCtrl.cs
rename to WinFrmUI/Yw.WinFrmUI.Hydro.Core/13-fail/HydroCalcuFailedCtrl.cs
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/99-failed/HydroCalcuFailedCtrl.resx b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/13-fail/HydroCalcuFailedCtrl.resx
similarity index 100%
rename from WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/99-failed/HydroCalcuFailedCtrl.resx
rename to WinFrmUI/Yw.WinFrmUI.Hydro.Core/13-fail/HydroCalcuFailedCtrl.resx
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/99-failed/HydroCalcuFailedViewModel.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/13-fail/HydroCalcuFailedViewModel.cs
similarity index 100%
rename from WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/99-failed/HydroCalcuFailedViewModel.cs
rename to WinFrmUI/Yw.WinFrmUI.Hydro.Core/13-fail/HydroCalcuFailedViewModel.cs
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/Properties/DataSources/Yw.WinFrmUI.HydroVisualMonitorValueViewModel.datasource b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/Properties/DataSources/Yw.WinFrmUI.HydroVisualMonitorValueViewModel.datasource
new file mode 100644
index 0000000..54aaf0d
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/Properties/DataSources/Yw.WinFrmUI.HydroVisualMonitorValueViewModel.datasource
@@ -0,0 +1,10 @@
+锘�<?xml version="1.0" encoding="utf-8"?>
+<!--
+    This file is automatically generated by Visual Studio. It is 
+    used to store generic object data source configuration information.  
+    Renaming the file extension or editing the content of this file may   
+    cause the file to be unrecognizable by the program.
+-->
+<GenericObjectDataSource DisplayName="HydroVisualMonitorValueViewModel" Version="1.0" xmlns="urn:schemas-microsoft-com:xml-msdatasource">
+  <TypeInfo>Yw.WinFrmUI.HydroVisualMonitorValueViewModel, Yw.WinFrmUI.Hydro.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null</TypeInfo>
+</GenericObjectDataSource>
\ No newline at end of file
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/Properties/DataSources/Yw.WinFrmUI.SetHydroVisualMonitorViewModel.datasource b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/Properties/DataSources/Yw.WinFrmUI.SetHydroVisualMonitorViewModel.datasource
new file mode 100644
index 0000000..43cada2
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/Properties/DataSources/Yw.WinFrmUI.SetHydroVisualMonitorViewModel.datasource
@@ -0,0 +1,10 @@
+锘�<?xml version="1.0" encoding="utf-8"?>
+<!--
+    This file is automatically generated by Visual Studio. It is 
+    used to store generic object data source configuration information.  
+    Renaming the file extension or editing the content of this file may   
+    cause the file to be unrecognizable by the program.
+-->
+<GenericObjectDataSource DisplayName="SetHydroVisualMonitorViewModel" Version="1.0" xmlns="urn:schemas-microsoft-com:xml-msdatasource">
+  <TypeInfo>Yw.WinFrmUI.SetHydroVisualMonitorViewModel, Yw.WinFrmUI.Hydro.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null</TypeInfo>
+</GenericObjectDataSource>
\ No newline at end of file
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 02fa24b..06e7bb2 100644
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/Yw.WinFrmUI.Hydro.Core.csproj
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/Yw.WinFrmUI.Hydro.Core.csproj
@@ -42,7 +42,7 @@
 	<ItemGroup>
 		<PackageReference Include="DevExpress.Win.Design" Version="23.2.4" />
 		<PackageReference Include="Yw.BLL.Basic.Core" Version="3.3.0" />
-		<PackageReference Include="Yw.BLL.Hydro.Core" Version="3.5.3" />
+		<PackageReference Include="Yw.BLL.Hydro.Core" Version="3.5.7" />
 	</ItemGroup>
 
 	<ItemGroup>
@@ -141,23 +141,20 @@
 		<Compile Update="10-working\00-core\SetHydroWorkingInfoDlg.cs">
 			<SubType>Form</SubType>
 		</Compile>
-		<Compile Update="10-working\01-waterbox\SetHydroWaterboxWorkingInfoCtrl.cs">
+		<Compile Update="10-working\02-waterbox\SetHydroWaterboxWorkingInfoCtrl.cs">
 			<SubType>UserControl</SubType>
 		</Compile>
-		<Compile Update="10-working\02-pump\SetHydroPumpWorkingInfoCtrl.cs">
+		<Compile Update="10-working\03-pump\SetHydroPumpWorkingInfoCtrl.cs">
 			<SubType>UserControl</SubType>
 		</Compile>
-		<Compile Update="10-working\03-valve\SetHydroValveWorkingInfoCtrl.cs">
-			<SubType>UserControl</SubType>
-		</Compile>
-		<Compile Update="10-working\05-pressmeter\SetHydroPressmeterWorkingInfoCtrl.cs">
-			<SubType>UserControl</SubType>
-		</Compile>
-		<Compile Update="10-working\04-flowmeter\SetHydroFlowmeterWorkingInfoCtrl.cs">
+		<Compile Update="10-working\04-valve\SetHydroValveWorkingInfoCtrl.cs">
 			<SubType>UserControl</SubType>
 		</Compile>
 		<Compile Update="11-search\HydroVisualSearchListCtrl.cs">
 			<SubType>UserControl</SubType>
+		</Compile>
+		<Compile Update="12-monitor\01-set\SetHydroVisualMonitorDlg.cs">
+		  <SubType>Form</SubType>
 		</Compile>
 		<Compile Update="14-l2d\HydroL2dViewPage.cs">
 			<SubType>UserControl</SubType>
@@ -180,7 +177,7 @@
 		<Compile Update="08-grading\06-apply\02-dlg\ApplyHydroGradingDlg.cs">
 			<SubType>Form</SubType>
 		</Compile>
-		<Compile Update="10-working\99-failed\HydroCalcuFailedCtrl.cs">
+		<Compile Update="13-fail\HydroCalcuFailedCtrl.cs">
 			<SubType>UserControl</SubType>
 		</Compile>
 		<Compile Update="06-visual\02-tank\SetHydroTankDlg.cs">
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 bad1330..1945855 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
@@ -40,6 +40,12 @@
     <Compile Update="11-search\InputHydroVisualSearchListDlg.cs">
       <SubType>Form</SubType>
     </Compile>
+    <Compile Update="12-monitor\01-set\SetHydroVisualMonitorCtrl.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Update="12-monitor\02-value\HydroVisualMonitorValueListCtrl.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
     <Compile Update="13-q3d\HydroQ3dViewPage.cs">
       <SubType>UserControl</SubType>
     </Compile>

--
Gitblit v1.9.3