From 74dba39c95f8120bb31a64739c872cb43790935c Mon Sep 17 00:00:00 2001
From: lixiaojun <1287241240@qq.com>
Date: 星期三, 20 十一月 2024 10:14:38 +0800
Subject: [PATCH] 核心界面修改

---
 WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/XhsProjectSimulationCorePage.resx                  |   54 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/04-set/SetHydroWorkingBottomCtrl.Designer.cs                            |    0 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/07-curve/01-view/HydroCurveViewDlg.Designer.cs                        |   96 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/GlobalUsings.cs                                                                    |    1 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/07-curve/00-core/HydroCurvePointViewModel.cs                          |    0 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/07-curve/02-set/SetHydroCurveDlg.resx                                 |    0 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/14-matching/11-flowmeter/HydroFlowmeterMatchingViewModel.cs                        |   96 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/05-tree/HydroWorkingTreeViewModel.cs                                    |   52 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/04-link/00-core/HydroCalcuLinkResult.cs                                   |   10 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/07-curve/01-view/HydroCurveViewDlg.resx                               |    0 
 WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/01-matching/01-viewmodel/ValveMatchingViewModel.cs |    4 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/01-const/HydroElbow.cs                                                     |   25 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/14-matching/08-hydrant/HydroHydrantMatchingViewModel.cs                            |  128 +
 WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/01-property/XhsProjectSimulationPropertyCtrl.cs                  |  423 +--
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/05-property/HydroVisualPropertyCtrl.cs                                             |   25 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/99-view/01-q3d/HydroQ3dViewPage.Designer.cs                                        |    0 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/05-property/HydroVisualPropertyCtrl.resx                                           |  115 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/05-tree/HydroWorkingTreeCtrl.resx                                       |  239 ++
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/13-fail/HydroCalcuFailedCtrl.cs                                                    |   18 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/99-view/01-q3d/HydroQ3dViewPage.resx                                               |    0 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/05-property/HydroVisualPropertyDescriptionCtrl.cs                                  |   13 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/99-view/03-l3d/HydroL3dViewPage.resx                                               |    0 
 WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/XhsProjectSimulationCorePage.cs                    |  893 +++---
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/05-property/HydroVisualPropertyCtrl.Designer.cs                                    |   44 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/04-set/SetHydroWorkingCtrl.Designer.cs                                  |    0 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/02-enum/eValveType.cs                                                      |   50 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/02-enum/eAlgorithmType.cs                                                  |   27 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/07-curve/01-view/HydroCurveViewDlg.cs                                 |    2 
 WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/XhsProjectSimulationCorePage.Designer.cs           |  208 +
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/14-matching/12-pressmeter/HydroFlowmeterMatchingViewModel.cs                       |   96 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/Yw.WinFrmUI.Hydro.Core.csproj.user                                                 |   14 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/05-tree/HydroWorkingTreeCtrl.Designer.cs                                |  302 ++
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/14-matching/07-blunthead/HydroBluntheadMatchingViewModel.cs                        |  117 +
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/03-node/01-flowmeter/HydroCalcuFlowmeterResult.cs                         |    5 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/07-curve/02-set/SetHydroCurveDlg.Designer.cs                          |  164 +
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/99-view/03-l3d/HydroL3dViewPage.cs                                                 |    0 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/14-matching/00-core/HydroMatchingHelper.cs                                         | 1312 +++++++++++
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/14-matching/01-pump/HydroPumpMatchingViewModel.cs                                  |  188 +
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/14-matching/10-meter/HydroMeterMatchingViewModel.cs                                |   96 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/02-visual/HydroCalcuVisualResult.cs                                       |    7 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/03-node/00-core/HydroCalcuNodeResult.cs                                   |   12 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/04-set/SetHydroWorkingBottomCtrl.resx                                   |    0 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/04-set/SetHydroWorkingDlg.Designer.cs                                   |    0 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/04-set/SetHydroWorkingViewModel.cs                                      |    0 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/07-curve/02-set/SetHydroCurveCtrl.resx                                |    0 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/14-matching/14-exchanger/HydroExchangerMatchingViewModel.cs                        |  133 +
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/14-matching/09-nozzle/HydroNozzleMatchingViewModel.cs                              |  128 +
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/99-view/02-l2d/HydroL2dViewPage.resx                                               |    0 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/99-view/02-l2d/HydroL2dViewPage.Designer.cs                                        |    0 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/07-curve/01-view/HydroCurveViewCtrl.Designer.cs                       |    0 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/07-curve/02-set/SetHydroCurveCtrl.Designer.cs                         |    0 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/07-curve/02-set/SetHydroCurveCtrl.cs                                  |    0 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/04-set/SetHydroWorkingDlg.cs                                            |    0 
 WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/02-bimface/XhsProjectSimulationBimfaceCtrl.cs                    |   36 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/07-curve/01-view/HydroCurveViewCtrl.resx                              |    0 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/04-link/01-pump/HydroCalcuPumpResult.cs                                   |    5 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/05-tree/HydroWorkingTreeCtrl.cs                                         |  148 +
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/01-result/HydroCalcuResultHelper.cs                                       |  156 +
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/14-matching/06-fourlink/HydroFourlinkMatchingViewModel.cs                          |  117 +
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/99-view/03-l3d/HydroL3dViewPage.Designer.cs                                        |    0 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/07-curve/01-view/HydroCurveViewCtrl.cs                                |   12 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/14-matching/04-elbow/HydroElbowMatchingViewModel.cs                                |  145 +
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/04-set/SetHydroWorkingCtrl.resx                                         |    0 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/14-matching/03-pipe/HydroPipeMatchingViewModel.cs                                  |  134 +
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/04-set/SetHydroWorkingDlg.resx                                          |    0 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/02-enum/eElbowType.cs                                                      |   29 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/99-view/02-l2d/HydroL2dViewPage.cs                                                 |    0 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/14-matching/13-translation/HydroTranslationMatchingViewModel.cs                    |  156 +
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/99-view/01-q3d/HydroQ3dViewPage.cs                                                 |    0 
 WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/04-scheme/XhsProjectSimulationSchemeMgrPage.cs                   |  102 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/07-curve/02-set/SetHydroCurveDlg.cs                                   |   50 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/04-set/SetHydroWorkingCtrl.cs                                           |    0 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/00-core/HydroWorkingViewModel.cs                                        |    9 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/Yw.WinFrmUI.Hydro.Core.csproj                                                      |   20 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/02-transfer/HydroL2dTransferHelper.cs                                      |    2 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/14-matching/02-valve/HydroValveMatchingViewModel.cs                                |  169 +
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/13-fail/HydroCalcuFailedViewModel.cs                                               |    9 
 /dev/null                                                                                                          |   55 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/04-set/SetHydroWorkingBottomCtrl.cs                                     |    0 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/14-matching/15-compressor/HydroCompressorMatchingViewModel.cs                      |  133 +
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/03-node/02-pressmeter/HydroCalcuPressmeterResult.cs                       |    5 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/14-matching/16-tank/HydroTankMatchingViewModel.cs                                  |  155 +
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/14-matching/05-threelink/HydroThreelinkMatchingViewModel.cs                        |  138 +
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/14-matching/00-core/HydroMatchingViewModel.cs                                      |   93 
 84 files changed, 5,938 insertions(+), 1,037 deletions(-)

diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/00-core/AssetsMatchingHelper-Bak.cs b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/00-core/AssetsMatchingHelper-Bak.cs
deleted file mode 100644
index 94cad1b..0000000
--- a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/00-core/AssetsMatchingHelper-Bak.cs
+++ /dev/null
@@ -1,712 +0,0 @@
-锘縰sing HStation.Vmo;
-using HStation.WinFrmUI.PhartRelation;
-using System.Windows.Input;
-
-namespace HStation.WinFrmUI
-{
-    public class AssetsMatchingHelper
-    {
-        private readonly Lazy<BLL.XhsPumpMainPhartMappingExtensions> _bll_ex = new();
-        private const double _caliberTolerance = 10.0;
-        private const double _speedTolerance = 100;
-        private const double _flowTolerance = 10;
-        private const double _headTolerance = 5;
-        private const double _powerTolerance = 0.05;
-
-        private const double _valveLift = 10;//闃�闂ㄥ紑搴﹁寖鍥�
-        private const int _angle = 1;//瑙掑害鑼冨洿
-
-        //璧勪骇鑷姩鍖归厤
-        public static bool Matching(AssetsMatchingViewModel assetsAutoMatchingView, out string Error)
-        {
-            Error = string.Empty;
-            bool IsMaching = false;
-            var AssetsPumpMain = new BLL.AssetsPumpMain();
-            var adaptingManage = new BLL.AdaptingManage();
-            var pipeLineManage = new BLL.AssetsPipeMain();
-            var AssetsValveMain = new BLL.AssetsValveMain();
-            var AssetsElbowMain = new BLL.AssetsElbowMain();
-            var AssetsThreelinkMain = new BLL.AssetsThreelinkMain();
-            var AssetsFourlinkMain = new BLL.AssetsFourlinkMain();
-            try
-            {
-                var allPump = Task.Run(async () => await AssetsPumpMain.GetAll()).Result;
-                var allAdapting = Task.Run(async () => await adaptingManage.GetAll()).Result;
-                var allPipeLine = Task.Run(async () => await pipeLineManage.GetAll()).Result;
-                var allValve = Task.Run(async () => await AssetsValveMain.GetAll()).Result;
-                var allElbow = Task.Run(async () => await AssetsElbowMain.GetAll()).Result;
-                var allThreeLink = Task.Run(async () => await AssetsThreelinkMain.GetAll()).Result;
-                var allFourLink = Task.Run(async () => await AssetsFourlinkMain.GetAll()).Result;
-                //娉靛尮閰�
-                foreach (var item in assetsAutoMatchingView.PumpMatchingList)
-                {
-                    if (MatchingPumps(item, allPump))
-                    {
-                        IsMaching = true;
-                    }
-                }
-                //涓夐�氬尮閰�
-                foreach (var item in assetsAutoMatchingView.ThreelinkMatchingList)
-                {
-                    if (MatchingThreelink(item, allThreeLink))
-                    {
-                        IsMaching = true;
-                    }
-                }
-                //鍥涢�氬尮閰�
-                foreach (var item in assetsAutoMatchingView.FourlinkMatchingList)
-                {
-                    if (MatchingFourlink(item, allFourLink))
-                    {
-                        IsMaching = true;
-                    }
-                }
-                //绠¢亾鍖归厤
-                foreach (var item in assetsAutoMatchingView.PipeMatchingList)
-                {
-                    if (MatchingPipe(item, allPipeLine))
-                    {
-                        IsMaching = true;
-                    }
-                }
-                //闃�闂ㄥ尮閰�
-                foreach (var item in assetsAutoMatchingView.ValveMatchingList)
-                {
-                    if (MatchingValve(item, allValve))
-                    {
-                        IsMaching = true;
-                    }
-                }
-                //寮ご鍖归厤
-                foreach (var item in assetsAutoMatchingView.ElbowMatchingList)
-                {
-                    if (MatchingElbow(item, allElbow))
-                    {
-                        IsMaching = true;
-                    }
-                }
-            }
-            catch (Exception ex)
-            {
-                Error = ex.Message;
-                return false;
-            }
-            return IsMaching;
-        }
-
-        //娉靛尮閰�
-        public static bool MatchingPumps(PumpMatchingViewModel InputModel, List<Vmo.AssetsPumpMainVmo> AssetsPumpMainVmos)
-        {
-            if (AssetsPumpMainVmos == null)
-            {
-                return true;
-            }
-            Vmo.AssetsPumpMainVmo vmo = null;
-            int startCount = 0;
-            // 灏濊瘯缁濆鍖归厤
-            var absoluteMatch = AssetsPumpMainVmos.Where(item =>
-            (InputModel.RatedN == null || InputModel.RatedN == item.RatedSpeed) &&
-            (InputModel.RatedQ == null || InputModel.RatedQ == item.RatedFlow) &&
-            (InputModel.RatedH == null || InputModel.RatedH == item.RatedHead) &&
-            (InputModel.RatedP == item.RatedPower)).ToList();
-            if (absoluteMatch != null && absoluteMatch.Count != 0)
-            {
-                foreach (var item in absoluteMatch)
-                {
-                    int commonCount = GetIntersect(InputModel.ModelType, item.Name);
-                    if (commonCount > startCount)
-                    {
-                        vmo = item;
-                        startCount = commonCount;
-                    }
-                }
-            }
-            else
-            {
-                // 灏濊瘯鍖洪棿鍖归厤
-                var rangeMatch = AssetsPumpMainVmos.Where(item =>
-                   (InputModel.RatedN.HasValue ? Math.Abs(InputModel.RatedN.Value - item.RatedSpeed) <= _speedTolerance : true) &&
-                   (InputModel.RatedQ.HasValue ? Math.Abs(InputModel.RatedQ.Value - item.RatedFlow) <= _flowTolerance : true) &&
-                   (InputModel.RatedH.HasValue ? Math.Abs(InputModel.RatedH.Value - item.RatedHead) <= _headTolerance : true) &&
-                   (Math.Abs(InputModel.RatedP - item.RatedPower) <= _powerTolerance)).ToList();
-                if (rangeMatch != null && rangeMatch.Count != 0)
-                {
-                    foreach (var item in rangeMatch)
-                    {
-                        int commonCount = GetIntersect(InputModel.ModelType, item.Name);
-                        if (commonCount > startCount)
-                        {
-                            vmo = item;
-                            startCount = commonCount;
-                        }
-                    }
-                }
-            }
-            //
-            if (vmo == null)
-            {
-                foreach (var item in AssetsPumpMainVmos)
-                {
-                    int commonCount = GetIntersect(InputModel.ModelType, item.Name);
-                    if (commonCount > startCount)
-                    {
-                        vmo = item;
-                        startCount = commonCount;
-                    }
-                }
-            }
-            if (vmo != null)
-            {
-                InputModel.MatchingRatedH = vmo.RatedHead;
-                InputModel.MatchingRatedN = vmo.RatedSpeed;
-                InputModel.MatchingRatedQ = vmo.RatedFlow;
-                InputModel.MatchingRatedP = vmo.RatedPower;
-                InputModel.MatchingDbId = vmo.ID.ToString();
-                InputModel.MatchingModelType = vmo.Name;
-                var list = Task.Run(async () => await new BLL.XhsPumpMainPhartMappingExtensions().GetByPumpMainID(vmo.ID)).Result;
-                if (list != null && list.Count > 0)
-                {
-                    InputModel.MatchingCurveDbId = list.First().ID.ToString();
-                    var graph_qh = list.First().Diagram.GraphList.Find(x => x.GraphType == HStation.PhartRelation.eGraphType.PumpQH);
-                    var graph_qe = list.First().Diagram.GraphList.Find(x => x.GraphType == HStation.PhartRelation.eGraphType.PumpQE);
-                    var graph_qp = list.First().Diagram.GraphList.Find(x => x.GraphType == HStation.PhartRelation.eGraphType.PumpQP);
-                    if (graph_qh != null)
-                    {
-                        var points_qh = PhartPerformCurveHelper.GetFeatPointList(graph_qh.GraphType, graph_qh.GeometryInfo, 100, null);
-                        InputModel.MatchingCurveQH = new List<CurvePointMatchingViewModel>();
-                        foreach (var item in points_qh)
-                        {
-                            InputModel.MatchingCurveQH.Add(new CurvePointMatchingViewModel(item.X, item.Y));
-                        }
-                    }
-                    if (graph_qe != null)
-                    {
-                        var points_qe = PhartPerformCurveHelper.GetFeatPointList(graph_qe.GraphType, graph_qe.GeometryInfo, 100, null);
-                        InputModel.MatchingCurveQE = new List<CurvePointMatchingViewModel>();
-                        foreach (var item in points_qe)
-                        {
-                            InputModel.MatchingCurveQE.Add(new CurvePointMatchingViewModel(item.X, item.Y));
-                        }
-                    }
-                    if (graph_qp != null)
-                    {
-                        var points_qp = PhartPerformCurveHelper.GetFeatPointList(graph_qp.GraphType, graph_qp.GeometryInfo, 100, null);
-                        InputModel.MatchingCurveQP = new List<CurvePointMatchingViewModel>();
-                        foreach (var item in points_qp)
-                        {
-                            InputModel.MatchingCurveQP.Add(new CurvePointMatchingViewModel(item.X, item.Y));
-                        }
-                    }
-                }
-                return true;
-            }
-            return false;
-        }
-
-        //闃�闂ㄥ尮閰�
-        public static bool MatchingValve(ValveMatchingViewModel input, List<Vmo.AssetsValveMainVmo> adaptingManageVmos)
-        {
-            if (adaptingManageVmos == null)
-            {
-                return true;
-            }
-            HStation.Vmo.AssetsValveMainVmo vmo = null;
-            int firstCount = 0;
-            //鍙e緞鏈�灏忓樊鍊�
-            // 缁濆鍖归厤
-            adaptingManageVmos = adaptingManageVmos.Where(x => x.Type.ToString() == input.ValveType).ToList();
-            var absoluteMatch = adaptingManageVmos.Where(i =>
-              ((i.Caliber == null) || i.Caliber == input.Diameter) &&
-               ((input.Material == null && i.MaterialName == null) || i.MaterialName == input.Material)).ToList();
-            if (absoluteMatch.Count > 1)
-            {
-                var allMatchingList = absoluteMatch
-    .Where(x => GetIntersect(x.KeyWord == string.Empty
-    ? x.Name : x.KeyWord, input.ModelType) >= 2)
-    .OrderByDescending(x => GetIntersect(x.KeyWord == string.Empty ? x.Name : x.KeyWord, input.ModelType))
-    .ToList();//鎵惧嚭鐩稿悓瀛楃鍦�2浠ヤ笂骞朵笖杩涜鎺掑簭
-                if (allMatchingList.Count < 1)
-                    return false;//閫氳繃鍨嬪彿鍚嶆病鏈夋壘鍒�,鍒欒涓烘病鏈夊尮閰嶅埌
-                foreach (var item in allMatchingList)
-                {
-                    if (item.IsDefault)
-                    {
-                        vmo = item;
-                    }
-                }
-                vmo = allMatchingList.First();//濡傛灉娌℃湁璁剧疆榛樿鍊�,鍒欓粯璁よ繑鍥炲尮閰嶅瓧绗︽渶澶氱殑涓�鏉℃暟鎹�
-            }
-            else if (absoluteMatch.Count == 1)
-            {
-                vmo = absoluteMatch.First();
-            }
-            else
-            {
-                //鍖洪棿鍖归厤
-                var rangeMatch = adaptingManageVmos
-               .Where(item =>
-                    item.Caliber == null ||
-                   Math.Abs(Convert.ToInt64(item.Caliber) - Convert.ToInt64(input.Diameter)) <= _caliberTolerance
-                   || Math.Abs(Convert.ToInt64(item.ValveLift) - Convert.ToInt64(input.ValveLift)) <= _valveLift)
-               .ToList();
-                if (rangeMatch != null && rangeMatch.Count > 0)
-                {
-                    var materialList = new List<Vmo.AssetsValveMainVmo>();
-                    foreach (var range in rangeMatch)
-                    {
-                        //浠ユ潗鏂欎负鏉′欢寮�濮嬪尮閰�
-                        if (range.MaterialName == null)
-                        {
-                            materialList.Add(range);
-                        }
-                        else
-                        {
-                            int commonCount = GetIntersect(input.Material, range.MaterialName);
-                            if (commonCount > firstCount)
-                            {
-                                materialList.Add(range);
-                                firstCount = commonCount;
-                            }
-                        }
-                    }
-                    //鐢ㄥ凡缁忕瓫閫夊畬鎴愮殑鍒楄〃涓互鍚嶇О绛涢��
-                    firstCount = 0;
-                    if (materialList.Count < 1)
-                        return false;
-                    var allMatchingList = materialList
-  .Where(x => GetIntersect(x.KeyWord == string.Empty ? x.Name : x.KeyWord, input.ModelType) >= 2)
-  .OrderByDescending(x => GetIntersect(x.KeyWord == string.Empty ? x.Name : x.KeyWord, input.ModelType))
-  .ToList();//鎵惧嚭鐩稿悓瀛楃鍦�2浠ヤ笂骞朵笖杩涜鎺掑簭
-                    if (allMatchingList.Count < 1)
-                        return false;//閫氳繃鍨嬪彿鍚嶆病鏈夋壘鍒�,鍒欒涓烘病鏈夊尮閰嶅埌
-                    foreach (var item in allMatchingList)
-                    {
-                        if (item.IsDefault)
-                        {
-                            vmo = item;
-                        }
-                    }
-                    vmo = allMatchingList.First();//濡傛灉娌℃湁璁剧疆榛樿鍊�,鍒欓粯璁よ繑鍥炲尮閰嶅瓧绗︽渶澶氱殑涓�鏉℃暟鎹�
-                }
-            }
-            //鍙e緞鍜屾潗鏂欓兘娌℃湁鍖归厤涓�,灏辩敤鍨嬪彿鍚嶅尮閰�
-            firstCount = 0;
-            if (vmo != null)
-            {
-                input.MatchingMinorLoss = vmo.Coefficient;
-                input.MatchingDbId = vmo.ID.ToString();
-                input.MatchingDiameter = vmo.Caliber;
-                input.MatchingMaterial = vmo.MaterialName;
-                input.MatchingModelType = vmo.Name;
-                //  input.MatchingValveSetting =
-                input.MatchingValveLift = vmo.ValveLift;
-                input.MatchingValveType = vmo.Type.ToString();
-                return true;
-            }
-            return false;
-        }
-
-        //绠¢亾鍖归厤
-        public static bool MatchingPipe(PipeMatchingViewModel input, List<Vmo.AssetsPipeMainVmo> pipeLineManageVmos)
-        {
-            if (pipeLineManageVmos == null)
-            {
-                return true;
-            }
-            Vmo.AssetsPipeMainVmo vmo = null;
-            int firstCount = 0;
-            //鍙e緞鏈�灏忓樊鍊�
-            // 缁濆鍖归厤
-            var absoluteMatch = pipeLineManageVmos.Where(i =>
-            ((i.Caliber == null) || i.Caliber == input.Diameter) &&
-               ((input.Material == null) || i.MaterialName == input.Material)).ToList();
-            if (absoluteMatch.Count > 1)
-            {
-            }
-            else if (absoluteMatch.Count == 1)
-            {
-                vmo = absoluteMatch.First();
-            }
-            else
-            {
-                //鍖洪棿鍖归厤
-                var rangeMatch = pipeLineManageVmos
-               .Where(item =>
-               item.Caliber == null ||
-               Math.Abs(Convert.ToInt64(item.Caliber) - Convert.ToInt64(input.Diameter)) <= _caliberTolerance)
-         .ToList();
-                if (rangeMatch != null)
-                {
-                    var materialList = new List<Vmo.AssetsPipeMainVmo>();
-                    foreach (var range in rangeMatch)
-                    {
-                        //浠ユ潗鏂欎负鏉′欢寮�濮嬪尮閰�
-                        if (range.MaterialName == null)
-                        {
-                            materialList.Add(range);
-                        }
-                        else
-                        {
-                            int commonCount = GetIntersect(input.Material, range.MaterialName);
-                            if (commonCount > firstCount)
-                            {
-                                materialList.Add(range);
-                                firstCount = commonCount;
-                            }
-                        }
-                    }
-                    firstCount = 0;
-                    if (materialList.Count < 1)
-                        return false;
-                    var allMatchingList = materialList
-                     .Where(x => GetIntersect(x.KeyWord == string.Empty ? x.Name : x.KeyWord, input.ModelType) >= 2)
-                     .OrderByDescending(x => GetIntersect(x.KeyWord == string.Empty ? x.Name : x.KeyWord, input.ModelType))
-                     .ToList();//鎵惧嚭鐩稿悓瀛楃鍦�2浠ヤ笂骞朵笖杩涜鎺掑簭
-                    if (allMatchingList.Count < 1)
-                        return false;//閫氳繃鍨嬪彿鍚嶆病鏈夋壘鍒�,鍒欒涓烘病鏈夊尮閰嶅埌
-                    foreach (var item in allMatchingList)
-                    {
-                        if (item.IsDefault)
-                        {
-                            vmo = item;
-                        }
-                    }
-                    vmo = allMatchingList.First();//濡傛灉娌℃湁璁剧疆榛樿鍊�,鍒欓粯璁よ繑鍥炲尮閰嶅瓧绗︽渶澶氱殑涓�鏉℃暟鎹�
-                }
-            }
-            //鍙e緞鍜屾潗鏂欓兘娌℃湁鍖归厤涓�,灏辩敤鍨嬪彿鍚嶅尮閰�
-            if (vmo != null)
-            {
-                switch (input.eAlgorithmType)
-                {
-                    case HStation.Assets.eAlgorithmType.Hazen:
-                        input.MatchingRoughness = vmo.Hazen;
-                        break;
-
-                    case HStation.Assets.eAlgorithmType.Manning:
-                        input.MatchingRoughness = vmo.Manning;
-                        break;
-
-                    case HStation.Assets.eAlgorithmType.Darcy:
-                        input.MatchingRoughness = vmo.Darcy;
-                        break;
-
-                    default:
-                        input.MatchingRoughness = vmo.Hazen;
-                        break;
-                }
-                input.MatchingDbId = vmo.ID.ToString();
-                input.MatchingMaterial = vmo.MaterialName;
-                input.MatchingModelType = vmo.Name;
-                input.MatchingMinorLoss = vmo.Coefficient;
-                return true;
-            }
-            return false;
-        }
-
-        //寮ご鍖归厤
-        public static bool MatchingElbow(ElbowMatchingViewModel input, List<Vmo.AssetsElbowMainVmo> adaptingManageVmos)
-        {
-            if (adaptingManageVmos == null)
-            {
-                return true;
-            }
-            Vmo.AssetsElbowMainVmo vmo = null;
-            int firstCount = 0;
-            // 缁濆鍖归厤
-            var absoluteMatch = adaptingManageVmos.Where(i =>
-              ((input.Caliber == null && i.Caliber == null) || i.Caliber == input.Caliber) &&
-               ((input.Material == null) || i.MaterialName == input.Material)).ToList();
-            if (absoluteMatch.Count > 1)
-            {
-                var allMatchingList = absoluteMatch
-    .Where(x => GetIntersect(x.KeyWord == string.Empty ? x.Name : x.KeyWord, input.ModelType) >= 2)
-    .OrderByDescending(x => GetIntersect(x.KeyWord == string.Empty ? x.Name : x.KeyWord, input.ModelType))
-    .ToList();//鎵惧嚭鐩稿悓瀛楃鍦�2浠ヤ笂骞朵笖杩涜鎺掑簭
-                if (allMatchingList.Count < 1)
-                    return false;//閫氳繃鍨嬪彿鍚嶆病鏈夋壘鍒�,鍒欒涓烘病鏈夊尮閰嶅埌
-                foreach (var item in allMatchingList)
-                {
-                    if (item.IsDefault)
-                    {
-                        vmo = item;
-                    }
-                }
-                vmo = allMatchingList.First();//濡傛灉娌℃湁璁剧疆榛樿鍊�,鍒欓粯璁よ繑鍥炲尮閰嶅瓧绗︽渶澶氱殑涓�鏉℃暟鎹�
-            }
-            else if (absoluteMatch.Count == 1)
-            {
-                vmo = absoluteMatch.First();
-            }
-            else
-            {
-                //鍖洪棿鍖归厤
-                var rangeMatch = adaptingManageVmos
-   .Where(item =>
-       (input.Caliber == null && input.Caliber == null)
-       || (item.Caliber.HasValue && input.Caliber.HasValue) &&   //瀛樺湪鍊�,鍒欒繘琛屼笅闈㈠樊鍊煎垽鏂�
-       Math.Abs(Convert.ToInt64(item.Caliber) - Convert.ToInt64(input.Caliber)) <= _caliberTolerance
-       || item.ConnectionLength == input.ConnectionLength
-       || (item.Angle.HasValue && input.Angle.HasValue) &&      //瀛樺湪鍊�,鍒欒繘琛屼笅闈㈠樊鍊煎垽鏂�
-       Math.Abs(Convert.ToInt64(item.Angle) - Convert.ToInt64(input.Angle)) <= _angle)
-    .ToList();
-                if (rangeMatch != null && rangeMatch.Count > 0)
-                {
-                    var materialList = new List<Vmo.AssetsElbowMainVmo>();
-                    foreach (var range in rangeMatch)
-                    {
-                        //浠ユ潗鏂欎负鏉′欢寮�濮嬪尮閰�
-                        if (range.MaterialName == null)
-                        {
-                            materialList.Add(range);
-                        }
-                        else
-                        {
-                            int commonCount = GetIntersect(input.Material, range.MaterialName);
-                            if (commonCount > firstCount)
-                            {
-                                materialList.Add(range);
-                                firstCount = commonCount;
-                            }
-                        }
-                    }
-                    //鐢ㄥ凡缁忕瓫閫夊畬鎴愮殑鍒楄〃涓互鍚嶇О绛涢��
-                    firstCount = 0;
-                    if (materialList.Count < 1)
-                        return false;
-                    var allMatchingList = materialList
-  .Where(x => GetIntersect(x.KeyWord == string.Empty ? x.Name : x.KeyWord, input.ModelType) >= 2)
-  .OrderByDescending(x => GetIntersect(x.KeyWord == string.Empty ? x.Name : x.KeyWord, input.ModelType))
-  .ToList();//鎵惧嚭鐩稿悓瀛楃鍦�2浠ヤ笂骞朵笖杩涜鎺掑簭
-                    if (allMatchingList.Count < 1)
-                        return false;//閫氳繃鍨嬪彿鍚嶆病鏈夋壘鍒�,鍒欒涓烘病鏈夊尮閰嶅埌
-                    foreach (var item in allMatchingList)
-                    {
-                        if (item.IsDefault)
-                        {
-                            vmo = item;
-                        }
-                    }
-                    vmo = allMatchingList.First();//濡傛灉娌℃湁璁剧疆榛樿鍊�,鍒欓粯璁よ繑鍥炲尮閰嶅瓧绗︽渶澶氱殑涓�鏉℃暟鎹�
-                }
-            }
-            //绮剧‘鍖归厤鍜岀矖绯欏尮閰嶉兘娌℃湁鍖归厤鍒板氨杩斿洖閿欒
-            firstCount = 0;
-            if (vmo != null)
-            {
-                input.MatchingMinorLoss = vmo.Coefficient;
-                input.MatchingDbId = vmo.ID.ToString();
-                input.MatchingMaterial = vmo.MaterialName;
-                input.MatchingModelType = vmo.Name;
-                input.MatchingConnectionLength = vmo.ConnectionLength;
-                input.MatchingAngle = vmo.Angle;
-                return true;
-            }
-            return false;
-        }
-
-        //涓夐�氬尮閰�
-        public static bool MatchingThreelink(ThreelinkMatchingViewModel input, List<Vmo.AssetsThreelinkMainVmo> adaptingManageVmos)
-        {
-            if (adaptingManageVmos == null)
-            {
-                return true;
-            }
-            Vmo.AssetsThreelinkMainVmo vmo = null;
-            int firstCount = 0;
-            // 缁濆鍖归厤
-            var absoluteMatch = adaptingManageVmos.Where(i =>
-              ((input.Caliber == null && i.Caliber == null) || i.Caliber == input.Caliber) &&
-               ((input.Material == null) || i.MaterialName == input.Material)).ToList();
-            if (absoluteMatch.Count > 1)
-            {
-                var allMatchingList = absoluteMatch
-    .Where(x => GetIntersect(x.KeyWord == string.Empty ? x.Name : x.KeyWord, input.ModelType) >= 2)
-    .OrderByDescending(x => GetIntersect(x.KeyWord == string.Empty ? x.Name : x.KeyWord, input.ModelType))
-    .ToList();//鎵惧嚭鐩稿悓瀛楃鍦�2浠ヤ笂骞朵笖杩涜鎺掑簭
-                if (allMatchingList.Count < 1)
-                    return false;//閫氳繃鍨嬪彿鍚嶆病鏈夋壘鍒�,鍒欒涓烘病鏈夊尮閰嶅埌
-                foreach (var item in allMatchingList)
-                {
-                    if (item.IsDefault)
-                    {
-                        vmo = item;
-                    }
-                }
-                vmo = allMatchingList.First();//濡傛灉娌℃湁璁剧疆榛樿鍊�,鍒欓粯璁よ繑鍥炲尮閰嶅瓧绗︽渶澶氱殑涓�鏉℃暟鎹�
-            }
-            else if (absoluteMatch.Count == 1)
-            {
-                vmo = absoluteMatch.First();
-            }
-            else
-            {
-                //鍖洪棿鍖归厤
-                var rangeMatch = adaptingManageVmos
-   .Where(item =>
-       input.Caliber == null ||
-       item.Caliber == null ||
-       Math.Abs(Convert.ToInt64(item.Caliber) - Convert.ToInt64(input.Caliber)) <= _caliberTolerance)
-   .ToList();
-                if (rangeMatch != null && rangeMatch.Count > 0)
-                {
-                    var materialList = new List<Vmo.AssetsThreelinkMainVmo>();
-                    foreach (var range in rangeMatch)
-                    {
-                        //浠ユ潗鏂欎负鏉′欢寮�濮嬪尮閰�
-                        if (range.MaterialName == null)
-                        {
-                            materialList.Add(range);
-                        }
-                        else
-                        {
-                            int commonCount = GetIntersect(input.Material, range.MaterialName);
-                            if (commonCount > firstCount)
-                            {
-                                materialList.Add(range);
-                                firstCount = commonCount;
-                            }
-                        }
-                    }
-                    //鐢ㄥ凡缁忕瓫閫夊畬鎴愮殑鍒楄〃涓互鍚嶇О绛涢��
-                    firstCount = 0;
-                    if (materialList.Count < 1)
-                        return false;
-                    var allMatchingList = materialList
-  .Where(x => GetIntersect(x.KeyWord == string.Empty ? x.Name : x.KeyWord, input.ModelType) >= 2)
-  .OrderByDescending(x => GetIntersect(x.KeyWord == string.Empty ? x.Name : x.KeyWord, input.ModelType))
-  .ToList();//鎵惧嚭鐩稿悓瀛楃鍦�2浠ヤ笂骞朵笖杩涜鎺掑簭
-                    if (allMatchingList.Count < 1)
-                        return false;//閫氳繃鍨嬪彿鍚嶆病鏈夋壘鍒�,鍒欒涓烘病鏈夊尮閰嶅埌
-                    foreach (var item in allMatchingList)
-                    {
-                        if (item.IsDefault)
-                        {
-                            vmo = item;
-                        }
-                    }
-                    vmo = allMatchingList.First();//濡傛灉娌℃湁璁剧疆榛樿鍊�,鍒欓粯璁よ繑鍥炲尮閰嶅瓧绗︽渶澶氱殑涓�鏉℃暟鎹�
-                }
-            }
-            //绮剧‘鍖归厤鍜岀矖绯欏尮閰嶉兘娌℃湁鍖归厤鍒板氨杩斿洖閿欒
-            firstCount = 0;
-            if (vmo != null)
-            {
-                input.MatchingMinorLoss = vmo.Coefficient;
-                input.MatchingDbId = vmo.ID.ToString();
-                input.MatchingMaterial = vmo.MaterialName;
-                input.MatchingModelType = vmo.Name;
-                input.MatchingRunThroughCoefficient = vmo.RunThroughCoefficient;
-                input.MatchingBranchThroughCoefficient = vmo.BranchThroughCoefficient;
-                return true;
-            }
-            return false;
-        }
-
-        //鍥涢�氬尮閰�
-        public static bool MatchingFourlink(FourlinkMatchingViewModel input, List<Vmo.AssetsFourlinkMainVmo> adaptingManageVmos)
-        {
-            if (adaptingManageVmos == null)
-            {
-                return true;
-            }
-            Vmo.AssetsFourlinkMainVmo vmo = null;
-            int firstCount = 0;
-            // 缁濆鍖归厤
-            var absoluteMatch = adaptingManageVmos.Where(i =>
-              ((input.Caliber == null && i.Caliber == null) || i.Caliber == input.Caliber) &&
-               ((input.Material == null) || i.MaterialName == input.Material)).ToList();
-            if (absoluteMatch.Count > 1)
-            {
-                var allMatchingList = absoluteMatch
-    .Where(x => GetIntersect(x.KeyWord == string.Empty ? x.Name : x.KeyWord, input.ModelType) >= 2)
-    .OrderByDescending(x => GetIntersect(x.KeyWord == string.Empty ? x.Name : x.KeyWord, input.ModelType))
-    .ToList();//鎵惧嚭鐩稿悓瀛楃鍦�2浠ヤ笂骞朵笖杩涜鎺掑簭
-                if (allMatchingList.Count < 1)
-                    return false;//閫氳繃鍨嬪彿鍚嶆病鏈夋壘鍒�,鍒欒涓烘病鏈夊尮閰嶅埌
-                foreach (var item in allMatchingList)
-                {
-                    if (item.IsDefault)
-                    {
-                        vmo = item;
-                    }
-                }
-                vmo = allMatchingList.First();//濡傛灉娌℃湁璁剧疆榛樿鍊�,鍒欓粯璁よ繑鍥炲尮閰嶅瓧绗︽渶澶氱殑涓�鏉℃暟鎹�
-            }
-            else if (absoluteMatch.Count == 1)
-            {
-                vmo = absoluteMatch.First();
-            }
-            else
-            {
-                //鍖洪棿鍖归厤
-                var rangeMatch = adaptingManageVmos
-   .Where(item =>
-       input.Caliber == null ||
-       item.Caliber == null ||
-       Math.Abs(Convert.ToInt64(item.Caliber) - Convert.ToInt64(input.Caliber)) <= _caliberTolerance)
-   .ToList();
-                if (rangeMatch != null && rangeMatch.Count > 0)
-                {
-                    var materialList = new List<Vmo.AssetsFourlinkMainVmo>();
-                    foreach (var range in rangeMatch)
-                    {
-                        //浠ユ潗鏂欎负鏉′欢寮�濮嬪尮閰�
-                        if (range.MaterialName == null)
-                        {
-                            materialList.Add(range);
-                        }
-                        else
-                        {
-                            int commonCount = GetIntersect(input.Material, range.MaterialName);
-                            if (commonCount > firstCount)
-                            {
-                                materialList.Add(range);
-                                firstCount = commonCount;
-                            }
-                        }
-                    }
-                    //鐢ㄥ凡缁忕瓫閫夊畬鎴愮殑鍒楄〃涓互鍚嶇О绛涢��
-                    firstCount = 0;
-                    if (materialList.Count < 1)
-                        return false;
-                    var allMatchingList = materialList
-  .Where(x => GetIntersect(x.KeyWord == string.Empty ? x.Name : x.KeyWord, input.ModelType) >= 2)
-  .OrderByDescending(x => GetIntersect(x.KeyWord == string.Empty ? x.Name : x.KeyWord, input.ModelType))
-  .ToList();//鎵惧嚭鐩稿悓瀛楃鍦�2浠ヤ笂骞朵笖杩涜鎺掑簭
-                    if (allMatchingList.Count < 1)
-                        return false;//閫氳繃鍨嬪彿鍚嶆病鏈夋壘鍒�,鍒欒涓烘病鏈夊尮閰嶅埌
-                    foreach (var item in allMatchingList)
-                    {
-                        if (item.IsDefault)
-                        {
-                            vmo = item;
-                        }
-                    }
-                    vmo = allMatchingList.First();//濡傛灉娌℃湁璁剧疆榛樿鍊�,鍒欓粯璁よ繑鍥炲尮閰嶅瓧绗︽渶澶氱殑涓�鏉℃暟鎹�
-                }
-            }
-            //绮剧‘鍖归厤鍜岀矖绯欏尮閰嶉兘娌℃湁鍖归厤鍒板氨杩斿洖閿欒
-            firstCount = 0;
-            if (vmo != null)
-            {
-                input.MatchingMinorLoss = vmo.Coefficient;
-                input.MatchingDbId = vmo.ID.ToString();
-                input.MatchingMaterial = vmo.MaterialName;
-                input.MatchingModelType = vmo.Name;
-                return true;
-            }
-            return false;
-        }
-
-        /// <summary>
-        /// 鑾峰彇涓や釜瀛楃涓茬殑鎵�鏈変氦闆�
-        /// </summary>
-        public static int GetIntersect(string str1, string str2)
-        {
-            if (str1 == null || str2 == null) return 0;
-
-            return string.Join("", str1.Intersect(str2)).Count();
-        }
-    }
-}
\ No newline at end of file
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/01-property/XhsProjectSimulationPropertyCtrl.cs b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/01-property/XhsProjectSimulationPropertyCtrl.cs
index b02805d..38a4fb0 100644
--- a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/01-property/XhsProjectSimulationPropertyCtrl.cs
+++ b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/01-property/XhsProjectSimulationPropertyCtrl.cs
@@ -11,85 +11,75 @@
         public XhsProjectSimulationPropertyCtrl()
         {
             InitializeComponent();
-            this.hydroVisualPropertyCtrl1.MatchingDbEvent += HydroParterPropertyCtrl1_MatchingDbEvent;
-            this.hydroVisualPropertyCtrl1.SetCurveEvent += HydroParterPropertyCtrl1_SetCurveEvent;
-            this.hydroVisualPropertyCtrl1.SetPatternEvent += HydroParterPropertyCtrl1_SetPatternEvent;
-            this.hydroVisualPropertyCtrl1.BlinkLinkParterEvent += HydroParterPropertyCtrl1_BlinkLinkParterEvent;
-            this.hydroVisualPropertyCtrl1.HydroViewEvent += HydroParterPropertyCtrl1_ViewParterEvent;
+            this.hydroVisualPropertyCtrl1.MatchingDbEvent += HydroVisualPropertyCtrl1_MatchingDbEvent;
+            this.hydroVisualPropertyCtrl1.SetCurveEvent += HydroVisualPropertyCtrl1_SetCurveEvent;
+            this.hydroVisualPropertyCtrl1.SetPatternEvent += HydroVisualPropertyCtrl1_SetPatternEvent;
 
-            this.hydroVisualPropertyCtrl1.PropertyValueChangedEvent += HydroParterPropertyCtrl1_PropertyValueChangedEvent;
-            this.hydroVisualPropertyCtrl1.MarkPropertyValueChangedEvent += HydroParterPropertyCtrl1_MarkPropertyValueChangedEvent;
-            this.hydroVisualPropertyCtrl1.GradingPropertyValueChangedEvent += HydroParterPropertyCtrl1_GradingPropertyValueChangedEvent;
-            this.hydroVisualPropertyCtrl1.FlowDirectionPropertyValueChangedEvent += HydroParterPropertyCtrl1_FlowDirectionPropertyValueChangedEvent;
+            this.hydroVisualPropertyCtrl1.HydroViewEvent += HydroVisualPropertyCtrl1_HydroViewEvent;
+            this.hydroVisualPropertyCtrl1.BlinkLinkNodeEvent += HydroVisualPropertyCtrl1_BlinkLinkNodeEvent;
+            this.hydroVisualPropertyCtrl1.PropertyValueChangedEvent += HydroVisualPropertyCtrl1_PropertyValueChangedEvent;
+            this.hydroVisualPropertyCtrl1.MarkPropertyValueChangedEvent += HydroVisualPropertyCtrl1_MarkPropertyValueChangedEvent;
+            this.hydroVisualPropertyCtrl1.GradingPropertyValueChangedEvent += HydroPVisualPropertyCtrl1_GradingPropertyValueChangedEvent;
+            this.hydroVisualPropertyCtrl1.FlowEffectPropertyValueChangedEvent += HydroVisualPropertyCtrl1_FlowEffectPropertyValueChangedEvent;
         }
 
+        #region 浜嬩欢闆�
 
-
-
-
+        /// <summary>
+        /// 鏋勪欢鏌ョ湅浜嬩欢
+        /// </summary>
+        public event Action<HydroVisualViewModel> HydroViewEvent;
 
         /// <summary>
         /// 寮鸿皟杩炴帴缁勪欢浜嬩欢
-        /// 绗竴涓弬鏁颁负缁勪欢Code
-        /// 绗簩涓弬鏁颁负杩炴帴缁勪欢Code
+        /// 绗竴涓弬鏁颁负缁勪欢
+        /// 绗簩涓弬鏁颁负杩炴帴鑺傜偣Code
         /// </summary>
-        public event Action<string, string> BlinkLinkParterEvent;
+        public event Action<HydroLinkViewModel, string> BlinkLinkNodeEvent;
 
         /// <summary>
         /// 灞炴�у�兼敼鍙樹簨浠�
         /// </summary>
-        public event Action<Yw.Model.HydroVisualInfo> PropertyValueChangedEvent;
+        public event Action<HydroVisualViewModel> PropertyValueChangedEvent;
 
         /// <summary>
         /// 鏍囨敞灞炴�у�兼敼鍙樹簨浠�
         /// </summary>
-        public event Action<Yw.Model.HydroVisualInfo> MarkPropertyValueChangedEvent;
+        public event Action<HydroVisualViewModel> MarkPropertyValueChangedEvent;
 
         /// <summary>
         /// 鍒嗙骇灞炴�у�兼敼鍙樹簨浠�
         /// </summary>
-        public event Action<Yw.Model.HydroVisualInfo> GradingPropertyValueChangedEvent;
+        public event Action<HydroVisualViewModel> GradingPropertyValueChangedEvent;
 
         /// <summary>
-        /// 娴佸悜灞炴�у�兼敼鍙樹簨浠�
+        /// 姘存祦鍔ㄧ敾灞炴�у�兼敼鍙樹簨浠�
         /// </summary>
-        public event Action<Yw.Model.HydroVisualInfo> FlowDirectionPropertyValueChangedEvent;
+        public event Action<HydroVisualViewModel> FlowEffectPropertyValueChangedEvent;
+
+        #endregion
+
+        #region 灞炴�ц祴鍊�
 
         /// <summary>
-        /// 鏌ョ湅鏋勪欢浜嬩欢
+        /// 閫夋嫨瀵硅薄
         /// </summary>
-        public event Action<Yw.Model.HydroVisualInfo> ViewParterEvent;
-
-        //姘村姏淇℃伅鏂规硶
-        private Func<Yw.Model.HydroModelInfo> _hydroInfoFunc = null;
-        private Func<List<HydroCalcuVisualResult>> _allHydroCalcuResultListFunc = null;
-
-        /// <summary>
-        /// 鍒濆鍖栨暟鎹�
-        /// </summary>
-        public void InitialData(Func<Yw.Model.HydroModelInfo> hydroInfoFunc, Func<List<HydroCalcuVisualResult>> allHydroCalcuResultListFunc)
-        {
-            _hydroInfoFunc = hydroInfoFunc;
-            _allHydroCalcuResultListFunc = allHydroCalcuResultListFunc;
-        }
-
-        //鑾峰彇姘村姏淇℃伅
-        private Yw.Model.HydroModelInfo GetHydroInfo()
-        {
-            var hydroInfo = _hydroInfoFunc?.Invoke();
-            if (hydroInfo == null)
-            {
-                this.hydroVisualPropertyCtrl1.SelectedObject = null;
-                return default;
-            }
-            return hydroInfo;
-        }
-
-
         public HydroVisualViewModel SelectedObject
         {
             get { return this.hydroVisualPropertyCtrl1.SelectedObject; }
             set { this.hydroVisualPropertyCtrl1.SelectedObject = value; }
+        }
+
+        #endregion
+
+        #region 灞炴�ф洿鏂�
+
+        /// <summary>
+        /// 閲嶆柊杞藉叆鏁版嵁
+        /// </summary>
+        public void UpdateData()
+        {
+            this.hydroVisualPropertyCtrl1?.UpdateData();
         }
 
         /// <summary>
@@ -98,14 +88,6 @@
         public void UpdateRows()
         {
             this.hydroVisualPropertyCtrl1?.UpdateRows();
-        }
-
-        /// <summary>
-        /// 閲嶆柊杞藉叆鏁版嵁
-        /// </summary>
-        public void UpdateData()
-        {
-            this.hydroVisualPropertyCtrl1?.UpdateData();
         }
 
         /// <summary>
@@ -122,186 +104,38 @@
             this.hydroVisualPropertyCtrl1.UpdateRows();
         }
 
-        /// <summary>
-        /// 鏇存柊璁$畻灞炴��
-        /// </summary>
-        public void UpdateCalcuProperty(Yw.WinFrmUI.HydroCalcuVisualResult calcuResult)
-        {
-            if (calcuResult == null)
-            {
-                return;
-            }
-            var vm = this.hydroVisualPropertyCtrl1.SelectedObject;
-            if (vm == null)
-            {
-                return;
-            }
-            vm.UpdateCalcuProperty(calcuResult);
-            this.hydroVisualPropertyCtrl1.UpdateRows();
-        }
+        #endregion
 
-        //閫夋嫨鏇茬嚎
-        private bool HydroParterPropertyCtrl1_SetCurveEvent(HydroParterViewModel propViewModel, string curveType)
+        #region 浜嬩欢瀹炵幇
+
+        //鍖归厤Db
+        private bool HydroVisualPropertyCtrl1_MatchingDbEvent(HydroVisualViewModel vm)
         {
-            var hydroInfo = _hydroInfoFunc?.Invoke();
-            if (hydroInfo == null)
+            if (vm == null)
             {
                 return false;
             }
-            switch (curveType)
-            {
-                case Yw.WinFrmUI.HydroCurve.Pump:
-                    {
-                        var pumpInfo = hydroInfo.Pumps?.Find(x => x.Code == propViewModel.Code);
-                        if (pumpInfo == null)
-                        {
-                            break;
-                        }
-                        var input = AssetsMatchingParasHelper.Create(hydroInfo, pumpInfo, _allHydroCalcuResultListFunc?.Invoke());
-                        var dlg = new SinglePumpAnalyDlg();
-                        dlg.SetBindindData(input);
-                        dlg.ReloadDataEvent += (output) =>
-                        {
-                            var bol = AssetsMatchingParasHelper.Apply(hydroInfo, output);
-                            if (bol)
-                            {
-                                propViewModel.UpdateProperty();
-                                this.hydroVisualPropertyCtrl1.UpdateRows();
-                            }
-                            return bol;
-                        };
-                        dlg.ShowDialog();
-                        return true;
-                    }
-                case Yw.WinFrmUI.HydroCurve.PumpQH:
-                    {
-                        return false;
-                    }
-                case Yw.WinFrmUI.HydroCurve.PumpQP:
-                    {
-                        return false;
-                    }
-                case Yw.WinFrmUI.HydroCurve.PumpQE:
-                    {
-                        return false;
-                    }
-                case Yw.WinFrmUI.HydroCurve.Valve:
-                    { 
-                        return false;
-                    }
-                case Yw.WinFrmUI.HydroCurve.ValveQL:
-                    {
-                        return false;
-                    }
-                default: break;
-            }
-            return false;
-        }
-
-        //閫夋嫨妯″紡
-        private bool HydroParterPropertyCtrl1_SetPatternEvent(HydroParterViewModel propViewModel, string patternType)
-        {
-            switch (patternType)
-            {
-                case Yw.WinFrmUI.HydroPattern.Demand:
-                    {
-                    }
-                    break;
-
-                case Yw.WinFrmUI.HydroPattern.Head:
-                    {
-                    }
-                    break;
-
-                default: break;
-            }
-            return true;
-        }
-
-        //灞炴�у彂鐢熸敼鍙�
-        private void HydroParterPropertyCtrl1_PropertyValueChangedEvent(HydroVisualViewModel vm)
-        {
-            if (vm == null)
-            {
-                return;
-            }
-            this.PropertyValueChangedEvent?.Invoke(vm.Vmo);
-        }
-
-        //鏍囨敞灞炴�у彂鐢熸敼鍙�
-        private void HydroParterPropertyCtrl1_MarkPropertyValueChangedEvent(HydroVisualViewModel vm)
-        {
-            if (vm == null)
-            {
-                return;
-            }
-            this.MarkPropertyValueChangedEvent?.Invoke(vm.Vmo);
-        }
-
-        //鍒嗙骇灞炴�у彂鐢熸敼鍙�
-        private void HydroParterPropertyCtrl1_GradingPropertyValueChangedEvent(HydroVisualViewModel vm)
-        {
-            if (vm == null)
-            {
-                return;
-            }
-            this.GradingPropertyValueChangedEvent?.Invoke(vm.Vmo);
-        }
-
-        //娴佸悜灞炴�у彂鐢熸敼鍙�
-        private void HydroParterPropertyCtrl1_FlowDirectionPropertyValueChangedEvent(HydroVisualViewModel vm)
-        {
-            if (vm == null)
-            {
-                return;
-            }
-            this.FlowDirectionPropertyValueChangedEvent?.Invoke(vm.Vmo);
-        }
-
-
-
-
-
-
-        //灞炴�ф鍦ㄥ彂鐢熸敼鍙�
-        private bool HydroParterPropertyCtrl1_PropertyValueChangingEvent(HydroParterViewModel arg)
-        {
-            return false;
-        }
-
-        //鍖归厤Db
-        private bool HydroParterPropertyCtrl1_MatchingDbEvent(HydroParterViewModel propertyViewModel)
-        {
             var bol = false;
-            if (propertyViewModel == null)
-            {
-                return bol;
-            }
-            var hydroInfo = _hydroInfoFunc?.Invoke();
-            if (hydroInfo == null)
-            {
-                return bol;
-            }
-            var catalog = Yw.WinFrmUI.HydroParterCatalogHelper.GetCode(propertyViewModel.Catalog);
+            var catalog = HydroParterCatalogHelper.GetCode(vm.Catalog);
             switch (catalog)
             {
                 case Yw.Hydro.ParterCatalog.Pump://姘存车
                     {
-                        var pumpInfo = hydroInfo.Pumps?.Find(x => x.Code == propertyViewModel.Code);
+                        var pumpInfo = vm.HydroInfo.Pumps?.Find(x => x.Code == vm.Code);
                         if (pumpInfo == null)
                         {
                             break;
                         }
 
-                        var input = AssetsMatchingParasHelper.Create(hydroInfo, pumpInfo, _allHydroCalcuResultListFunc?.Invoke());
+                        var input = AssetsMatchingParasHelper.Create(vm.HydroInfo, pumpInfo, null);
                         var dlg = new PumpSingleMatchingDlg();
                         dlg.SetBindingData(input);
                         dlg.ReloadDataEvent += (output) =>
                         {
-                            bol = AssetsMatchingParasHelper.Apply(hydroInfo, output);
+                            bol = AssetsMatchingParasHelper.Apply(vm.HydroInfo, output);
                             if (bol)
                             {
-                                propertyViewModel.UpdateProperty();
+                                vm.UpdateProperty();
                             }
                         };
                         dlg.ShowDialog();
@@ -309,20 +143,20 @@
                     break;
                 case Yw.Hydro.ParterCatalog.Valve://闃�闂�
                     {
-                        var valveInfo = hydroInfo.Valves?.Find(x => x.Code == propertyViewModel.Code);
+                        var valveInfo = vm.HydroInfo.Valves?.Find(x => x.Code == vm.Code);
                         if (valveInfo == null)
                         {
                             break;
                         }
-                        var input = AssetsMatchingParasHelper.Create(hydroInfo, valveInfo, _allHydroCalcuResultListFunc?.Invoke());
+                        var input = AssetsMatchingParasHelper.Create(vm.HydroInfo, valveInfo, null);
                         var dlg = new ValveSingleMatchingDlg();
                         dlg.SetBindingData(input);
                         dlg.ReloadDataEvent += (rhs) =>
                         {
-                            var bol = AssetsMatchingParasHelper.Apply(hydroInfo, rhs);
+                            bol = AssetsMatchingParasHelper.Apply(vm.HydroInfo, rhs);
                             if (bol)
                             {
-                                propertyViewModel.UpdateProperty();
+                                vm.UpdateProperty();
                                 this.hydroVisualPropertyCtrl1.UpdateRows();
                             }
                         };
@@ -335,20 +169,20 @@
                     break;
                 case Yw.Hydro.ParterCatalog.Elbow://寮ご
                     {
-                        var elbowInfo = hydroInfo.Elbows?.Find(x => x.Code == propertyViewModel.Code);
+                        var elbowInfo = vm.HydroInfo.Elbows?.Find(x => x.Code == vm.Code);
                         if (elbowInfo == null)
                         {
                             break;
                         }
-                        var input = AssetsMatchingParasHelper.Create(hydroInfo, elbowInfo, _allHydroCalcuResultListFunc?.Invoke());
+                        var input = AssetsMatchingParasHelper.Create(vm.HydroInfo, elbowInfo, null);
                         var dlg = new ElbowSingMatchingDlg();
                         dlg.SetBindingData(input);
                         dlg.ReloadDataEvent += (output) =>
                         {
-                            var bol = AssetsMatchingParasHelper.Apply(hydroInfo, output);
+                            bol = AssetsMatchingParasHelper.Apply(vm.HydroInfo, output);
                             if (bol)
                             {
-                                propertyViewModel.UpdateProperty();
+                                vm.UpdateProperty();
                                 this.hydroVisualPropertyCtrl1.UpdateRows();
                             }
                         };
@@ -368,30 +202,151 @@
             return bol;
         }
 
-        //寮鸿皟杩炴帴缁勪欢
-        private void HydroParterPropertyCtrl1_BlinkLinkParterEvent(string code, string linkCode)
+        //閫夋嫨鏇茬嚎
+        private bool HydroVisualPropertyCtrl1_SetCurveEvent(HydroVisualViewModel vm, string curveType)
         {
-            if (string.IsNullOrEmpty(code))
+            if (vm == null)
             {
-                return;
+                return false;
             }
-            if (string.IsNullOrEmpty(linkCode))
+            switch (curveType)
             {
-                return;
+                case HydroCurve.Pump:
+                    {
+                        var pumpInfo = vm.HydroInfo.Pumps?.Find(x => x.Code == vm.Code);
+                        if (pumpInfo == null)
+                        {
+                            break;
+                        }
+                        var input = AssetsMatchingParasHelper.Create(vm.HydroInfo, pumpInfo, null);
+                        var dlg = new SinglePumpAnalyDlg();
+                        dlg.SetBindindData(input);
+                        dlg.ReloadDataEvent += (output) =>
+                        {
+                            var bol = AssetsMatchingParasHelper.Apply(vm.HydroInfo, output);
+                            if (bol)
+                            {
+                                vm.UpdateProperty();
+                                this.hydroVisualPropertyCtrl1.UpdateRows();
+                            }
+                            return bol;
+                        };
+                        dlg.ShowDialog();
+                        return true;
+                    }
+                case HydroCurve.PumpQH:
+                    {
+                        return false;
+                    }
+                case HydroCurve.PumpQP:
+                    {
+                        return false;
+                    }
+                case HydroCurve.PumpQE:
+                    {
+                        return false;
+                    }
+                case HydroCurve.Valve:
+                    {
+                        return false;
+                    }
+                case HydroCurve.ValveQL:
+                    {
+                        return false;
+                    }
+                default: break;
             }
-            this.BlinkLinkParterEvent?.Invoke(code, linkCode);
+            return false;
         }
 
-        //鏌ョ湅鏋勪欢
-        private void HydroParterPropertyCtrl1_ViewParterEvent(HydroVisualViewModel vm)
+        //閫夋嫨妯″紡
+        private bool HydroVisualPropertyCtrl1_SetPatternEvent(HydroVisualViewModel vm, string patternType)
+        {
+            switch (patternType)
+            {
+                case HydroPattern.Head:
+                    {
+                        return false;
+                    }
+                case HydroPattern.Demand:
+                    {
+                        return false;
+                    }
+                default: break;
+            }
+            return false;
+        }
+
+        #endregion
+
+        #region 浜嬩欢绌块��
+
+        //鏋勪欢鏌ョ湅浜嬩欢
+        private void HydroVisualPropertyCtrl1_HydroViewEvent(HydroVisualViewModel vm)
         {
             if (vm == null)
             {
                 return;
             }
-            this.ViewParterEvent?.Invoke(vm.Vmo);
+            this.HydroViewEvent?.Invoke(vm);
         }
 
+        //寮鸿皟杩炴帴鑺傜偣
+        private void HydroVisualPropertyCtrl1_BlinkLinkNodeEvent(HydroLinkViewModel vm, string linkNodeCode)
+        {
+            if (vm == null)
+            {
+                return;
+            }
+            if (string.IsNullOrEmpty(linkNodeCode))
+            {
+                return;
+            }
+            this.BlinkLinkNodeEvent?.Invoke(vm, linkNodeCode);
+        }
+
+        //灞炴�у彂鐢熸敼鍙�
+        private void HydroVisualPropertyCtrl1_PropertyValueChangedEvent(HydroVisualViewModel vm)
+        {
+            if (vm == null)
+            {
+                return;
+            }
+            this.PropertyValueChangedEvent?.Invoke(vm);
+        }
+
+        //鏍囨敞灞炴�у彂鐢熸敼鍙�
+        private void HydroVisualPropertyCtrl1_MarkPropertyValueChangedEvent(HydroVisualViewModel vm)
+        {
+            if (vm == null)
+            {
+                return;
+            }
+            this.MarkPropertyValueChangedEvent?.Invoke(vm);
+        }
+
+        //鍒嗙骇灞炴�у彂鐢熸敼鍙�
+        private void HydroPVisualPropertyCtrl1_GradingPropertyValueChangedEvent(HydroVisualViewModel vm)
+        {
+            if (vm == null)
+            {
+                return;
+            }
+            this.GradingPropertyValueChangedEvent?.Invoke(vm);
+        }
+
+        //姘存祦鍔ㄧ敾灞炴�у彂鐢熸敼鍙�
+        private void HydroVisualPropertyCtrl1_FlowEffectPropertyValueChangedEvent(HydroVisualViewModel vm)
+        {
+            if (vm == null)
+            {
+                return;
+            }
+            this.FlowEffectPropertyValueChangedEvent?.Invoke(vm);
+        }
+
+        #endregion
+
 
     }
 }
\ No newline at end of file
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 b1d455f..c016336 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
@@ -343,17 +343,25 @@
         /// <summary>
         /// 璁剧疆寮鸿皟鏋勪欢
         /// </summary>
-        public async Task SetBlinkComponents(List<string> elementIds, string color, double transparency)
+        public async Task SetBlinkComponents(string elementId, string color = _blinkColor, double transparency = _blinkTransparency)
         {
-            await _bimfaceInteropContainer?.SetBlinkComponents(elementIds, color, transparency);
+            if (string.IsNullOrEmpty(elementId))
+            {
+                return;
+            }
+            await _bimfaceInteropContainer?.SetBlinkComponents(new List<string>() { elementId }, color, transparency);
         }
 
         /// <summary>
         /// 璁剧疆寮鸿皟鏋勪欢
         /// </summary>
-        public async Task SetBlinkComponents(List<string> elementIds)
+        public async Task SetBlinkComponents(List<string> elementIds, string color = _blinkColor, double transparency = _blinkTransparency)
         {
-            await _bimfaceInteropContainer?.SetBlinkComponents(elementIds, _blinkColor, _blinkTransparency);
+            if (elementIds == null || elementIds.Count < 1)
+            {
+                return;
+            }
+            await _bimfaceInteropContainer?.SetBlinkComponents(elementIds, color, transparency);
         }
 
         /// <summary>
@@ -415,7 +423,7 @@
         /// <summary>
         /// 鏄剧ず涓氬姟璁$畻鑷畾涔夋爣绛�
         /// </summary>
-        public async Task SetLogicCalcuCustomLabels(CalcuResult calcuResult)
+        public async Task SetLogicCalcuCustomLabelsCalcuResult(HydroCalcuResult calcuResult)
         {
             var hydroInfo = _hydroInfoFunc?.Invoke();
             if (hydroInfo == null)
@@ -438,9 +446,9 @@
                 if (x is Yw.Model.HydroPumpInfo pump)
                 {
                     var hz = Math.Round(pump.RatedHz * pump.SpeedRatio);
-                    var calcuPump = calcuResult.LinkList.Find(x => x.Id == pump.Code);
-                    var calcuPumpStart = calcuResult.NodeList.Find(x => x.Id == pump.StartCode);
-                    var calcuPumpEnd = calcuResult.NodeList.Find(x => x.Id == pump.EndCode);
+                    var calcuPump = calcuResult.LinkList.Find(x => x.Code == pump.Code);
+                    var calcuPumpStart = calcuResult.NodeList.Find(x => x.Code == pump.StartCode);
+                    var calcuPumpEnd = calcuResult.NodeList.Find(x => x.Code == pump.EndCode);
                     var pumpCustomLabel = new LogicCalcuCustomLabel();
                     pumpCustomLabel.Id = pump.Code;
                     pumpCustomLabel.Distance = 10000;
@@ -448,22 +456,22 @@
                     {
                         new LogicCalcuCustomLabelItem(){ Name="鐘舵��",Value=HydroLinkStatusHelper.GetStatusName(pump.LinkStatus),Unit=string.Empty},
                         new LogicCalcuCustomLabelItem(){ Name="棰戠巼",Value=hz.ToString(),Unit=string.Empty},
-                        new LogicCalcuCustomLabelItem(){ Name="娴侀噺",Value=Math.Round(calcuPump.Flow,1).ToString(),Unit="m鲁/h"},
-                        new LogicCalcuCustomLabelItem(){ Name="杩涘彛鍘嬪姏",Value=Math.Round(calcuPumpStart.Head,4).ToString(),Unit="m"},
-                        new LogicCalcuCustomLabelItem(){ Name="鍑哄彛鍘嬪姏",Value=Math.Round(calcuPumpEnd.Head,4).ToString(),Unit="m"},
+                        new LogicCalcuCustomLabelItem(){ Name="娴侀噺",Value=Math.Round(calcuPump.CalcuFlow.Value,1).ToString(),Unit="m鲁/h"},
+                        new LogicCalcuCustomLabelItem(){ Name="杩涘彛鍘嬪姏",Value=Math.Round(calcuPumpStart.CalcuHead.Value,4).ToString(),Unit="m"},
+                        new LogicCalcuCustomLabelItem(){ Name="鍑哄彛鍘嬪姏",Value=Math.Round(calcuPumpEnd.CalcuHead.Value,4).ToString(),Unit="m"},
                     };
                     obj.Add(pumpCustomLabel);
                 }
                 else if (x is Yw.Model.HydroEmitterInfo emitter)
                 {
-                    var calcuEmitter = calcuResult.NodeList.Find(x => x.Id == emitter.Code);
+                    var calcuEmitter = calcuResult.NodeList.Find(x => x.Code == emitter.Code);
                     var emitterCustomLabel = new LogicCalcuCustomLabel();
                     emitterCustomLabel.Id = emitter.Code;
                     emitterCustomLabel.Distance = 10000;
                     emitterCustomLabel.Data = new List<LogicCalcuCustomLabelItem>()
                     {
-                        new LogicCalcuCustomLabelItem(){ Name="娴侀噺",Value=Math.Round(calcuEmitter.Demand,1).ToString(),Unit="m鲁/h"},
-                        new LogicCalcuCustomLabelItem(){ Name="鍘嬪姏",Value=Math.Round(calcuEmitter.Head,4).ToString(),Unit="m"}
+                        new LogicCalcuCustomLabelItem(){ Name="娴侀噺",Value=Math.Round(calcuEmitter.CalcuDemand.Value,1).ToString(),Unit="m鲁/h"},
+                        new LogicCalcuCustomLabelItem(){ Name="鍘嬪姏",Value=Math.Round(calcuEmitter.CalcuDemand.Value,4).ToString(),Unit="m"}
                     };
                     obj.Add(emitterCustomLabel);
                 }
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 ca539a6..d6479f6 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
@@ -179,57 +179,57 @@
             {
                 _propertyCtrl = new XhsProjectSimulationPropertyCtrl();
                 _propertyCtrl.Dock = DockStyle.Fill;
-                _propertyCtrl.InitialData(() => _hydroInfo, () => GetCalcuResultList());
-                _propertyCtrl.BlinkLinkParterEvent += async (code, linkCode) =>
-                { //寮鸿皟杩炴帴缁勪欢
-                    if (string.IsNullOrEmpty(code))
-                    {
-                        return;
-                    }
-                    if (string.IsNullOrEmpty(linkCode))
-                    {
-                        return;
-                    }
-                    if (_hydroInfo == null)
-                    {
-                        return;
-                    }
-                    var allVisualList = _hydroInfo.GetAllVisuals();
-                    if (allVisualList == null || allVisualList.Count < 1)
-                    {
-                        return;
-                    }
-                    var linkParter = allVisualList.Find(x => x.Code == linkCode);
-                    if (linkParter == null)
-                    {
-                        return;
-                    }
-                    var blinkCodes = new List<string>();
-                    if (linkParter.GetType() == typeof(Yw.Model.HydroJunctionInfo))
-                    {
-                        var allLinkList = _hydroInfo.GetAllLinks();
-                        if (allLinkList == null || allLinkList.Count < 1)
-                        {
-                            return;
-                        }
-                        var linkList = allLinkList.Where(x => (x.StartCode == linkParter.Code || x.EndCode == linkParter.Code) && x.Code != code).ToList();
-                        if (linkList == null || linkList.Count < 1)
-                        {
-                            return;
-                        }
-                        blinkCodes.AddRange(linkList.Select(x => x.Code));
-                    }
-                    else
-                    {
-                        blinkCodes.Add(linkCode);
-                    }
+                //_propertyCtrl.InitialData(() => _hydroInfo, () => GetCalcuResultList());
+                //_propertyCtrl.BlinkLinkNodeEvent += async (code, linkCode) =>
+                //{ //寮鸿皟杩炴帴缁勪欢
+                //    if (string.IsNullOrEmpty(code))
+                //    {
+                //        return;
+                //    }
+                //    if (string.IsNullOrEmpty(linkCode))
+                //    {
+                //        return;
+                //    }
+                //    if (_hydroInfo == null)
+                //    {
+                //        return;
+                //    }
+                //    var allVisualList = _hydroInfo.GetAllVisuals();
+                //    if (allVisualList == null || allVisualList.Count < 1)
+                //    {
+                //        return;
+                //    }
+                //    var linkParter = allVisualList.Find(x => x.Code == linkCode);
+                //    if (linkParter == null)
+                //    {
+                //        return;
+                //    }
+                //    var blinkCodes = new List<string>();
+                //    if (linkParter.GetType() == typeof(Yw.Model.HydroJunctionInfo))
+                //    {
+                //        var allLinkList = _hydroInfo.GetAllLinks();
+                //        if (allLinkList == null || allLinkList.Count < 1)
+                //        {
+                //            return;
+                //        }
+                //        var linkList = allLinkList.Where(x => (x.StartCode == linkParter.Code || x.EndCode == linkParter.Code) && x.Code != code).ToList();
+                //        if (linkList == null || linkList.Count < 1)
+                //        {
+                //            return;
+                //        }
+                //        blinkCodes.AddRange(linkList.Select(x => x.Code));
+                //    }
+                //    else
+                //    {
+                //        blinkCodes.Add(linkCode);
+                //    }
 
-                    await _bimfaceCtrl?.SetBlinkComponents(blinkCodes);
-                    await Task.Delay(5000);
-                    await _bimfaceCtrl?.ClearBlinkComponents();
-                };
+                //    await _bimfaceCtrl?.SetBlinkComponents(blinkCodes);
+                //    await Task.Delay(5000);
+                //    await _bimfaceCtrl?.ClearBlinkComponents();
+                //};
 
-                _propertyCtrl.ViewParterEvent += (parter) =>
+                _propertyCtrl.HydroViewEvent += (parter) =>
                 {
                     if (parter == null)
                     {
@@ -256,11 +256,11 @@
                     //鍒嗙骇灞炴�у彂鐢熸敼鍙�
                     //鍒ゆ柇褰撳墠鏄惁鏈夊垎绾у睍绀猴紝鑻ユ湁鍒欐洿鏂板垎绾э紝鏈�濂芥槸鏇存柊鍗曚釜鍒嗙骇
                 };
-                _propertyCtrl.FlowDirectionPropertyValueChangedEvent += async (parter) =>
+                _propertyCtrl.FlowEffectPropertyValueChangedEvent += async (parter) =>
                 {
                     //娴佸悜灞炴�у彂鐢熸敼鍙�
                     //鍒ゆ柇娴佸悜鏄惁鍔犺浇锛屽鏋滃姞杞藉垯鏇存柊娴佸悜锛屾渶濂芥槸鏇存柊鍗曚釜娴佸悜
-                    UpdateFlowEffect(parter);
+                    //UpdateFlowEffect(parter);
                     //await _bimfaceCtrl?.UnloadFlowEffectById(parter.Code);
                 };
 
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/01-matching/01-viewmodel/ValveMatchingViewModel.cs b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/01-matching/01-viewmodel/ValveMatchingViewModel.cs
index dbd593d..fc84601 100644
--- a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/01-matching/01-viewmodel/ValveMatchingViewModel.cs
+++ b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/01-matching/01-viewmodel/ValveMatchingViewModel.cs
@@ -118,7 +118,7 @@
         /// </summary>
         [DisplayName("闃�闂ㄧ被鍨�")]
         [Browsable(true)]
-        public eValveType ValveType { get; set; }
+        public HStation.Assets.eValveType ValveType { get; set; }
 
         /// <summary>
         /// 闃�闂ㄨ缃�
@@ -174,7 +174,7 @@
         /// </summary>
         [DisplayName("鍖归厤闃�闂ㄧ被鍨�")]
         [Browsable(true)]
-        public eValveType? MatchingValveType { get; set; }
+        public HStation.Assets.eValveType? MatchingValveType { get; set; }
 
         /// <summary>
         /// 鍖归厤闃�闂ㄨ缃�
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 3fca934..060adc4 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
@@ -32,8 +32,8 @@
         {
             components = new Container();
             ComponentResourceManager resources = new ComponentResourceManager(typeof(XhsProjectSimulationCorePage));
-            DevExpress.Utils.SuperToolTip superToolTip1 = new DevExpress.Utils.SuperToolTip();
-            DevExpress.Utils.ToolTipItem toolTipItem1 = new DevExpress.Utils.ToolTipItem();
+            DevExpress.Utils.SuperToolTip superToolTip2 = new DevExpress.Utils.SuperToolTip();
+            DevExpress.Utils.ToolTipItem toolTipItem2 = new DevExpress.Utils.ToolTipItem();
             ribbonControl1 = new DevExpress.XtraBars.Ribbon.RibbonControl();
             barBtnCheck = new DevExpress.XtraBars.BarButtonItem();
             barBtnWorkingCalcu = new DevExpress.XtraBars.BarButtonItem();
@@ -53,7 +53,7 @@
             barBtnSetTranslationList = new DevExpress.XtraBars.BarButtonItem();
             barBtnSetExchangerList = new DevExpress.XtraBars.BarButtonItem();
             barBtnSetJunctionList = new DevExpress.XtraBars.BarButtonItem();
-            barBtnParallelAnaly = new DevExpress.XtraBars.BarButtonItem();
+            barBtnCurrentWorkingParallelAnalysis = new DevExpress.XtraBars.BarButtonItem();
             barBtnSearch = new DevExpress.XtraBars.BarButtonItem();
             barBtnGradingSet = new DevExpress.XtraBars.BarButtonItem();
             barBtnGradingApply = new DevExpress.XtraBars.BarButtonItem();
@@ -74,17 +74,17 @@
             barCkMonitor = new DevExpress.XtraBars.BarCheckItem();
             barEditCurrentWorking = new DevExpress.XtraBars.BarEditItem();
             repositoryItemImageComboBox1 = new DevExpress.XtraEditors.Repository.RepositoryItemImageComboBox();
-            barBtnWorkingCompare = new DevExpress.XtraBars.BarButtonItem();
             barCkMark = new DevExpress.XtraBars.BarCheckItem();
             barCkFlowEffect = new DevExpress.XtraBars.BarCheckItem();
             barCkGrading = new DevExpress.XtraBars.BarCheckItem();
-            barCkCalcuResult = new DevExpress.XtraBars.BarCheckItem();
-            barBtnWorkingLossCurve = new DevExpress.XtraBars.BarButtonItem();
-            barBtnWorkingLossScale = new DevExpress.XtraBars.BarButtonItem();
-            barBtnWorkingPowerAnalysis = new DevExpress.XtraBars.BarButtonItem();
-            barBtnWorkingMulti = new DevExpress.XtraBars.BarButtonItem();
+            barCkCurrentWorkingCalcuResult = new DevExpress.XtraBars.BarCheckItem();
+            barBtnCurrentWorkingLossCurve = new DevExpress.XtraBars.BarButtonItem();
+            barBtnCurrentWorkingLossScale = new DevExpress.XtraBars.BarButtonItem();
+            barBtnCurrentWorkingPowerAnalysis = new DevExpress.XtraBars.BarButtonItem();
+            barBtnCurrentWorkingMultiAnalysis = new DevExpress.XtraBars.BarButtonItem();
             barBtnParallel = new DevExpress.XtraBars.BarButtonItem();
             barBtnRepair = new DevExpress.XtraBars.BarButtonItem();
+            barBtnWorkingList = new DevExpress.XtraBars.BarButtonItem();
             ribbonPage1 = new DevExpress.XtraBars.Ribbon.RibbonPage();
             pageGroupMatching = new DevExpress.XtraBars.Ribbon.RibbonPageGroup();
             pageGroupModel = new DevExpress.XtraBars.Ribbon.RibbonPageGroup();
@@ -105,6 +105,9 @@
             controlContainerBottom = new DevExpress.XtraBars.Docking.ControlContainer();
             svgImg32 = new DevExpress.Utils.SvgImageCollection(components);
             rmSet = new DevExpress.XtraBars.Ribbon.RadialMenu(components);
+            docPnlWorking = new DevExpress.XtraBars.Docking.DockPanel();
+            dockPanel2 = new DevExpress.XtraBars.Docking.DockPanel();
+            dockPanel1 = new DevExpress.XtraBars.Docking.DockPanel();
             ((ISupportInitialize)ribbonControl1).BeginInit();
             ((ISupportInitialize)repositoryItemImageComboBox1).BeginInit();
             ((ISupportInitialize)tabPane1).BeginInit();
@@ -114,15 +117,16 @@
             docPnlBottom.SuspendLayout();
             ((ISupportInitialize)svgImg32).BeginInit();
             ((ISupportInitialize)rmSet).BeginInit();
+            dockPanel1.SuspendLayout();
             SuspendLayout();
             // 
             // ribbonControl1
             // 
             ribbonControl1.ExpandCollapseItem.Id = 0;
             ribbonControl1.ItemPanelStyle = DevExpress.XtraBars.Ribbon.RibbonItemPanelStyle.Classic;
-            ribbonControl1.Items.AddRange(new DevExpress.XtraBars.BarItem[] { ribbonControl1.ExpandCollapseItem, barBtnCheck, barBtnWorkingCalcu, barBtnExportInp, barBtnSave, barBtnHydroVisualList, barBtnFastShowHidden, barBtnMatchingList, barBtnUnMatchingList, barBtnSetList, barBtnSetPumpList, barBtnSetValveList, barBtnSetPipeList, barBtnSetElbowsList, barBtnSetThreelinkList, barBtnSetFourlinkList, barBtnSetTranslationList, barBtnSetExchangerList, barBtnSetJunctionList, barBtnParallelAnaly, barBtnSearch, barBtnGradingSet, barBtnGradingApply, barBtnRefresh, barBtnSetMark, barBtnSetReservoirList, barBtnSetTankList, barBtnSetWaterboxList, barBtnSetBluntheadList, barBtnSetNozzleList, barBtnSetHydrantList, barBtnSetMeterList, barBtnSetCompressorList, barBtnSetFlowmeterList, barBtnSetPressmeterList, barBtnSetMonitor, barBtnSetMonitorValue, barCkMonitor, barEditCurrentWorking, barBtnWorkingCompare, barCkMark, barCkFlowEffect, barCkGrading, barCkCalcuResult, barBtnWorkingLossCurve, barBtnWorkingLossScale, barBtnWorkingPowerAnalysis, barBtnWorkingMulti, barBtnParallel, barBtnRepair });
+            ribbonControl1.Items.AddRange(new DevExpress.XtraBars.BarItem[] { ribbonControl1.ExpandCollapseItem, barBtnCheck, barBtnWorkingCalcu, barBtnExportInp, barBtnSave, barBtnHydroVisualList, barBtnFastShowHidden, barBtnMatchingList, barBtnUnMatchingList, barBtnSetList, barBtnSetPumpList, barBtnSetValveList, barBtnSetPipeList, barBtnSetElbowsList, barBtnSetThreelinkList, barBtnSetFourlinkList, barBtnSetTranslationList, barBtnSetExchangerList, barBtnSetJunctionList, barBtnCurrentWorkingParallelAnalysis, barBtnSearch, barBtnGradingSet, barBtnGradingApply, barBtnRefresh, barBtnSetMark, barBtnSetReservoirList, barBtnSetTankList, barBtnSetWaterboxList, barBtnSetBluntheadList, barBtnSetNozzleList, barBtnSetHydrantList, barBtnSetMeterList, barBtnSetCompressorList, barBtnSetFlowmeterList, barBtnSetPressmeterList, barBtnSetMonitor, barBtnSetMonitorValue, barCkMonitor, barEditCurrentWorking, barCkMark, barCkFlowEffect, barCkGrading, barCkCurrentWorkingCalcuResult, barBtnCurrentWorkingLossCurve, barBtnCurrentWorkingLossScale, barBtnCurrentWorkingPowerAnalysis, barBtnCurrentWorkingMultiAnalysis, barBtnParallel, barBtnRepair, barBtnWorkingList });
             ribbonControl1.Location = new Point(0, 0);
-            ribbonControl1.MaxItemId = 75;
+            ribbonControl1.MaxItemId = 76;
             ribbonControl1.Name = "ribbonControl1";
             ribbonControl1.Pages.AddRange(new DevExpress.XtraBars.Ribbon.RibbonPage[] { ribbonPage1 });
             ribbonControl1.RepositoryItems.AddRange(new DevExpress.XtraEditors.Repository.RepositoryItem[] { repositoryItemImageComboBox1 });
@@ -274,14 +278,14 @@
             barBtnSetJunctionList.Id = 30;
             barBtnSetJunctionList.Name = "barBtnSetJunctionList";
             // 
-            // barBtnParallelAnaly
+            // barBtnCurrentWorkingParallelAnalysis
             // 
-            barBtnParallelAnaly.Caption = "骞惰仈鍒嗘瀽";
-            barBtnParallelAnaly.Id = 31;
-            barBtnParallelAnaly.ImageOptions.SvgImage = (DevExpress.Utils.Svg.SvgImage)resources.GetObject("barBtnParallelAnaly.ImageOptions.SvgImage");
-            barBtnParallelAnaly.Name = "barBtnParallelAnaly";
-            barBtnParallelAnaly.RibbonStyle = DevExpress.XtraBars.Ribbon.RibbonItemStyles.SmallWithText;
-            barBtnParallelAnaly.ItemClick += barBtnAnaly_ItemClick;
+            barBtnCurrentWorkingParallelAnalysis.Caption = "骞惰仈鍒嗘瀽";
+            barBtnCurrentWorkingParallelAnalysis.Id = 31;
+            barBtnCurrentWorkingParallelAnalysis.ImageOptions.SvgImage = (DevExpress.Utils.Svg.SvgImage)resources.GetObject("barBtnCurrentWorkingParallelAnalysis.ImageOptions.SvgImage");
+            barBtnCurrentWorkingParallelAnalysis.Name = "barBtnCurrentWorkingParallelAnalysis";
+            barBtnCurrentWorkingParallelAnalysis.RibbonStyle = DevExpress.XtraBars.Ribbon.RibbonItemStyles.SmallWithText;
+            barBtnCurrentWorkingParallelAnalysis.ItemClick += barBtnAnaly_ItemClick;
             // 
             // barBtnSearch
             // 
@@ -422,24 +426,17 @@
             // 
             // barEditCurrentWorking
             // 
-            barEditCurrentWorking.Caption = "宸ュ喌";
+            barEditCurrentWorking.Caption = "褰撳墠宸ュ喌";
             barEditCurrentWorking.Edit = repositoryItemImageComboBox1;
             barEditCurrentWorking.Id = 63;
             barEditCurrentWorking.Name = "barEditCurrentWorking";
+            barEditCurrentWorking.EditValueChanged += barEditCurrentWorking_EditValueChanged;
             // 
             // repositoryItemImageComboBox1
             // 
             repositoryItemImageComboBox1.AutoHeight = false;
             repositoryItemImageComboBox1.Buttons.AddRange(new EditorButton[] { new EditorButton(ButtonPredefines.Combo) });
             repositoryItemImageComboBox1.Name = "repositoryItemImageComboBox1";
-            // 
-            // barBtnWorkingCompare
-            // 
-            barBtnWorkingCompare.Caption = "宸ュ喌瀵规瘮";
-            barBtnWorkingCompare.Id = 64;
-            barBtnWorkingCompare.ImageOptions.SvgImage = (DevExpress.Utils.Svg.SvgImage)resources.GetObject("barBtnWorkingCompare.ImageOptions.SvgImage");
-            barBtnWorkingCompare.Name = "barBtnWorkingCompare";
-            barBtnWorkingCompare.RibbonStyle = DevExpress.XtraBars.Ribbon.RibbonItemStyles.Large;
             // 
             // barCkMark
             // 
@@ -465,48 +462,48 @@
             barCkGrading.Name = "barCkGrading";
             barCkGrading.CheckedChanged += barCkGrading_CheckedChanged;
             // 
-            // barCkCalcuResult
+            // barCkCurrentWorkingCalcuResult
             // 
-            barCkCalcuResult.Caption = "鏄剧ず";
-            barCkCalcuResult.CheckBoxVisibility = DevExpress.XtraBars.CheckBoxVisibility.AfterText;
-            barCkCalcuResult.Id = 68;
-            barCkCalcuResult.Name = "barCkCalcuResult";
+            barCkCurrentWorkingCalcuResult.Caption = "璁$畻缁撴灉";
+            barCkCurrentWorkingCalcuResult.CheckBoxVisibility = DevExpress.XtraBars.CheckBoxVisibility.AfterText;
+            barCkCurrentWorkingCalcuResult.Id = 68;
+            barCkCurrentWorkingCalcuResult.Name = "barCkCurrentWorkingCalcuResult";
             // 
-            // barBtnWorkingLossCurve
+            // barBtnCurrentWorkingLossCurve
             // 
-            barBtnWorkingLossCurve.Caption = "鎹熷け鏇茬嚎";
-            barBtnWorkingLossCurve.Id = 69;
-            barBtnWorkingLossCurve.ImageOptions.SvgImage = (DevExpress.Utils.Svg.SvgImage)resources.GetObject("barBtnWorkingLossCurve.ImageOptions.SvgImage");
-            barBtnWorkingLossCurve.Name = "barBtnWorkingLossCurve";
-            barBtnWorkingLossCurve.RibbonStyle = DevExpress.XtraBars.Ribbon.RibbonItemStyles.SmallWithText;
+            barBtnCurrentWorkingLossCurve.Caption = "鎹熷け鏇茬嚎";
+            barBtnCurrentWorkingLossCurve.Id = 69;
+            barBtnCurrentWorkingLossCurve.ImageOptions.SvgImage = (DevExpress.Utils.Svg.SvgImage)resources.GetObject("barBtnCurrentWorkingLossCurve.ImageOptions.SvgImage");
+            barBtnCurrentWorkingLossCurve.Name = "barBtnCurrentWorkingLossCurve";
+            barBtnCurrentWorkingLossCurve.RibbonStyle = DevExpress.XtraBars.Ribbon.RibbonItemStyles.SmallWithText;
             // 
-            // barBtnWorkingLossScale
+            // barBtnCurrentWorkingLossScale
             // 
-            barBtnWorkingLossScale.Caption = "鎹熷け姣斾緥";
-            barBtnWorkingLossScale.Id = 70;
-            barBtnWorkingLossScale.ImageOptions.SvgImage = (DevExpress.Utils.Svg.SvgImage)resources.GetObject("barBtnWorkingLossScale.ImageOptions.SvgImage");
-            barBtnWorkingLossScale.Name = "barBtnWorkingLossScale";
-            barBtnWorkingLossScale.RibbonStyle = DevExpress.XtraBars.Ribbon.RibbonItemStyles.SmallWithText;
+            barBtnCurrentWorkingLossScale.Caption = "鎹熷け姣斾緥";
+            barBtnCurrentWorkingLossScale.Id = 70;
+            barBtnCurrentWorkingLossScale.ImageOptions.SvgImage = (DevExpress.Utils.Svg.SvgImage)resources.GetObject("barBtnCurrentWorkingLossScale.ImageOptions.SvgImage");
+            barBtnCurrentWorkingLossScale.Name = "barBtnCurrentWorkingLossScale";
+            barBtnCurrentWorkingLossScale.RibbonStyle = DevExpress.XtraBars.Ribbon.RibbonItemStyles.SmallWithText;
             // 
-            // barBtnWorkingPowerAnalysis
+            // barBtnCurrentWorkingPowerAnalysis
             // 
-            barBtnWorkingPowerAnalysis.Caption = "鑳芥晥鍒嗘瀽";
-            barBtnWorkingPowerAnalysis.Id = 71;
-            barBtnWorkingPowerAnalysis.ImageOptions.SvgImage = (DevExpress.Utils.Svg.SvgImage)resources.GetObject("barBtnWorkingPowerAnalysis.ImageOptions.SvgImage");
-            barBtnWorkingPowerAnalysis.Name = "barBtnWorkingPowerAnalysis";
-            barBtnWorkingPowerAnalysis.RibbonStyle = DevExpress.XtraBars.Ribbon.RibbonItemStyles.SmallWithText;
+            barBtnCurrentWorkingPowerAnalysis.Caption = "鑳芥晥鍒嗘瀽";
+            barBtnCurrentWorkingPowerAnalysis.Id = 71;
+            barBtnCurrentWorkingPowerAnalysis.ImageOptions.SvgImage = (DevExpress.Utils.Svg.SvgImage)resources.GetObject("barBtnCurrentWorkingPowerAnalysis.ImageOptions.SvgImage");
+            barBtnCurrentWorkingPowerAnalysis.Name = "barBtnCurrentWorkingPowerAnalysis";
+            barBtnCurrentWorkingPowerAnalysis.RibbonStyle = DevExpress.XtraBars.Ribbon.RibbonItemStyles.SmallWithText;
             // 
-            // barBtnWorkingMulti
+            // barBtnCurrentWorkingMultiAnalysis
             // 
-            barBtnWorkingMulti.Caption = "缁煎悎鍒嗘瀽";
-            barBtnWorkingMulti.Id = 72;
-            barBtnWorkingMulti.ImageOptions.SvgImage = (DevExpress.Utils.Svg.SvgImage)resources.GetObject("barBtnWorkingMulti.ImageOptions.SvgImage");
-            barBtnWorkingMulti.Name = "barBtnWorkingMulti";
-            barBtnWorkingMulti.RibbonStyle = DevExpress.XtraBars.Ribbon.RibbonItemStyles.Large;
+            barBtnCurrentWorkingMultiAnalysis.Caption = "缁煎悎鍒嗘瀽";
+            barBtnCurrentWorkingMultiAnalysis.Id = 72;
+            barBtnCurrentWorkingMultiAnalysis.ImageOptions.SvgImage = (DevExpress.Utils.Svg.SvgImage)resources.GetObject("barBtnCurrentWorkingMultiAnalysis.ImageOptions.SvgImage");
+            barBtnCurrentWorkingMultiAnalysis.Name = "barBtnCurrentWorkingMultiAnalysis";
+            barBtnCurrentWorkingMultiAnalysis.RibbonStyle = DevExpress.XtraBars.Ribbon.RibbonItemStyles.Large;
             // 
             // barBtnParallel
             // 
-            barBtnParallel.Caption = "骞惰仈鍒嗘瀽";
+            barBtnParallel.Caption = "骞惰仈璁$畻";
             barBtnParallel.Id = 73;
             barBtnParallel.ImageOptions.SvgImage = (DevExpress.Utils.Svg.SvgImage)resources.GetObject("barBtnParallel.ImageOptions.SvgImage");
             barBtnParallel.Name = "barBtnParallel";
@@ -520,10 +517,17 @@
             barBtnRepair.ImageOptions.SvgImage = (DevExpress.Utils.Svg.SvgImage)resources.GetObject("barBtnRepair.ImageOptions.SvgImage");
             barBtnRepair.Name = "barBtnRepair";
             barBtnRepair.RibbonStyle = DevExpress.XtraBars.Ribbon.RibbonItemStyles.SmallWithText;
-            toolTipItem1.Text = "閫氳繃璇曠畻锛岃皟鏁寸娈典笂涓嬫父";
-            superToolTip1.Items.Add(toolTipItem1);
-            barBtnRepair.SuperTip = superToolTip1;
+            toolTipItem2.Text = "閫氳繃璇曠畻锛岃皟鏁寸娈典笂涓嬫父";
+            superToolTip2.Items.Add(toolTipItem2);
+            barBtnRepair.SuperTip = superToolTip2;
             barBtnRepair.ItemClick += barBtnRepair_ItemClick;
+            // 
+            // barBtnWorkingList
+            // 
+            barBtnWorkingList.Caption = "宸ュ喌鍒楄〃";
+            barBtnWorkingList.Id = 75;
+            barBtnWorkingList.ImageOptions.SvgImage = (DevExpress.Utils.Svg.SvgImage)resources.GetObject("barBtnWorkingList.ImageOptions.SvgImage");
+            barBtnWorkingList.Name = "barBtnWorkingList";
             // 
             // ribbonPage1
             // 
@@ -584,13 +588,13 @@
             // ribbonPageGroup9
             // 
             ribbonPageGroup9.ItemLinks.Add(barEditCurrentWorking);
-            ribbonPageGroup9.ItemLinks.Add(barCkCalcuResult);
-            ribbonPageGroup9.ItemLinks.Add(barBtnWorkingLossCurve);
-            ribbonPageGroup9.ItemLinks.Add(barBtnWorkingLossScale);
-            ribbonPageGroup9.ItemLinks.Add(barBtnWorkingPowerAnalysis);
-            ribbonPageGroup9.ItemLinks.Add(barBtnParallelAnaly);
-            ribbonPageGroup9.ItemLinks.Add(barBtnWorkingMulti);
-            ribbonPageGroup9.ItemLinks.Add(barBtnWorkingCompare);
+            ribbonPageGroup9.ItemLinks.Add(barCkCurrentWorkingCalcuResult);
+            ribbonPageGroup9.ItemLinks.Add(barBtnCurrentWorkingParallelAnalysis);
+            ribbonPageGroup9.ItemLinks.Add(barBtnCurrentWorkingLossCurve);
+            ribbonPageGroup9.ItemLinks.Add(barBtnCurrentWorkingLossScale);
+            ribbonPageGroup9.ItemLinks.Add(barBtnCurrentWorkingPowerAnalysis);
+            ribbonPageGroup9.ItemLinks.Add(barBtnCurrentWorkingMultiAnalysis);
+            ribbonPageGroup9.ItemLinks.Add(barBtnWorkingList);
             ribbonPageGroup9.Name = "ribbonPageGroup9";
             ribbonPageGroup9.Text = "宸ュ喌鍒嗘瀽";
             // 
@@ -635,25 +639,26 @@
             // dockManager1
             // 
             dockManager1.Form = this;
-            dockManager1.RootPanels.AddRange(new DevExpress.XtraBars.Docking.DockPanel[] { docPnlRight, docPnlBottom });
+            dockManager1.RootPanels.AddRange(new DevExpress.XtraBars.Docking.DockPanel[] { dockPanel1, docPnlBottom });
             dockManager1.TopZIndexControls.AddRange(new string[] { "DevExpress.XtraBars.BarDockControl", "DevExpress.XtraBars.StandaloneBarDockControl", "System.Windows.Forms.MenuStrip", "System.Windows.Forms.StatusStrip", "System.Windows.Forms.StatusBar", "DevExpress.XtraBars.Ribbon.RibbonStatusBar", "DevExpress.XtraBars.Ribbon.RibbonControl", "DevExpress.XtraBars.Navigation.OfficeNavigationBar", "DevExpress.XtraBars.Navigation.TileNavPane", "DevExpress.XtraBars.TabFormControl", "DevExpress.XtraBars.FluentDesignSystem.FluentDesignFormControl", "DevExpress.XtraBars.ToolbarForm.ToolbarFormControl" });
             // 
             // docPnlRight
             // 
             docPnlRight.Controls.Add(controlContainerRight);
-            docPnlRight.Dock = DevExpress.XtraBars.Docking.DockingStyle.Right;
+            docPnlRight.Dock = DevExpress.XtraBars.Docking.DockingStyle.Fill;
+            docPnlRight.FloatVertical = true;
             docPnlRight.ID = new Guid("cffe2560-3445-4488-83cf-b9e4b936ff18");
-            docPnlRight.Location = new Point(1666, 128);
+            docPnlRight.Location = new Point(4, 26);
             docPnlRight.Name = "docPnlRight";
-            docPnlRight.OriginalSize = new Size(275, 200);
-            docPnlRight.Size = new Size(275, 572);
+            docPnlRight.OriginalSize = new Size(200, 200);
+            docPnlRight.Size = new Size(268, 516);
             docPnlRight.Text = "灞炴��";
             // 
             // controlContainerRight
             // 
-            controlContainerRight.Location = new Point(4, 26);
+            controlContainerRight.Location = new Point(0, 0);
             controlContainerRight.Name = "controlContainerRight";
-            controlContainerRight.Size = new Size(268, 543);
+            controlContainerRight.Size = new Size(268, 516);
             controlContainerRight.TabIndex = 0;
             // 
             // docPnlBottom
@@ -706,6 +711,41 @@
             rmSet.Ribbon = ribbonControl1;
             rmSet.BeforePopup += rmSet_BeforePopup;
             // 
+            // docPnlWorking
+            // 
+            docPnlWorking.Dock = DevExpress.XtraBars.Docking.DockingStyle.Fill;
+            docPnlWorking.ID = new Guid("6a12321b-176a-43ac-b64f-fbaa0f6806ce");
+            docPnlWorking.Location = new Point(4, 26);
+            docPnlWorking.Name = "docPnlWorking";
+            docPnlWorking.OriginalSize = new Size(200, 200);
+            docPnlWorking.Size = new Size(268, 516);
+            docPnlWorking.Text = "宸ュ喌";
+            // 
+            // dockPanel2
+            // 
+            dockPanel2.Dock = DevExpress.XtraBars.Docking.DockingStyle.Right;
+            dockPanel2.ID = new Guid("9e1401bf-eba9-4e65-8e3e-50e08d389108");
+            dockPanel2.Location = new Point(1666, 128);
+            dockPanel2.Name = "dockPanel2";
+            dockPanel2.OriginalSize = new Size(275, 200);
+            dockPanel2.Size = new Size(275, 572);
+            dockPanel2.Tabbed = true;
+            dockPanel2.Text = "panelContainer1";
+            // 
+            // dockPanel1
+            // 
+            dockPanel1.ActiveChild = docPnlRight;
+            dockPanel1.Controls.Add(docPnlRight);
+            dockPanel1.Controls.Add(docPnlWorking);
+            dockPanel1.Dock = DevExpress.XtraBars.Docking.DockingStyle.Right;
+            dockPanel1.ID = new Guid("9c1c1fcf-0dc2-460f-ad97-7c25e496b4ae");
+            dockPanel1.Location = new Point(1666, 128);
+            dockPanel1.Name = "dockPanel1";
+            dockPanel1.OriginalSize = new Size(275, 200);
+            dockPanel1.Size = new Size(275, 572);
+            dockPanel1.Tabbed = true;
+            dockPanel1.Text = "panelContainer1";
+            // 
             // XhsProjectSimulationCorePage
             // 
             Appearance.BackColor = SystemColors.Control;
@@ -714,7 +754,7 @@
             AutoScaleMode = AutoScaleMode.Font;
             Controls.Add(tabPane1);
             Controls.Add(docPnlBottom);
-            Controls.Add(docPnlRight);
+            Controls.Add(dockPanel1);
             Controls.Add(ribbonControl1);
             Margin = new Padding(2);
             Name = "XhsProjectSimulationCorePage";
@@ -728,6 +768,7 @@
             docPnlBottom.ResumeLayout(false);
             ((ISupportInitialize)svgImg32).EndInit();
             ((ISupportInitialize)rmSet).EndInit();
+            dockPanel1.ResumeLayout(false);
             ResumeLayout(false);
             PerformLayout();
         }
@@ -765,7 +806,7 @@
         private DevExpress.XtraBars.BarButtonItem barBtnSetTranslationList;
         private DevExpress.XtraBars.BarButtonItem barBtnSetExchangerList;
         private DevExpress.XtraBars.BarButtonItem barBtnSetJunctionList;
-        private DevExpress.XtraBars.BarButtonItem barBtnParallelAnaly;
+        private DevExpress.XtraBars.BarButtonItem barBtnCurrentWorkingParallelAnalysis;
         private DevExpress.XtraBars.BarButtonItem barBtnSearch;
         private DevExpress.XtraBars.Ribbon.RibbonPageGroup pageGroupModel;
         private DevExpress.XtraBars.Docking.DockPanel docPnlBottom;
@@ -793,17 +834,20 @@
         private DevExpress.XtraBars.BarCheckItem barCkMonitor;
         private DevExpress.XtraBars.BarEditItem barEditCurrentWorking;
         private DevExpress.XtraEditors.Repository.RepositoryItemImageComboBox repositoryItemImageComboBox1;
-        private DevExpress.XtraBars.BarButtonItem barBtnWorkingCompare;
         private DevExpress.XtraBars.Ribbon.RibbonPageGroup ribbonPageGroup9;
         private DevExpress.XtraBars.BarCheckItem barCkMark;
         private DevExpress.XtraBars.BarCheckItem barCkFlowEffect;
         private DevExpress.XtraBars.BarCheckItem barCkGrading;
-        private DevExpress.XtraBars.BarCheckItem barCkCalcuResult;
-        private DevExpress.XtraBars.BarButtonItem barBtnWorkingLossCurve;
-        private DevExpress.XtraBars.BarButtonItem barBtnWorkingLossScale;
-        private DevExpress.XtraBars.BarButtonItem barBtnWorkingPowerAnalysis;
-        private DevExpress.XtraBars.BarButtonItem barBtnWorkingMulti;
+        private DevExpress.XtraBars.BarCheckItem barCkCurrentWorkingCalcuResult;
+        private DevExpress.XtraBars.BarButtonItem barBtnCurrentWorkingLossCurve;
+        private DevExpress.XtraBars.BarButtonItem barBtnCurrentWorkingLossScale;
+        private DevExpress.XtraBars.BarButtonItem barBtnCurrentWorkingPowerAnalysis;
+        private DevExpress.XtraBars.BarButtonItem barBtnCurrentWorkingMultiAnalysis;
         private DevExpress.XtraBars.BarButtonItem barBtnParallel;
         private DevExpress.XtraBars.BarButtonItem barBtnRepair;
+        private DevExpress.XtraBars.BarButtonItem barBtnWorkingList;
+        private DevExpress.XtraBars.Docking.DockPanel dockPanel2;
+        private DevExpress.XtraBars.Docking.DockPanel docPnlWorking;
+        private DevExpress.XtraBars.Docking.DockPanel dockPanel1;
     }
 }
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 0b09759..4c1ea9a 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,4 +1,5 @@
 锘縢lobal using Yw.EPAnet;
+using DevExpress.CodeParser;
 using DevExpress.Mvvm.Native;
 using DevExpress.Office.Utils;
 using DevExpress.Utils.Extensions;
@@ -7,10 +8,12 @@
 using DevExpress.XtraRichEdit.Layout;
 using DevExpress.XtraSpreadsheet.Commands;
 using HStation.WinFrmUI.PhartRelation;
+using NPOI.SS.Formula.Functions;
 using System.Diagnostics;
 using System.Windows.Media;
 using System.Windows.Media.Media3D;
 using Yw.Hydro;
+using Yw.Model;
 using Yw.Pump;
 using Yw.Vmo;
 using Yw.WinFrmUI.Bimface;
@@ -167,6 +170,314 @@
 
         #endregion
 
+        #region 鍙鍒楄〃
+
+        //鎵�鏈夊彲瑙嗗瓧鍏�
+        private Dictionary<string, HydroVisualInfo> _allVisualDict = null;
+
+        //鑾峰彇鍙瀛楀吀
+        private Dictionary<string, HydroVisualInfo> GetVisualDict()
+        {
+            if (_hydroInfo == null)
+            {
+                return default;
+            }
+            if (_allVisualDict == null)
+            {
+                _allVisualDict = new Dictionary<string, HydroVisualInfo>();
+                var allVisualList = _hydroInfo.GetAllVisuals();
+                allVisualList?.ForEach(x => _allVisualDict.Add(x.Code, x));
+            }
+            return _allVisualDict;
+        }
+
+        //鑾峰彇鍙鍒楄〃
+        private List<HydroVisualInfo> GetVisualList()
+        {
+            var allVisualDict = GetVisualDict();
+            return allVisualDict?.Values.ToList();
+        }
+
+        //鑾峰彇鑺傜偣鍒楄〃
+        private List<HydroNodeInfo> GetNodeList()
+        {
+            if (_hydroInfo == null)
+            {
+                return default;
+            }
+            return _hydroInfo.GetAllNodes();
+        }
+
+        //鑾峰彇绠℃鍒楄〃
+        private List<HydroLinkInfo> GetLinkList()
+        {
+            if (_hydroInfo == null)
+            {
+                return default;
+            }
+            return _hydroInfo.GetAllLinks();
+        }
+
+        //鑾峰彇鍙鏋勪欢
+        private HydroVisualInfo GetVisual(string code)
+        {
+            var allVisualDict = GetVisualDict();
+            if (allVisualDict == null)
+            {
+                return default;
+            }
+            if (allVisualDict.ContainsKey(code))
+            {
+                return allVisualDict[code];
+            }
+            return default;
+        }
+
+        #endregion
+
+        #region 璁$畻缁撴灉
+
+        //璁$畻缁撴灉
+        private HydroCalcuResult _calcuResult = null;
+
+        //鑾峰彇璁$畻缁撴灉
+        private HydroCalcuResult GetCalcuResult(string calcuMode, bool needCalcuAgain = false)
+        {
+            if (_hydroInfo == null)
+            {
+                return default;
+            }
+            if (needCalcuAgain)
+            {
+                _calcuResult = _hydroInfo.Calcu(calcuMode);
+            }
+            if (_calcuResult == null)
+            {
+                _calcuResult = _hydroInfo.Calcu(calcuMode);
+            }
+            return _calcuResult;
+        }
+
+        //鑾峰彇鍙缁勪欢璁$畻缁撴灉鍒楄〃
+        private List<HydroCalcuVisualResult> GetCalcuVisualResultList(string calcuMode, bool needCalcuAgain = false)
+        {
+            var calcuResult = GetCalcuResult(calcuMode, needCalcuAgain);
+            if (calcuResult == null)
+            {
+                return default;
+            }
+            if (!calcuResult.Succeed)
+            {
+                return default;
+            }
+            return calcuResult.GetVisualList();
+        }
+
+        //鑾峰彇鑺傜偣璁$畻缁撴灉鍒楄〃
+        private List<HydroCalcuNodeResult> GetCalcuNodeResultList(string calcuMode, bool needCalcuAgain = false)
+        {
+            var calcuResult = GetCalcuResult(calcuMode, needCalcuAgain);
+            if (calcuResult == null)
+            {
+                return default;
+            }
+            if (!calcuResult.Succeed)
+            {
+                return default;
+            }
+            return calcuResult.NodeList;
+        }
+
+        //鑾峰彇绠℃璁$畻缁撴灉鍒楄〃
+        private List<HydroCalcuLinkResult> GetCalcuLinkResultList(string calcuMode, bool needCalcuAgain = false)
+        {
+            var calcuResult = GetCalcuResult(calcuMode, needCalcuAgain);
+            if (calcuResult == null)
+            {
+                return default;
+            }
+            if (!calcuResult.Succeed)
+            {
+                return default;
+            }
+            return calcuResult.LinkList;
+        }
+
+        //鎵�鏈夊彲瑙佽绠楀瓧鍏�
+        private Dictionary<string, HydroCalcuVisualResult> _allCalcuVisualDict = null;
+
+        //鑾峰彇鍙璁$畻瀛楀吀
+        private Dictionary<string, HydroCalcuVisualResult> GetCalcuVisualDict(string calcuMode, bool needCalcuAgain = false)
+        {
+            if (_hydroInfo == null)
+            {
+                return default;
+            }
+            var allCalcuVisualResultList = GetCalcuVisualResultList(calcuMode, needCalcuAgain);
+            if (needCalcuAgain)
+            {
+                _allCalcuVisualDict = new Dictionary<string, HydroCalcuVisualResult>();
+                allCalcuVisualResultList?.ForEach(x => _allCalcuVisualDict.Add(x.Code, x));
+            }
+            if (_allCalcuVisualDict == null)
+            {
+                _allCalcuVisualDict = new Dictionary<string, HydroCalcuVisualResult>();
+                allCalcuVisualResultList?.ForEach(x => _allCalcuVisualDict.Add(x.Code, x));
+            }
+            return _allCalcuVisualDict;
+        }
+
+        //鑾峰彇鍙璁$畻缁撴灉
+        private HydroCalcuVisualResult GetCalcuVisualResult(string code, string calcuMode = Yw.EPAnet.CalcuMode.MinorLoss, bool needCalcuAgain = false)
+        {
+            var allCalcuVisualDict = GetCalcuVisualDict(calcuMode, needCalcuAgain);
+            if (allCalcuVisualDict == null || allCalcuVisualDict.Count < 1)
+            {
+                return default;
+            }
+            if (allCalcuVisualDict.ContainsKey(code))
+            {
+                return allCalcuVisualDict[code];
+            }
+            return default;
+        }
+
+        //鑾峰彇鍙璁$畻缁撴灉
+        private HydroCalcuVisualResult GetCalcuVisualResult(Yw.Model.HydroVisualInfo visual, string calcuMode = Yw.EPAnet.CalcuMode.MinorLoss, bool needCalcuAgain = false)
+        {
+            return GetCalcuVisualResult(visual?.Code, calcuMode, needCalcuAgain);
+        }
+
+        #endregion
+
+        #region 鍙瑙嗗浘鍒楄〃
+
+        //鎵�鏈夊彲瑙佽鍥惧瓧鍏�
+        private Dictionary<string, HydroVisualViewModel> _allVisualViewModelDict = null;
+
+        //鑾峰彇鍙瑙嗗浘瀛楀吀
+        private Dictionary<string, HydroVisualViewModel> GetVisualViewModelDict()
+        {
+            if (_hydroInfo == null)
+            {
+                return default;
+            }
+            if (_allVisualViewModelDict == null)
+            {
+                _allVisualViewModelDict = new Dictionary<string, HydroVisualViewModel>();
+                var allVisualDict = GetVisualDict();
+                if (allVisualDict != null && allVisualDict.Count > 0)
+                {
+                    foreach (var visualKeyValue in allVisualDict)
+                    {
+                        var vm = HydroVisualViewModelBuilder.CreateVisualViewModel(visualKeyValue.Value, _hydroInfo);
+                        var calcuVisualResult = GetCalcuVisualResult(visualKeyValue.Key);
+                        if (calcuVisualResult != null)
+                        {
+                            vm.UpdateCalcuProperty(calcuVisualResult);
+                        }
+                        _allVisualViewModelDict.Add(visualKeyValue.Key, vm);
+                    }
+                }
+            }
+            return _allVisualViewModelDict;
+        }
+
+        //鑾峰彇鍙瑙嗗浘鍒楄〃
+        private List<HydroVisualViewModel> GetVisualViewModelList()
+        {
+            var allVisualViewModelDict = GetVisualViewModelDict();
+            return allVisualViewModelDict?.Values.ToList();
+        }
+
+        //鏇存柊鍙瑙嗗浘灞炴��
+        private void UpdateVisualViewModelProperty()
+        {
+            var allVisualViewModelList = GetVisualViewModelList();
+            allVisualViewModelList?.ForEach(x => x.UpdateProperty());
+        }
+
+        //鏇存柊鍙瑙嗗浘灞炴��
+        private void UpdateVisualViewModelProperty(string code)
+        {
+            var allVisualViewModelDict = GetVisualViewModelDict();
+            if (allVisualViewModelDict != null && allVisualViewModelDict.Count > 0)
+            {
+                if (allVisualViewModelDict.ContainsKey(code))
+                {
+                    allVisualViewModelDict[code].UpdateProperty();
+                }
+            }
+        }
+
+        //鏇存柊鍙瑙嗗浘灞炴��
+        private void UpdateVisualViewModelProperty(List<string> codes)
+        {
+            codes?.ForEach(x => UpdateVisualViewModelProperty(x));
+        }
+
+        //鏇存柊鍙瑙嗗浘灞炴��
+        private void UpdateVisualViewModelProperty(List<HydroVisualInfo> visualList)
+        {
+            visualList?.ForEach(x => UpdateVisualViewModelProperty(x.Code));
+        }
+
+        //鏇存柊鍙瑙嗗浘璁$畻灞炴��
+        private void UpdateVisualViewModelCalcuProperty()
+        {
+            var allVisualViewModelDict = GetVisualViewModelDict();
+            if (allVisualViewModelDict != null && allVisualViewModelDict.Count > 0)
+            {
+                foreach (var visualViewModelKeyValue in allVisualViewModelDict)
+                {
+                    var calcuVisualResult = GetCalcuVisualResult(visualViewModelKeyValue.Key);
+                    if (calcuVisualResult != null)
+                    {
+                        visualViewModelKeyValue.Value.UpdateCalcuProperty(calcuVisualResult);
+                    }
+                }
+            }
+        }
+
+        //鑾峰彇鍙瑙嗗浘
+        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)
+        {
+            return GetVisualViewModel(visual?.Code);
+        }
+
+        #endregion
+
+        #region 閫夋嫨鏋勪欢
+
+        //閫夋嫨鏋勪欢
+        private Yw.Model.HydroVisualInfo _selectedVisual = null;
+
+        //閫夋嫨鏋勪欢
+        private Yw.Model.HydroVisualInfo SelectedVisual
+        {
+            get { return _selectedVisual; }
+            set
+            {
+
+                _selectedVisual = value;
+                this.barBtnSetMonitor.Enabled = _selectedVisual != null;
+            }
+        }
+
+
+        #endregion
+
         #region 灞炴�ф帶浠�
 
         //灞炴�ф帶浠�
@@ -179,40 +490,42 @@
             {
                 _propertyCtrl = new XhsProjectSimulationPropertyCtrl();
                 _propertyCtrl.Dock = DockStyle.Fill;
-                _propertyCtrl.InitialData(() => _hydroInfo, () => GetCalcuResultList());
-                _propertyCtrl.BlinkLinkParterEvent += async (code, linkCode) =>
-                { //寮鸿皟杩炴帴缁勪欢
-                    if (string.IsNullOrEmpty(code))
+                _propertyCtrl.HydroViewEvent += (visual) =>
+                {
+                    if (visual == null)
                     {
                         return;
                     }
-                    if (string.IsNullOrEmpty(linkCode))
-                    {
-                        return;
-                    }
+                    _bimfaceCtrl?.ZoomToComponent(visual.Code);
+                };
+                _propertyCtrl.BlinkLinkNodeEvent += async (link, linkNodeCode) =>
+                { //寮鸿皟杩炴帴鑺傜偣
                     if (_hydroInfo == null)
                     {
                         return;
                     }
-                    var allVisualList = _hydroInfo.GetAllVisuals();
-                    if (allVisualList == null || allVisualList.Count < 1)
+                    if (link == null)
                     {
                         return;
                     }
-                    var linkParter = allVisualList.Find(x => x.Code == linkCode);
-                    if (linkParter == null)
+                    if (string.IsNullOrEmpty(linkNodeCode))
+                    {
+                        return;
+                    }
+                    var linkNode = GetVisual(linkNodeCode);
+                    if (linkNode == null)
                     {
                         return;
                     }
                     var blinkCodes = new List<string>();
-                    if (linkParter.GetType() == typeof(Yw.Model.HydroJunctionInfo))
+                    if (linkNode.GetType() == typeof(HydroJunctionInfo))
                     {
-                        var allLinkList = _hydroInfo.GetAllLinks();
+                        var allLinkList = GetLinkList();
                         if (allLinkList == null || allLinkList.Count < 1)
                         {
                             return;
                         }
-                        var linkList = allLinkList.Where(x => (x.StartCode == linkParter.Code || x.EndCode == linkParter.Code) && x.Code != code).ToList();
+                        var linkList = allLinkList.Where(x => (x.StartCode == linkNodeCode || x.EndCode == linkNodeCode) && x.Code != linkNodeCode).ToList();
                         if (linkList == null || linkList.Count < 1)
                         {
                             return;
@@ -221,21 +534,13 @@
                     }
                     else
                     {
-                        blinkCodes.Add(linkCode);
+                        blinkCodes.Add(linkNodeCode);
                     }
 
+                    await _bimfaceCtrl?.ClearBlinkComponents();
                     await _bimfaceCtrl?.SetBlinkComponents(blinkCodes);
                     await Task.Delay(5000);
                     await _bimfaceCtrl?.ClearBlinkComponents();
-                };
-
-                _propertyCtrl.ViewParterEvent += (parter) =>
-                {
-                    if (parter == null)
-                    {
-                        return;
-                    }
-                    _bimfaceCtrl?.ZoomToComponent(parter.Code);
                 };
                 _propertyCtrl.PropertyValueChangedEvent += (visual) =>
                 {
@@ -244,24 +549,24 @@
                         return;
                     }
                     UpdateVisualListCtrl();
-                    ApplyGradingResultList(visual);
+                    //ApplyGradingResultList(visual);
                 };
                 _propertyCtrl.MarkPropertyValueChangedEvent += (visual) =>
                 {
                     //鏍囨敞灞炴�у彂鐢熸敼鍙�
                     //鍒ゆ柇褰撳墠鏄惁鏈夋爣娉ㄥ睍绀猴紝鑻ユ湁鍒欐洿鏂版爣娉紝鏈�濂芥槸鏇存柊鍗曚釜鏍囨敞
-                    UpdateMark(visual);
+                    //UpdateMark(visual);
                 };
                 _propertyCtrl.GradingPropertyValueChangedEvent += (parter) =>
                 {
                     //鍒嗙骇灞炴�у彂鐢熸敼鍙�
                     //鍒ゆ柇褰撳墠鏄惁鏈夊垎绾у睍绀猴紝鑻ユ湁鍒欐洿鏂板垎绾э紝鏈�濂芥槸鏇存柊鍗曚釜鍒嗙骇
                 };
-                _propertyCtrl.FlowDirectionPropertyValueChangedEvent += (visual) =>
+                _propertyCtrl.FlowEffectPropertyValueChangedEvent += (visual) =>
                 {
                     //娴佸悜灞炴�у彂鐢熸敼鍙�
                     //鍒ゆ柇娴佸悜鏄惁鍔犺浇锛屽鏋滃姞杞藉垯鏇存柊娴佸悜锛屾渶濂芥槸鏇存柊鍗曚釜娴佸悜
-                    UpdateFlowEffect(visual);
+                    //UpdateFlowEffect(visual);
                 };
 
             }
@@ -339,6 +644,27 @@
             _propertyCtrl?.UpdateRows();
         }
 
+        //璁剧疆灞炴�ф帶浠�
+        private void SetPropertyCtrl(Yw.Model.HydroVisualInfo visual)
+        {
+            if (visual == null)
+            {
+
+            }
+        }
+
+        //鏇存柊灞炴�ф帶浠�
+        private void UpdatePropertyCtrl()
+        {
+            _propertyCtrl?.UpdateRows();
+        }
+
+        #endregion
+
+        #region 宸ュ喌鍒楄〃
+
+
+
         #endregion
 
         #region 鑷姩鍖归厤
@@ -390,7 +716,7 @@
             }
             this.controlContainerBottom.Controls.Clear();
             var matchingListCtrl = GetMatchingListCtrl();
-            var input = AssetsMatchingParasHelper.Create(_hydroInfo, GetCalcuResultList());
+            var input = AssetsMatchingParasHelper.Create(_hydroInfo, GetCalcuVisualResultList(Yw.EPAnet.CalcuMode.MinorLoss, false));
             matchingListCtrl.SetBindingData(input);
             this.controlContainerBottom.Controls.Add(matchingListCtrl);
             this.docPnlBottom.Visibility = DevExpress.XtraBars.Docking.DockVisibility.Visible;
@@ -933,7 +1259,7 @@
             {
                 return;
             }
-            var allCalcuResultList = GetCalcuResultList();
+            var allCalcuResultList = GetCalcuVisualResultList(Yw.EPAnet.CalcuMode.MinorLoss, false);
             var vmList = new List<XhsSinglePumpViewModel>();
             foreach (var pump in _hydroInfo.Pumps)
             {
@@ -1381,7 +1707,7 @@
             }
             var allGradingList = await GetGradingList();
             var allGradingApplyList = GetGradingApplyList();
-            var allCalcuResultList = GetCalcuResultList();
+            var allCalcuResultList = GetCalcuVisualResultList(Yw.EPAnet.CalcuMode.MinorLoss, false);
             if (!useCache)
             {
                 _allGradingResultList = HydroGradingHelper.GetResultList(_hydroInfo, allGradingList, allGradingApplyList, allCalcuResultList);
@@ -1435,7 +1761,7 @@
             var allGradingList = await GetGradingList();
             var allGradingApplyList = GetGradingApplyList();
             var allGradingResultList = await GetGradingResultList(true);
-            var allCalcuResultList = GetCalcuResultList(true);
+            var allCalcuResultList = GetCalcuVisualResultList(Yw.EPAnet.CalcuMode.MinorLoss, false);
             var oldResult = allGradingResultList?.Find(x => x.Code == visual.Code);
             if (oldResult != null)
             {
@@ -1533,7 +1859,7 @@
             if (_allFlowEffectList == null)
             {
                 _allFlowEffectList = new List<LogicFlowEffect>();
-                var allCalcuResultList = GetCalcuResultList();
+                var allCalcuResultList = GetCalcuVisualResultList(Yw.EPAnet.CalcuMode.MinorLoss, false);
                 if (_hydroInfo.Pipes != null && _hydroInfo.Pipes.Count > 0)
                 {
                     foreach (var parter in _hydroInfo.Pipes)
@@ -1656,7 +1982,7 @@
                 flowEffect.SpeedY = -0.1;
             }
 
-            var allCalcuResultList = GetCalcuResultList();
+            var allCalcuResultList = GetCalcuVisualResultList(Yw.EPAnet.CalcuMode.MinorLoss, false);
             var calcuResult = allCalcuResultList?.Find(x => x.Code == visual.Code) as HydroCalcuLinkResult;
             if (calcuResult != null)
             {
@@ -1676,165 +2002,6 @@
         {
             _isFlowEffectVisible = this.barCkFlowEffect.Checked;
             SetFlowEffect();
-        }
-
-        #endregion
-
-        #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)
-            {
-                return default;
-            }
-            if (_allVisualViewModelList == null)
-            {
-                _allVisualViewModelList = new List<HydroVisualViewModel>();
-                var allVisualList = _hydroInfo.GetAllVisuals();
-                if (allVisualList != null && allVisualList.Count > 0)
-                {
-                    var allCalcuResultList = GetCalcuResultList();
-                    allVisualList.ForEach(x =>
-                    {
-                        var vm = HydroVisualViewModelBuilder.CreateVisualViewModel(x, _hydroInfo);
-                        var calcuResult = allCalcuResultList?.Find(x => x.Code == x.Code);
-                        if (calcuResult != null)
-                        {
-                            vm.UpdateCalcuProperty(calcuResult);
-                        }
-                        _allVisualViewModelList.Add(vm);
-                    });
-                }
-            }
-            return _allVisualViewModelList;
-        }
-
-        //鏇存柊鍙瑙嗗浘灞炴��
-        private void UpdateVisualViewModelProperty()
-        {
-            var allVisualViewModelList = GetVisualViewModelList();
-            if (allVisualViewModelList != null && allVisualViewModelList.Count > 0)
-            {
-                allVisualViewModelList.ForEach(x =>
-                {
-                    x.UpdateProperty();
-                });
-            }
-        }
-
-        //鏇存柊鍙瑙嗗浘灞炴��
-        private void UpdateVisualViewModelProperty(List<string> codes)
-        {
-            if (codes == null || codes.Count < 1)
-            {
-                return;
-            }
-            var allVisualViewModelList = GetVisualViewModelList();
-            if (allVisualViewModelList != null && allVisualViewModelList.Count > 0)
-            {
-                allVisualViewModelList.ForEach(x =>
-                {
-                    if (codes.Contains(x.Code))
-                    {
-                        x.UpdateProperty();
-                    }
-                });
-            }
-        }
-
-        //鏇存柊鍙瑙嗗浘灞炴��
-        private void UpdateVisualViewModelProperty(List<Yw.Model.HydroVisualInfo> visualList)
-        {
-            if (visualList == null || visualList.Count < 1)
-            {
-                return;
-            }
-            var allVisualViewModelList = GetVisualViewModelList();
-            if (allVisualViewModelList != null && allVisualViewModelList.Count > 0)
-            {
-                allVisualViewModelList.ForEach(x =>
-                {
-                    if (visualList.Exists(t => t.Code == x.Code))
-                    {
-                        x.UpdateProperty();
-                    }
-                });
-            }
-        }
-
-        //鏇存柊鍙瑙嗗浘璁$畻灞炴��
-        private void UpdateVisualViewModelCalcuProperty()
-        {
-            var allVisualViewModelList = GetVisualViewModelList();
-            if (allVisualViewModelList != null && allVisualViewModelList.Count > 0)
-            {
-                var allCalcuResultList = GetCalcuResultList();
-                if (allCalcuResultList != null && allCalcuResultList.Count > 0)
-                {
-                    allVisualViewModelList.ForEach(x =>
-                    {
-                        var calcuResult = allCalcuResultList.Find(t => t.Code == x.Code);
-                        if (calcuResult != null)
-                        {
-                            x.UpdateCalcuProperty(calcuResult);
-                        }
-                    });
-                }
-            }
-        }
-
-        //鑾峰彇鏋勪欢瑙嗗浘
-        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)
-        {
-            if (visual == null)
-            {
-                return default;
-            }
-            var allVisualViewModelList = GetVisualViewModelList();
-            return allVisualViewModelList?.Find(x => x.Code == visual.Code);
         }
 
         #endregion
@@ -1900,7 +2067,7 @@
             var visualListCtrl = GetVisualListCtrl();
             var allVisualViewModelList = GetVisualViewModelList();
             visualListCtrl.SetBindingData(allVisualViewModelList);
-            var allCalcuResultList = GetCalcuResultList();
+            var allCalcuResultList = GetCalcuVisualResultList(Yw.EPAnet.CalcuMode.MinorLoss, false);
             if (allCalcuResultList == null || allCalcuResultList.Count < 1)
             {
                 visualListCtrl.SetNormalView();
@@ -1931,8 +2098,6 @@
         {
             ShowVisualListCtrl();
         }
-
-        #endregion
 
         #endregion
 
@@ -2175,8 +2340,6 @@
 
         #endregion
 
-        #region 姘村姏妫�鏌�
-
         #region 妫�鏌ョ粨鏋�
 
         //妫�鏌ョ粨鏋滅紦瀛�
@@ -2260,41 +2423,10 @@
             this.docPnlBottom.Height = 350;
         }
 
-        #endregion
-
         //妫�鏌�
         private void barBtnCheck_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
         {
             ShowCheckCtrl(true);
-        }
-
-        #endregion
-
-        #region EPA璁$畻缁撴灉
-
-        //EPA璁$畻缁撴灉
-        private Yw.EPAnet.CalcuResult _epaCalcuResult = null;
-
-        //鑾峰彇EPA璁$畻缁撴灉
-        //CalcuMode 鍦� Yw.EPANet.Calcu.Core 涓畾涔�
-        //NeedCalcuAgain 鏄惁闇�瑕侀噸鏂拌绠�
-        private Yw.EPAnet.CalcuResult GetEpaCalcuResult(string calcuMode, bool needCalcuAgain = false)
-        {
-            if (_hydroInfo == null)
-            {
-                return default;
-            }
-            if (needCalcuAgain)
-            {
-                var network = _hydroInfo.ToNetwork();
-                _epaCalcuResult = network.Calcu(calcuMode);
-            }
-            if (_epaCalcuResult == null)
-            {
-                var network = _hydroInfo.ToNetwork();
-                _epaCalcuResult = network.Calcu(calcuMode);
-            }
-            return _epaCalcuResult;
         }
 
         #endregion
@@ -2316,7 +2448,7 @@
         }
 
         //鏄剧ず璁$畻澶辫触鎺т欢
-        private void ShowCalcuFailedCtrl(Yw.EPAnet.CalcuResult calcuResult)
+        private void ShowCalcuFailedCtrl(HydroCalcuResult calcuResult)
         {
             if (_hydroInfo == null)
             {
@@ -2330,6 +2462,7 @@
             {
                 return;
             }
+
             var calcuFailedCtrl = GetCalcuFailedCtrl();
             calcuFailedCtrl.SetBindingData(calcuResult.FailedList);
             this.controlContainerBottom.Controls.Clear();
@@ -2342,9 +2475,8 @@
         //鏄剧ず璁$畻澶辫触鎺т欢
         private void ShowCalcuFailedCtrl()
         {
-            ShowCalcuFailedCtrl(_epaCalcuResult);
+            ShowCalcuFailedCtrl(_calcuResult);
         }
-
 
         #endregion
 
@@ -2365,32 +2497,39 @@
             if (!checkResult.Succeed)
             {
                 ShowCheckCtrl(false);
-                TipFormHelper.ShowWarn("妫�鏌ュけ璐ュ鑷存棤娉曡繘琛岃瘯绠楋紝鍋滄淇锛�");
+                TipFormHelper.ShowWarn("妫�鏌ュけ璐ュ鑷存棤娉曡繘琛岃瘯绠楋紝鍋滄绠$綉淇锛�");
                 return;
             }
-            var calcuResult = GetEpaCalcuResult(Yw.EPAnet.CalcuMode.Simple, true);
-            if (calcuResult == null || !calcuResult.Succeed)
+            var calcuResult = _hydroInfo.Calcu(Yw.EPAnet.CalcuMode.Simple);
+            if (calcuResult == null)
+            {
+                return;
+            }
+            if (!calcuResult.Succeed)
             {
                 ShowCalcuFailedCtrl(calcuResult);
-                TipFormHelper.ShowWarn("璇曠畻澶辫触锛屽仠姝慨澶嶏紒");
+                TipFormHelper.ShowWarn("璇曠畻澶辫触锛屽仠姝㈢缃戜慨澶嶏紒");
                 return;
             }
-
             var allLinks = _hydroInfo.GetAllLinks();
             if (allLinks != null && allLinks.Count < 1)
             {
-                TipFormHelper.ShowError("妯″瀷涓湭鍖呭惈绠℃淇℃伅锛屽仠姝慨澶嶏紒");
+                TipFormHelper.ShowError("妯″瀷涓湭鍖呭惈绠℃淇℃伅锛屽仠姝㈢缃戜慨澶嶏紒");
                 return;
             }
             int count = 0;
             foreach (var link in allLinks)
             {
-                var calcuLink = calcuResult.LinkList?.Find(x => x.Id == link.Code);
+                var calcuLink = calcuResult.LinkList?.Find(x => x.Code == link.Code);
                 if (calcuLink == null)
                 {
                     continue;
                 }
-                if (calcuLink.Flow < 0)
+                if (!calcuLink.CalcuFlow.HasValue)
+                {
+                    continue;
+                }
+                if (calcuLink.CalcuFlow.Value < 0)
                 {
                     var tempCode = link.StartCode;
                     link.StartCode = link.EndCode;
@@ -2517,20 +2656,8 @@
 
         #region 宸ュ喌璁$畻
 
-        //鎵�鏈夊伐鍐靛垪琛�
-        private List<HydroWorkingVmo> _allWorkingList = null;
-
         //鎵�鏈夊伐鍐靛厓缁勫垪琛�
-        private Tuple<HydroWorkingVmo, HydroCheckResult, HydroCalcuResult> _allWorkingTupleList = null;
-
-
-
-
-
-
-
-        #region 宸ュ喌
-
+        private List<Tuple<HydroWorkingVmo, HydroCheckResult, HydroCalcuResult>> _allWorkingTupleList = new List<Tuple<HydroWorkingVmo, HydroCheckResult, HydroCalcuResult>>();
 
         //鏄剧ず宸ュ喌璁$畻绐椾綋
         private void ShowWorkingCalcuDlg()
@@ -2551,11 +2678,27 @@
                 {
                     return;
                 }
+                var vmo = new HydroWorkingVmo();
+                vmo.ModelID = _hydroInfo.ID;
+                vmo.Name = working.Name;
+                vmo.WorkingInfo = JsonHelper.Object2Json(working.WorkingInfo);
+                vmo.MonitorInfo = JsonHelper.Object2Json(working.MonitorInfo);
+                vmo.SortCode = _allWorkingList.Count < 1 ? 1 : _allWorkingList.Max(x => x.SortCode) + 1;
+                vmo.Description = working.Description;
+                vmo.ID = await BLLFactory<Yw.BLL.HydroWorking>.Instance.Insert(vmo);
+                if (vmo.ID < 1)
+                {
+                    TipFormHelper.ShowError("鍒涘缓宸ュ喌澶辫触锛岃绠楀彇娑堬紒");
+                    return;
+                }
+                _allWorkingList.Add(vmo);
+
                 _hydroInfo.UpdateWorkingInfo(working.WorkingInfo);
                 //鏍¢獙
                 _checkResult = _hydroInfo.Check();
                 if (!_checkResult.Succeed)
                 {
+                    _allWorkingTupleList.Add(new Tuple<HydroWorkingVmo, HydroCheckResult, HydroCalcuResult>(vmo, _checkResult, null));
                     ShowCheckCtrl();
                     TipFormHelper.ShowWarn("鏍¢獙澶辫触锛岃妫�鏌ュ悗閲嶈瘯");
                     return;
@@ -2565,19 +2708,18 @@
 
 
                 //await Task.Delay(5000);
+                _calcuResult = _hydroInfo.Calcu(Yw.EPAnet.CalcuMode.MinorLoss);
 
-                var netWork = Yw.Hydro.ParseHelper.ToNetwork(_hydroInfo);
-                _epaCalcuResult = netWork.CalcuMinorLoss();
 
                 WaitFormHelper.HideWaitForm();
-                if (_epaCalcuResult.Succeed)
+                if (_calcuResult.Succeed)
                 {
-                    GetCalcuResultList(false);
+                    _allWorkingTupleList.Add(new Tuple<HydroWorkingVmo, HydroCheckResult, HydroCalcuResult>(vmo, _checkResult, _calcuResult));
                     UpdateVisualViewModelProperty();
                     UpdateVisualViewModelCalcuProperty();
                     UpdateVisualListCtrl();
                     UpdateSelectedProperty();
-                    await _bimfaceCtrl?.SetLogicCalcuCustomLabels(_epaCalcuResult);
+                    await _bimfaceCtrl?.SetLogicCalcuCustomLabelsCalcuResult(_calcuResult);
                     TipFormHelper.ShowSucceed("璁$畻鎴愬姛锛�");
                     var codes = _hydroInfo.Pumps.Select(x => x.Code).ToList();
                     await _bimfaceCtrl?.ZoomAndSelectComponents(codes);
@@ -2595,182 +2737,6 @@
             dlg.ShowDialog();
         }
 
-        #endregion
-
-
-
-        #region 璁$畻缁撴灉
-
-        //鎵�鏈夎绠楃粨鏋滃垪琛�
-        private List<HydroCalcuVisualResult> _allCalcuResultList = null;
-
-        //鑾峰彇璁$畻缁撴灉
-        //true 浣跨敤缂撳瓨锛宖alse 涓嶄娇鐢ㄧ紦瀛�
-        private List<HydroCalcuVisualResult> GetCalcuResultList(bool isCache = true)
-        {
-            if (_hydroInfo == null)
-            {
-                return default;
-            }
-            if (_epaCalcuResult == null)
-            {
-                return default;
-            }
-            if (!_epaCalcuResult.Succeed)
-            {
-                return default;
-            }
-            if (isCache)
-            {
-                return _allCalcuResultList;
-            }
-
-            _allCalcuResultList = new List<HydroCalcuVisualResult>();
-
-            //鑺傜偣
-            var allNodeList = _hydroInfo.GetAllNodes();
-            if (allNodeList != null && allNodeList.Count > 0)
-            {
-                foreach (var node in allNodeList)
-                {
-                    var calcuNode = _epaCalcuResult.NodeList?.Find(x => x.Id == node.Code);
-                    if (calcuNode != null)
-                    {
-                        var calcuResult = new HydroCalcuNodeResult()
-                        {
-                            Code = node.Code,
-                            CalcuPress = calcuNode.Press,
-                            CalcuHead = calcuNode.Head,
-                            CalcuDemand = calcuNode.Demand
-                        };
-                        _allCalcuResultList.Add(calcuResult);
-                    }
-                }
-            }
-
-            //绠℃
-            var allLinkList = _hydroInfo.GetAllLinks();
-            if (allLinkList != null && allLinkList.Count > 0)
-            {
-                foreach (var link in allLinkList)
-                {
-                    var calcuLink = _epaCalcuResult.LinkList?.Find(x => x.Id == link.Code);
-                    if (calcuLink != null)
-                    {
-                        var calcuResult = new HydroCalcuLinkResult()
-                        {
-                            Code = link.Code,
-                            CalcuFlow = calcuLink.Flow,
-                            CalcuVelocity = calcuLink.Velocity,
-                            CalcuHeadLoss = calcuLink.Headloss
-                        };
-                        _allCalcuResultList.Add(calcuResult);
-                    }
-                }
-            }
-
-            //娴侀噺璁�
-            var allFlowmeterList = _hydroInfo.Flowmeters;
-            if (allFlowmeterList != null && allFlowmeterList.Count > 0)
-            {
-                foreach (var flowmeter in allFlowmeterList)
-                {
-                    var calcuFlowmeterResult = _allCalcuResultList.Find(x => x.Code == flowmeter.Code) as HydroCalcuNodeResult;
-                    if (calcuFlowmeterResult != null)
-                    {
-                        var calcuFlowmeterNewResult = new HydroCalcuFlowmeterResult(calcuFlowmeterResult);
-                        var calcuFlowmeterLinkResultList = new List<HydroCalcuLinkResult>();
-                        var flowmeterLinkList = allLinkList?.Where(x => x.StartCode == flowmeter.Code || x.EndCode == flowmeter.Code).ToList();
-                        if (flowmeterLinkList != null && flowmeterLinkList.Count > 0)
-                        {
-                            foreach (var flowmeterLink in flowmeterLinkList)
-                            {
-                                var calcuFlowmeterLinkResult = _allCalcuResultList.Find(x => x.Code == flowmeterLink.Code) as HydroCalcuLinkResult;
-                                if (calcuFlowmeterLinkResult != null)
-                                {
-                                    calcuFlowmeterLinkResultList.Add(calcuFlowmeterLinkResult);
-                                }
-                            }
-                        }
-                        if (calcuFlowmeterLinkResultList.Exists(x => x.CalcuFlow.HasValue))
-                        {
-                            calcuFlowmeterNewResult.CalcuQ = calcuFlowmeterLinkResultList.Where(x => x.CalcuFlow.HasValue).Average(x => x.CalcuFlow.Value);
-                        }
-                        _allCalcuResultList.Remove(calcuFlowmeterResult);
-                        _allCalcuResultList.Add(calcuFlowmeterNewResult);
-                    }
-                }
-            }
-
-            //鍘嬪姏琛�
-            var allPressmeterList = _hydroInfo.Pressmeters;
-            if (allPressmeterList != null && allPressmeterList.Count > 0)
-            {
-                foreach (var pressmeter in allPressmeterList)
-                {
-                    var calcuPressmeterResult = _allCalcuResultList.Find(x => x.Code == pressmeter.Code) as HydroCalcuNodeResult;
-                    if (calcuPressmeterResult != null)
-                    {
-                        var calcuPressmeterNewResult = new HydroCalcuPressmeterResult(calcuPressmeterResult);
-                        calcuPressmeterNewResult.CalcuPr = calcuPressmeterResult.CalcuPress;
-                        _allCalcuResultList.Remove(calcuPressmeterResult);
-                        _allCalcuResultList.Add(calcuPressmeterNewResult);
-                    }
-                }
-            }
-
-            //姘存车
-            var allPumpList = _hydroInfo.Pumps;
-            if (allPumpList != null && allPumpList.Count > 0)
-            {
-                foreach (var pump in allPumpList)
-                {
-                    var calcuPumpResult = _allCalcuResultList.Find(x => x.Code == pump.Code) as HydroCalcuLinkResult;
-                    if (calcuPumpResult != null)
-                    {
-                        var calcuPumpNewResult = new HydroCalcuPumpResult(calcuPumpResult);
-                        calcuPumpNewResult.CalcuQ = calcuPumpResult.CalcuFlow;
-                        if (calcuPumpNewResult.CalcuQ.HasValue)
-                        {
-                            var calcuNodeStartResult = _allCalcuResultList.Find(x => x.Code == pump.StartCode) as HydroCalcuNodeResult;
-                            var calcuNodeEndResult = _allCalcuResultList.Find(x => x.Code == pump.EndCode) as HydroCalcuNodeResult;
-                            if (calcuNodeStartResult != null && calcuNodeEndResult != null)
-                            {
-                                if (calcuNodeStartResult.CalcuPress.HasValue && calcuNodeEndResult.CalcuPress.HasValue)
-                                {
-                                    calcuPumpNewResult.CalcuH = Math.Abs(calcuNodeStartResult.CalcuPress.Value - calcuNodeEndResult.CalcuPress.Value);
-                                }
-                                if (pump.LinkStatus == Yw.Hydro.PumpStatus.Open && pump.RatedN.HasValue)
-                                {
-                                    var curveqp = _hydroInfo.Curves?.Find(x => x.Code == pump.CurveQP);
-                                    if (curveqp != null)
-                                    {
-                                        if (curveqp.CurveData != null && curveqp.CurveData.Count > 3)
-                                        {
-                                            var point2dList = curveqp.CurveData.Select(x => new Yw.Geometry.Point2d(x.X, x.Y)).ToList();
-                                            var point2dSimularList = point2dList.GetQPPointListByN(pump.RatedN.Value, pump.RatedN.Value * pump.SpeedRatio);
-                                            var pumpCurveQp = new Yw.Pump.CurveQP(eFeatType.Cubic, point2dSimularList);
-                                            calcuPumpNewResult.CalcuP = pumpCurveQp.FeatCurve.GetPointY(calcuPumpNewResult.CalcuQ.Value);
-                                        }
-                                    }
-                                }
-                                if (calcuPumpNewResult.CalcuH.HasValue && calcuPumpNewResult.CalcuP.HasValue)
-                                {
-                                    calcuPumpNewResult.CalcuE = Yw.Pump.CalculationHelper.CalcuE(calcuPumpNewResult.CalcuQ.Value, calcuPumpNewResult.CalcuH.Value, calcuPumpNewResult.CalcuP.Value);
-                                }
-                            }
-                        }
-                        _allCalcuResultList.Remove(calcuPumpResult);
-                        _allCalcuResultList.Add(calcuPumpNewResult);
-                    }
-                }
-            }
-
-            return _allCalcuResultList;
-        }
-
-        #endregion
-
         //姘村姏璁$畻
         private void barBtnHydroCalcu_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
         {
@@ -2779,8 +2745,65 @@
 
         #endregion
 
+        #region 褰撳墠宸ュ喌
+
+        //褰撳墠宸ュ喌
+        private Yw.Vmo.HydroWorkingVmo _currentWorking = null;
+
+        //鍒濆鍖栧綋鍓嶅伐鍐�
+        private void InitialCurrentWorking(List<HydroWorkingVmo> allWorkingList)
+        {
+            this.repositoryItemImageComboBox1.Items.BeginUpdate();
+            this.repositoryItemImageComboBox1.Items.Clear();
+            if (allWorkingList != null && allWorkingList.Count > 0)
+            {
+                allWorkingList.ForEach(x => this.repositoryItemImageComboBox1.Items.Add(x.Name, x, -1));
+                this.barEditCurrentWorking.EditValue = allWorkingList.Last();
+            }
+            this.repositoryItemImageComboBox1.Items.EndUpdate();
+        }
+
+        //澧炲姞褰撳墠宸ュ喌
+        private void AppendCurrentWorking(HydroWorkingVmo working)
+        {
+            this.repositoryItemImageComboBox1.Items.BeginUpdate();
+            this.repositoryItemImageComboBox1.Items.Add(working.Name, working, -1);
+            this.repositoryItemImageComboBox1.Items.EndUpdate();
+            this.barEditCurrentWorking.EditValue = working;
+        }
+
+        //璁剧疆褰撳墠宸ュ喌
+        private void SetCurrentWorking(HydroWorkingVmo working)
+        {
+            _currentWorking = working;
+        }
+
+        //褰撳墠宸ュ喌鍙戠敓鏀瑰彉
+        private void barEditCurrentWorking_EditValueChanged(object sender, EventArgs e)
+        {
+            var working = this.barEditCurrentWorking.EditValue as HydroWorkingVmo;
+            SetCurrentWorking(working);
+        }
 
 
+        #endregion
+
+        #region 宸ュ喌鍒楄〃
+
+        //鎵�鏈夊伐鍐靛垪琛�
+        private List<HydroWorkingVmo> _allWorkingList = null;
+
+        //鍒濆鍖栧伐鍐靛垪琛�
+        private async void InitialWorkingList()
+        {
+            _allWorkingList = await BLLFactory<Yw.BLL.HydroWorking>.Instance.GetByModelID(_hydroInfo.ID);
+            if (_allWorkingList == null)
+            {
+                _allWorkingList = new List<HydroWorkingVmo>();
+            }
+        }
+
+        #endregion
 
 
 
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 63b2d92..026d825 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
@@ -348,7 +348,7 @@
         UzE4LjcsMTYsMTcsMTZ6IiBjbGFzcz0iQmx1ZSIgLz4NCiAgPC9nPg0KPC9zdmc+Cw==
 </value>
   </data>
-  <data name="barBtnParallelAnaly.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
+  <data name="barBtnCurrentWorkingParallelAnalysis.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
     <value>
         AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIzLjIsIFZlcnNpb249MjMuMi40
         LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
@@ -534,29 +534,7 @@
         PSJSZWQiIC8+DQogIDwvZz4NCjwvc3ZnPgs=
 </value>
   </data>
-  <data name="barBtnWorkingCompare.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
-    <value>
-        AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIzLjIsIFZlcnNpb249MjMuMi40
-        LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
-        dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAAGwDAAAC77u/
-        PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi
-        IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv
-        MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh
-        Y2U9InByZXNlcnZlIiBpZD0iTGF5ZXJfMSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAg
-        MzIgMzIiPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLkJsYWNre2ZpbGw6IzcyNzI3Mjt9Cgku
-        WWVsbG93e2ZpbGw6I0ZGQjExNTt9CgkuQmx1ZXtmaWxsOiMxMTc3RDc7fQoJLkdyZWVue2ZpbGw6IzAz
-        OUMyMzt9CgkuUmVke2ZpbGw6I0QxMUMxQzt9CgkuV2hpdGV7ZmlsbDojRkZGRkZGO30KCS5zdDB7b3Bh
-        Y2l0eTowLjc1O30KCS5zdDF7b3BhY2l0eTowLjU7fQoJLnN0MntvcGFjaXR5OjAuMjU7fQo8L3N0eWxl
-        Pg0KICA8ZyBpZD0iR3JvdXBGaWVsZENvbGxlY3Rpb25fMV8iPg0KICAgIDxwYXRoIGQ9Ik0xNywxNEgx
-        Yy0wLjYsMC0xLTAuNC0xLTFWNWMwLTAuNiwwLjQtMSwxLTFoMTZjMC41LDAsMSwwLjQsMSwxdjhDMTgs
-        MTMuNiwxNy41LDE0LDE3LDE0eiBNMzIsMjV2LTggICBjMC0wLjUtMC41LTEtMS0xSDE1Yy0wLjYsMC0x
-        LDAuNS0xLDF2OGMwLDAuNSwwLjQsMSwxLDFoMTZDMzEuNSwyNiwzMiwyNS41LDMyLDI1eiIgY2xhc3M9
-        IkJsdWUiIC8+DQogICAgPHBhdGggZD0iTTgsMjB2NGg0djJIN2MtMC42LDAtMS0wLjQtMS0xdi01SDJs
-        NS01bDUsNUg4eiBNMjYsMTBWNWMwLTAuNi0wLjQtMS0xLTFoLTV2Mmg0djRoLTRsNSw1bDUtNUgyNnoi
-        IGNsYXNzPSJHcmVlbiIgLz4NCiAgPC9nPg0KPC9zdmc+Cw==
-</value>
-  </data>
-  <data name="barBtnWorkingLossCurve.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
+  <data name="barBtnCurrentWorkingLossCurve.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
     <value>
         AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIzLjIsIFZlcnNpb249MjMuMi40
         LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
@@ -574,7 +552,7 @@
         IGNsYXNzPSJCbHVlIiAvPg0KICA8L2c+DQo8L3N2Zz4L
 </value>
   </data>
-  <data name="barBtnWorkingLossScale.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
+  <data name="barBtnCurrentWorkingLossScale.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
     <value>
         AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIzLjIsIFZlcnNpb249MjMuMi40
         LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
@@ -595,7 +573,7 @@
         IC8+DQogIDwvZz4NCjwvc3ZnPgs=
 </value>
   </data>
-  <data name="barBtnWorkingPowerAnalysis.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
+  <data name="barBtnCurrentWorkingPowerAnalysis.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
     <value>
         AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIzLjIsIFZlcnNpb249MjMuMi40
         LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
@@ -642,7 +620,7 @@
         MjQsOS42LDIzLjYsMTAsMjMsMTB6IiBjbGFzcz0iR3JlZW4iIC8+DQogIDwvZz4NCjwvc3ZnPgs=
 </value>
   </data>
-  <data name="barBtnWorkingMulti.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
+  <data name="barBtnCurrentWorkingMultiAnalysis.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
     <value>
         AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIzLjIsIFZlcnNpb249MjMuMi40
         LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
@@ -713,6 +691,28 @@
         LTZWMjh6IiBjbGFzcz0iQmxhY2siIC8+DQogIDwvZz4NCjwvc3ZnPgs=
 </value>
   </data>
+  <data name="barBtnWorkingList.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIzLjIsIFZlcnNpb249MjMuMi40
+        LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
+        dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAAIUDAAAC77u/
+        PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi
+        IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv
+        MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh
+        Y2U9InByZXNlcnZlIiBpZD0iTGF5ZXJfMSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAg
+        MzIgMzIiPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLlllbGxvd3tmaWxsOiNGRkIxMTU7fQoJ
+        LlJlZHtmaWxsOiNEMTFDMUM7fQoJLkJsdWV7ZmlsbDojMTE3N0Q3O30KCS5HcmVlbntmaWxsOiMwMzlD
+        MjM7fQoJLkJsYWNre2ZpbGw6IzcyNzI3Mjt9CgkuV2hpdGV7ZmlsbDojRkZGRkZGO30KCS5zdDB7b3Bh
+        Y2l0eTowLjU7fQoJLnN0MXtkaXNwbGF5Om5vbmU7fQoJLnN0MntkaXNwbGF5OmlubGluZTtmaWxsOiMw
+        MzlDMjM7fQoJLnN0M3tkaXNwbGF5OmlubGluZTtmaWxsOiNEMTFDMUM7fQoJLnN0NHtkaXNwbGF5Omlu
+        bGluZTtmaWxsOiM3MjcyNzI7fQo8L3N0eWxlPg0KICA8ZyBpZD0iTGlzdEJ1bGxldHMiPg0KICAgIDxw
+        YXRoIGQ9Ik0zMCwxMEgxMlY4aDE4VjEweiBNMzAsMThIMTJ2LTJoMThWMTh6IE0zMCwyNkgxMnYtMmgx
+        OFYyNnoiIGNsYXNzPSJCbGFjayIgLz4NCiAgICA8cGF0aCBkPSJNOCw5YzAsMS43LTEuMywzLTMsM3Mt
+        My0xLjMtMy0zczEuMy0zLDMtM1M4LDcuMyw4LDl6IE01LDE0Yy0xLjcsMC0zLDEuMy0zLDNzMS4zLDMs
+        MywzczMtMS4zLDMtMyAgIFM2LjcsMTQsNSwxNHogTTUsMjJjLTEuNywwLTMsMS4zLTMsM3MxLjMsMywz
+        LDNzMy0xLjMsMy0zUzYuNywyMiw1LDIyeiIgY2xhc3M9IkJsdWUiIC8+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.Hydro.Core/00-core/01-const/HydroElbow.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/01-const/HydroElbow.cs
new file mode 100644
index 0000000..3349296
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/01-const/HydroElbow.cs
@@ -0,0 +1,25 @@
+锘縩amespace Yw.WinFrmUI
+{
+    /// <summary>
+    /// 寮ご
+    /// </summary>
+    public class HydroElbow
+    {
+        /// <summary>
+        /// 鐭緞
+        /// </summary>
+        public const string Short = "鐭緞";
+
+        /// <summary>
+        /// 涓緞
+        /// </summary>
+        public const string Middle = "涓緞";
+
+        /// <summary>
+        /// 闀垮緞 
+        /// </summary>
+        public const string Long = "闀垮緞";
+
+
+    }
+}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/02-enum/eAlgorithmType.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/02-enum/eAlgorithmType.cs
new file mode 100644
index 0000000..a2c5169
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/02-enum/eAlgorithmType.cs
@@ -0,0 +1,27 @@
+锘縩amespace Yw.WinFrmUI
+{
+    /// <summary>
+    /// 绠楁硶绫诲瀷
+    /// </summary>
+    public enum eAlgorithmType
+    {
+        /// <summary>
+        /// 娴锋.-濞佸粔濮嗘柉绯绘暟
+        /// </summary>
+        [Display(Name = "娴锋.-濞佸粔濮嗘柉绯绘暟")]
+        Hazen = 0,
+
+        /// <summary>
+        /// 杈捐タ-榄忔柉宸磋但绮楃硻搴︾郴鏁�
+        /// </summary>
+        [Display(Name = "杈捐タ-榄忔柉宸磋但绮楃硻搴︾郴鏁�")]
+        Darcy = 1,
+
+        /// <summary>
+        /// 鏇煎畞绮楃硻绯绘暟
+        /// </summary>
+        [Display(Name = "鏇煎畞绮楃硻绯绘暟")]
+        Manning = 2
+    }
+
+}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/02-enum/eElbowType.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/02-enum/eElbowType.cs
new file mode 100644
index 0000000..1ef63dd
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/02-enum/eElbowType.cs
@@ -0,0 +1,29 @@
+锘縩amespace Yw.WinFrmUI
+{
+    /// <summary>
+    /// 寮ご绫诲瀷
+    /// </summary>
+    public enum eElbowType
+    {
+
+        /// <summary>
+        /// 鐭緞
+        /// </summary>
+        [Display(Name = "鐭緞")]
+        Short = 1,
+
+        /// <summary>
+        /// 涓緞
+        /// </summary>
+        [Display(Name = "涓緞")]
+        Middle = 2,
+
+        /// <summary>
+        /// 闀垮緞
+        /// </summary>
+        [Display(Name = "闀垮緞")]
+        Long = 3
+
+
+    }
+}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/02-enum/eValveType.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/02-enum/eValveType.cs
new file mode 100644
index 0000000..de71b1c
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/02-enum/eValveType.cs
@@ -0,0 +1,50 @@
+锘縩amespace Yw.WinFrmUI
+{
+    /// <summary>
+    /// 闃�闂ㄧ被鍨�
+    /// </summary>
+    public enum eValveType
+    {
+        /// <summary>
+        /// 鍑忓帇闃�
+        /// </summary>
+        [Display(Name = "鍑忓帇闃�")]
+        PRV = 0,
+
+        /// <summary>
+        /// 绋冲帇闃�
+        /// </summary>
+        [Display(Name = "绋冲帇闃�")]
+        PSV = 1,
+
+        /// <summary>
+        /// 鍘嬪姏鍒跺姩闃�
+        /// </summary>
+        [Display(Name = "鍘嬪姏鍒跺姩闃�")]
+        PBV = 2,
+
+        /// <summary>
+        /// 娴侀噺鎺у埗闃�
+        /// </summary>
+        [Display(Name = "娴侀噺鎺у埗闃�")]
+        FCV = 3,
+
+        /// <summary>
+        /// 鑺傛祦鎺у埗闃�
+        /// </summary>
+        [Display(Name = "鑺傛祦鎺у埗闃�")]
+        TCV = 4,
+
+        /// <summary>
+        /// 甯歌闃�闂�
+        /// </summary>
+        [Display(Name = "甯歌闃�闂�")]
+        GPV = 5,
+
+        /// <summary>
+        /// 姝㈠洖闃�
+        /// </summary>
+        [Display(Name = "姝㈠洖闃�")]
+        CV = 6
+    }
+}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/02-transfer/HydroL2dTransferHelper.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/02-transfer/HydroL2dTransferHelper.cs
index 2a92841..8d79183 100644
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/02-transfer/HydroL2dTransferHelper.cs
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/02-transfer/HydroL2dTransferHelper.cs
@@ -212,7 +212,7 @@
                 {
                     var startNode = rhs.GetAllNodes().Find(x => x.Code == pump.StartCode);
                     var endNode = rhs.GetAllNodes().Find(x => x.Code == pump.EndCode);
-                    var pumpViewModel = new Pump();
+                    var pumpViewModel = new Yw.WinFrmUI.HydroL2d.Pump();
                     pumpViewModel.Id = pump.Code;
                     pumpViewModel.Name = pump.Name;
                     pumpViewModel.StartPosition = new PointF((float)startNode.Position2d.X, (float)startNode.Position2d.Y);
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/01-result/HydroCalcuResultHelper.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/01-result/HydroCalcuResultHelper.cs
new file mode 100644
index 0000000..8fd3d6c
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/01-result/HydroCalcuResultHelper.cs
@@ -0,0 +1,156 @@
+锘縰sing Yw.EPAnet;
+using Yw.Hydro;
+
+namespace Yw.WinFrmUI
+{
+    /// <summary>
+    /// 璁$畻缁撴灉杈呭姪绫�
+    /// </summary>
+    public static class HydroCalcuResultHelper
+    {
+        /// <summary>
+        /// 璁$畻
+        /// </summary>
+        public static HydroCalcuResult Calcu(this Yw.Model.HydroModelInfo hydroInfo, string calcuMode = Yw.EPAnet.CalcuMode.Simple)
+        {
+            var network = hydroInfo.ToNetwork();
+            if (network == null)
+            {
+                return default;
+            }
+            var calcuResult = network.Calcu(calcuMode);
+            if (calcuResult == null)
+            {
+                return default;
+            }
+            return hydroInfo.GetCalcuResult(calcuResult);
+        }
+
+        /// <summary>
+        /// 鑾峰彇璁$畻缁撴灉
+        /// </summary>
+        public static HydroCalcuResult GetCalcuResult(this Yw.Model.HydroModelInfo hydroInfo, Yw.EPAnet.CalcuResult calcuResult)
+        {
+            if (hydroInfo == null)
+            {
+                return default;
+            }
+            if (calcuResult == null)
+            {
+                return default;
+            }
+
+            var hydroCalcuResult = new HydroCalcuResult();
+            hydroCalcuResult.Succeed = calcuResult.Succeed;
+            //澶辫触鍒楄〃
+            hydroCalcuResult.FailedList = calcuResult.FailedList?.Select(x => new HydroCalcuFailed(x)).ToList();
+            //鑺傜偣鍒楄〃
+            hydroCalcuResult.NodeList = calcuResult.NodeList?.Select(x => new HydroCalcuNodeResult(x)).ToList();
+            //绠℃鍒楄〃
+            hydroCalcuResult.LinkList = calcuResult.LinkList?.Select(x => new HydroCalcuLinkResult(x)).ToList();
+
+            //娴侀噺璁�
+            var allFlowmeterList = hydroInfo.Flowmeters;
+            if (allFlowmeterList != null && allFlowmeterList.Count > 0)
+            {
+                var allLinkList = hydroInfo.GetAllLinks();
+                foreach (var flowmeter in allFlowmeterList)
+                {
+                    var calcuFlowmeterResult = hydroCalcuResult.NodeList?.Find(x => x.Code == flowmeter.Code);
+                    if (calcuFlowmeterResult != null)
+                    {
+                        var calcuFlowmeterNewResult = new HydroCalcuFlowmeterResult(calcuFlowmeterResult);
+                        var calcuFlowmeterLinkResultList = new List<HydroCalcuLinkResult>();
+                        var flowmeterLinkList = allLinkList?.Where(x => x.StartCode == flowmeter.Code || x.EndCode == flowmeter.Code).ToList();
+                        if (flowmeterLinkList != null && flowmeterLinkList.Count > 0)
+                        {
+                            foreach (var flowmeterLink in flowmeterLinkList)
+                            {
+                                var calcuFlowmeterLinkResult = hydroCalcuResult.LinkList?.Find(x => x.Code == flowmeterLink.Code);
+                                if (calcuFlowmeterLinkResult != null)
+                                {
+                                    calcuFlowmeterLinkResultList.Add(calcuFlowmeterLinkResult);
+                                }
+                            }
+                        }
+                        if (calcuFlowmeterLinkResultList.Exists(x => x.CalcuFlow.HasValue))
+                        {
+                            calcuFlowmeterNewResult.CalcuQ = calcuFlowmeterLinkResultList.Where(x => x.CalcuFlow.HasValue).Average(x => x.CalcuFlow.Value);
+                        }
+                        hydroCalcuResult.NodeList.Remove(calcuFlowmeterResult);
+                        hydroCalcuResult.NodeList.Add(calcuFlowmeterNewResult);
+                    }
+                }
+            }
+
+            //鍘嬪姏琛�
+            var allPressmeterList = hydroInfo.Pressmeters;
+            if (allPressmeterList != null && allPressmeterList.Count > 0)
+            {
+                foreach (var pressmeter in allPressmeterList)
+                {
+                    var calcuPressmeterResult = hydroCalcuResult.NodeList?.Find(x => x.Code == pressmeter.Code);
+                    if (calcuPressmeterResult != null)
+                    {
+                        var calcuPressmeterNewResult = new HydroCalcuPressmeterResult(calcuPressmeterResult);
+                        calcuPressmeterNewResult.CalcuPr = calcuPressmeterResult.CalcuPress;
+                        hydroCalcuResult.NodeList.Remove(calcuPressmeterResult);
+                        hydroCalcuResult.NodeList.Add(calcuPressmeterNewResult);
+                    }
+                }
+            }
+
+            //姘存车
+            var allPumpList = hydroInfo.Pumps;
+            if (allPumpList != null && allPumpList.Count > 0)
+            {
+                foreach (var pump in allPumpList)
+                {
+                    var calcuPumpResult = hydroCalcuResult.LinkList.Find(x => x.Code == pump.Code);
+                    if (calcuPumpResult != null)
+                    {
+                        var calcuPumpNewResult = new HydroCalcuPumpResult(calcuPumpResult);
+                        calcuPumpNewResult.CalcuQ = calcuPumpResult.CalcuFlow;
+                        if (calcuPumpNewResult.CalcuQ.HasValue)
+                        {
+                            var calcuNodeStartResult = hydroCalcuResult.NodeList?.Find(x => x.Code == pump.StartCode);
+                            var calcuNodeEndResult = hydroCalcuResult.NodeList?.Find(x => x.Code == pump.EndCode);
+                            if (calcuNodeStartResult != null && calcuNodeEndResult != null)
+                            {
+                                if (calcuNodeStartResult.CalcuPress.HasValue && calcuNodeEndResult.CalcuPress.HasValue)
+                                {
+                                    calcuPumpNewResult.CalcuH = Math.Abs(calcuNodeStartResult.CalcuPress.Value - calcuNodeEndResult.CalcuPress.Value);
+                                }
+                                if (pump.LinkStatus == Yw.Hydro.PumpStatus.Open && pump.RatedN.HasValue)
+                                {
+                                    var curveqp = hydroInfo.Curves?.Find(x => x.Code == pump.CurveQP);
+                                    if (curveqp != null)
+                                    {
+                                        if (curveqp.CurveData != null && curveqp.CurveData.Count > 3)
+                                        {
+                                            var point2dList = curveqp.CurveData.Select(x => new Yw.Geometry.Point2d(x.X, x.Y)).ToList();
+                                            var point2dSimularList = point2dList.GetQPPointListByN(pump.RatedN.Value, pump.RatedN.Value * pump.SpeedRatio);
+                                            var pumpCurveQp = new Yw.Pump.CurveQP(eFeatType.Cubic, point2dSimularList);
+                                            calcuPumpNewResult.CalcuP = pumpCurveQp.FeatCurve.GetPointY(calcuPumpNewResult.CalcuQ.Value);
+                                        }
+                                    }
+                                }
+                                if (calcuPumpNewResult.CalcuH.HasValue && calcuPumpNewResult.CalcuP.HasValue)
+                                {
+                                    calcuPumpNewResult.CalcuE = Yw.Pump.CalculationHelper.CalcuE(calcuPumpNewResult.CalcuQ.Value, calcuPumpNewResult.CalcuH.Value, calcuPumpNewResult.CalcuP.Value);
+                                }
+                            }
+                        }
+                        hydroCalcuResult.LinkList.Remove(calcuPumpResult);
+                        hydroCalcuResult.LinkList.Add(calcuPumpNewResult);
+                    }
+                }
+            }
+
+            return hydroCalcuResult;
+        }
+
+
+    }
+
+}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/02-visual/HydroCalcuVisualResult.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/02-visual/HydroCalcuVisualResult.cs
index 63e6327..3dc4e1e 100644
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/02-visual/HydroCalcuVisualResult.cs
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/02-visual/HydroCalcuVisualResult.cs
@@ -26,6 +26,13 @@
             this.Code = rhs.Code;
         }
 
+        /// <summary>
+        /// 
+        /// </summary>
+        public HydroCalcuVisualResult(Yw.EPAnet.CalcuVisual rhs)
+        {
+            this.Code = rhs.Id;
+        }
 
         /// <summary>
         /// 缂栫爜
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/03-node/00-core/HydroCalcuNodeResult.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/03-node/00-core/HydroCalcuNodeResult.cs
index ce37bcd..463d8e1 100644
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/03-node/00-core/HydroCalcuNodeResult.cs
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/03-node/00-core/HydroCalcuNodeResult.cs
@@ -41,6 +41,16 @@
         }
 
         /// <summary>
+        /// 
+        /// </summary>
+        public HydroCalcuNodeResult(Yw.EPAnet.CalcuNode rhs) : base(rhs)
+        {
+            this.CalcuPress = rhs.Press;
+            this.CalcuHead = rhs.Head;
+            this.CalcuDemand = rhs.Demand;
+        }
+
+        /// <summary>
         /// 鍘嬪姏锛坢锛�
         /// </summary>
         public double? CalcuPress { get; set; }
@@ -54,5 +64,7 @@
         /// 闇�姘撮噺锛坢鲁/h锛�
         /// </summary>
         public double? CalcuDemand { get; set; }
+
+
     }
 }
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/03-node/01-flowmeter/HydroCalcuFlowmeterResult.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/03-node/01-flowmeter/HydroCalcuFlowmeterResult.cs
index fff404a..04f70ea 100644
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/03-node/01-flowmeter/HydroCalcuFlowmeterResult.cs
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/03-node/01-flowmeter/HydroCalcuFlowmeterResult.cs
@@ -33,6 +33,11 @@
         /// <summary>
         /// 
         /// </summary>
+        public HydroCalcuFlowmeterResult(Yw.EPAnet.CalcuNode rhs) : base(rhs) { }
+
+        /// <summary>
+        /// 
+        /// </summary>
         public HydroCalcuFlowmeterResult(IHydroCalcuFlowmeterResult rhs) : base(rhs)
         {
             this.CalcuQ = rhs.CalcuQ;
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/03-node/02-pressmeter/HydroCalcuPressmeterResult.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/03-node/02-pressmeter/HydroCalcuPressmeterResult.cs
index f4aa2d0..9771875 100644
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/03-node/02-pressmeter/HydroCalcuPressmeterResult.cs
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/03-node/02-pressmeter/HydroCalcuPressmeterResult.cs
@@ -33,6 +33,11 @@
         /// <summary>
         /// 
         /// </summary>
+        public HydroCalcuPressmeterResult(Yw.EPAnet.CalcuNode rhs) : base(rhs) { }
+
+        /// <summary>
+        /// 
+        /// </summary>
         public HydroCalcuPressmeterResult(IHydroCalcuPressmeterResult rhs) : base(rhs)
         {
             this.CalcuPr = rhs.CalcuPr;
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/04-link/00-core/HydroCalcuLinkResult.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/04-link/00-core/HydroCalcuLinkResult.cs
index a6e0f56..30947cf 100644
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/04-link/00-core/HydroCalcuLinkResult.cs
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/04-link/00-core/HydroCalcuLinkResult.cs
@@ -23,6 +23,16 @@
         /// <summary>
         /// 
         /// </summary>
+        public HydroCalcuLinkResult(Yw.EPAnet.CalcuLink rhs) : base(rhs)
+        {
+            this.CalcuFlow = rhs.Flow;
+            this.CalcuVelocity = rhs.Velocity;
+            this.CalcuHeadLoss = rhs.Headloss;
+        }
+
+        /// <summary>
+        /// 
+        /// </summary>
         public HydroCalcuLinkResult(IHydroCalcuLinkResult rhs) : base(rhs)
         {
             this.CalcuFlow = rhs.CalcuFlow;
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/04-link/01-pump/HydroCalcuPumpResult.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/04-link/01-pump/HydroCalcuPumpResult.cs
index ab84abf..448cb8a 100644
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/04-link/01-pump/HydroCalcuPumpResult.cs
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/03-calcu/04-link/01-pump/HydroCalcuPumpResult.cs
@@ -33,6 +33,11 @@
         /// <summary>
         /// 
         /// </summary>
+        public HydroCalcuPumpResult(Yw.EPAnet.CalcuLink rhs) : base(rhs) { }
+
+        /// <summary>
+        /// 
+        /// </summary>
         public HydroCalcuPumpResult(IHydroCalcuPumpResult rhs) : base(rhs)
         {
             this.CalcuQ = rhs.CalcuQ;
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/07-curve/HydroCurvePointViewModel.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/07-curve/00-core/HydroCurvePointViewModel.cs
similarity index 100%
rename from WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/07-curve/HydroCurvePointViewModel.cs
rename to WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/07-curve/00-core/HydroCurvePointViewModel.cs
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/07-curve/HydroCurveViewCtrl.Designer.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/07-curve/01-view/HydroCurveViewCtrl.Designer.cs
similarity index 100%
rename from WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/07-curve/HydroCurveViewCtrl.Designer.cs
rename to WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/07-curve/01-view/HydroCurveViewCtrl.Designer.cs
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/07-curve/HydroCurveViewCtrl.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/07-curve/01-view/HydroCurveViewCtrl.cs
similarity index 90%
rename from WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/07-curve/HydroCurveViewCtrl.cs
rename to WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/07-curve/01-view/HydroCurveViewCtrl.cs
index 4ccff33..f5d9a08 100644
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/07-curve/HydroCurveViewCtrl.cs
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/07-curve/01-view/HydroCurveViewCtrl.cs
@@ -9,15 +9,7 @@
         public HydroCurveViewCtrl()
         {
             InitializeComponent();
-             
-        }
 
-  
-        private void InitChart()
-        {
-            var xy_diagram = (XYDiagram)this.chartControl1.Diagram;
-            var axis_x = xy_diagram.AxisX;
-            var axis_y = xy_diagram.AxisX;
         }
 
         /// <summary>
@@ -80,10 +72,10 @@
                 this.AxisX.VisualRange.SetMinMaxValues(x_min, x_max);
 
                 this.AxisY.WholeRange.SetMinMaxValues(y_min, y_min);
-                this.AxisY.VisualRange.SetMinMaxValues(y_max, y_max); 
+                this.AxisY.VisualRange.SetMinMaxValues(y_max, y_max);
             }
 
-           
+
 
 
         }
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/07-curve/HydroCurveViewCtrl.resx b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/07-curve/01-view/HydroCurveViewCtrl.resx
similarity index 100%
rename from WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/07-curve/HydroCurveViewCtrl.resx
rename to WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/07-curve/01-view/HydroCurveViewCtrl.resx
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/07-curve/01-view/HydroCurveViewDlg.Designer.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/07-curve/01-view/HydroCurveViewDlg.Designer.cs
new file mode 100644
index 0000000..5d61dac
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/07-curve/01-view/HydroCurveViewDlg.Designer.cs
@@ -0,0 +1,96 @@
+锘縩amespace Yw.WinFrmUI
+{
+    partial class HydroCurveViewDlg
+    {
+        /// <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();
+            hydroCurveViewCtrl1 = new HydroCurveViewCtrl();
+            ((ISupportInitialize)ribbon).BeginInit();
+            SuspendLayout();
+            // 
+            // ribbon
+            // 
+            ribbon.ExpandCollapseItem.Id = 0;
+            ribbon.Items.AddRange(new DevExpress.XtraBars.BarItem[] { ribbon.ExpandCollapseItem });
+            ribbon.Location = new Point(0, 0);
+            ribbon.MaxItemId = 1;
+            ribbon.Name = "ribbon";
+            ribbon.Pages.AddRange(new DevExpress.XtraBars.Ribbon.RibbonPage[] { ribbonPage1 });
+            ribbon.RibbonCaptionAlignment = DevExpress.XtraBars.Ribbon.RibbonCaptionAlignment.Left;
+            ribbon.ShowDisplayOptionsMenuButton = DevExpress.Utils.DefaultBoolean.False;
+            ribbon.Size = new Size(821, 32);
+            // 
+            // ribbonPage1
+            // 
+            ribbonPage1.Groups.AddRange(new DevExpress.XtraBars.Ribbon.RibbonPageGroup[] { ribbonPageGroup1 });
+            ribbonPage1.Name = "ribbonPage1";
+            ribbonPage1.Text = "ribbonPage1";
+            // 
+            // ribbonPageGroup1
+            // 
+            ribbonPageGroup1.Name = "ribbonPageGroup1";
+            ribbonPageGroup1.Text = "ribbonPageGroup1";
+            // 
+            // hydroCurveViewCtrl1
+            // 
+            hydroCurveViewCtrl1.Dock = DockStyle.Fill;
+            hydroCurveViewCtrl1.Location = new Point(0, 32);
+            hydroCurveViewCtrl1.Name = "hydroCurveViewCtrl1";
+            hydroCurveViewCtrl1.Size = new Size(821, 564);
+            hydroCurveViewCtrl1.TabIndex = 4;
+            hydroCurveViewCtrl1.TitleTextX = "Axis of arguments";
+            hydroCurveViewCtrl1.TitleTextY = "Axis of values";
+            // 
+            // HydroCurveViewDlg
+            // 
+            AutoScaleDimensions = new SizeF(7F, 14F);
+            AutoScaleMode = AutoScaleMode.Font;
+            ClientSize = new Size(821, 596);
+            Controls.Add(hydroCurveViewCtrl1);
+            Controls.Add(ribbon);
+            FormBorderStyle = FormBorderStyle.SizableToolWindow;
+            Name = "HydroCurveViewDlg";
+            Ribbon = ribbon;
+            RibbonVisibility = DevExpress.XtraBars.Ribbon.RibbonVisibility.Hidden;
+            StartPosition = FormStartPosition.CenterParent;
+            Text = "鏇茬嚎";
+            ((ISupportInitialize)ribbon).EndInit();
+            ResumeLayout(false);
+            PerformLayout();
+        }
+
+        #endregion
+
+        private DevExpress.XtraBars.Ribbon.RibbonControl ribbon;
+        private DevExpress.XtraBars.Ribbon.RibbonPage ribbonPage1;
+        private DevExpress.XtraBars.Ribbon.RibbonPageGroup ribbonPageGroup1;
+        private HydroCurveViewCtrl hydroCurveViewCtrl1;
+    }
+}
\ No newline at end of file
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/07-curve/HydroCurveViewDlg.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/07-curve/01-view/HydroCurveViewDlg.cs
similarity index 91%
rename from WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/07-curve/HydroCurveViewDlg.cs
rename to WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/07-curve/01-view/HydroCurveViewDlg.cs
index 7b91904..d9e9a7c 100644
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/07-curve/HydroCurveViewDlg.cs
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/07-curve/01-view/HydroCurveViewDlg.cs
@@ -1,6 +1,6 @@
 锘縩amespace Yw.WinFrmUI
 {
-    public partial class HydroCurveViewDlg : DevExpress.XtraEditors.XtraForm
+    public partial class HydroCurveViewDlg : DevExpress.XtraBars.Ribbon.RibbonForm
     {
         public HydroCurveViewDlg()
         {
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/07-curve/HydroCurveViewDlg.resx b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/07-curve/01-view/HydroCurveViewDlg.resx
similarity index 100%
rename from WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/07-curve/HydroCurveViewDlg.resx
rename to WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/07-curve/01-view/HydroCurveViewDlg.resx
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/07-curve/SetHydroCurveCtrl.Designer.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/07-curve/02-set/SetHydroCurveCtrl.Designer.cs
similarity index 100%
rename from WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/07-curve/SetHydroCurveCtrl.Designer.cs
rename to WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/07-curve/02-set/SetHydroCurveCtrl.Designer.cs
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/07-curve/SetHydroCurveCtrl.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/07-curve/02-set/SetHydroCurveCtrl.cs
similarity index 100%
rename from WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/07-curve/SetHydroCurveCtrl.cs
rename to WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/07-curve/02-set/SetHydroCurveCtrl.cs
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/07-curve/SetHydroCurveCtrl.resx b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/07-curve/02-set/SetHydroCurveCtrl.resx
similarity index 100%
rename from WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/07-curve/SetHydroCurveCtrl.resx
rename to WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/07-curve/02-set/SetHydroCurveCtrl.resx
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/07-curve/02-set/SetHydroCurveDlg.Designer.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/07-curve/02-set/SetHydroCurveDlg.Designer.cs
new file mode 100644
index 0000000..d51b6ff
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/07-curve/02-set/SetHydroCurveDlg.Designer.cs
@@ -0,0 +1,164 @@
+锘縩amespace Yw.WinFrmUI
+{
+    partial class SetHydroCurveDlg
+    {
+        /// <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();
+            setHydroCurveCtrl1 = new SetHydroCurveCtrl();
+            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(990, 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(setHydroCurveCtrl1);
+            layoutControl1.Dock = DockStyle.Fill;
+            layoutControl1.Location = new Point(0, 32);
+            layoutControl1.Name = "layoutControl1";
+            layoutControl1.Root = Root;
+            layoutControl1.Size = new Size(990, 651);
+            layoutControl1.TabIndex = 6;
+            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(990, 651);
+            Root.TextVisible = false;
+            // 
+            // setHydroCurveCtrl1
+            // 
+            setHydroCurveCtrl1.Location = new Point(2, 2);
+            setHydroCurveCtrl1.Name = "setHydroCurveCtrl1";
+            setHydroCurveCtrl1.Size = new Size(986, 617);
+            setHydroCurveCtrl1.TabIndex = 4;
+            // 
+            // layoutControlItem1
+            // 
+            layoutControlItem1.Control = setHydroCurveCtrl1;
+            layoutControlItem1.Location = new Point(0, 0);
+            layoutControlItem1.Name = "layoutControlItem1";
+            layoutControlItem1.Size = new Size(990, 621);
+            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, 623);
+            generalOkAndCancelCtrl1.Name = "generalOkAndCancelCtrl1";
+            generalOkAndCancelCtrl1.Size = new Size(986, 26);
+            generalOkAndCancelCtrl1.TabIndex = 5;
+            // 
+            // layoutControlItem2
+            // 
+            layoutControlItem2.Control = generalOkAndCancelCtrl1;
+            layoutControlItem2.Location = new Point(0, 621);
+            layoutControlItem2.Name = "layoutControlItem2";
+            layoutControlItem2.Size = new Size(990, 30);
+            layoutControlItem2.TextSize = new Size(0, 0);
+            layoutControlItem2.TextVisible = false;
+            // 
+            // SetHydroCurveDlg
+            // 
+            AutoScaleDimensions = new SizeF(7F, 14F);
+            AutoScaleMode = AutoScaleMode.Font;
+            ClientSize = new Size(990, 683);
+            Controls.Add(layoutControl1);
+            Controls.Add(ribbon);
+            FormBorderStyle = FormBorderStyle.SizableToolWindow;
+            Name = "SetHydroCurveDlg";
+            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 GeneralOkAndCancelCtrl generalOkAndCancelCtrl1;
+        private SetHydroCurveCtrl setHydroCurveCtrl1;
+        private DevExpress.XtraLayout.LayoutControlGroup Root;
+        private DevExpress.XtraLayout.LayoutControlItem layoutControlItem1;
+        private DevExpress.XtraLayout.LayoutControlItem layoutControlItem2;
+    }
+}
\ No newline at end of file
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/07-curve/02-set/SetHydroCurveDlg.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/07-curve/02-set/SetHydroCurveDlg.cs
new file mode 100644
index 0000000..164c198
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/07-curve/02-set/SetHydroCurveDlg.cs
@@ -0,0 +1,50 @@
+锘縩amespace Yw.WinFrmUI
+{
+    public partial class SetHydroCurveDlg : DevExpress.XtraBars.Ribbon.RibbonForm
+    {
+        public SetHydroCurveDlg()
+        {
+            InitializeComponent();
+            this.IconOptions.Icon = Yw.WinFrmUI.GlobalParas.AppIcon;
+            this.layoutControl1.SetupLayoutControl();
+            this.setHydroCurveCtrl1.SaveCurveInfoEvent += SetHydroCurveCtrl1_SaveCurveInfoEvent;
+            this.generalOkAndCancelCtrl1.OkEvent += GeneralOkAndCancelCtrl1_OkEvent;
+        }
+
+        /// <summary>
+        /// 閲嶈浇鏁版嵁浜嬩欢
+        /// </summary>
+        public event Action<Yw.Model.HydroCurveInfo> ReloadDataEvent;
+
+        //鏇茬嚎
+        private Yw.Model.HydroCurveInfo _curve;
+
+        /// <summary>
+        /// 缁戝畾鏁版嵁
+        /// </summary>
+        public void SetBindingData(Yw.Model.HydroModelInfo hydroInfo, Yw.Model.HydroCurveInfo curveInfo, string curveType)
+        {
+            this.setHydroCurveCtrl1.SetBindingData(hydroInfo, curveInfo, curveType);
+        }
+
+        //淇濆瓨
+        private void SetHydroCurveCtrl1_SaveCurveInfoEvent(Model.HydroCurveInfo obj)
+        {
+            _curve = obj;
+        }
+
+        //纭畾
+        private void GeneralOkAndCancelCtrl1_OkEvent()
+        {
+            if (_curve == null)
+            {
+                return;
+            }
+            this.ReloadDataEvent?.Invoke(_curve);
+            this.DialogResult = DialogResult.OK;
+            this.Close();
+        }
+
+
+    }
+}
\ No newline at end of file
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/07-curve/SetHydroCurveDlg.resx b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/07-curve/02-set/SetHydroCurveDlg.resx
similarity index 100%
rename from WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/07-curve/SetHydroCurveDlg.resx
rename to WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/07-curve/02-set/SetHydroCurveDlg.resx
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/07-curve/HydroCurveViewDlg.Designer.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/07-curve/HydroCurveViewDlg.Designer.cs
deleted file mode 100644
index d1cb0b5..0000000
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/07-curve/HydroCurveViewDlg.Designer.cs
+++ /dev/null
@@ -1,60 +0,0 @@
-锘縩amespace Yw.WinFrmUI
-{
-    partial class HydroCurveViewDlg
-    {
-        /// <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()
-        {
-            hydroCurveViewCtrl1 = new HydroCurveViewCtrl();
-            SuspendLayout();
-            // 
-            // hydroCurveViewCtrl1
-            // 
-            hydroCurveViewCtrl1.Dock = DockStyle.Fill;
-            hydroCurveViewCtrl1.Location = new Point(0, 0);
-            hydroCurveViewCtrl1.Name = "hydroCurveViewCtrl1";
-            hydroCurveViewCtrl1.Size = new Size(771, 567);
-            hydroCurveViewCtrl1.TabIndex = 0;
-            hydroCurveViewCtrl1.TitleTextX = "Axis of arguments";
-            hydroCurveViewCtrl1.TitleTextY = "Axis of values";
-            // 
-            // HydroCurveViewDlg
-            // 
-            AutoScaleDimensions = new SizeF(7F, 14F);
-            AutoScaleMode = AutoScaleMode.Font;
-            ClientSize = new Size(771, 567);
-            Controls.Add(hydroCurveViewCtrl1);
-            Name = "HydroCurveViewDlg";
-            StartPosition = FormStartPosition.CenterParent;
-            Text = "鏇茬嚎";
-            ResumeLayout(false);
-        }
-
-        #endregion
-
-        private HydroCurveViewCtrl hydroCurveViewCtrl1;
-    }
-}
\ No newline at end of file
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/07-curve/SetHydroCurveDlg.Designer.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/07-curve/SetHydroCurveDlg.Designer.cs
deleted file mode 100644
index db3c153..0000000
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/07-curve/SetHydroCurveDlg.Designer.cs
+++ /dev/null
@@ -1,175 +0,0 @@
-锘縩amespace Yw.WinFrmUI
-{
-    partial class SetHydroCurveDlg
-    {
-        /// <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()
-        {
-            layoutControl1 = new DevExpress.XtraLayout.LayoutControl();
-            Root = new DevExpress.XtraLayout.LayoutControlGroup();
-            setHydroCurveCtrl1 = new SetHydroCurveCtrl();
-            layoutControlItem1 = new DevExpress.XtraLayout.LayoutControlItem();
-            btnOk = new DevExpress.XtraEditors.SimpleButton();
-            layoutControlItem2 = new DevExpress.XtraLayout.LayoutControlItem();
-            btnCancel = new DevExpress.XtraEditors.SimpleButton();
-            layoutControlItem3 = new DevExpress.XtraLayout.LayoutControlItem();
-            emptySpaceItem1 = new DevExpress.XtraLayout.EmptySpaceItem();
-            ((ISupportInitialize)layoutControl1).BeginInit();
-            layoutControl1.SuspendLayout();
-            ((ISupportInitialize)Root).BeginInit();
-            ((ISupportInitialize)layoutControlItem1).BeginInit();
-            ((ISupportInitialize)layoutControlItem2).BeginInit();
-            ((ISupportInitialize)layoutControlItem3).BeginInit();
-            ((ISupportInitialize)emptySpaceItem1).BeginInit();
-            SuspendLayout();
-            // 
-            // layoutControl1
-            // 
-            layoutControl1.Controls.Add(btnCancel);
-            layoutControl1.Controls.Add(btnOk);
-            layoutControl1.Controls.Add(setHydroCurveCtrl1);
-            layoutControl1.Dock = DockStyle.Fill;
-            layoutControl1.Location = new Point(0, 0);
-            layoutControl1.Name = "layoutControl1";
-            layoutControl1.OptionsCustomizationForm.DesignTimeCustomizationFormPositionAndSize = new Rectangle(1270, 380, 650, 400);
-            layoutControl1.Root = Root;
-            layoutControl1.Size = new Size(987, 638);
-            layoutControl1.TabIndex = 0;
-            layoutControl1.Text = "layoutControl1";
-            // 
-            // Root
-            // 
-            Root.EnableIndentsWithoutBorders = DevExpress.Utils.DefaultBoolean.True;
-            Root.GroupBordersVisible = false;
-            Root.Items.AddRange(new DevExpress.XtraLayout.BaseLayoutItem[] { layoutControlItem1, layoutControlItem2, layoutControlItem3, emptySpaceItem1 });
-            Root.Name = "Root";
-            Root.Size = new Size(987, 638);
-            Root.TextVisible = false;
-            // 
-            // setHydroCurveCtrl1
-            // 
-            setHydroCurveCtrl1.Location = new Point(12, 12);
-            setHydroCurveCtrl1.Name = "setHydroCurveCtrl1";
-            setHydroCurveCtrl1.Size = new Size(963, 588);
-            setHydroCurveCtrl1.TabIndex = 4;
-            // 
-            // layoutControlItem1
-            // 
-            layoutControlItem1.Control = setHydroCurveCtrl1;
-            layoutControlItem1.Location = new Point(0, 0);
-            layoutControlItem1.Name = "layoutControlItem1";
-            layoutControlItem1.Size = new Size(967, 592);
-            layoutControlItem1.TextSize = new Size(0, 0);
-            layoutControlItem1.TextVisible = false;
-            // 
-            // btnOk
-            // 
-            btnOk.Appearance.BackColor = DevExpress.LookAndFeel.DXSkinColors.FillColors.Primary;
-            btnOk.Appearance.Options.UseBackColor = true;
-            btnOk.Location = new Point(739, 604);
-            btnOk.Name = "btnOk";
-            btnOk.Size = new Size(116, 22);
-            btnOk.StyleController = layoutControl1;
-            btnOk.TabIndex = 5;
-            btnOk.Text = "纭畾";
-            btnOk.Click += btnOk_Click;
-            // 
-            // layoutControlItem2
-            // 
-            layoutControlItem2.Control = btnOk;
-            layoutControlItem2.Location = new Point(727, 592);
-            layoutControlItem2.MaxSize = new Size(120, 26);
-            layoutControlItem2.MinSize = new Size(120, 26);
-            layoutControlItem2.Name = "layoutControlItem2";
-            layoutControlItem2.Size = new Size(120, 26);
-            layoutControlItem2.SizeConstraintsType = DevExpress.XtraLayout.SizeConstraintsType.Custom;
-            layoutControlItem2.TextSize = new Size(0, 0);
-            layoutControlItem2.TextVisible = false;
-            // 
-            // btnCancel
-            // 
-            btnCancel.Appearance.BackColor = DevExpress.LookAndFeel.DXSkinColors.FillColors.Warning;
-            btnCancel.Appearance.Options.UseBackColor = true;
-            btnCancel.DialogResult = DialogResult.Cancel;
-            btnCancel.Location = new Point(859, 604);
-            btnCancel.Name = "btnCancel";
-            btnCancel.Size = new Size(116, 22);
-            btnCancel.StyleController = layoutControl1;
-            btnCancel.TabIndex = 6;
-            btnCancel.Text = "鍙栨秷";
-            // 
-            // layoutControlItem3
-            // 
-            layoutControlItem3.Control = btnCancel;
-            layoutControlItem3.Location = new Point(847, 592);
-            layoutControlItem3.MaxSize = new Size(120, 26);
-            layoutControlItem3.MinSize = new Size(120, 26);
-            layoutControlItem3.Name = "layoutControlItem3";
-            layoutControlItem3.Size = new Size(120, 26);
-            layoutControlItem3.SizeConstraintsType = DevExpress.XtraLayout.SizeConstraintsType.Custom;
-            layoutControlItem3.TextSize = new Size(0, 0);
-            layoutControlItem3.TextVisible = false;
-            // 
-            // emptySpaceItem1
-            // 
-            emptySpaceItem1.AllowHotTrack = false;
-            emptySpaceItem1.Location = new Point(0, 592);
-            emptySpaceItem1.Name = "emptySpaceItem1";
-            emptySpaceItem1.Size = new Size(727, 26);
-            emptySpaceItem1.TextSize = new Size(0, 0);
-            // 
-            // SetHydroCurveDlg
-            // 
-            AutoScaleDimensions = new SizeF(7F, 14F);
-            AutoScaleMode = AutoScaleMode.Font;
-            ClientSize = new Size(987, 638);
-            Controls.Add(layoutControl1);
-            Name = "SetHydroCurveDlg";
-            StartPosition = FormStartPosition.CenterParent;
-            Text = "璁剧疆鏇茬嚎";
-            ((ISupportInitialize)layoutControl1).EndInit();
-            layoutControl1.ResumeLayout(false);
-            ((ISupportInitialize)Root).EndInit();
-            ((ISupportInitialize)layoutControlItem1).EndInit();
-            ((ISupportInitialize)layoutControlItem2).EndInit();
-            ((ISupportInitialize)layoutControlItem3).EndInit();
-            ((ISupportInitialize)emptySpaceItem1).EndInit();
-            ResumeLayout(false);
-        }
-
-        #endregion
-
-        private DevExpress.XtraLayout.LayoutControl layoutControl1;
-        private DevExpress.XtraEditors.SimpleButton btnCancel;
-        private DevExpress.XtraEditors.SimpleButton btnOk;
-        private SetHydroCurveCtrl setHydroCurveCtrl1;
-        private DevExpress.XtraLayout.LayoutControlGroup Root;
-        private DevExpress.XtraLayout.LayoutControlItem layoutControlItem1;
-        private DevExpress.XtraLayout.LayoutControlItem layoutControlItem2;
-        private DevExpress.XtraLayout.LayoutControlItem layoutControlItem3;
-        private DevExpress.XtraLayout.EmptySpaceItem emptySpaceItem1;
-    }
-}
\ No newline at end of file
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/07-curve/SetHydroCurveDlg.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/07-curve/SetHydroCurveDlg.cs
deleted file mode 100644
index 0744a01..0000000
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/07-curve/SetHydroCurveDlg.cs
+++ /dev/null
@@ -1,55 +0,0 @@
-锘縰sing 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 SetHydroCurveDlg : DevExpress.XtraEditors.XtraForm
-    {
-        public SetHydroCurveDlg()
-        {
-            InitializeComponent();
-            this.IconOptions.Icon = Yw.WinFrmUI.GlobalParas.AppIcon;
-            this.setHydroCurveCtrl1.SaveCurveInfoEvent += SetHydroCurveCtrl1_SaveCurveInfoEvent;
-        }
-
-        /// <summary>
-        /// 
-        /// </summary>
-        public event Action<Yw.Model.HydroCurveInfo> ReloadDataEvent;
-
-        private Yw.Model.HydroCurveInfo _curveInfo;
-
-        /// <summary>
-        /// 
-        /// </summary>
-        public void SetBindingData(Yw.Model.HydroModelInfo hydroInfo, Yw.Model.HydroCurveInfo curveInfo, string curveType)
-        {
-            this.setHydroCurveCtrl1.SetBindingData(hydroInfo, curveInfo, curveType);
-        }
-
-        private void SetHydroCurveCtrl1_SaveCurveInfoEvent(Model.HydroCurveInfo obj)
-        {
-            _curveInfo = obj;
-        }
-
-        //
-        private void btnOk_Click(object sender, EventArgs e)
-        {
-            if (_curveInfo == null)
-            {
-                return;
-            }
-            this.ReloadDataEvent?.Invoke(_curveInfo);
-            this.DialogResult = DialogResult.OK;
-            this.Close();
-        }
-    }
-}
\ No newline at end of file
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/05-property/HydroVisualPropertyCtrl.Designer.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/05-property/HydroVisualPropertyCtrl.Designer.cs
index 7bafcad..66e6ff9 100644
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/05-property/HydroVisualPropertyCtrl.Designer.cs
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/05-property/HydroVisualPropertyCtrl.Designer.cs
@@ -29,14 +29,14 @@
         private void InitializeComponent()
         {
             components = new Container();
-            DevExpress.Utils.SuperToolTip superToolTip5 = new DevExpress.Utils.SuperToolTip();
-            DevExpress.Utils.ToolTipItem toolTipItem5 = new DevExpress.Utils.ToolTipItem();
-            DevExpress.Utils.SuperToolTip superToolTip6 = new DevExpress.Utils.SuperToolTip();
-            DevExpress.Utils.ToolTipItem toolTipItem6 = new DevExpress.Utils.ToolTipItem();
             ComponentResourceManager resources = new ComponentResourceManager(typeof(HydroVisualPropertyCtrl));
-            DevExpress.Utils.SuperToolTip superToolTip4 = new DevExpress.Utils.SuperToolTip();
-            DevExpress.Utils.ToolTipTitleItem toolTipTitleItem2 = new DevExpress.Utils.ToolTipTitleItem();
-            DevExpress.Utils.ToolTipItem toolTipItem4 = new DevExpress.Utils.ToolTipItem();
+            DevExpress.Utils.SuperToolTip superToolTip1 = new DevExpress.Utils.SuperToolTip();
+            DevExpress.Utils.ToolTipItem toolTipItem1 = new DevExpress.Utils.ToolTipItem();
+            DevExpress.Utils.SuperToolTip superToolTip2 = new DevExpress.Utils.SuperToolTip();
+            DevExpress.Utils.ToolTipItem toolTipItem2 = new DevExpress.Utils.ToolTipItem();
+            DevExpress.Utils.SuperToolTip superToolTip3 = new DevExpress.Utils.SuperToolTip();
+            DevExpress.Utils.ToolTipTitleItem toolTipTitleItem1 = new DevExpress.Utils.ToolTipTitleItem();
+            DevExpress.Utils.ToolTipItem toolTipItem3 = new DevExpress.Utils.ToolTipItem();
             layoutControl1 = new DevExpress.XtraLayout.LayoutControl();
             hydroVisualPropertyDescriptionCtrl1 = new HydroVisualPropertyDescriptionCtrl();
             propertyGridControl1 = new DevExpress.XtraVerticalGrid.PropertyGridControl();
@@ -204,9 +204,10 @@
             barBtnChangeLink.Id = 16;
             barBtnChangeLink.ImageOptions.SvgImage = (DevExpress.Utils.Svg.SvgImage)resources.GetObject("barBtnChangeLink.ImageOptions.SvgImage");
             barBtnChangeLink.Name = "barBtnChangeLink";
-            toolTipItem5.Text = "璋冩暣涓婁笅娓�";
-            superToolTip5.Items.Add(toolTipItem5);
-            barBtnChangeLink.SuperTip = superToolTip5;
+            toolTipItem1.Text = "璋冩暣涓婁笅娓�";
+            superToolTip1.Items.Add(toolTipItem1);
+            barBtnChangeLink.SuperTip = superToolTip1;
+            barBtnChangeLink.Visibility = DevExpress.XtraBars.BarItemVisibility.Never;
             barBtnChangeLink.ItemClick += barBtnChangeLink_ItemClick;
             // 
             // barBtnView
@@ -214,9 +215,10 @@
             barBtnView.Id = 17;
             barBtnView.ImageOptions.SvgImage = (DevExpress.Utils.Svg.SvgImage)resources.GetObject("barBtnView.ImageOptions.SvgImage");
             barBtnView.Name = "barBtnView";
-            toolTipItem6.Text = "鏌ョ湅";
-            superToolTip6.Items.Add(toolTipItem6);
-            barBtnView.SuperTip = superToolTip6;
+            toolTipItem2.Text = "鏌ョ湅";
+            superToolTip2.Items.Add(toolTipItem2);
+            barBtnView.SuperTip = superToolTip2;
+            barBtnView.Visibility = DevExpress.XtraBars.BarItemVisibility.Never;
             barBtnView.ItemClick += barBtnView_ItemClick;
             // 
             // barBtnHelp
@@ -226,14 +228,14 @@
             barBtnHelp.ImageOptions.SvgImage = (DevExpress.Utils.Svg.SvgImage)resources.GetObject("barBtnHelp.ImageOptions.SvgImage");
             barBtnHelp.ImageOptions.SvgImageSize = new Size(20, 20);
             barBtnHelp.Name = "barBtnHelp";
-            toolTipTitleItem2.Appearance.Image = (Image)resources.GetObject("resource.Image");
-            toolTipTitleItem2.Appearance.Options.UseImage = true;
-            toolTipTitleItem2.ImageOptions.Image = (Image)resources.GetObject("resource.Image1");
-            toolTipItem4.LeftIndent = 6;
-            toolTipItem4.Text = "鎻忚堪淇℃伅";
-            superToolTip4.Items.Add(toolTipTitleItem2);
-            superToolTip4.Items.Add(toolTipItem4);
-            barBtnHelp.SuperTip = superToolTip4;
+            toolTipTitleItem1.Appearance.Image = (Image)resources.GetObject("resource.Image");
+            toolTipTitleItem1.Appearance.Options.UseImage = true;
+            toolTipTitleItem1.ImageOptions.Image = (Image)resources.GetObject("resource.Image1");
+            toolTipItem3.LeftIndent = 6;
+            toolTipItem3.Text = "鎻忚堪淇℃伅";
+            superToolTip3.Items.Add(toolTipTitleItem1);
+            superToolTip3.Items.Add(toolTipItem3);
+            barBtnHelp.SuperTip = superToolTip3;
             barBtnHelp.ItemClick += barBtnHelp_ItemClick;
             // 
             // barDockControlTop
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/05-property/HydroVisualPropertyCtrl.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/05-property/HydroVisualPropertyCtrl.cs
index 61c6de3..f11d47a 100644
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/05-property/HydroVisualPropertyCtrl.cs
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/05-property/HydroVisualPropertyCtrl.cs
@@ -3,7 +3,6 @@
 using DevExpress.XtraEditors.Controls;
 using DevExpress.XtraEditors.Repository;
 using DevExpress.XtraLayout.Utils;
-using DevExpress.XtraRichEdit.Model;
 using DevExpress.XtraVerticalGrid.Events;
 
 namespace Yw.WinFrmUI
@@ -15,9 +14,6 @@
         {
             InitializeComponent();
             this.layoutControl1.SetupLayoutControl();
-            this.barBtnChangeLink.Visibility = BarItemVisibility.Never;
-            this.barBtnView.Visibility = BarItemVisibility.Never;
-            SetDescriptionVisible(false);//榛樿璁剧疆灞炴�ф弿杩伴潰鏉夸笉鏄剧ず
         }
 
         /// <summary>
@@ -56,25 +52,21 @@
         public event Action<HydroVisualViewModel> GradingPropertyValueChangedEvent;
 
         /// <summary>
-        /// 娴佸悜灞炴�у�兼敼鍙樹簨浠�
+        /// 姘存祦鍔ㄧ敾灞炴�у�兼敼鍙樹簨浠�
         /// </summary>
-        public event Action<HydroVisualViewModel> FlowDirectionPropertyValueChangedEvent;
+        public event Action<HydroVisualViewModel> FlowEffectPropertyValueChangedEvent;
 
         /// <summary>
-        /// 寮鸿皟杩炴帴缁勪欢浜嬩欢
+        /// 寮鸿皟杩炴帴鑺傜偣浜嬩欢
         /// 绗竴涓弬鏁颁负鏈韩Code
-        /// 绗簩涓弬鏁颁负杩炴帴Code
+        /// 绗簩涓弬鏁颁负杩炴帴鑺傜偣Code
         /// </summary>
-        public event Action<string, string> BlinkLinkParterEvent;
+        public event Action<HydroLinkViewModel, string> BlinkLinkNodeEvent;
 
         /// <summary>
         /// 鏌ョ湅鏋勪欢浜嬩欢
         /// </summary>
         public event Action<HydroVisualViewModel> HydroViewEvent;
-
-
-
-
 
 
         /// <summary>
@@ -94,8 +86,6 @@
                 this.propertyGridControl1.SelectedObject = value;
             }
         }
-
-
 
         /// <summary>
         /// 閲嶆柊浠庢暟鎹簮涓鍙栨暟鎹紝澶栬鎭㈠鍒氬紑濮嬪姞杞界殑鏍峰瓙
@@ -573,7 +563,8 @@
                     buttonEdit.ButtonClick += delegate
                     {
                         var vm = GetPropertyViewModel(e.Row);
-                        this.BlinkLinkParterEvent?.Invoke(vm.Code, e.Row.Properties.Value.ToString());
+                        var vmLink = vm as HydroLinkViewModel;
+                        this.BlinkLinkNodeEvent?.Invoke(vmLink, e.Row.Properties.Value.ToString());
                     };
                     e.RepositoryItem = buttonEdit;
                 }
@@ -617,7 +608,7 @@
                 var hydroFlowDirectionPropAttri = descriptor.Attributes[typeof(HydroFlowDirectionProAttribute)];
                 if (hydroFlowDirectionPropAttri != null)
                 {
-                    this.FlowDirectionPropertyValueChangedEvent?.Invoke(vm);
+                    this.FlowEffectPropertyValueChangedEvent?.Invoke(vm);
                 }
             }
         }
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/05-property/HydroVisualPropertyCtrl.resx b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/05-property/HydroVisualPropertyCtrl.resx
index 1aed3b8..3a55373 100644
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/05-property/HydroVisualPropertyCtrl.resx
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/05-property/HydroVisualPropertyCtrl.resx
@@ -120,69 +120,10 @@
   <metadata name="svgImg16.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
     <value>152, 17</value>
   </metadata>
-  <metadata name="svgImg16.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>152, 17</value>
-  </metadata>
   <metadata name="barManager1.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="barBtnHelp.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
-    <value>
-        AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIzLjIsIFZlcnNpb249MjMuMi40
-        LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
-        dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAABsDAAAC77u/
-        PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi
-        IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv
-        MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh
-        Y2U9InByZXNlcnZlIiBpZD0iTGF5ZXJfMSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAg
-        MzIgMzIiPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLlllbGxvd3tmaWxsOiNGRkIxMTU7fQoJ
-        LlJlZHtmaWxsOiNEMTFDMUM7fQoJLkJsdWV7ZmlsbDojMTE3N0Q3O30KCS5HcmVlbntmaWxsOiMwMzlD
-        MjM7fQoJLkJsYWNre2ZpbGw6IzcyNzI3Mjt9CgkuV2hpdGV7ZmlsbDojRkZGRkZGO30KCS5zdDB7b3Bh
-        Y2l0eTowLjU7fQoJLnN0MXtkaXNwbGF5Om5vbmU7fQoJLnN0MntkaXNwbGF5OmlubGluZTtmaWxsOiMw
-        MzlDMjM7fQoJLnN0M3tkaXNwbGF5OmlubGluZTtmaWxsOiNEMTFDMUM7fQoJLnN0NHtkaXNwbGF5Omlu
-        bGluZTtmaWxsOiM3MjcyNzI7fQo8L3N0eWxlPg0KICA8ZyBpZD0iQWJvdXQiPg0KICAgIDxwYXRoIGQ9
-        Ik0xNiwyQzguMywyLDIsOC4zLDIsMTZzNi4zLDE0LDE0LDE0czE0LTYuMywxNC0xNFMyMy43LDIsMTYs
-        MnogTTE2LDZjMS4xLDAsMiwwLjksMiwycy0wLjksMi0yLDJzLTItMC45LTItMiAgIFMxNC45LDYsMTYs
-        NnogTTIwLDI0aC04di0yaDJ2LThoLTJ2LTJoMmg0djEwaDJWMjR6IiBjbGFzcz0iQmx1ZSIgLz4NCiAg
-        PC9nPg0KPC9zdmc+Cw==
-</value>
-  </data>
-  <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
-  <data name="resource.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-    <value>
-        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAACR0RVh0VGl0
-        bGUAQ29tbWVudDtUb29sdGlwO0hpbnQ7VGlwO0Nsb3Vk08HbyQAAAm9JREFUOE91k0lMU1EUhm8QJ6xY
-        QIWlW4kL3GAoGIIaF7rRDQsFBUUKBLFaQIK0FlocVpo40DQyU1rKIIQhYNR0oVgtpWUSlCJpcGhNQMRo
-        dPV77nsPUkBv8uX/z7nn/vct3mW0QohQYqPEJmKzxBZiKxEmsY2QSfC9EFbR4rEb2kZhaB2TGCGoto1A
-        T17PtWUEFTYPaBblLW6UW90orXs5SAFhTGN2w7P0B57vIm6JYc6iiCuIIcL57TdKGpyggB2sqNYJFzXa
-        ZxZFvBLB9Zq+/ctPqEyDPCCC5T14AUfgF5omFiTmBTWPB9fzUk2etN+3hAt37TwgiqXdfornvh8wDQeQ
-        VeNC3JVOQVf7oRVvcgVge7uAVH0fD9jJUvUD6KTkW8/moCjpwdxnPw5d7/+vNzzxwTjox4mybh6wi53U
-        9sLi/opr3bM4/dCBg5o+nDU5kW58LfgM7qtEn258g9LuD7hj/4RjxY95wG52vKQL1a/8KOzwQtszi8oB
-        n6CcG3Sbtpc8UUleQ8rnKvt9OHK5lQdEs6PqDtyzf0SB9Z2IbWrFX1zRKcEv12VdM0jOt/KAGJZSYMNN
-        urWYkovbvLjaMY0iUj6Y2zQpoGwUtcAyhcLWaaht76HIMYtfkJBVa0/KtSAppxmJHGUzEpRmpKgsUNZN
-        4lzdBDGG7PpxJKusiD/fKLD/1H0HBcgJ4V8Pl4oIIpKICd+XaTysbkdm9SgyCEVOA7bHptfQ3h6+T/D5
-        UKbT6dZBiz8wefSBS6bE/GbEZ9dDtjftEfWiiA2rZoOLYKSQSHmcskoWe8b4r8PC3NpGMPwAsfyU1x3W
-        6XTsLy5SM69xQkG9AAAAAElFTkSuQmCC
-</value>
-  </data>
-  <data name="resource.Image1" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-    <value>
-        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAACR0RVh0VGl0
-        bGUAQ29tbWVudDtUb29sdGlwO0hpbnQ7VGlwO0Nsb3Vk08HbyQAAAm9JREFUOE91k0lMU1EUhm8QJ6xY
-        QIWlW4kL3GAoGIIaF7rRDQsFBUUKBLFaQIK0FlocVpo40DQyU1rKIIQhYNR0oVgtpWUSlCJpcGhNQMRo
-        dPV77nsPUkBv8uX/z7nn/vct3mW0QohQYqPEJmKzxBZiKxEmsY2QSfC9EFbR4rEb2kZhaB2TGCGoto1A
-        T17PtWUEFTYPaBblLW6UW90orXs5SAFhTGN2w7P0B57vIm6JYc6iiCuIIcL57TdKGpyggB2sqNYJFzXa
-        ZxZFvBLB9Zq+/ctPqEyDPCCC5T14AUfgF5omFiTmBTWPB9fzUk2etN+3hAt37TwgiqXdfornvh8wDQeQ
-        VeNC3JVOQVf7oRVvcgVge7uAVH0fD9jJUvUD6KTkW8/moCjpwdxnPw5d7/+vNzzxwTjox4mybh6wi53U
-        9sLi/opr3bM4/dCBg5o+nDU5kW58LfgM7qtEn258g9LuD7hj/4RjxY95wG52vKQL1a/8KOzwQtszi8oB
-        n6CcG3Sbtpc8UUleQ8rnKvt9OHK5lQdEs6PqDtyzf0SB9Z2IbWrFX1zRKcEv12VdM0jOt/KAGJZSYMNN
-        urWYkovbvLjaMY0iUj6Y2zQpoGwUtcAyhcLWaaht76HIMYtfkJBVa0/KtSAppxmJHGUzEpRmpKgsUNZN
-        4lzdBDGG7PpxJKusiD/fKLD/1H0HBcgJ4V8Pl4oIIpKICd+XaTysbkdm9SgyCEVOA7bHptfQ3h6+T/D5
-        UKbT6dZBiz8wefSBS6bE/GbEZ9dDtjftEfWiiA2rZoOLYKSQSHmcskoWe8b4r8PC3NpGMPwAsfyU1x3W
-        6XTsLy5SM69xQkG9AAAAAElFTkSuQmCC
-</value>
-  </data>
   <data name="barBtnExpandAll.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
     <value>
         AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIzLjIsIFZlcnNpb249MjMuMi40
@@ -252,4 +193,60 @@
         dWUiIC8+DQogIDwvZz4NCjwvc3ZnPgs=
 </value>
   </data>
+  <data name="barBtnHelp.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIzLjIsIFZlcnNpb249MjMuMi40
+        LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
+        dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAABsDAAAC77u/
+        PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi
+        IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv
+        MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh
+        Y2U9InByZXNlcnZlIiBpZD0iTGF5ZXJfMSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAg
+        MzIgMzIiPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLlllbGxvd3tmaWxsOiNGRkIxMTU7fQoJ
+        LlJlZHtmaWxsOiNEMTFDMUM7fQoJLkJsdWV7ZmlsbDojMTE3N0Q3O30KCS5HcmVlbntmaWxsOiMwMzlD
+        MjM7fQoJLkJsYWNre2ZpbGw6IzcyNzI3Mjt9CgkuV2hpdGV7ZmlsbDojRkZGRkZGO30KCS5zdDB7b3Bh
+        Y2l0eTowLjU7fQoJLnN0MXtkaXNwbGF5Om5vbmU7fQoJLnN0MntkaXNwbGF5OmlubGluZTtmaWxsOiMw
+        MzlDMjM7fQoJLnN0M3tkaXNwbGF5OmlubGluZTtmaWxsOiNEMTFDMUM7fQoJLnN0NHtkaXNwbGF5Omlu
+        bGluZTtmaWxsOiM3MjcyNzI7fQo8L3N0eWxlPg0KICA8ZyBpZD0iQWJvdXQiPg0KICAgIDxwYXRoIGQ9
+        Ik0xNiwyQzguMywyLDIsOC4zLDIsMTZzNi4zLDE0LDE0LDE0czE0LTYuMywxNC0xNFMyMy43LDIsMTYs
+        MnogTTE2LDZjMS4xLDAsMiwwLjksMiwycy0wLjksMi0yLDJzLTItMC45LTItMiAgIFMxNC45LDYsMTYs
+        NnogTTIwLDI0aC04di0yaDJ2LThoLTJ2LTJoMmg0djEwaDJWMjR6IiBjbGFzcz0iQmx1ZSIgLz4NCiAg
+        PC9nPg0KPC9zdmc+Cw==
+</value>
+  </data>
+  <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="resource.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAACR0RVh0VGl0
+        bGUAQ29tbWVudDtUb29sdGlwO0hpbnQ7VGlwO0Nsb3Vk08HbyQAAAm9JREFUOE91k0lMU1EUhm8QJ6xY
+        QIWlW4kL3GAoGIIaF7rRDQsFBUUKBLFaQIK0FlocVpo40DQyU1rKIIQhYNR0oVgtpWUSlCJpcGhNQMRo
+        dPV77nsPUkBv8uX/z7nn/vct3mW0QohQYqPEJmKzxBZiKxEmsY2QSfC9EFbR4rEb2kZhaB2TGCGoto1A
+        T17PtWUEFTYPaBblLW6UW90orXs5SAFhTGN2w7P0B57vIm6JYc6iiCuIIcL57TdKGpyggB2sqNYJFzXa
+        ZxZFvBLB9Zq+/ctPqEyDPCCC5T14AUfgF5omFiTmBTWPB9fzUk2etN+3hAt37TwgiqXdfornvh8wDQeQ
+        VeNC3JVOQVf7oRVvcgVge7uAVH0fD9jJUvUD6KTkW8/moCjpwdxnPw5d7/+vNzzxwTjox4mybh6wi53U
+        9sLi/opr3bM4/dCBg5o+nDU5kW58LfgM7qtEn258g9LuD7hj/4RjxY95wG52vKQL1a/8KOzwQtszi8oB
+        n6CcG3Sbtpc8UUleQ8rnKvt9OHK5lQdEs6PqDtyzf0SB9Z2IbWrFX1zRKcEv12VdM0jOt/KAGJZSYMNN
+        urWYkovbvLjaMY0iUj6Y2zQpoGwUtcAyhcLWaaht76HIMYtfkJBVa0/KtSAppxmJHGUzEpRmpKgsUNZN
+        4lzdBDGG7PpxJKusiD/fKLD/1H0HBcgJ4V8Pl4oIIpKICd+XaTysbkdm9SgyCEVOA7bHptfQ3h6+T/D5
+        UKbT6dZBiz8wefSBS6bE/GbEZ9dDtjftEfWiiA2rZoOLYKSQSHmcskoWe8b4r8PC3NpGMPwAsfyU1x3W
+        6XTsLy5SM69xQkG9AAAAAElFTkSuQmCC
+</value>
+  </data>
+  <data name="resource.Image1" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAACR0RVh0VGl0
+        bGUAQ29tbWVudDtUb29sdGlwO0hpbnQ7VGlwO0Nsb3Vk08HbyQAAAm9JREFUOE91k0lMU1EUhm8QJ6xY
+        QIWlW4kL3GAoGIIaF7rRDQsFBUUKBLFaQIK0FlocVpo40DQyU1rKIIQhYNR0oVgtpWUSlCJpcGhNQMRo
+        dPV77nsPUkBv8uX/z7nn/vct3mW0QohQYqPEJmKzxBZiKxEmsY2QSfC9EFbR4rEb2kZhaB2TGCGoto1A
+        T17PtWUEFTYPaBblLW6UW90orXs5SAFhTGN2w7P0B57vIm6JYc6iiCuIIcL57TdKGpyggB2sqNYJFzXa
+        ZxZFvBLB9Zq+/ctPqEyDPCCC5T14AUfgF5omFiTmBTWPB9fzUk2etN+3hAt37TwgiqXdfornvh8wDQeQ
+        VeNC3JVOQVf7oRVvcgVge7uAVH0fD9jJUvUD6KTkW8/moCjpwdxnPw5d7/+vNzzxwTjox4mybh6wi53U
+        9sLi/opr3bM4/dCBg5o+nDU5kW58LfgM7qtEn258g9LuD7hj/4RjxY95wG52vKQL1a/8KOzwQtszi8oB
+        n6CcG3Sbtpc8UUleQ8rnKvt9OHK5lQdEs6PqDtyzf0SB9Z2IbWrFX1zRKcEv12VdM0jOt/KAGJZSYMNN
+        urWYkovbvLjaMY0iUj6Y2zQpoGwUtcAyhcLWaaht76HIMYtfkJBVa0/KtSAppxmJHGUzEpRmpKgsUNZN
+        4lzdBDGG7PpxJKusiD/fKLD/1H0HBcgJ4V8Pl4oIIpKICd+XaTysbkdm9SgyCEVOA7bHptfQ3h6+T/D5
+        UKbT6dZBiz8wefSBS6bE/GbEZ9dDtjftEfWiiA2rZoOLYKSQSHmcskoWe8b4r8PC3NpGMPwAsfyU1x3W
+        6XTsLy5SM69xQkG9AAAAAElFTkSuQmCC
+</value>
+  </data>
 </root>
\ No newline at end of file
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/05-property/HydroVisualPropertyDescriptionCtrl.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/05-property/HydroVisualPropertyDescriptionCtrl.cs
index dd923d6..2af9527 100644
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/05-property/HydroVisualPropertyDescriptionCtrl.cs
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/05-property/HydroVisualPropertyDescriptionCtrl.cs
@@ -1,15 +1,4 @@
-锘縰sing 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
+锘縩amespace Yw.WinFrmUI
 {
     public partial class HydroVisualPropertyDescriptionCtrl : DevExpress.XtraEditors.XtraUserControl
     {
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/00-core/HydroWorkingViewModel.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/00-core/HydroWorkingViewModel.cs
new file mode 100644
index 0000000..ad7f8b8
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/00-core/HydroWorkingViewModel.cs
@@ -0,0 +1,9 @@
+锘縩amespace Yw.WinFrmUI
+{
+    /// <summary>
+    /// 
+    /// </summary>
+    public class HydroWorkingViewModel
+    {
+    }
+}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/00-core/SetHydroWorkingBottomCtrl.Designer.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/04-set/SetHydroWorkingBottomCtrl.Designer.cs
similarity index 100%
rename from WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/00-core/SetHydroWorkingBottomCtrl.Designer.cs
rename to WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/04-set/SetHydroWorkingBottomCtrl.Designer.cs
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/00-core/SetHydroWorkingBottomCtrl.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/04-set/SetHydroWorkingBottomCtrl.cs
similarity index 100%
rename from WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/00-core/SetHydroWorkingBottomCtrl.cs
rename to WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/04-set/SetHydroWorkingBottomCtrl.cs
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/00-core/SetHydroWorkingBottomCtrl.resx b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/04-set/SetHydroWorkingBottomCtrl.resx
similarity index 100%
rename from WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/00-core/SetHydroWorkingBottomCtrl.resx
rename to WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/04-set/SetHydroWorkingBottomCtrl.resx
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/00-core/SetHydroWorkingCtrl.Designer.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/04-set/SetHydroWorkingCtrl.Designer.cs
similarity index 100%
rename from WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/00-core/SetHydroWorkingCtrl.Designer.cs
rename to WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/04-set/SetHydroWorkingCtrl.Designer.cs
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/00-core/SetHydroWorkingCtrl.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/04-set/SetHydroWorkingCtrl.cs
similarity index 100%
rename from WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/00-core/SetHydroWorkingCtrl.cs
rename to WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/04-set/SetHydroWorkingCtrl.cs
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/00-core/SetHydroWorkingCtrl.resx b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/04-set/SetHydroWorkingCtrl.resx
similarity index 100%
rename from WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/00-core/SetHydroWorkingCtrl.resx
rename to WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/04-set/SetHydroWorkingCtrl.resx
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/00-core/SetHydroWorkingDlg.Designer.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/04-set/SetHydroWorkingDlg.Designer.cs
similarity index 100%
rename from WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/00-core/SetHydroWorkingDlg.Designer.cs
rename to WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/04-set/SetHydroWorkingDlg.Designer.cs
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/00-core/SetHydroWorkingDlg.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/04-set/SetHydroWorkingDlg.cs
similarity index 100%
rename from WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/00-core/SetHydroWorkingDlg.cs
rename to WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/04-set/SetHydroWorkingDlg.cs
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/00-core/SetHydroWorkingDlg.resx b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/04-set/SetHydroWorkingDlg.resx
similarity index 100%
rename from WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/00-core/SetHydroWorkingDlg.resx
rename to WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/04-set/SetHydroWorkingDlg.resx
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/00-core/SetHydroWorkingViewModel.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/04-set/SetHydroWorkingViewModel.cs
similarity index 100%
rename from WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/00-core/SetHydroWorkingViewModel.cs
rename to WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/04-set/SetHydroWorkingViewModel.cs
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/05-tree/HydroWorkingTreeCtrl.Designer.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/05-tree/HydroWorkingTreeCtrl.Designer.cs
new file mode 100644
index 0000000..d88f210
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/05-tree/HydroWorkingTreeCtrl.Designer.cs
@@ -0,0 +1,302 @@
+锘縰sing DevExpress.Utils;
+using DevExpress.XtraEditors;
+using DevExpress.XtraLayout;
+using DevExpress.XtraTreeList;
+using DevExpress.XtraTreeList.Columns;
+
+namespace Yw.WinFrmUI
+{
+    partial class HydroWorkingTreeCtrl
+    {
+        /// <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(HydroWorkingTreeCtrl));
+            DevExpress.XtraEditors.Controls.EditorButtonImageOptions editorButtonImageOptions1 = new DevExpress.XtraEditors.Controls.EditorButtonImageOptions();
+            SerializableAppearanceObject serializableAppearanceObject1 = new SerializableAppearanceObject();
+            SerializableAppearanceObject serializableAppearanceObject2 = new SerializableAppearanceObject();
+            SerializableAppearanceObject serializableAppearanceObject3 = new SerializableAppearanceObject();
+            SerializableAppearanceObject serializableAppearanceObject4 = new SerializableAppearanceObject();
+            layoutControl1 = new LayoutControl();
+            treeList1 = new TreeList();
+            colName = new TreeListColumn();
+            barManager1 = new DevExpress.XtraBars.BarManager(components);
+            bar1 = new DevExpress.XtraBars.Bar();
+            barBtnExpandAll = new DevExpress.XtraBars.BarButtonItem();
+            barBtnCollpseAll = new DevExpress.XtraBars.BarButtonItem();
+            barBtnSearchBox = new DevExpress.XtraBars.BarButtonItem();
+            barCkTreeLine = new DevExpress.XtraBars.BarCheckItem();
+            barDockControlTop = new DevExpress.XtraBars.BarDockControl();
+            barDockControlBottom = new DevExpress.XtraBars.BarDockControl();
+            barDockControlLeft = new DevExpress.XtraBars.BarDockControl();
+            barDockControlRight = new DevExpress.XtraBars.BarDockControl();
+            repositoryItemButtonEdit1 = new DevExpress.XtraEditors.Repository.RepositoryItemButtonEdit();
+            searchControl1 = new SearchControl();
+            Root = new LayoutControlGroup();
+            layoutControlItem1 = new LayoutControlItem();
+            layoutControlItem2 = new LayoutControlItem();
+            ((ISupportInitialize)layoutControl1).BeginInit();
+            layoutControl1.SuspendLayout();
+            ((ISupportInitialize)treeList1).BeginInit();
+            ((ISupportInitialize)barManager1).BeginInit();
+            ((ISupportInitialize)repositoryItemButtonEdit1).BeginInit();
+            ((ISupportInitialize)searchControl1.Properties).BeginInit();
+            ((ISupportInitialize)Root).BeginInit();
+            ((ISupportInitialize)layoutControlItem1).BeginInit();
+            ((ISupportInitialize)layoutControlItem2).BeginInit();
+            SuspendLayout();
+            // 
+            // layoutControl1
+            // 
+            layoutControl1.Controls.Add(treeList1);
+            layoutControl1.Controls.Add(searchControl1);
+            layoutControl1.Dock = DockStyle.Fill;
+            layoutControl1.Location = new Point(0, 24);
+            layoutControl1.Name = "layoutControl1";
+            layoutControl1.OptionsCustomizationForm.DesignTimeCustomizationFormPositionAndSize = new Rectangle(539, 371, 650, 400);
+            layoutControl1.Root = Root;
+            layoutControl1.Size = new Size(235, 636);
+            layoutControl1.TabIndex = 0;
+            layoutControl1.Text = "layoutControl1";
+            // 
+            // treeList1
+            // 
+            treeList1.Columns.AddRange(new TreeListColumn[] { colName });
+            treeList1.KeyFieldName = "Id";
+            treeList1.Location = new Point(0, 24);
+            treeList1.MenuManager = barManager1;
+            treeList1.Name = "treeList1";
+            treeList1.OptionsMenu.EnableNodeMenu = false;
+            treeList1.OptionsSelection.EnableAppearanceFocusedCell = false;
+            treeList1.OptionsView.FocusRectStyle = DevExpress.XtraTreeList.DrawFocusRectStyle.None;
+            treeList1.ParentFieldName = "ParentId";
+            treeList1.RepositoryItems.AddRange(new DevExpress.XtraEditors.Repository.RepositoryItem[] { repositoryItemButtonEdit1 });
+            treeList1.Size = new Size(235, 611);
+            treeList1.TabIndex = 5;
+            treeList1.TreeViewColumn = colName;
+            treeList1.ViewStyle = TreeListViewStyle.TreeView;
+            treeList1.FocusedNodeChanged += treeList1_FocusedNodeChanged;
+            // 
+            // colName
+            // 
+            colName.Caption = "鍚嶇О";
+            colName.FieldName = "Name";
+            colName.ImageOptions.SvgImage = (DevExpress.Utils.Svg.SvgImage)resources.GetObject("colName.ImageOptions.SvgImage");
+            colName.Name = "colName";
+            colName.Visible = true;
+            colName.VisibleIndex = 0;
+            colName.Width = 172;
+            // 
+            // barManager1
+            // 
+            barManager1.Bars.AddRange(new DevExpress.XtraBars.Bar[] { bar1 });
+            barManager1.DockControls.Add(barDockControlTop);
+            barManager1.DockControls.Add(barDockControlBottom);
+            barManager1.DockControls.Add(barDockControlLeft);
+            barManager1.DockControls.Add(barDockControlRight);
+            barManager1.Form = this;
+            barManager1.Items.AddRange(new DevExpress.XtraBars.BarItem[] { barBtnExpandAll, barBtnCollpseAll, barBtnSearchBox, barCkTreeLine });
+            barManager1.MaxItemId = 6;
+            // 
+            // bar1
+            // 
+            bar1.BarName = "Custom 1";
+            bar1.CanDockStyle = DevExpress.XtraBars.BarCanDockStyle.Top;
+            bar1.DockCol = 0;
+            bar1.DockRow = 0;
+            bar1.DockStyle = DevExpress.XtraBars.BarDockStyle.Top;
+            bar1.LinksPersistInfo.AddRange(new DevExpress.XtraBars.LinkPersistInfo[] { new DevExpress.XtraBars.LinkPersistInfo(barBtnExpandAll), new DevExpress.XtraBars.LinkPersistInfo(barBtnCollpseAll), new DevExpress.XtraBars.LinkPersistInfo(barBtnSearchBox), new DevExpress.XtraBars.LinkPersistInfo(barCkTreeLine) });
+            bar1.OptionsBar.AllowQuickCustomization = false;
+            bar1.OptionsBar.DrawDragBorder = false;
+            bar1.OptionsBar.MultiLine = true;
+            bar1.OptionsBar.UseWholeRow = true;
+            bar1.Text = "Custom 1";
+            // 
+            // barBtnExpandAll
+            // 
+            barBtnExpandAll.Caption = "灞曞紑";
+            barBtnExpandAll.Id = 0;
+            barBtnExpandAll.ImageOptions.SvgImage = (DevExpress.Utils.Svg.SvgImage)resources.GetObject("barBtnExpandAll.ImageOptions.SvgImage");
+            barBtnExpandAll.Name = "barBtnExpandAll";
+            barBtnExpandAll.ItemClick += barBtnExpandAll_ItemClick;
+            // 
+            // barBtnCollpseAll
+            // 
+            barBtnCollpseAll.Caption = "鎶樺彔";
+            barBtnCollpseAll.Id = 1;
+            barBtnCollpseAll.ImageOptions.SvgImage = (DevExpress.Utils.Svg.SvgImage)resources.GetObject("barBtnCollpseAll.ImageOptions.SvgImage");
+            barBtnCollpseAll.Name = "barBtnCollpseAll";
+            barBtnCollpseAll.ItemClick += barBtnCollpseAll_ItemClick;
+            // 
+            // barBtnSearchBox
+            // 
+            barBtnSearchBox.Caption = "鎼滅储";
+            barBtnSearchBox.Id = 2;
+            barBtnSearchBox.ImageOptions.SvgImage = (DevExpress.Utils.Svg.SvgImage)resources.GetObject("barBtnSearchBox.ImageOptions.SvgImage");
+            barBtnSearchBox.Name = "barBtnSearchBox";
+            barBtnSearchBox.ItemClick += barBtnSearch_ItemClick;
+            // 
+            // barCkTreeLine
+            // 
+            barCkTreeLine.Caption = "鏍戠嚎";
+            barCkTreeLine.Id = 4;
+            barCkTreeLine.ImageOptions.SvgImage = (DevExpress.Utils.Svg.SvgImage)resources.GetObject("barCkTreeLine.ImageOptions.SvgImage");
+            barCkTreeLine.Name = "barCkTreeLine";
+            barCkTreeLine.CheckedChanged += barCkTreeLine_CheckedChanged;
+            // 
+            // barDockControlTop
+            // 
+            barDockControlTop.CausesValidation = false;
+            barDockControlTop.Dock = DockStyle.Top;
+            barDockControlTop.Location = new Point(0, 0);
+            barDockControlTop.Manager = barManager1;
+            barDockControlTop.Size = new Size(235, 24);
+            // 
+            // barDockControlBottom
+            // 
+            barDockControlBottom.CausesValidation = false;
+            barDockControlBottom.Dock = DockStyle.Bottom;
+            barDockControlBottom.Location = new Point(0, 660);
+            barDockControlBottom.Manager = barManager1;
+            barDockControlBottom.Size = new Size(235, 0);
+            // 
+            // barDockControlLeft
+            // 
+            barDockControlLeft.CausesValidation = false;
+            barDockControlLeft.Dock = DockStyle.Left;
+            barDockControlLeft.Location = new Point(0, 24);
+            barDockControlLeft.Manager = barManager1;
+            barDockControlLeft.Size = new Size(0, 636);
+            // 
+            // barDockControlRight
+            // 
+            barDockControlRight.CausesValidation = false;
+            barDockControlRight.Dock = DockStyle.Right;
+            barDockControlRight.Location = new Point(235, 24);
+            barDockControlRight.Manager = barManager1;
+            barDockControlRight.Size = new Size(0, 636);
+            // 
+            // repositoryItemButtonEdit1
+            // 
+            repositoryItemButtonEdit1.AutoHeight = false;
+            editorButtonImageOptions1.SvgImage = (DevExpress.Utils.Svg.SvgImage)resources.GetObject("editorButtonImageOptions1.SvgImage");
+            editorButtonImageOptions1.SvgImageSize = new Size(20, 20);
+            repositoryItemButtonEdit1.Buttons.AddRange(new DevExpress.XtraEditors.Controls.EditorButton[] { new DevExpress.XtraEditors.Controls.EditorButton(DevExpress.XtraEditors.Controls.ButtonPredefines.Glyph, "", -1, true, true, false, editorButtonImageOptions1, new KeyShortcut(Keys.None), serializableAppearanceObject1, serializableAppearanceObject2, serializableAppearanceObject3, serializableAppearanceObject4, "", null, null, ToolTipAnchor.Default) });
+            repositoryItemButtonEdit1.Name = "repositoryItemButtonEdit1";
+            repositoryItemButtonEdit1.TextEditStyle = DevExpress.XtraEditors.Controls.TextEditStyles.HideTextEditor;
+            // 
+            // searchControl1
+            // 
+            searchControl1.Client = treeList1;
+            searchControl1.Location = new Point(0, 2);
+            searchControl1.MenuManager = barManager1;
+            searchControl1.Name = "searchControl1";
+            searchControl1.Properties.Buttons.AddRange(new DevExpress.XtraEditors.Controls.EditorButton[] { new DevExpress.XtraEditors.Repository.ClearButton(), new DevExpress.XtraEditors.Repository.SearchButton() });
+            searchControl1.Properties.Client = treeList1;
+            searchControl1.Size = new Size(235, 20);
+            searchControl1.StyleController = layoutControl1;
+            searchControl1.TabIndex = 4;
+            // 
+            // Root
+            // 
+            Root.EnableIndentsWithoutBorders = DefaultBoolean.True;
+            Root.GroupBordersVisible = false;
+            Root.Items.AddRange(new BaseLayoutItem[] { layoutControlItem1, layoutControlItem2 });
+            Root.Name = "Root";
+            Root.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
+            Root.Size = new Size(235, 636);
+            Root.TextVisible = false;
+            // 
+            // layoutControlItem1
+            // 
+            layoutControlItem1.Control = searchControl1;
+            layoutControlItem1.Location = new Point(0, 0);
+            layoutControlItem1.Name = "layoutControlItem1";
+            layoutControlItem1.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 2, 1);
+            layoutControlItem1.Size = new Size(235, 23);
+            layoutControlItem1.TextSize = new Size(0, 0);
+            layoutControlItem1.TextVisible = false;
+            // 
+            // layoutControlItem2
+            // 
+            layoutControlItem2.Control = treeList1;
+            layoutControlItem2.Location = new Point(0, 23);
+            layoutControlItem2.Name = "layoutControlItem2";
+            layoutControlItem2.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 1, 1);
+            layoutControlItem2.Size = new Size(235, 613);
+            layoutControlItem2.TextSize = new Size(0, 0);
+            layoutControlItem2.TextVisible = false;
+            // 
+            // SimpleTreeViewCtrl
+            // 
+            AutoScaleDimensions = new SizeF(7F, 14F);
+            AutoScaleMode = AutoScaleMode.Font;
+            Controls.Add(layoutControl1);
+            Controls.Add(barDockControlLeft);
+            Controls.Add(barDockControlRight);
+            Controls.Add(barDockControlBottom);
+            Controls.Add(barDockControlTop);
+            Name = "SimpleTreeViewCtrl";
+            Size = new Size(235, 660);
+            ((ISupportInitialize)layoutControl1).EndInit();
+            layoutControl1.ResumeLayout(false);
+            ((ISupportInitialize)treeList1).EndInit();
+            ((ISupportInitialize)barManager1).EndInit();
+            ((ISupportInitialize)repositoryItemButtonEdit1).EndInit();
+            ((ISupportInitialize)searchControl1.Properties).EndInit();
+            ((ISupportInitialize)Root).EndInit();
+            ((ISupportInitialize)layoutControlItem1).EndInit();
+            ((ISupportInitialize)layoutControlItem2).EndInit();
+            ResumeLayout(false);
+            PerformLayout();
+        }
+
+        #endregion
+
+        private DevExpress.XtraLayout.LayoutControl layoutControl1;
+        private DevExpress.XtraLayout.LayoutControlGroup Root;
+        private DevExpress.XtraBars.BarManager barManager1;
+        private DevExpress.XtraBars.Bar bar1;
+        private DevExpress.XtraBars.BarButtonItem barBtnExpandAll;
+        private DevExpress.XtraBars.BarDockControl barDockControlTop;
+        private DevExpress.XtraBars.BarDockControl barDockControlBottom;
+        private DevExpress.XtraBars.BarDockControl barDockControlLeft;
+        private DevExpress.XtraBars.BarDockControl barDockControlRight;
+        private DevExpress.XtraEditors.SearchControl searchControl1;
+        private DevExpress.XtraBars.BarButtonItem barBtnCollpseAll;
+        private DevExpress.XtraBars.BarButtonItem barBtnSearchBox;
+        private DevExpress.XtraBars.BarCheckItem barCkTreeLine;
+        private DevExpress.XtraLayout.LayoutControlItem layoutControlItem1;
+        private DevExpress.XtraTreeList.TreeList treeList1;
+        private DevExpress.XtraLayout.LayoutControlItem layoutControlItem2;
+        private DevExpress.XtraTreeList.Columns.TreeListColumn colName;
+        private DevExpress.XtraEditors.SimpleButton btnImportProject;
+        private DevExpress.XtraLayout.LayoutControlItem layoutControlItem3;
+        private DevExpress.XtraBars.BarButtonItem barBtnRefresh;
+        private DevExpress.XtraEditors.Repository.RepositoryItemButtonEdit repositoryItemButtonEdit1;
+    }
+}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/05-tree/HydroWorkingTreeCtrl.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/05-tree/HydroWorkingTreeCtrl.cs
new file mode 100644
index 0000000..b48511b
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/05-tree/HydroWorkingTreeCtrl.cs
@@ -0,0 +1,148 @@
+锘縰sing DevExpress.Utils;
+using DevExpress.Utils.Design;
+using DevExpress.Utils.Extensions;
+
+namespace Yw.WinFrmUI
+{
+    public partial class HydroWorkingTreeCtrl : DevExpress.XtraEditors.XtraUserControl
+    {
+        /// <summary>
+        /// 
+        /// </summary>
+        public HydroWorkingTreeCtrl()
+        {
+            InitializeComponent();
+            this.treeList1.InitialDefaultSettings();
+            this.layoutControl1.SetupLayoutControl();
+        }
+
+        /// <summary>
+        /// 鑱氱劍鏀瑰彉浜嬩欢
+        /// </summary>
+        public event Action<SimpleTreeViewModel> FocusedChangedEvent;
+
+        /// <summary>
+        /// 鎵�鏈夌粦瀹氬垪琛�
+        /// </summary>
+        private List<SimpleTreeViewModel> _allBindingList = null;
+
+        /// <summary>
+        /// 缁戝畾鏁版嵁
+        /// </summary>
+        public void SetBindingData(List<SimpleTreeViewModel> allList)
+        {
+            _allBindingList = new List<SimpleTreeViewModel>();
+            allList?.ForEach(x =>
+            {
+                _allBindingList.Add(x);
+            });
+            this.treeList1.DataSource = _allBindingList;
+            this.treeList1.ForceInitialize();
+        }
+
+        /// <summary>
+        /// 鍏ㄩ儴灞曞紑
+        /// </summary>
+        public void ExpandAll()
+        {
+            this.treeList1.ExpandAll();
+        }
+
+        /// <summary>
+        /// 鍏ㄩ儴鎶樺彔
+        /// </summary>
+        public void CollapseAll()
+        {
+            this.treeList1.CollapseAll();
+        }
+
+        /// <summary>
+        /// 鏄剧ず鏍戠嚎
+        /// </summary>
+        public bool ShowTreeLines
+        {
+            get { return this.barCkTreeLine.Checked; }
+            set { this.barCkTreeLine.Checked = value; }
+        }
+
+        /// <summary>
+        /// 鏄剧ず鎼滅储妗�
+        /// </summary>
+        public void ShowSearchControl()
+        {
+            this.layoutControlItem1.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Always;
+        }
+
+        /// <summary>
+        /// 鍏抽棴鎼滅储妗�
+        /// </summary>
+        public void CloseSearchControl()
+        {
+            this.layoutControlItem1.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Never;
+        }
+
+        /// <summary>
+        /// 閫夋嫨鍥剧墖鍒楄〃
+        /// </summary>
+        [DefaultValue(null)]
+        [TypeConverter(typeof(ImageCollectionImagesConverter))]
+        public object SelectImageList
+        {
+            get
+            {
+                return this.treeList1.SelectImageList;
+            }
+            set
+            {
+                this.treeList1.SelectImageList = value;
+            }
+        }
+
+        /// <summary>
+        /// 宸ュ叿鏉″彲瑙佹��
+        /// </summary>
+        public bool ToolBarVisible
+        {
+            get { return this.bar1.Visible; }
+            set { this.bar1.Visible = value; }
+        }
+
+
+        //鍏ㄩ儴灞曞紑
+        private void barBtnExpandAll_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
+        {
+            this.treeList1.ExpandAll();
+        }
+
+        //鍏ㄩ儴鎶樺彔
+        private void barBtnCollpseAll_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
+        {
+            this.treeList1.CollapseAll();
+        }
+
+        //妫�绱紙menu锛�
+        private void barBtnSearch_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
+        {
+            if (this.layoutControlItem1.Visibility == DevExpress.XtraLayout.Utils.LayoutVisibility.Always)
+                this.layoutControlItem1.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Never;
+            else
+                this.layoutControlItem1.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Always;
+        }
+
+        //鏍戠嚎
+        private void barCkTreeLine_CheckedChanged(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
+        {
+            this.treeList1.OptionsView.ShowTreeLines = this.barCkTreeLine.Checked ? DefaultBoolean.True : DefaultBoolean.False;
+        }
+
+        //鑱氱劍鑺傜偣鏀瑰彉
+        private void treeList1_FocusedNodeChanged(object sender, DevExpress.XtraTreeList.FocusedNodeChangedEventArgs e)
+        {
+            var vm = this.treeList1.GetDataRecordByNode(e.Node) as SimpleTreeViewModel;
+            this.FocusedChangedEvent?.Invoke(vm);
+        }
+
+
+
+    }
+}
\ No newline at end of file
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/05-tree/HydroWorkingTreeCtrl.resx b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/05-tree/HydroWorkingTreeCtrl.resx
new file mode 100644
index 0000000..13c9ad4
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/05-tree/HydroWorkingTreeCtrl.resx
@@ -0,0 +1,239 @@
+锘�<?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="colName.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIzLjIsIFZlcnNpb249MjMuMi40
+        LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
+        dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAAOMCAAAC77u/
+        PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi
+        IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv
+        MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh
+        Y2U9InByZXNlcnZlIiBpZD0iTmV3VGFibGVTdHlsZSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5l
+        dyAwIDAgMzIgMzIiPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLkJsdWV7ZmlsbDojMTE3N0Q3
+        O30KCS5CbGFja3tmaWxsOiM3MjcyNzI7fQoJLlllbGxvd3tmaWxsOiNGRkIxMTU7fQoJLnN0MHtvcGFj
+        aXR5OjAuNTt9Cjwvc3R5bGU+DQogIDxnIGNsYXNzPSJzdDAiPg0KICAgIDxwYXRoIGQ9Ik0wLDIwaDh2
+        NkgwVjIweiBNMTAsMjZoOHYtNmgtOFYyNnogTTIwLDEydjZoOHYtNkgyMHogTTIwLDI2aDh2LTZoLThW
+        MjZ6IiBjbGFzcz0iQmxhY2siIC8+DQogIDwvZz4NCiAgPHBhdGggZD0iTTAsNGg4djZIMFY0eiBNMCwx
+        OGg4di02SDBWMTh6IE0xMCwxMGg4VjRoLThWMTB6IE0xMCwxOGg4di02aC04VjE4eiIgY2xhc3M9IkJs
+        dWUiIC8+DQogIDxwb2x5Z29uIHBvaW50cz0iMjUsMiAyNywwIDI3LDMgMzAsMyAyOCw1IDMwLDcgMjcs
+        NyAyNywxMCAyNSw4IDIzLDEwIDIzLDcgMjAsNyAyMiw1IDIwLDMgMjMsMyAyMywwICIgY2xhc3M9Illl
+        bGxvdyIgLz4NCjwvc3ZnPgs=
+</value>
+  </data>
+  <metadata name="barManager1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+  <data name="barBtnExpandAll.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIzLjIsIFZlcnNpb249MjMuMi40
+        LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
+        dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAALACAAAC77u/
+        PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi
+        IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv
+        MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh
+        Y2U9InByZXNlcnZlIiBpZD0iRXhwYW5kX0ZpZWxkIiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3
+        IDAgMCAzMiAzMiI+DQogIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CgkuQmxhY2t7ZmlsbDojNzI3Mjcy
+        O30KCS5HcmVlbntmaWxsOiMwMzlDMjM7fQoJLnN0MHtvcGFjaXR5OjAuNzU7fQo8L3N0eWxlPg0KICA8
+        cG9seWdvbiBwb2ludHM9IjE0LDYgMTAsNiAxMCwyIDYsMiA2LDYgMiw2IDIsMTAgNiwxMCA2LDE0IDEw
+        LDE0IDEwLDEwIDE0LDEwICIgY2xhc3M9IkdyZWVuIiAvPg0KICA8ZyBjbGFzcz0ic3QwIj4NCiAgICA8
+        cGF0aCBkPSJNMjIsNmgxMHYySDIyVjZ6IE0yMiwxMmgxMHYtMkgyMlYxMnogTTIyLDIwaDEwdi0ySDIy
+        VjIweiBNMjIsMjRoMTB2LTJIMjJWMjR6IiBjbGFzcz0iQmxhY2siIC8+DQogIDwvZz4NCiAgPHBhdGgg
+        ZD0iTTE4LDJoMTR2MkgxOFYyeiBNMTgsMTZoMTR2LTJIMThWMTZ6IE0xOCwyOGgxNHYtMkgxOFYyOHoi
+        IGNsYXNzPSJCbGFjayIgLz4NCjwvc3ZnPgs=
+</value>
+  </data>
+  <data name="barBtnCollpseAll.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIzLjIsIFZlcnNpb249MjMuMi40
+        LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
+        dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAAIcCAAAC77u/
+        PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi
+        IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv
+        MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh
+        Y2U9InByZXNlcnZlIiBpZD0iQ29sbGFwc2VfRmllbGQiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpu
+        ZXcgMCAwIDMyIDMyIj4NCiAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KCS5CbGFja3tmaWxsOiM3Mjcy
+        NzI7fQoJLlJlZHtmaWxsOiNEMTFDMUM7fQoJLnN0MHtvcGFjaXR5OjAuNzU7fQo8L3N0eWxlPg0KICA8
+        cmVjdCB4PSIyIiB5PSI2IiB3aWR0aD0iMTIiIGhlaWdodD0iNCIgY2xhc3M9IlJlZCIgLz4NCiAgPGcg
+        Y2xhc3M9InN0MCI+DQogICAgPHBhdGggZD0iTTIyLDZoMTB2MkgyMlY2eiBNMjIsMTJoMTB2LTJIMjJW
+        MTJ6IE0yMiwyMGgxMHYtMkgyMlYyMHogTTIyLDI0aDEwdi0ySDIyVjI0eiIgY2xhc3M9IkJsYWNrIiAv
+        Pg0KICA8L2c+DQogIDxwYXRoIGQ9Ik0xOCwyaDE0djJIMThWMnogTTE4LDE2aDE0di0ySDE4VjE2eiBN
+        MTgsMjhoMTR2LTJIMThWMjh6IiBjbGFzcz0iQmxhY2siIC8+DQo8L3N2Zz4L
+</value>
+  </data>
+  <data name="barBtnSearchBox.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIzLjIsIFZlcnNpb249MjMuMi40
+        LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
+        dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAANoCAAAC77u/
+        PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi
+        IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv
+        MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh
+        Y2U9InByZXNlcnZlIiBpZD0iTGF5ZXJfMSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAg
+        MzIgMzIiPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLkJsdWV7ZmlsbDojMTE3N0Q3O30KCS5Z
+        ZWxsb3d7ZmlsbDojRkZCMTE1O30KCS5CbGFja3tmaWxsOiM3MjcyNzI7fQoJLkdyZWVue2ZpbGw6IzAz
+        OUMyMzt9CgkuUmVke2ZpbGw6I0QxMUMxQzt9Cgkuc3Qwe29wYWNpdHk6MC43NTt9Cgkuc3Qxe29wYWNp
+        dHk6MC41O30KPC9zdHlsZT4NCiAgPGcgaWQ9Ilpvb20iPg0KICAgIDxwYXRoIGQ9Ik0yNy43LDI1LjNM
+        MjAuNSwxOGMxLTEuNCwxLjUtMy4yLDEuNS01YzAtNS00LTktOS05cy05LDQtOSw5YzAsNSw0LDksOSw5
+        YzEuOSwwLDMuNi0wLjYsNS0xLjVsNy4zLDcuMyAgIGMwLjMsMC4zLDAuOSwwLjMsMS4yLDBsMS4yLTEu
+        MkMyOC4xLDI2LjIsMjguMSwyNS42LDI3LjcsMjUuM3ogTTYsMTNjMC0zLjksMy4xLTcsNy03czcsMy4x
+        LDcsN2MwLDMuOS0zLjEsNy03LDdTNiwxNi45LDYsMTN6IiBjbGFzcz0iQmxhY2siIC8+DQogIDwvZz4N
+        Cjwvc3ZnPgs=
+</value>
+  </data>
+  <data name="barCkTreeLine.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIzLjIsIFZlcnNpb249MjMuMi40
+        LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
+        dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAAIkDAAAC77u/
+        PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi
+        IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv
+        MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh
+        Y2U9InByZXNlcnZlIiBpZD0iTGF5ZXJfMSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAg
+        MzIgMzIiPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLkdyZWVue2ZpbGw6IzAzOUMyMzt9Cgku
+        QmxhY2t7ZmlsbDojNzI3MjcyO30KCS5SZWR7ZmlsbDojRDExQzFDO30KCS5ZZWxsb3d7ZmlsbDojRkZC
+        MTE1O30KCS5CbHVle2ZpbGw6IzExNzdENzt9CgkuV2hpdGV7ZmlsbDojRkZGRkZGO30KCS5zdDB7b3Bh
+        Y2l0eTowLjU7fQoJLnN0MXtvcGFjaXR5OjAuNzU7fQo8L3N0eWxlPg0KICA8ZyBpZD0iSW5zZXJ0VHJl
+        ZVZpZXciPg0KICAgIDxwYXRoIGQ9Ik0xMyw4SDVDNC40LDgsNCw3LjYsNCw3VjNjMC0wLjUsMC40LTEs
+        MS0xaDhjMC42LDAsMSwwLjUsMSwxdjRDMTQsNy42LDEzLjYsOCwxMyw4eiBNMjYsMTd2LTQgICBjMC0w
+        LjYtMC41LTEtMS0xaC04Yy0wLjUsMC0xLDAuNC0xLDF2NGMwLDAuNSwwLjUsMSwxLDFoOEMyNS41LDE4
+        LDI2LDE3LjUsMjYsMTd6IE0yNiwyN3YtNGMwLTAuNS0wLjUtMS0xLTFoLThjLTAuNSwwLTEsMC41LTEs
+        MSAgIHY0YzAsMC41LDAuNSwxLDEsMWg4QzI1LjUsMjgsMjYsMjcuNSwyNiwyN3oiIGNsYXNzPSJZZWxs
+        b3ciIC8+DQogICAgPHBvbHlnb24gcG9pbnRzPSIxNCwxNiAxNCwxNCAxMCwxNCAxMCwxMCA4LDEwIDgs
+        MjYgMTQsMjYgMTQsMjQgMTAsMjQgMTAsMTYgICIgY2xhc3M9IkJsYWNrIiAvPg0KICA8L2c+DQo8L3N2
+        Zz4L
+</value>
+  </data>
+  <data name="editorButtonImageOptions1.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIzLjIsIFZlcnNpb249MjMuMi40
+        LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
+        dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAAK4BAAAC77u/
+        PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi
+        IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv
+        MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh
+        Y2U9InByZXNlcnZlIiBpZD0iTGF5ZXIxIiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAz
+        MiAzMiI+DQogIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CgkJLkJsdWUKCQl7CgkJCWZpbGw6IzExNzdE
+        NzsgCgkJCWZvbnQtZmFtaWx5OidkeC1mb250LWljb25zJzsgCgkJCWZvbnQtc2l6ZTozMnB4OwoJCX0K
+        CTwvc3R5bGU+DQogIDx0ZXh0IHg9IjBweCIgeT0iMzJweCIgY2xhc3M9IkJsdWUiPu6drDwvdGV4dD4N
+        Cjwvc3ZnPgs=
+</value>
+  </data>
+</root>
\ No newline at end of file
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/05-tree/HydroWorkingTreeViewModel.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/05-tree/HydroWorkingTreeViewModel.cs
new file mode 100644
index 0000000..b25b2c5
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/10-working/05-tree/HydroWorkingTreeViewModel.cs
@@ -0,0 +1,52 @@
+锘縩amespace Yw.WinFrmUI
+{
+    /// <summary>
+    /// 
+    /// </summary>
+    public class HydroWorkingTreeViewModel
+    {
+
+        /// <summary>
+        /// Id
+        /// </summary>
+        public string Id { get; set; }
+
+        /// <summary>
+        /// 鐖剁骇id
+        /// </summary>
+        public string ParentId { get; set; }
+
+        /// <summary>
+        /// 鍚嶇О
+        /// </summary>
+        public string Name { get; set; }
+
+        /// <summary>
+        /// 鍥剧墖绱㈠紩
+        /// </summary>
+        public int ImageIndex { get; set; }
+
+        /// <summary>
+        /// 閫夋嫨
+        /// </summary>
+        public bool Checked { get; set; }
+
+        /// <summary>
+        /// 鎺掑簭鐮�
+        /// </summary>
+        public int SortCode { get; set; }
+
+        /// <summary>
+        /// 璇存槑
+        /// </summary>
+        public string Description { get; set; }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public HydroWorkingVmo Vmo { get; set; }
+
+
+
+    }
+}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/13-fail/HydroCalcuFailedCtrl.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/13-fail/HydroCalcuFailedCtrl.cs
index bd35689..8972730 100644
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/13-fail/HydroCalcuFailedCtrl.cs
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/13-fail/HydroCalcuFailedCtrl.cs
@@ -30,7 +30,23 @@
             this.hydroCalcuFailedViewModelBindingSource.ResetBindings(false);
         }
 
-
+        /// <summary>
+        /// 缁戝畾鏁版嵁
+        /// </summary>
+        public void SetBindingData(List<HydroCalcuFailed> allFailedList)
+        {
+            _allBindingList = new List<HydroCalcuFailedViewModel>();
+            if (allFailedList != null && allFailedList.Count > 0)
+            {
+                foreach (var failed in allFailedList)
+                {
+                    var vm = new HydroCalcuFailedViewModel(failed);
+                    _allBindingList.Add(vm);
+                }
+            }
+            this.hydroCalcuFailedViewModelBindingSource.DataSource = _allBindingList;
+            this.hydroCalcuFailedViewModelBindingSource.ResetBindings(false);
+        }
 
 
 
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/13-fail/HydroCalcuFailedViewModel.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/13-fail/HydroCalcuFailedViewModel.cs
index b53c79a..441a4ce 100644
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/13-fail/HydroCalcuFailedViewModel.cs
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/13-fail/HydroCalcuFailedViewModel.cs
@@ -20,6 +20,15 @@
         }
 
         /// <summary>
+        /// 
+        /// </summary>
+        public HydroCalcuFailedViewModel(HydroCalcuFailed rhs)
+        {
+            this.Code = rhs.Code;
+            this.Message = rhs.Message;
+        }
+
+        /// <summary>
         /// 閿欒缂栫爜
         /// </summary>
         [Display(Name = "閿欒缂栫爜")]
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/14-matching/00-core/HydroMatchingHelper.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/14-matching/00-core/HydroMatchingHelper.cs
new file mode 100644
index 0000000..584d927
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/14-matching/00-core/HydroMatchingHelper.cs
@@ -0,0 +1,1312 @@
+锘縰sing Yw.Model;
+
+namespace Yw.WinFrmUI
+{
+    /// <summary>
+    /// 璧勪骇鍖归厤杈呭姪绫�
+    /// </summary>
+    public class HydroMatchingHelper
+    {
+
+        #region 鍒涘缓
+
+        /// <summary>
+        /// 鍒涘缓鑷姩鍖归厤ViewModel
+        /// </summary>
+        public static HydroMatchingViewModel Create(Yw.Model.HydroModelInfo hydroInfo, List<HydroCalcuVisualResult> allCalcuVisualResultList = null)
+        {
+            #region 鍒濆鍖栧瓧鍏�
+
+            Dictionary<string, HydroCalcuVisualResult> dict = null;
+            if (allCalcuVisualResultList != null && allCalcuVisualResultList.Count > 0)
+            {
+                dict = new Dictionary<string, HydroCalcuVisualResult>();
+                allCalcuVisualResultList.ForEach(x => dict.Add(x.Code, x));
+            }
+
+            #endregion
+
+            #region 鑾峰彇璁$畻缁撴灉鏂规硶
+
+            HydroCalcuVisualResult getCalcuVisualResult(string code)
+            {
+                if (dict == null)
+                {
+                    return default;
+                }
+                if (dict.ContainsKey(code))
+                {
+                    return dict[code];
+                }
+                return default;
+            }
+
+            #endregion
+
+            var vm = new HydroMatchingViewModel();
+
+            #region 姘存睜
+
+            var tanks = hydroInfo.GetAllTanks();
+            vm.Tanks = tanks?.Select(x => Create(x, hydroInfo, getCalcuVisualResult(x.Code) as HydroCalcuNodeResult)).ToList();
+
+            #endregion
+
+            #region 闂峰ご
+
+            vm.Bluntheads = hydroInfo.Bluntheads?.Select(x => Create(x, hydroInfo, getCalcuVisualResult(x.Code) as HydroCalcuNodeResult)).ToList();
+
+            #endregion
+
+            #region 寮ご
+
+            vm.Elbows = hydroInfo.Elbows?.Select(x => Create(x, hydroInfo, getCalcuVisualResult(x.Code) as HydroCalcuNodeResult)).ToList();
+
+            #endregion
+
+            #region 涓夐��
+
+            vm.Threelinks = hydroInfo.Threelinks?.Select(x => Create(x, hydroInfo, getCalcuVisualResult(x.Code) as HydroCalcuNodeResult)).ToList();
+
+            #endregion
+
+            #region 鍥涢��
+
+            vm.Fourlinks = hydroInfo.Fourlinks?.Select(x => Create(x, hydroInfo, getCalcuVisualResult(x.Code) as HydroCalcuNodeResult)).ToList();
+
+            #endregion
+
+            #region 鍠峰槾
+
+            vm.Nozzles = hydroInfo.Nozzles?.Select(x => Create(x, hydroInfo, getCalcuVisualResult(x.Code) as HydroCalcuNodeResult)).ToList();
+
+            #endregion
+
+            #region 娑堢伀鏍�
+
+            vm.Hydrants = hydroInfo.Hydrants?.Select(x => Create(x, hydroInfo, getCalcuVisualResult(x.Code) as HydroCalcuNodeResult)).ToList();
+
+            #endregion
+
+            #region 姘磋〃
+
+            vm.Meters = hydroInfo.Meters?.Select(x => Create(x, hydroInfo, getCalcuVisualResult(x.Code) as HydroCalcuNodeResult)).ToList();
+
+            #endregion
+
+            #region 娴侀噺璁�
+
+            vm.Flowmeters = hydroInfo.Flowmeters?.Select(x => Create(x, hydroInfo, getCalcuVisualResult(x.Code) as HydroCalcuFlowmeterResult)).ToList();
+
+            #endregion
+
+            #region 鍘嬪姏琛�
+
+            vm.Pressmeters = hydroInfo.Pressmeters?.Select(x => Create(x, hydroInfo, getCalcuVisualResult(x.Code) as HydroCalcuPressmeterResult)).ToList();
+
+            #endregion
+
+            #region 绠¢亾
+
+            vm.Pipes = hydroInfo.Pipes?.Select(x => Create(x, hydroInfo, getCalcuVisualResult(x.Code) as HydroCalcuLinkResult)).ToList();
+
+            #endregion
+
+            #region 杩囨浮浠�
+
+            vm.Translations = hydroInfo.Translations?.Select(x => Create(x, hydroInfo, getCalcuVisualResult(x.Code) as HydroCalcuLinkResult)).ToList();
+
+            #endregion
+
+            #region 姘存车
+
+            vm.Pumps = hydroInfo.Pumps?.Select(x => Create(x, hydroInfo, getCalcuVisualResult(x.Code) as HydroCalcuPumpResult)).ToList();
+
+            #endregion
+
+            #region 闃�闂�
+
+            vm.Valves = hydroInfo.Valves?.Select(x => Create(x, hydroInfo, getCalcuVisualResult(x.Code) as HydroCalcuLinkResult)).ToList();
+
+            #endregion
+
+            #region 鎹㈢儹鍣�
+
+            vm.Exchangers = hydroInfo.Exchangers?.Select(x => Create(x, hydroInfo, getCalcuVisualResult(x.Code) as HydroCalcuLinkResult)).ToList();
+
+            #endregion
+
+            #region 鍘嬬缉鏈�
+
+            vm.Compressors = hydroInfo.Compressors?.Select(x => Create(x, hydroInfo, getCalcuVisualResult(x.Code) as HydroCalcuLinkResult)).ToList();
+
+            #endregion
+
+            return vm;
+
+        }
+
+        public static HydroMatchingViewModel Create(List<HydroVisualViewModel> allVisualList)
+        {
+            return default;
+        }
+
+        #region 姘存睜
+
+        /// <summary>
+        /// 鍒涘缓姘存睜鑷姩鍖归厤ViewModel
+        /// </summary>
+        public static HydroTankMatchingViewModel Create(HydroTankInfo parterInfo, HydroModelInfo hydroInfo, HydroCalcuNodeResult calcuResult = null)
+        {
+            if (parterInfo == null)
+            {
+                return default;
+            }
+            if (hydroInfo == null)
+            {
+                return default;
+            }
+            return new HydroTankMatchingViewModel(parterInfo, hydroInfo, calcuResult);
+        }
+
+        /// <summary>
+        /// 鍒涘缓姘存睜鑷姩鍖归厤ViewModel
+        /// </summary>
+        public static HydroTankMatchingViewModel Create(HydroTankViewModel parterViewModel)
+        {
+            if (parterViewModel == null)
+            {
+                return default;
+            }
+            return new HydroTankMatchingViewModel(parterViewModel);
+        }
+
+        #endregion
+
+        #region 闂峰ご
+
+        /// <summary>
+        /// 鍒涘缓闂峰ご鑷姩鍖归厤ViewModel
+        /// </summary>
+        public static HydroBluntheadMatchingViewModel Create(HydroBluntheadInfo parterInfo, HydroModelInfo hydroInfo, HydroCalcuNodeResult calcuResult = null)
+        {
+            if (parterInfo == null)
+            {
+                return default;
+            }
+            if (hydroInfo == null)
+            {
+                return default;
+            }
+            return new HydroBluntheadMatchingViewModel(parterInfo, hydroInfo, calcuResult);
+        }
+
+        /// <summary>
+        /// 鍒涘缓闂峰ご鑷姩鍖归厤ViewModel
+        /// </summary>
+        public static HydroBluntheadMatchingViewModel Create(HydroBluntheadViewModel parterViewModel)
+        {
+            if (parterViewModel == null)
+            {
+                return default;
+            }
+            return new HydroBluntheadMatchingViewModel(parterViewModel);
+        }
+
+        #endregion
+
+        #region 寮ご
+
+        /// <summary>
+        /// 鍒涘缓寮ご鑷姩鍖归厤ViewModel
+        /// </summary>
+        public static HydroElbowMatchingViewModel Create(HydroElbowInfo parterInfo, HydroModelInfo hydroInfo, HydroCalcuNodeResult calcuResult = null)
+        {
+            if (parterInfo == null)
+            {
+                return default;
+            }
+            if (hydroInfo == null)
+            {
+                return default;
+            }
+            return new HydroElbowMatchingViewModel(parterInfo, hydroInfo, calcuResult);
+        }
+
+        /// <summary>
+        /// 鍒涘缓寮ご鑷姩鍖归厤ViewModel
+        /// </summary>
+        public static HydroElbowMatchingViewModel Create(HydroElbowViewModel parterViewModel)
+        {
+            if (parterViewModel == null)
+            {
+                return default;
+            }
+            return new HydroElbowMatchingViewModel(parterViewModel);
+        }
+
+        #endregion
+
+        #region 涓夐��
+
+        /// <summary>
+        /// 鍒涘缓涓夐�氳嚜鍔ㄥ尮閰峍iewModel
+        /// </summary>
+        public static HydroThreelinkMatchingViewModel Create(HydroThreelinkInfo parterInfo, HydroModelInfo hydroInfo, HydroCalcuNodeResult calcuResult = null)
+        {
+            if (parterInfo == null)
+            {
+                return default;
+            }
+            if (hydroInfo == null)
+            {
+                return default;
+            }
+            return new HydroThreelinkMatchingViewModel(parterInfo, hydroInfo, calcuResult);
+        }
+
+        /// <summary>
+        /// 鍒涘缓涓夐�氳嚜鍔ㄥ尮閰峍iewModel
+        /// </summary>
+        public static HydroThreelinkMatchingViewModel Create(HydroThreelinkViewModel parterViewModel)
+        {
+            if (parterViewModel == null)
+            {
+                return default;
+            }
+            return new HydroThreelinkMatchingViewModel(parterViewModel);
+        }
+
+        #endregion
+
+        #region 鍥涢��
+
+        /// <summary>
+        /// 鍒涘缓鍥涢�氳嚜鍔ㄥ尮閰峍iewModel
+        /// </summary>
+        public static HydroFourlinkMatchingViewModel Create(HydroFourlinkInfo parterInfo, HydroModelInfo hydroInfo, HydroCalcuNodeResult calcuResult = null)
+        {
+            if (parterInfo == null)
+            {
+                return default;
+            }
+            if (hydroInfo == null)
+            {
+                return default;
+            }
+            return new HydroFourlinkMatchingViewModel(parterInfo, hydroInfo, calcuResult);
+        }
+
+        /// <summary>
+        /// 鍒涘缓鍥涢�氳嚜鍔ㄥ尮閰峍iewModel
+        /// </summary>
+        public static HydroFourlinkMatchingViewModel Create(HydroFourlinkViewModel parterViewModel)
+        {
+            if (parterViewModel == null)
+            {
+                return default;
+            }
+            return new HydroFourlinkMatchingViewModel(parterViewModel);
+        }
+
+        #endregion
+
+        #region 鍠峰ご
+
+        /// <summary>
+        /// 鍒涘缓鍠峰ご鑷姩鍖归厤ViewModel
+        /// </summary>
+        public static HydroNozzleMatchingViewModel Create(HydroNozzleInfo parterInfo, HydroModelInfo hydroInfo, HydroCalcuNodeResult calcuResult = null)
+        {
+            if (parterInfo == null)
+            {
+                return default;
+            }
+            if (hydroInfo == null)
+            {
+                return default;
+            }
+            return new HydroNozzleMatchingViewModel(parterInfo, hydroInfo, calcuResult);
+        }
+
+        /// <summary>
+        /// 鍒涘缓鍠峰ご鑷姩鍖归厤ViewModel
+        /// </summary>
+        public static HydroNozzleMatchingViewModel Create(HydroNozzleViewModel parterViewModel)
+        {
+            if (parterViewModel == null)
+            {
+                return default;
+            }
+            return new HydroNozzleMatchingViewModel(parterViewModel);
+        }
+
+        #endregion
+
+        #region 娑堢伀鏍�
+
+        /// <summary>
+        /// 鍒涘缓娑堢伀鏍撹嚜鍔ㄥ尮閰峍iewModel
+        /// </summary>
+        public static HydroHydrantMatchingViewModel Create(HydroHydrantInfo parterInfo, HydroModelInfo hydroInfo, HydroCalcuNodeResult calcuResult = null)
+        {
+            if (parterInfo == null)
+            {
+                return default;
+            }
+            if (hydroInfo == null)
+            {
+                return default;
+            }
+            return new HydroHydrantMatchingViewModel(parterInfo, hydroInfo, calcuResult);
+        }
+
+        /// <summary>
+        /// 鍒涘缓娑堢伀鏍撹嚜鍔ㄥ尮閰峍iewModel
+        /// </summary>
+        public static HydroHydrantMatchingViewModel Create(HydroHydrantViewModel parterViewModel)
+        {
+            if (parterViewModel == null)
+            {
+                return default;
+            }
+            return new HydroHydrantMatchingViewModel(parterViewModel);
+        }
+
+        #endregion
+
+        #region 姘磋〃
+
+        /// <summary>
+        /// 鍒涘缓姘磋〃鑷姩鍖归厤ViewModel
+        /// </summary>
+        public static HydroMeterMatchingViewModel Create(HydroMeterInfo parterInfo, HydroModelInfo hydroInfo, HydroCalcuNodeResult calcuResult = null)
+        {
+            if (parterInfo == null)
+            {
+                return default;
+            }
+            if (hydroInfo == null)
+            {
+                return default;
+            }
+            return new HydroMeterMatchingViewModel(parterInfo, hydroInfo, calcuResult);
+        }
+
+        /// <summary>
+        /// 鍒涘缓姘磋〃鑷姩鍖归厤ViewModel
+        /// </summary>
+        public static HydroMeterMatchingViewModel Create(HydroMeterViewModel parterViewModel)
+        {
+            if (parterViewModel == null)
+            {
+                return default;
+            }
+            return new HydroMeterMatchingViewModel(parterViewModel);
+        }
+
+        #endregion
+
+        #region 娴侀噺璁�
+
+        /// <summary>
+        /// 鍒涘缓娴侀噺璁¤嚜鍔ㄥ尮閰峍iewModel
+        /// </summary>
+        public static HydroFlowmeterMatchingViewModel Create(HydroFlowmeterInfo parterInfo, HydroModelInfo hydroInfo, HydroCalcuFlowmeterResult calcuResult = null)
+        {
+            if (parterInfo == null)
+            {
+                return default;
+            }
+            if (hydroInfo == null)
+            {
+                return default;
+            }
+            return new HydroFlowmeterMatchingViewModel(parterInfo, hydroInfo, calcuResult);
+        }
+
+        /// <summary>
+        /// 鍒涘缓娴侀噺璁¤嚜鍔ㄥ尮閰峍iewModel
+        /// </summary>
+        public static HydroFlowmeterMatchingViewModel Create(HydroFlowmeterViewModel parterViewModel)
+        {
+            if (parterViewModel == null)
+            {
+                return default;
+            }
+            return new HydroFlowmeterMatchingViewModel(parterViewModel);
+        }
+
+        #endregion
+
+        #region 鍘嬪姏琛�
+
+        /// <summary>
+        /// 鍒涘缓鍘嬪姏琛ㄨ嚜鍔ㄥ尮閰峍iewModel
+        /// </summary>
+        public static HydroPressmeterMatchingViewModel Create(HydroPressmeterInfo parterInfo, HydroModelInfo hydroInfo, HydroCalcuPressmeterResult calcuResult = null)
+        {
+            if (parterInfo == null)
+            {
+                return default;
+            }
+            if (hydroInfo == null)
+            {
+                return default;
+            }
+            return new HydroPressmeterMatchingViewModel(parterInfo, hydroInfo, calcuResult);
+        }
+
+        /// <summary>
+        /// 鍒涘缓鍘嬪姏琛ㄨ嚜鍔ㄥ尮閰峍iewModel
+        /// </summary>
+        public static HydroPressmeterMatchingViewModel Create(HydroPressmeterViewModel parterViewModel)
+        {
+            if (parterViewModel == null)
+            {
+                return default;
+            }
+            return new HydroPressmeterMatchingViewModel(parterViewModel);
+        }
+
+        #endregion
+
+        #region 绠¢亾
+
+        /// <summary>
+        /// 鍒涘缓绠¢亾鑷姩鍖归厤ViewModel
+        /// </summary>
+        public static HydroPipeMatchingViewModel Create(HydroPipeInfo pipeInfo, HydroModelInfo hydroInfo, HydroCalcuLinkResult calcuResult = null)
+        {
+            if (pipeInfo == null)
+            {
+                return default;
+            }
+            if (hydroInfo == null)
+            {
+                return default;
+            }
+            return new HydroPipeMatchingViewModel(pipeInfo, hydroInfo, calcuResult);
+        }
+
+        /// <summary>
+        /// 鍒涘缓绠¢亾鑷姩鍖归厤ViewModel
+        /// </summary>
+        public static HydroPipeMatchingViewModel Create(HydroPipeViewModel pipeViewModel)
+        {
+            if (pipeViewModel == null)
+            {
+                return default;
+            }
+            return new HydroPipeMatchingViewModel(pipeViewModel);
+        }
+
+        #endregion
+
+        #region 杩囨浮浠�
+
+        /// <summary>
+        /// 鍒涘缓杩囨浮浠惰嚜鍔ㄥ尮閰峍iewModel
+        /// </summary>
+        public static HydroTranslationMatchingViewModel Create(HydroTranslationInfo parterInfo, HydroModelInfo hydroInfo, HydroCalcuLinkResult calcuResult = null)
+        {
+            if (parterInfo == null)
+            {
+                return default;
+            }
+            if (hydroInfo == null)
+            {
+                return default;
+            }
+            return new HydroTranslationMatchingViewModel(parterInfo, hydroInfo, calcuResult);
+        }
+
+        /// <summary>
+        /// 鍒涘缓杩囨浮浠惰嚜鍔ㄥ尮閰峍iewModel
+        /// </summary>
+        public static HydroTranslationMatchingViewModel Create(HydroTranslationViewModel parterViewModel)
+        {
+            if (parterViewModel == null)
+            {
+                return default;
+            }
+            return new HydroTranslationMatchingViewModel(parterViewModel);
+        }
+
+        #endregion
+
+        #region 姘存车
+
+        /// <summary>
+        /// 鍒涘缓姘存车鑷姩鍖归厤ViewModel
+        /// </summary>
+        public static HydroPumpMatchingViewModel Create(HydroPumpInfo pumpInfo, HydroModelInfo hydroInfo, HydroCalcuPumpResult calcuResult = null)
+        {
+            if (pumpInfo == null)
+            {
+                return default;
+            }
+            if (hydroInfo == null)
+            {
+                return default;
+            }
+            return new HydroPumpMatchingViewModel(pumpInfo, hydroInfo, calcuResult);
+        }
+
+        /// <summary>
+        /// 鍒涘缓姘存车鑷姩鍖归厤ViewModel
+        /// </summary>
+        public static HydroPumpMatchingViewModel Create(HydroPumpViewModel pumpViewModel)
+        {
+            if (pumpViewModel == null)
+            {
+                return default;
+            }
+            return new HydroPumpMatchingViewModel(pumpViewModel);
+        }
+
+        #endregion
+
+        #region 闃�闂�
+
+        /// <summary>
+        /// 鍒涘缓闃�闂ㄨ嚜鍔ㄥ尮閰峍iewModel
+        /// </summary>
+        public static HydroValveMatchingViewModel Create(HydroValveInfo valveInfo, HydroModelInfo hydroInfo, HydroCalcuLinkResult calcuResult = null)
+        {
+            if (valveInfo == null)
+            {
+                return default;
+            }
+            if (hydroInfo == null)
+            {
+                return default;
+            }
+            return new HydroValveMatchingViewModel(valveInfo, hydroInfo, calcuResult);
+        }
+
+        /// <summary>
+        /// 鍒涘缓闃�闂ㄨ嚜鍔ㄥ尮閰峍iewModel
+        /// </summary>
+        public static HydroValveMatchingViewModel Create(HydroValveViewModel valveViewModel)
+        {
+            if (valveViewModel == null)
+            {
+                return default;
+            }
+            return new HydroValveMatchingViewModel(valveViewModel);
+        }
+
+        #endregion
+
+        #region 鎹㈢儹鍣�
+
+        /// <summary>
+        /// 鍒涘缓鎹㈢儹鍣ㄨ嚜鍔ㄥ尮閰峍iewModel
+        /// </summary>
+        public static HydroExchangerMatchingViewModel Create(HydroExchangerInfo parterInfo, HydroModelInfo hydroInfo, HydroCalcuLinkResult calcuResult = null)
+        {
+            if (parterInfo == null)
+            {
+                return default;
+            }
+            if (hydroInfo == null)
+            {
+                return default;
+            }
+            return new HydroExchangerMatchingViewModel(parterInfo, hydroInfo, calcuResult);
+        }
+
+        /// <summary>
+        /// 鍒涘缓鎹㈢儹鍣ㄨ嚜鍔ㄥ尮閰峍iewModel
+        /// </summary>
+        public static HydroExchangerMatchingViewModel Create(HydroExchangerViewModel parterViewModel)
+        {
+            if (parterViewModel == null)
+            {
+                return default;
+            }
+            return new HydroExchangerMatchingViewModel(parterViewModel);
+        }
+
+        #endregion
+
+        #region 鍘嬬缉鏈�
+
+        /// <summary>
+        /// 鍒涘缓鍘嬬缉鏈鸿嚜鍔ㄥ尮閰峍iewModel
+        /// </summary>
+        public static HydroCompressorMatchingViewModel Create(HydroCompressorInfo parterInfo, HydroModelInfo hydroInfo, HydroCalcuLinkResult calcuResult = null)
+        {
+            if (parterInfo == null)
+            {
+                return default;
+            }
+            if (hydroInfo == null)
+            {
+                return default;
+            }
+            return new HydroCompressorMatchingViewModel(parterInfo, hydroInfo, calcuResult);
+        }
+
+        /// <summary>
+        /// 鍒涘缓鍘嬬缉鏈鸿嚜鍔ㄥ尮閰峍iewModel
+        /// </summary>
+        public static HydroCompressorMatchingViewModel Create(HydroCompressorViewModel parterViewModel)
+        {
+            if (parterViewModel == null)
+            {
+                return default;
+            }
+            return new HydroCompressorMatchingViewModel(parterViewModel);
+        }
+
+        #endregion
+
+        #endregion
+
+        #region 搴旂敤
+
+        ///// <summary>
+        ///// 搴旂敤璧勪骇鑷姩鍖归厤ViewModel
+        ///// </summary>
+        //public static bool Apply(Yw.Model.HydroModelInfo hydroInfo, AssetsMatchingViewModel output)
+        //{
+        //    if (hydroInfo == null)
+        //    {
+        //        return false;
+        //    }
+        //    if (output == null)
+        //    {
+        //        return false;
+        //    }
+
+        //    bool result = false;
+
+        //    //姘存车
+        //    output.PumpMatchingList?.ForEach(x =>
+        //    {
+        //        if (Apply(hydroInfo, x))
+        //        {
+        //            result = true;
+        //        }
+        //    });
+
+        //    //闃�闂�
+        //    output.ValveMatchingList?.ForEach(x =>
+        //    {
+        //        if (Apply(hydroInfo, x))
+        //        {
+        //            result = true;
+        //        }
+        //    });
+
+        //    //绠¢亾
+        //    output.PipeMatchingList?.ForEach(x =>
+        //    {
+        //        if (Apply(hydroInfo, x))
+        //        {
+        //            result = true;
+        //        }
+        //    });
+
+        //    //寮ご
+        //    output.ElbowMatchingList?.ForEach(x =>
+        //    {
+        //        if (Apply(hydroInfo, x))
+        //        {
+        //            result = true;
+        //        }
+        //    });
+
+        //    //涓夐��
+        //    output.ThreelinkMatchingList?.ForEach(x =>
+        //    {
+        //        if (Apply(hydroInfo, x))
+        //        {
+        //            result = true;
+        //        }
+        //    });
+
+        //    //鍥涢��
+        //    output.FourlinkMatchingList?.ForEach(x =>
+        //    {
+        //        if (Apply(hydroInfo, x))
+        //        {
+        //            result = true;
+        //        }
+        //    });
+
+        //    return result;
+        //}
+
+        ///// <summary>
+        ///// 搴旂敤娉佃嚜鍔ㄥ尮閰峍iewModel
+        ///// </summary>
+        //public static bool Apply(Yw.Model.HydroModelInfo hydroInfo, PumpMatchingViewModel matching)
+        //{
+        //    if (hydroInfo == null)
+        //    {
+        //        return false;
+        //    }
+        //    if (matching == null)
+        //    {
+        //        return false;
+        //    }
+
+        //    bool result = false;
+
+        //    var pump = hydroInfo.Pumps?.Find(x => x.Code == matching.Code);
+        //    if (pump != null)
+        //    {
+        //        pump.DbLocked = matching.DbLocked;
+        //        pump.ModelType = matching.ModelType;
+        //        pump.RatedP = matching.RatedP;
+        //        pump.RatedQ = matching.RatedQ;
+        //        pump.RatedH = matching.RatedH;
+        //        pump.RatedN = matching.RatedN;
+        //        pump.RatedHz = matching.RatedHz;
+        //        pump.SpeedRatio = Math.Round(matching.CurrentHz / matching.RatedHz, 1);
+
+        //        if (!pump.DbLocked)
+        //        {
+        //            if (!string.IsNullOrEmpty(matching.MatchingModelType))
+        //            {
+        //                pump.ModelType = matching.MatchingModelType;
+        //            }
+        //            if (!string.IsNullOrEmpty(matching.MatchingDbId))
+        //            {
+        //                pump.DbId = matching.MatchingDbId;
+        //            }
+        //            if (matching.MatchingRatedP.HasValue)
+        //            {
+        //                pump.RatedP = matching.MatchingRatedP.Value;
+        //            }
+        //            if (matching.MatchingRatedQ.HasValue)
+        //            {
+        //                pump.RatedQ = matching.MatchingRatedQ.Value;
+        //            }
+        //            if (matching.MatchingRatedH.HasValue)
+        //            {
+        //                pump.RatedH = matching.MatchingRatedH.Value;
+        //            }
+        //            if (matching.MatchingRatedN.HasValue)
+        //            {
+        //                pump.RatedN = matching.MatchingRatedN.Value;
+        //            }
+
+        //            if (!string.IsNullOrEmpty(matching.MatchingCurveDbId))
+        //            {
+        //                //娴侀噺鎵▼鏇茬嚎
+        //                var curveqh = hydroInfo.Curves?.Find(x => x.Code == pump.CurveQH);
+        //                if (curveqh == null)
+        //                {
+        //                    curveqh = new Yw.Model.HydroCurveInfo();
+        //                    curveqh.Catalog = Yw.Hydro.ParterCatalog.Curve;
+        //                    curveqh.Code = Yw.Untity.UniqueHelper.CreateFromFirst("curve", hydroInfo.GetAllParterCodes());
+        //                    curveqh.Name = "鍖归厤";
+        //                    curveqh.ModelType = string.Empty;
+        //                    curveqh.DbLocked = false;
+        //                    curveqh.DbId = matching.MatchingCurveDbId;
+        //                    curveqh.CurveType = Yw.WinFrmUI.HydroCurve.PumpQH;
+        //                    curveqh.CurveData = matching.MatchingCurveQH?.Select(x => new Yw.Model.Hydro.CurvePoint(x.X, x.Y)).ToList();
+        //                    if (hydroInfo.Curves == null)
+        //                    {
+        //                        hydroInfo.Curves = new List<Yw.Model.HydroCurveInfo>();
+        //                    }
+        //                    hydroInfo.Curves.Add(curveqh);
+        //                    pump.CurveQH = curveqh.Code;
+        //                }
+        //                else
+        //                {
+        //                    if (!curveqh.DbLocked)
+        //                    {
+        //                        curveqh.DbId = matching.MatchingCurveDbId;
+        //                        curveqh.CurveData = matching.MatchingCurveQH?.Select(x => new Yw.Model.Hydro.CurvePoint(x.X, x.Y)).ToList();
+        //                    }
+        //                }
+
+        //                //娴侀噺鍔熺巼鏇茬嚎
+        //                var curveqp = hydroInfo.Curves?.Find(x => x.Code == pump.CurveQP);
+        //                if (curveqp == null)
+        //                {
+        //                    curveqp = new Yw.Model.HydroCurveInfo();
+        //                    curveqp.Catalog = Yw.Hydro.ParterCatalog.Curve;
+        //                    curveqp.Code = Yw.Untity.UniqueHelper.CreateFromFirst("curve", hydroInfo.GetAllParterCodes());
+        //                    curveqp.Name = "鍖归厤";
+        //                    curveqp.ModelType = string.Empty;
+        //                    curveqp.DbLocked = false;
+        //                    curveqp.DbId = matching.MatchingCurveDbId;
+        //                    curveqp.CurveType = Yw.WinFrmUI.HydroCurve.PumpQP;
+        //                    curveqp.CurveData = matching.MatchingCurveQP?.Select(x => new Yw.Model.Hydro.CurvePoint(x.X, x.Y)).ToList();
+        //                    if (hydroInfo.Curves == null)
+        //                    {
+        //                        hydroInfo.Curves = new List<Yw.Model.HydroCurveInfo>();
+        //                    }
+        //                    hydroInfo.Curves.Add(curveqp);
+        //                    pump.CurveQP = curveqp.Code;
+        //                }
+        //                else
+        //                {
+        //                    if (!curveqp.DbLocked)
+        //                    {
+        //                        curveqp.DbId = matching.MatchingCurveDbId;
+        //                        curveqp.CurveData = matching.MatchingCurveQP?.Select(x => new Yw.Model.Hydro.CurvePoint(x.X, x.Y)).ToList();
+        //                    }
+        //                }
+
+        //                //娴侀噺鏁堢巼鏇茬嚎
+        //                var curveqe = hydroInfo.Curves?.Find(x => x.Code == pump.CurveQE);
+        //                if (curveqe == null)
+        //                {
+        //                    curveqe = new Yw.Model.HydroCurveInfo();
+        //                    curveqe.Catalog = Yw.Hydro.ParterCatalog.Curve;
+        //                    curveqe.Code = Yw.Untity.UniqueHelper.CreateFromFirst("curve", hydroInfo.GetAllParterCodes());
+        //                    curveqe.Name = "鍖归厤";
+        //                    curveqe.ModelType = string.Empty;
+        //                    curveqe.DbLocked = false;
+        //                    curveqe.DbId = matching.MatchingCurveDbId;
+        //                    curveqe.CurveType = Yw.WinFrmUI.HydroCurve.PumpQE;
+        //                    curveqe.CurveData = matching.MatchingCurveQE?.Select(x => new Yw.Model.Hydro.CurvePoint(x.X, x.Y)).ToList();
+        //                    if (hydroInfo.Curves == null)
+        //                    {
+        //                        hydroInfo.Curves = new List<Yw.Model.HydroCurveInfo>();
+        //                    }
+        //                    hydroInfo.Curves.Add(curveqe);
+        //                    pump.CurveQE = curveqe.Code;
+        //                }
+        //                else
+        //                {
+        //                    if (!curveqe.DbLocked)
+        //                    {
+        //                        curveqe.DbId = matching.MatchingCurveDbId;
+        //                        curveqe.CurveData = matching.MatchingCurveQE?.Select(x => new Yw.Model.Hydro.CurvePoint(x.X, x.Y)).ToList();
+        //                    }
+        //                }
+
+        //            }
+
+        //            result = true;
+        //        }
+        //    }
+
+        //    return result;
+        //}
+
+        ///// <summary>
+        ///// 搴旂敤闃�闂ㄨ嚜鍔ㄥ尮閰峍iewModel
+        ///// </summary>
+        //public static bool Apply(Yw.Model.HydroModelInfo hydroInfo, ValveMatchingViewModel matching)
+        //{
+        //    if (hydroInfo == null)
+        //    {
+        //        return false;
+        //    }
+        //    if (matching == null)
+        //    {
+        //        return false;
+        //    }
+
+        //    bool result = false;
+
+        //    var valve = hydroInfo.Valves?.Find(x => x.Code == matching.Code);
+        //    if (valve != null)
+        //    {
+        //        valve.DbLocked = matching.DbLocked;
+        //        valve.ModelType = matching.ModelType;
+        //        valve.Material = matching.Material;
+        //        valve.Diameter = matching.Diameter;
+        //        valve.MinorLoss = matching.MinorLoss;
+        //        switch (matching.ValveType)
+        //        {
+        //            case HStation.Assets.eValveType.PBV: valve.ValveType = Yw.Hydro.ValveType.PBV; break;
+        //            case HStation.Assets.eValveType.PRV: valve.ValveType = Yw.Hydro.ValveType.PRV; break;
+        //            case HStation.Assets.eValveType.PSV: valve.ValveType = Yw.Hydro.ValveType.PSV; break;
+        //            case HStation.Assets.eValveType.TCV: valve.ValveType = Yw.Hydro.ValveType.TCV; break;
+        //            case HStation.Assets.eValveType.FCV: valve.ValveType = Yw.Hydro.ValveType.FCV; break;
+        //            case HStation.Assets.eValveType.GPV: valve.ValveType = Yw.Hydro.ValveType.GPV; break;
+        //            case HStation.Assets.eValveType.CV: valve.ValveType = Yw.Hydro.ValveType.CV; break;
+        //            default: break;
+        //        }
+        //        valve.ValveSetting = matching.ValveSetting;
+
+        //        if (!valve.DbLocked)
+        //        {
+        //            if (!string.IsNullOrEmpty(matching.MatchingDbId))
+        //            {
+        //                valve.DbId = matching.MatchingDbId;
+        //            }
+        //            if (!string.IsNullOrEmpty(matching.MatchingModelType))
+        //            {
+        //                valve.ModelType = matching.MatchingModelType;
+        //            }
+        //            if (!string.IsNullOrEmpty(matching.MatchingMaterial))
+        //            {
+        //                valve.Material = matching.MatchingMaterial;
+        //            }
+        //            if (matching.MatchingDiameter.HasValue)
+        //            {
+        //                valve.Diameter = matching.MatchingDiameter.Value;
+        //            }
+        //            if (matching.MatchingMinorLoss.HasValue)
+        //            {
+        //                valve.MinorLoss = matching.MatchingMinorLoss.Value;
+        //            }
+        //            if (matching.MatchingValveType.HasValue)
+        //            {
+        //                switch (matching.MatchingValveType.Value)
+        //                {
+        //                    case HStation.Assets.eValveType.PBV: valve.ValveType = Yw.Hydro.ValveType.PBV; break;
+        //                    case HStation.Assets.eValveType.PRV: valve.ValveType = Yw.Hydro.ValveType.PRV; break;
+        //                    case HStation.Assets.eValveType.PSV: valve.ValveType = Yw.Hydro.ValveType.PSV; break;
+        //                    case HStation.Assets.eValveType.TCV: valve.ValveType = Yw.Hydro.ValveType.TCV; break;
+        //                    case HStation.Assets.eValveType.FCV: valve.ValveType = Yw.Hydro.ValveType.FCV; break;
+        //                    case HStation.Assets.eValveType.GPV: valve.ValveType = Yw.Hydro.ValveType.GPV; break;
+        //                    case HStation.Assets.eValveType.CV: valve.ValveType = Yw.Hydro.ValveType.CV; break;
+        //                    default: break;
+        //                }
+        //            }
+        //            switch (valve.ValveType)
+        //            {
+        //                case Yw.Hydro.ValveType.PSV:
+        //                    {
+        //                        if (!string.IsNullOrEmpty(matching.MatchingValveSetting))
+        //                        {
+        //                            valve.ValveSetting = matching.MatchingValveSetting;
+        //                        }
+        //                    }
+        //                    break;
+        //                case Yw.Hydro.ValveType.PBV:
+        //                    {
+        //                        if (!string.IsNullOrEmpty(matching.MatchingValveSetting))
+        //                        {
+        //                            valve.ValveSetting = matching.MatchingValveSetting;
+        //                        }
+        //                    }
+        //                    break;
+        //                case Yw.Hydro.ValveType.PRV:
+        //                    {
+        //                        if (!string.IsNullOrEmpty(matching.MatchingValveSetting))
+        //                        {
+        //                            valve.ValveSetting = matching.MatchingValveSetting;
+        //                        }
+        //                    }
+        //                    break;
+        //                case Yw.Hydro.ValveType.FCV:
+        //                    {
+        //                        if (!string.IsNullOrEmpty(matching.MatchingValveSetting))
+        //                        {
+        //                            valve.ValveSetting = matching.MatchingValveSetting;
+        //                        }
+        //                    }
+        //                    break;
+        //                case Yw.Hydro.ValveType.TCV:
+        //                    {
+        //                        if (!string.IsNullOrEmpty(matching.MatchingCurveDbId))
+        //                        {
+        //                            //闃�闂ㄥ紑搴︽崯澶辩郴鏁版洸绾�
+        //                            var curveol = hydroInfo.Curves?.Find(x => x.Code == valve.ValveSetting);
+        //                            if (curveol == null)
+        //                            {
+        //                                curveol = new Yw.Model.HydroCurveInfo();
+        //                                curveol.Catalog = Yw.Hydro.ParterCatalog.Curve;
+        //                                curveol.Code = Yw.Untity.UniqueHelper.CreateFromFirst("curve", hydroInfo.GetAllParterCodes());
+        //                                curveol.Name = "鍖归厤";
+        //                                curveol.ModelType = valve.ModelType;
+        //                                curveol.DbLocked = false;
+        //                                curveol.DbId = matching.MatchingCurveDbId;
+        //                                curveol.CurveType = Yw.WinFrmUI.HydroCurve.ValveOL;
+        //                                curveol.CurveData = matching.MatchingCurveOL?.Select(x => new Yw.Model.Hydro.CurvePoint(x.X, x.Y)).ToList();
+        //                                if (hydroInfo.Curves == null)
+        //                                {
+        //                                    hydroInfo.Curves = new List<Yw.Model.HydroCurveInfo>();
+        //                                }
+        //                                hydroInfo.Curves.Add(curveol);
+        //                                valve.ValveSetting = curveol.Code;
+        //                            }
+        //                            else
+        //                            {
+        //                                if (!curveol.DbLocked)
+        //                                {
+        //                                    curveol.DbId = matching.MatchingCurveDbId;
+        //                                    curveol.CurveData = matching.MatchingCurveOL?.Select(x => new Yw.Model.Hydro.CurvePoint(x.X, x.Y)).ToList();
+        //                                }
+        //                            }
+        //                        }
+        //                    }
+        //                    break;
+        //                case Yw.Hydro.ValveType.GPV:
+        //                    {
+        //                        if (!string.IsNullOrEmpty(matching.MatchingCurveDbId))
+        //                        {
+        //                            //闃�闂ㄥ紑搴︽崯澶辩郴鏁版洸绾�
+        //                            var curveql = hydroInfo.Curves?.Find(x => x.Code == valve.ValveSetting);
+        //                            if (curveql == null)
+        //                            {
+        //                                curveql = new Yw.Model.HydroCurveInfo();
+        //                                curveql.Catalog = Yw.Hydro.ParterCatalog.Curve;
+        //                                curveql.Code = Yw.Untity.UniqueHelper.CreateFromFirst("curve", hydroInfo.GetAllParterCodes());
+        //                                curveql.Name = "鍖归厤";
+        //                                curveql.ModelType = valve.ModelType;
+        //                                curveql.DbLocked = false;
+        //                                curveql.DbId = matching.MatchingCurveDbId;
+        //                                curveql.CurveType = Yw.WinFrmUI.HydroCurve.ValveOL;
+        //                                curveql.CurveData = matching.MatchingCurveQL?.Select(x => new Yw.Model.Hydro.CurvePoint(x.X, x.Y)).ToList();
+        //                                if (hydroInfo.Curves == null)
+        //                                {
+        //                                    hydroInfo.Curves = new List<Yw.Model.HydroCurveInfo>();
+        //                                }
+        //                                hydroInfo.Curves.Add(curveql);
+        //                                valve.ValveSetting = curveql.Code;
+        //                            }
+        //                            else
+        //                            {
+        //                                if (!curveql.DbLocked)
+        //                                {
+        //                                    curveql.DbId = matching.MatchingCurveDbId;
+        //                                    curveql.CurveData = matching.MatchingCurveQL?.Select(x => new Yw.Model.Hydro.CurvePoint(x.X, x.Y)).ToList();
+        //                                }
+        //                            }
+        //                        }
+        //                    }
+        //                    break;
+        //                case Yw.Hydro.ValveType.CV:
+        //                    {
+
+        //                    }
+        //                    break;
+        //            }
+
+        //            result = true;
+        //        }
+        //    }
+        //    return result;
+        //}
+
+        ///// <summary>
+        ///// 搴旂敤绠¢亾鑷姩鍖归厤ViewModel
+        ///// </summary>
+        //public static bool Apply(Yw.Model.HydroModelInfo hydroInfo, PipeMatchingViewModel matching)
+        //{
+        //    if (hydroInfo == null)
+        //    {
+        //        return false;
+        //    }
+        //    if (matching == null)
+        //    {
+        //        return false;
+        //    }
+
+        //    bool result = false;
+
+        //    var pipe = hydroInfo.Pipes?.Find(x => x.Code == matching.Code);
+        //    if (pipe != null)
+        //    {
+        //        pipe.DbLocked = matching.DbLocked;
+        //        pipe.ModelType = matching.ModelType;
+        //        pipe.Diameter = matching.Diameter;
+        //        pipe.Material = matching.Material;
+        //        pipe.Roughness = matching.Roughness;
+        //        pipe.MinorLoss = matching.MinorLoss;
+
+        //        if (!pipe.DbLocked)
+        //        {
+        //            if (!string.IsNullOrEmpty(matching.MatchingModelType))
+        //            {
+        //                pipe.ModelType = matching.MatchingModelType;
+        //            }
+        //            if (!string.IsNullOrEmpty(matching.MatchingDbId))
+        //            {
+        //                pipe.DbId = matching.MatchingDbId;
+        //            }
+        //            if (matching.MatchingDiameter.HasValue)
+        //            {
+        //                pipe.Diameter = matching.MatchingDiameter.Value;
+        //            }
+        //            if (!string.IsNullOrEmpty(matching.MatchingMaterial))
+        //            {
+        //                pipe.Material = matching.MatchingMaterial;
+        //            }
+        //            if (matching.MatchingRoughness.HasValue)
+        //            {
+        //                pipe.Roughness = matching.MatchingRoughness.Value;
+        //            }
+        //            if (matching.MatchingMinorLoss.HasValue)
+        //            {
+        //                pipe.MinorLoss = matching.MatchingMinorLoss.Value;
+        //            }
+
+        //            result = true;
+        //        }
+        //    }
+        //    return result;
+        //}
+
+        ///// <summary>
+        ///// 搴旂敤寮ご鑷姩鍖归厤ViewModel
+        ///// </summary>
+        //public static bool Apply(Yw.Model.HydroModelInfo hydroInfo, ElbowMatchingViewModel matching)
+        //{
+        //    if (hydroInfo == null)
+        //    {
+        //        return false;
+        //    }
+        //    if (matching == null)
+        //    {
+        //        return false;
+        //    }
+
+        //    bool result = false;
+
+        //    var elbow = hydroInfo.Elbows?.Find(x => x.Code == matching.Code);
+        //    if (elbow != null)
+        //    {
+        //        elbow.DbLocked = matching.DbLocked;
+        //        elbow.ModelType = matching.ModelType;
+        //        elbow.Caliber = matching.Caliber;
+        //        elbow.Material = matching.Material;
+        //        elbow.MinorLoss = matching.MinorLoss;
+
+        //        if (!elbow.DbLocked)
+        //        {
+        //            if (!string.IsNullOrEmpty(matching.MatchingModelType))
+        //            {
+        //                elbow.ModelType = matching.MatchingModelType;
+        //            }
+        //            if (!string.IsNullOrEmpty(matching.MatchingDbId))
+        //            {
+        //                elbow.DbId = matching.MatchingDbId;
+        //            }
+        //            if (matching.MatchingCaliber.HasValue)
+        //            {
+        //                elbow.Caliber = matching.MatchingCaliber.Value;
+        //            }
+        //            if (!string.IsNullOrEmpty(matching.MatchingMaterial))
+        //            {
+        //                elbow.Material = matching.MatchingMaterial;
+        //            }
+        //            if (matching.MatchingMinorLoss.HasValue)
+        //            {
+        //                elbow.MinorLoss = matching.MatchingMinorLoss.Value;
+        //            }
+
+        //            result = true;
+        //        }
+        //    }
+        //    return result;
+        //}
+
+        ///// <summary>
+        ///// 搴旂敤涓夐�氳嚜鍔ㄥ尮閰峍iewModel
+        ///// </summary>
+        //public static bool Apply(Yw.Model.HydroModelInfo hydroInfo, ThreelinkMatchingViewModel matching)
+        //{
+        //    if (hydroInfo == null)
+        //    {
+        //        return false;
+        //    }
+        //    if (matching == null)
+        //    {
+        //        return false;
+        //    }
+
+        //    bool result = false;
+
+        //    var threelink = hydroInfo.Threelinks?.Find(x => x.Code == matching.Code);
+        //    if (threelink != null)
+        //    {
+        //        threelink.DbLocked = matching.DbLocked;
+        //        threelink.ModelType = matching.ModelType;
+        //        threelink.Caliber = matching.Caliber;
+        //        threelink.Material = matching.Material;
+        //        threelink.MinorLoss = matching.MinorLoss;
+
+        //        if (!threelink.DbLocked)
+        //        {
+        //            if (!string.IsNullOrEmpty(matching.MatchingModelType))
+        //            {
+        //                threelink.ModelType = matching.MatchingModelType;
+        //            }
+        //            if (!string.IsNullOrEmpty(matching.MatchingDbId))
+        //            {
+        //                threelink.DbId = matching.MatchingDbId;
+        //            }
+        //            if (matching.MatchingCaliber.HasValue)
+        //            {
+        //                threelink.Caliber = matching.MatchingCaliber.Value;
+        //            }
+        //            if (!string.IsNullOrEmpty(matching.MatchingMaterial))
+        //            {
+        //                threelink.Material = matching.MatchingMaterial;
+        //            }
+        //            if (matching.MatchingMinorLoss.HasValue)
+        //            {
+        //                threelink.MinorLoss = matching.MatchingMinorLoss.Value;
+        //            }
+
+        //            result = true;
+        //        }
+        //    }
+        //    return result;
+        //}
+
+        ///// <summary>
+        ///// 搴旂敤鍥涢�氳嚜鍔ㄥ尮閰峍iewModel
+        ///// </summary>
+        //public static bool Apply(Yw.Model.HydroModelInfo hydroInfo, FourlinkMatchingViewModel matching)
+        //{
+        //    if (hydroInfo == null)
+        //    {
+        //        return false;
+        //    }
+        //    if (matching == null)
+        //    {
+        //        return false;
+        //    }
+
+        //    bool result = false;
+
+        //    var fourlink = hydroInfo.Fourlinks?.Find(x => x.Code == matching.Code);
+        //    if (fourlink != null)
+        //    {
+        //        fourlink.DbLocked = matching.DbLocked;
+        //        fourlink.ModelType = matching.ModelType;
+        //        fourlink.Caliber = matching.Caliber;
+        //        fourlink.Material = matching.Material;
+        //        fourlink.MinorLoss = matching.MinorLoss;
+
+        //        if (!fourlink.DbLocked)
+        //        {
+        //            if (!string.IsNullOrEmpty(matching.MatchingModelType))
+        //            {
+        //                fourlink.ModelType = matching.MatchingModelType;
+        //            }
+        //            if (!string.IsNullOrEmpty(matching.MatchingDbId))
+        //            {
+        //                fourlink.DbId = matching.MatchingDbId;
+        //            }
+        //            if (matching.MatchingCaliber.HasValue)
+        //            {
+        //                fourlink.Caliber = matching.MatchingCaliber.Value;
+        //            }
+        //            if (!string.IsNullOrEmpty(matching.MatchingMaterial))
+        //            {
+        //                fourlink.Material = matching.MatchingMaterial;
+        //            }
+        //            if (matching.MatchingMinorLoss.HasValue)
+        //            {
+        //                fourlink.MinorLoss = matching.MatchingMinorLoss.Value;
+        //            }
+
+        //            result = true;
+        //        }
+        //    }
+        //    return result;
+        //}
+
+        #endregion
+
+
+
+    }
+}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/14-matching/00-core/HydroMatchingViewModel.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/14-matching/00-core/HydroMatchingViewModel.cs
new file mode 100644
index 0000000..aef076f
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/14-matching/00-core/HydroMatchingViewModel.cs
@@ -0,0 +1,93 @@
+锘縩amespace Yw.WinFrmUI
+{
+    /// <summary>
+    /// 
+    /// </summary>
+    public class HydroMatchingViewModel
+    {
+        /// <summary>
+        /// 姘存睜
+        /// </summary>
+        public List<HydroTankMatchingViewModel> Tanks { get; set; }
+
+        /// <summary>
+        /// 闂峰ご
+        /// </summary>
+        public List<HydroBluntheadMatchingViewModel> Bluntheads { get; set; }
+
+        /// <summary>
+        /// 寮ご
+        /// </summary>
+        public List<HydroElbowMatchingViewModel> Elbows { get; set; }
+
+        /// <summary>
+        /// 涓夐��
+        /// </summary>
+        public List<HydroThreelinkMatchingViewModel> Threelinks { get; set; }
+
+        /// <summary>
+        /// 鍥涢��
+        /// </summary>
+        public List<HydroFourlinkMatchingViewModel> Fourlinks { get; set; }
+
+        /// <summary>
+        /// 鍠峰槾
+        /// </summary>
+        public List<HydroNozzleMatchingViewModel> Nozzles { get; set; }
+
+        /// <summary>
+        /// 娑堢伀鏍�
+        /// </summary>
+        public List<HydroHydrantMatchingViewModel> Hydrants { get; set; }
+
+        /// <summary>
+        /// 姘磋〃
+        /// </summary>
+        public List<HydroMeterMatchingViewModel> Meters { get; set; }
+
+        /// <summary>
+        /// 娴侀噺璁�
+        /// </summary>
+        public List<HydroFlowmeterMatchingViewModel> Flowmeters { get; set; }
+
+        /// <summary>
+        /// 鍘嬪姏琛�
+        /// </summary>
+        public List<HydroPressmeterMatchingViewModel> Pressmeters { get; set; }
+
+        /// <summary>
+        /// 绠¢亾
+        /// </summary>
+        public List<HydroPipeMatchingViewModel> Pipes { get; set; }
+
+        /// <summary>
+        /// 杩囨浮浠�
+        /// </summary>
+        public List<HydroTranslationMatchingViewModel> Translations { get; set; }
+
+        /// <summary>
+        /// 姘存车
+        /// </summary>
+        public List<HydroPumpMatchingViewModel> Pumps { get; set; }
+
+        /// <summary>
+        /// 闃�闂�
+        /// </summary>
+        public List<HydroValveMatchingViewModel> Valves { get; set; }
+
+        /// <summary>
+        /// 鎹㈢儹鍣�
+        /// </summary>
+        public List<HydroExchangerMatchingViewModel> Exchangers { get; set; }
+
+        /// <summary>
+        /// 鍘嬬缉鏈�
+        /// </summary>
+        public List<HydroCompressorMatchingViewModel> Compressors { get; set; }
+
+
+
+
+
+    }
+}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/14-matching/01-pump/HydroPumpMatchingViewModel.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/14-matching/01-pump/HydroPumpMatchingViewModel.cs
new file mode 100644
index 0000000..0281a06
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/14-matching/01-pump/HydroPumpMatchingViewModel.cs
@@ -0,0 +1,188 @@
+锘縩amespace Yw.WinFrmUI
+{
+    /// <summary>
+    /// 姘存车鍖归厤ViewModel
+    /// </summary>
+    public class HydroPumpMatchingViewModel
+    {
+        /// <summary>
+        /// 
+        /// </summary>
+        public HydroPumpMatchingViewModel() { }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public HydroPumpMatchingViewModel(Yw.Model.HydroPumpInfo rhs, Yw.Model.HydroModelInfo hydroInfo)
+        {
+            this.ID = rhs.ID;
+            this.Name = rhs.Name;
+            this.Code = rhs.Code;
+            this.ModelType = rhs.ModelType;
+            this.DbId = rhs.DbId;
+            this.DbLocked = rhs.DbLocked;
+            this.CurveDbId = hydroInfo.Curves?.Find(x => x.Code == rhs.CurveQH)?.DbId;
+            this.RatedP = rhs.RatedP;
+            this.RatedQ = rhs.RatedQ;
+            this.RatedH = rhs.RatedH;
+            this.RatedN = rhs.RatedN;
+            this.RatedHz = rhs.RatedHz;
+            this.CurrentHz = Math.Round(rhs.RatedHz * rhs.SpeedRatio, 1);
+        }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public HydroPumpMatchingViewModel(Yw.Model.HydroPumpInfo rhs, Yw.Model.HydroModelInfo hydroInfo, HydroCalcuPumpResult calcuResult) : this(rhs, hydroInfo)
+        {
+            this.CalcuQ = calcuResult?.CalcuQ;
+            this.CalcuH = calcuResult?.CalcuH;
+        }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public HydroPumpMatchingViewModel(HydroPumpViewModel rhs) : this(rhs.Vmo, rhs.HydroInfo)
+        {
+            this.CalcuQ = rhs.CalcuQ;
+            this.CalcuH = rhs.CalcuH;
+        }
+
+        /// <summary>
+        /// ID
+        /// </summary>
+        public long ID { get; set; }
+
+        /// <summary>
+        /// 鍚嶇О
+        /// </summary>
+        public string Name { get; set; }
+
+        /// <summary>
+        /// 缂栫爜
+        /// </summary>
+        public string Code { get; set; }
+
+        /// <summary>
+        /// 鍨嬪彿
+        /// </summary>
+        public string ModelType { get; set; }
+
+        /// <summary>
+        /// DbId
+        /// </summary>
+        public string DbId { get; set; }
+
+        /// <summary>
+        /// Db閿佸畾
+        /// </summary>
+        public bool DbLocked { get; set; }
+
+        /// <summary>
+        /// CurveDbId
+        /// </summary>
+        public string CurveDbId { get; set; }
+
+        /// <summary>
+        /// 棰濆畾鍔熺巼
+        /// </summary>
+        public double RatedP { get; set; }
+
+        /// <summary>
+        ///  棰濆畾娴侀噺
+        /// </summary>
+        public double? RatedQ { get; set; }
+
+        /// <summary>
+        /// 棰濆畾鎵▼
+        /// </summary>
+        public double? RatedH { get; set; }
+
+        /// <summary>
+        /// 棰濆畾杞��
+        /// </summary>
+        public double? RatedN { get; set; }
+
+        /// <summary>
+        /// 棰濆畾棰戠巼
+        /// </summary>
+        public double RatedHz { get; set; }
+
+        /// <summary>
+        /// 璁惧畾棰戠巼
+        /// </summary>
+        public double CurrentHz { get; set; }
+
+        /// <summary>
+        /// 璁$畻娴侀噺
+        /// </summary>
+        public double? CalcuQ { get; set; }
+
+        /// <summary>
+        /// 璁$畻鎵▼
+        /// </summary>
+        public double? CalcuH { get; set; }
+
+        /// <summary>
+        /// 鍖归厤鍨嬪彿
+        /// </summary>
+        public string MatchingModelType { get; set; }
+
+        /// <summary>
+        /// 鍖归厤DbId
+        /// </summary>
+        public string MatchingDbId { get; set; }
+
+        /// <summary>
+        /// 鍖归厤CurveDbId
+        /// </summary>
+        public string MatchingCurveDbId { get; set; }
+
+        /// <summary>
+        /// 鍖归厤棰濆畾鍔熺巼
+        /// </summary>
+        public double? MatchingRatedP { get; set; }
+
+        /// <summary>
+        ///  鍖归厤棰濆畾娴侀噺
+        /// </summary>
+        public double? MatchingRatedQ { get; set; }
+
+        /// <summary>
+        /// 鍖归厤棰濆畾鎵▼
+        /// </summary>
+        public double? MatchingRatedH { get; set; }
+
+        /// <summary>
+        /// 鍖归厤棰濆畾杞��
+        /// </summary>
+        public double? MatchingRatedN { get; set; }
+
+        /// <summary>
+        /// 鍖归厤棰濆畾棰戠巼
+        /// </summary>
+        public double? MatchingRatedHz { get; set; }
+
+        /// <summary>
+        /// 鍖归厤璁惧畾棰戠巼
+        /// </summary>
+        public double? MatchingCurrentHz { get; set; }
+
+        /// <summary>
+        /// 鍖归厤娴侀噺鎵▼鏇茬嚎
+        /// </summary>
+        public List<HydroCurvePointViewModel> MatchingCurveQH { get; set; }
+
+        /// <summary>
+        /// 鍖归厤娴侀噺鍔熺巼鏇茬嚎
+        /// </summary>
+        public List<HydroCurvePointViewModel> MatchingCurveQP { get; set; }
+
+        /// <summary>
+        /// 鍖归厤娴侀噺鏁堢巼鏇茬嚎
+        /// </summary>
+        public List<HydroCurvePointViewModel> MatchingCurveQE { get; set; }
+
+
+    }
+}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/14-matching/02-valve/HydroValveMatchingViewModel.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/14-matching/02-valve/HydroValveMatchingViewModel.cs
new file mode 100644
index 0000000..3615956
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/14-matching/02-valve/HydroValveMatchingViewModel.cs
@@ -0,0 +1,169 @@
+锘縩amespace Yw.WinFrmUI
+{
+    /// <summary>
+    /// 闃�闂ㄥ尮閰峍iewModel
+    /// </summary>
+    public class HydroValveMatchingViewModel
+    {
+        /// <summary>
+        ///
+        /// </summary>
+        public HydroValveMatchingViewModel() { }
+
+        /// <summary>
+        ///
+        /// </summary>
+        public HydroValveMatchingViewModel(Yw.Model.HydroValveInfo rhs, Yw.Model.HydroModelInfo hydroInfo)
+        {
+            this.ID = rhs.ID;
+            this.Name = rhs.Name;
+            this.Code = rhs.Code;
+            this.ModelType = rhs.ModelType;
+            this.DbLocked = rhs.DbLocked;
+            this.DbId = rhs.DbId;
+            this.CurveDbId = hydroInfo.Curves?.Find(x => x.Code == rhs.ValveSetting)?.DbId;
+            this.Material = rhs.Material;
+            this.Diameter = rhs.Diameter;
+            this.MinorLoss = rhs.MinorLoss;
+            switch (rhs.ValveType)
+            {
+                case Yw.Hydro.ValveType.PRV: this.ValveType = eValveType.PRV; break;
+                case Yw.Hydro.ValveType.PSV: this.ValveType = eValveType.PSV; break;
+                case Yw.Hydro.ValveType.PBV: this.ValveType = eValveType.PBV; break;
+                case Yw.Hydro.ValveType.TCV: this.ValveType = eValveType.TCV; break;
+                case Yw.Hydro.ValveType.FCV: this.ValveType = eValveType.FCV; break;
+                case Yw.Hydro.ValveType.GPV: this.ValveType = eValveType.GPV; break;
+                case Yw.Hydro.ValveType.CV: this.ValveType = eValveType.CV; break;
+                default: break;
+            }
+            this.ValveSetting = rhs.ValveSetting;
+        }
+
+        /// <summary>
+        ///
+        /// </summary>
+        public HydroValveMatchingViewModel(Yw.Model.HydroValveInfo rhs, Yw.Model.HydroModelInfo hydroInfo, HydroCalcuLinkResult calcuResult) : this(rhs, hydroInfo)
+        {
+
+        }
+
+        /// <summary>
+        ///
+        /// </summary>
+        public HydroValveMatchingViewModel(HydroValveViewModel rhs) : this(rhs.Vmo, rhs.HydroInfo)
+        {
+
+        }
+
+        /// <summary>
+        /// ID
+        /// </summary>
+        public long ID { get; set; }
+
+        /// <summary>
+        /// 缂栫爜
+        /// </summary>
+        public string Code { get; set; }
+
+        /// <summary>
+        /// 鍚嶇О
+        /// </summary>
+        public string Name { get; set; }
+
+        /// <summary>
+        /// Db閿佸畾
+        /// </summary>
+        public bool DbLocked { get; set; }
+
+        /// <summary>
+        /// 鍨嬪彿
+        /// </summary>
+        public string ModelType { get; set; }
+
+        /// <summary>
+        /// DbId
+        /// </summary>
+        public string DbId { get; set; }
+
+        /// <summary>
+        /// CurveDbId
+        /// </summary>
+        public string CurveDbId { get; set; }
+
+        /// <summary>
+        /// 鏉愯川
+        /// </summary>
+        public string Material { get; set; }
+
+        /// <summary>
+        /// 鐩村緞
+        /// </summary>
+        public double Diameter { get; set; }
+
+        /// <summary>
+        /// 鎹熷け绯绘暟
+        /// </summary>
+        public double MinorLoss { get; set; }
+
+        /// <summary>
+        /// 闃�闂ㄧ被鍨�
+        /// </summary>
+        public eValveType ValveType { get; set; }
+
+        /// <summary>
+        /// 闃�闂ㄨ缃�
+        /// </summary>
+        public string ValveSetting { get; set; }
+
+        /// <summary>
+        /// 鍖归厤鍨嬪彿
+        /// </summary>
+        public string MatchingModelType { get; set; }
+
+        /// <summary>
+        /// 鍖归厤Dbid
+        /// </summary>
+        public string MatchingDbId { get; set; }
+
+        /// <summary>
+        /// 鍖归厤鏇茬嚎id
+        /// </summary>
+        public string MatchingCurveDbId { get; set; }
+
+        /// <summary>
+        /// 鍖归厤鏉愯川
+        /// </summary>
+        public string MatchingMaterial { get; set; }
+
+        /// <summary>
+        /// 鍖归厤鐩村緞
+        /// </summary>
+        public double? MatchingDiameter { get; set; }
+
+        /// <summary>
+        /// 鍖归厤鎹熷け绯绘暟
+        /// </summary>
+        public double? MatchingMinorLoss { get; set; }
+
+        /// <summary>
+        /// 鍖归厤闃�闂ㄧ被鍨�
+        /// </summary>
+        public eValveType? MatchingValveType { get; set; }
+
+        /// <summary>
+        /// 鍖归厤闃�闂ㄨ缃�
+        /// </summary>
+        public string MatchingValveSetting { get; set; }
+
+        /// <summary>
+        /// 鍖归厤姘村ご鎹熷け鏇茬嚎
+        /// </summary>
+        public List<HydroCurvePointViewModel> MatchingCurveQL { get; set; }
+
+        /// <summary>
+        /// 鍖归厤寮�搴︽崯澶辨洸绾�
+        /// </summary>
+        public List<HydroCurvePointViewModel> MatchingCurveOL { get; set; }
+
+    }
+}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/14-matching/03-pipe/HydroPipeMatchingViewModel.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/14-matching/03-pipe/HydroPipeMatchingViewModel.cs
new file mode 100644
index 0000000..2cd6372
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/14-matching/03-pipe/HydroPipeMatchingViewModel.cs
@@ -0,0 +1,134 @@
+锘縩amespace Yw.WinFrmUI
+{
+    /// <summary>
+    /// 绠¢亾鍖归厤ViewModel
+    /// </summary>
+    public class HydroPipeMatchingViewModel
+    {
+        /// <summary>
+        ///
+        /// </summary>
+        public HydroPipeMatchingViewModel() { }
+
+        /// <summary>
+        ///
+        /// </summary>
+        public HydroPipeMatchingViewModel(Yw.Model.HydroPipeInfo rhs, Yw.Model.HydroModelInfo hydroInfo)
+        {
+            this.ID = rhs.ID;
+            this.Name = rhs.Name;
+            this.Code = rhs.Code;
+            this.DbLocked = rhs.DbLocked;
+            this.DbId = rhs.DbId;
+            this.ModelType = rhs.ModelType;
+            this.Material = rhs.Material;
+            this.Diameter = rhs.Diameter;
+            this.Roughness = rhs.Roughness;
+            this.MinorLoss = rhs.MinorLoss;
+            this.eAlgorithmType = eAlgorithmType.Hazen;
+        }
+
+        /// <summary>
+        ///
+        /// </summary>
+        public HydroPipeMatchingViewModel(Yw.Model.HydroPipeInfo rhs, Yw.Model.HydroModelInfo hydroInfo, HydroCalcuLinkResult calcuResult) : this(rhs, hydroInfo)
+        {
+
+        }
+
+        /// <summary>
+        ///
+        /// </summary>
+        public HydroPipeMatchingViewModel(HydroPipeViewModel rhs) : this(rhs.Vmo, rhs.HydroInfo)
+        {
+
+        }
+
+        /// <summary>
+        /// ID
+        /// </summary>
+        public long ID { get; set; }
+
+        /// <summary>
+        /// 缂栫爜
+        /// </summary>
+        public string Code { get; set; }
+
+        /// <summary>
+        /// 鍚嶇О
+        /// </summary>
+        public string Name { get; set; }
+
+        /// <summary>
+        /// Db閿佸畾
+        /// </summary>
+        public bool DbLocked { get; set; }
+
+        /// <summary>
+        ///DbId
+        /// </summary>
+        public string DbId { get; set; }
+
+        /// <summary>
+        /// 鍨嬪彿
+        /// </summary>
+        public string ModelType { get; set; }
+
+        /// <summary>
+        /// 鏉愯川
+        /// </summary>
+        public string Material { get; set; }
+
+        /// <summary>
+        /// 鐩村緞
+        /// </summary>
+        public double Diameter { get; set; }
+
+        /// <summary>
+        /// 绮楃硻绯绘暟
+        /// </summary>
+        public double Roughness { get; set; }
+
+        /// <summary>
+        /// 鎹熷け绯绘暟
+        /// </summary>
+        public double MinorLoss { get; set; }
+
+        /// <summary>
+        /// 绠楁硶绫诲瀷
+        /// </summary>
+        public eAlgorithmType eAlgorithmType { get; set; }
+
+        /// <summary>
+        /// 鍖归厤鍨嬪彿
+        /// </summary>
+        public string MatchingModelType { get; set; }
+
+        /// <summary>
+        /// 鍖归厤Dbid
+        /// </summary>
+        public string MatchingDbId { get; set; }
+
+        /// <summary>
+        /// 鍖归厤鏉愯川
+        /// </summary>
+        public string MatchingMaterial { get; set; }
+
+        /// <summary>
+        /// 鍖归厤鐩村緞
+        /// </summary>
+        public double? MatchingDiameter { get; set; }
+
+        /// <summary>
+        /// 鍖归厤绮楃硻绯绘暟
+        /// </summary>
+        public double? MatchingRoughness { get; set; }
+
+        /// <summary>
+        /// 鍖归厤鎹熷け绯绘暟
+        /// </summary>
+        public double? MatchingMinorLoss { get; set; }
+
+
+    }
+}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/14-matching/04-elbow/HydroElbowMatchingViewModel.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/14-matching/04-elbow/HydroElbowMatchingViewModel.cs
new file mode 100644
index 0000000..6dc2ec7
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/14-matching/04-elbow/HydroElbowMatchingViewModel.cs
@@ -0,0 +1,145 @@
+锘縩amespace Yw.WinFrmUI
+{
+    /// <summary>
+    /// 寮ご鍖归厤ViewModel
+    /// </summary>
+    public class HydroElbowMatchingViewModel
+    {
+        /// <summary>
+        ///
+        /// </summary>
+        public HydroElbowMatchingViewModel() { }
+
+        /// <summary>
+        ///
+        /// </summary>
+        public HydroElbowMatchingViewModel(Yw.Model.HydroElbowInfo rhs, Yw.Model.HydroModelInfo hydroInfo)
+        {
+            this.ID = rhs.ID;
+            this.Name = rhs.Name;
+            this.Code = rhs.Code;
+            this.DbLocked = rhs.DbLocked;
+            this.DbId = rhs.DbId;
+            this.ModelType = rhs.ModelType;
+            this.Material = rhs.Material;
+            this.Caliber = rhs.Caliber;
+            this.MinorLoss = rhs.MinorLoss;
+            this.BendingAngle = rhs.BendingAngle.HasValue ? (int)rhs.BendingAngle.Value : null;
+            switch (rhs.ElbowType)
+            {
+                case HydroElbow.Short: this.ElbowType = eElbowType.Short; break;
+                case HydroElbow.Middle: this.ElbowType = eElbowType.Middle; break;
+                case HydroElbow.Long: this.ElbowType = eElbowType.Long; break;
+                default: break;
+            }
+        }
+
+        /// <summary>
+        ///
+        /// </summary>
+        public HydroElbowMatchingViewModel(Yw.Model.HydroElbowInfo rhs, Yw.Model.HydroModelInfo hydroInfo, HydroCalcuNodeResult calcuResult) : this(rhs, hydroInfo)
+        {
+
+        }
+
+        /// <summary>
+        ///
+        /// </summary>
+        public HydroElbowMatchingViewModel(HydroElbowViewModel rhs) : this(rhs.Vmo, rhs.HydroInfo)
+        {
+
+        }
+
+        /// <summary>
+        /// ID
+        /// </summary>
+        public long ID { get; set; }
+
+        /// <summary>
+        /// 缂栫爜
+        /// </summary>
+        public string Code { get; set; }
+
+        /// <summary>
+        /// 鍚嶇О
+        /// </summary>
+        public string Name { get; set; }
+
+        /// <summary>
+        /// Db閿佸畾
+        /// </summary>
+        public bool DbLocked { get; set; }
+
+        /// <summary>
+        /// DbId
+        /// </summary>
+        public string DbId { get; set; }
+
+        /// <summary>
+        /// 鍨嬪彿
+        /// </summary>
+        public string ModelType { get; set; }
+
+        /// <summary>
+        /// 鏉愯川
+        /// </summary>
+        public string Material { get; set; }
+
+        /// <summary>
+        /// 鍙e緞
+        /// </summary>
+        public double? Caliber { get; set; }
+
+        /// <summary>
+        /// 鎹熷け绯绘暟
+        /// </summary>
+        public double? MinorLoss { get; set; }
+
+        /// <summary>
+        /// 寮洸瑙掑害
+        /// </summary>        
+        public int? BendingAngle { get; set; }
+
+        /// <summary>
+        /// 寮ご绫诲瀷
+        /// </summary>
+        public eElbowType? ElbowType { get; set; }
+
+        /// <summary>
+        /// 鍖归厤鍨嬪彿
+        /// </summary>
+        public string MatchingModelType { get; set; }
+
+        /// <summary>
+        /// 鍖归厤Dbid
+        /// </summary>
+        public string MatchingDbId { get; set; }
+
+        /// <summary>
+        /// 鍖归厤鏉愯川
+        /// </summary>
+        public string MatchingMaterial { get; set; }
+
+        /// <summary>
+        /// 鍖归厤鍙e緞
+        /// </summary>
+        public double? MatchingCaliber { get; set; }
+
+        /// <summary>
+        /// 鍖归厤鎹熷け绯绘暟
+        /// </summary>
+        public double? MatchingMinorLoss { get; set; }
+
+        /// <summary>
+        /// 鍖归厤寮洸瑙掑害
+        /// </summary>
+        public int? MatchingBendingAngle { get; set; }
+
+        /// <summary>
+        /// 鍖归厤寮ご绫诲瀷
+        /// </summary>
+        public eElbowType? MatchingElbowType { get; set; }
+
+
+    }
+}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/14-matching/05-threelink/HydroThreelinkMatchingViewModel.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/14-matching/05-threelink/HydroThreelinkMatchingViewModel.cs
new file mode 100644
index 0000000..c3bb3a8
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/14-matching/05-threelink/HydroThreelinkMatchingViewModel.cs
@@ -0,0 +1,138 @@
+锘縩amespace Yw.WinFrmUI
+{
+    /// <summary>
+    /// 涓夐�氬尮閰峍iewModel
+    /// </summary>
+    public class HydroThreelinkMatchingViewModel
+    {
+        /// <summary>
+        ///
+        /// </summary>
+        public HydroThreelinkMatchingViewModel() { }
+
+        /// <summary>
+        ///
+        /// </summary>
+        public HydroThreelinkMatchingViewModel(Yw.Model.HydroThreelinkInfo rhs, Yw.Model.HydroModelInfo hydroInfo)
+        {
+            this.ID = rhs.ID;
+            this.Name = rhs.Name;
+            this.Code = rhs.Code;
+            this.DbLocked = rhs.DbLocked;
+            this.DbId = rhs.DbId;
+            this.ModelType = rhs.ModelType;
+            this.Material = rhs.Material;
+            this.Caliber = rhs.Caliber;
+            this.MinorLoss = rhs.MinorLoss;
+            this.RunningThroughLoss = rhs.RunningThroughLoss;
+            this.BranchThroughLoss = rhs.BranchThroughLoss;
+        }
+
+        /// <summary>
+        ///
+        /// </summary>
+        public HydroThreelinkMatchingViewModel(Yw.Model.HydroThreelinkInfo rhs, Yw.Model.HydroModelInfo hydroInfo, HydroCalcuNodeResult calcuResult) : this(rhs, hydroInfo)
+        {
+
+        }
+
+        /// <summary>
+        ///
+        /// </summary>
+        public HydroThreelinkMatchingViewModel(HydroThreelinkViewModel rhs) : this(rhs.Vmo, rhs.HydroInfo)
+        {
+
+        }
+
+        /// <summary>
+        /// ID
+        /// </summary>
+        public long ID { get; set; }
+
+        /// <summary>
+        /// 缂栫爜
+        /// </summary>
+        public string Code { get; set; }
+
+        /// <summary>
+        /// 鍚嶇О
+        /// </summary>
+        public string Name { get; set; }
+
+        /// <summary>
+        /// Db閿佸畾
+        /// </summary>
+        public bool DbLocked { get; set; }
+
+        /// <summary>
+        /// DbId
+        /// </summary>
+        public string DbId { get; set; }
+
+        /// <summary>
+        /// 鍨嬪彿
+        /// </summary>
+        public string ModelType { get; set; }
+
+        /// <summary>
+        /// 鏉愯川
+        /// </summary>
+        public string Material { get; set; }
+
+        /// <summary>
+        /// 鍙e緞
+        /// </summary>
+        public double? Caliber { get; set; }
+
+        /// <summary>
+        /// 鎹熷け绯绘暟
+        /// </summary>
+        public double? MinorLoss { get; set; }
+
+        /// <summary>
+        /// 杩愯閫氳繃鎹熷け绯绘暟
+        /// </summary>
+        public double? RunningThroughLoss { get; set; }
+
+        /// <summary>
+        /// 鏀閫氳繃鎹熷け绯绘暟
+        /// </summary>
+        public double? BranchThroughLoss { get; set; }
+
+        /// <summary>
+        /// 鍖归厤鍨嬪彿
+        /// </summary>
+        public string MatchingModelType { get; set; }
+
+        /// <summary>
+        /// 鍖归厤Dbid
+        /// </summary>
+        public string MatchingDbId { get; set; }
+
+        /// <summary>
+        /// 鍖归厤鏉愯川
+        /// </summary>
+        public string MatchingMaterial { get; set; }
+
+        /// <summary>
+        /// 鍖归厤鍙e緞
+        /// </summary>
+        public double? MatchingCaliber { get; set; }
+
+        /// <summary>
+        /// 鍖归厤鎹熷け绯绘暟
+        /// </summary>
+        public double? MatchingMinorLoss { get; set; }
+
+        /// <summary>
+        /// 杩愯閫氳繃鎹熷け绯绘暟
+        /// </summary>
+        public double? MatchingRunningThroughLoss { get; set; }
+
+        /// <summary>
+        /// 鏀閫氳繃鎹熷け绯绘暟
+        /// </summary>
+        public double? MatchingBranchThroughLoss { get; set; }
+
+    }
+}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/14-matching/06-fourlink/HydroFourlinkMatchingViewModel.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/14-matching/06-fourlink/HydroFourlinkMatchingViewModel.cs
new file mode 100644
index 0000000..767a76a
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/14-matching/06-fourlink/HydroFourlinkMatchingViewModel.cs
@@ -0,0 +1,117 @@
+锘縩amespace Yw.WinFrmUI
+{
+    /// <summary>
+    /// 鍥涢�氬尮閰峍iewModel
+    /// </summary>
+    public class HydroFourlinkMatchingViewModel
+    {
+        /// <summary>
+        ///
+        /// </summary>
+        public HydroFourlinkMatchingViewModel() { }
+
+        /// <summary>
+        ///
+        /// </summary>
+        public HydroFourlinkMatchingViewModel(Yw.Model.HydroFourlinkInfo rhs, Yw.Model.HydroModelInfo hydroInfo)
+        {
+            this.ID = rhs.ID;
+            this.Name = rhs.Name;
+            this.Code = rhs.Code;
+            this.DbLocked = rhs.DbLocked;
+            this.DbId = rhs.DbId;
+            this.ModelType = rhs.ModelType;
+            this.Material = rhs.Material;
+            this.Caliber = rhs.Caliber;
+            this.MinorLoss = rhs.MinorLoss;
+        }
+
+        /// <summary>
+        ///
+        /// </summary>
+        public HydroFourlinkMatchingViewModel(Yw.Model.HydroFourlinkInfo rhs, Yw.Model.HydroModelInfo hydroInfo, HydroCalcuNodeResult calcuResult) : this(rhs, hydroInfo)
+        {
+
+        }
+
+        /// <summary>
+        ///
+        /// </summary>
+        public HydroFourlinkMatchingViewModel(HydroFourlinkViewModel rhs) : this(rhs.Vmo, rhs.HydroInfo)
+        {
+
+        }
+
+        /// <summary>
+        /// ID
+        /// </summary>
+        public long ID { get; set; }
+
+        /// <summary>
+        /// 缂栫爜
+        /// </summary>
+        public string Code { get; set; }
+
+        /// <summary>
+        /// 鍚嶇О
+        /// </summary>
+        public string Name { get; set; }
+
+        /// <summary>
+        /// Db閿佸畾
+        /// </summary>
+        public bool DbLocked { get; set; }
+
+        /// <summary>
+        /// DbId
+        /// </summary>
+        public string DbId { get; set; }
+
+        /// <summary>
+        /// 鍨嬪彿
+        /// </summary>
+        public string ModelType { get; set; }
+
+        /// <summary>
+        /// 鏉愯川
+        /// </summary>
+        public string Material { get; set; }
+
+        /// <summary>
+        /// 鍙e緞
+        /// </summary>
+        public double? Caliber { get; set; }
+
+        /// <summary>
+        /// 鎹熷け绯绘暟
+        /// </summary>
+        public double? MinorLoss { get; set; }
+
+        /// <summary>
+        /// 鍖归厤鍨嬪彿
+        /// </summary>
+        public string MatchingModelType { get; set; }
+
+        /// <summary>
+        /// 鍖归厤Dbid
+        /// </summary>
+        public string MatchingDbId { get; set; }
+
+        /// <summary>
+        /// 鍖归厤鏉愯川
+        /// </summary>
+        public string MatchingMaterial { get; set; }
+
+        /// <summary>
+        /// 鍖归厤鍙e緞
+        /// </summary>
+        public double? MatchingCaliber { get; set; }
+
+        /// <summary>
+        /// 鍖归厤鎹熷け绯绘暟
+        /// </summary>
+        public double? MatchingMinorLoss { get; set; }
+
+
+    }
+}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/14-matching/07-blunthead/HydroBluntheadMatchingViewModel.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/14-matching/07-blunthead/HydroBluntheadMatchingViewModel.cs
new file mode 100644
index 0000000..c0b269f
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/14-matching/07-blunthead/HydroBluntheadMatchingViewModel.cs
@@ -0,0 +1,117 @@
+锘縩amespace Yw.WinFrmUI
+{
+    /// <summary>
+    /// 闂峰ご鍖归厤ViewModel
+    /// </summary>
+    public class HydroBluntheadMatchingViewModel
+    {
+        /// <summary>
+        ///
+        /// </summary>
+        public HydroBluntheadMatchingViewModel() { }
+
+        /// <summary>
+        ///
+        /// </summary>
+        public HydroBluntheadMatchingViewModel(Yw.Model.HydroBluntheadInfo rhs, Yw.Model.HydroModelInfo hydroInfo)
+        {
+            this.ID = rhs.ID;
+            this.Name = rhs.Name;
+            this.Code = rhs.Code;
+            this.DbLocked = rhs.DbLocked;
+            this.DbId = rhs.DbId;
+            this.ModelType = rhs.ModelType;
+            this.Material = rhs.Material;
+            this.Caliber = rhs.Caliber;
+            this.MinorLoss = rhs.MinorLoss;
+        }
+
+        /// <summary>
+        ///
+        /// </summary>
+        public HydroBluntheadMatchingViewModel(Yw.Model.HydroBluntheadInfo rhs, Yw.Model.HydroModelInfo hydroInfo, HydroCalcuNodeResult calcuResult) : this(rhs, hydroInfo)
+        {
+
+        }
+
+        /// <summary>
+        ///
+        /// </summary>
+        public HydroBluntheadMatchingViewModel(HydroBluntheadViewModel rhs) : this(rhs.Vmo, rhs.HydroInfo)
+        {
+
+        }
+
+        /// <summary>
+        /// ID
+        /// </summary>
+        public long ID { get; set; }
+
+        /// <summary>
+        /// 缂栫爜
+        /// </summary>
+        public string Code { get; set; }
+
+        /// <summary>
+        /// 鍚嶇О
+        /// </summary>
+        public string Name { get; set; }
+
+        /// <summary>
+        /// Db閿佸畾
+        /// </summary>
+        public bool DbLocked { get; set; }
+
+        /// <summary>
+        /// DbId
+        /// </summary>
+        public string DbId { get; set; }
+
+        /// <summary>
+        /// 鍨嬪彿
+        /// </summary>
+        public string ModelType { get; set; }
+
+        /// <summary>
+        /// 鏉愯川
+        /// </summary>
+        public string Material { get; set; }
+
+        /// <summary>
+        /// 鍙e緞
+        /// </summary>
+        public double? Caliber { get; set; }
+
+        /// <summary>
+        /// 鎹熷け绯绘暟
+        /// </summary>
+        public double? MinorLoss { get; set; }
+
+        /// <summary>
+        /// 鍖归厤鍨嬪彿
+        /// </summary>
+        public string MatchingModelType { get; set; }
+
+        /// <summary>
+        /// 鍖归厤Dbid
+        /// </summary>
+        public string MatchingDbId { get; set; }
+
+        /// <summary>
+        /// 鍖归厤鏉愯川
+        /// </summary>
+        public string MatchingMaterial { get; set; }
+
+        /// <summary>
+        /// 鍖归厤鍙e緞
+        /// </summary>
+        public double? MatchingCaliber { get; set; }
+
+        /// <summary>
+        /// 鍖归厤鎹熷け绯绘暟
+        /// </summary>
+        public double? MatchingMinorLoss { get; set; }
+
+
+    }
+}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/14-matching/08-hydrant/HydroHydrantMatchingViewModel.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/14-matching/08-hydrant/HydroHydrantMatchingViewModel.cs
new file mode 100644
index 0000000..08e4db8
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/14-matching/08-hydrant/HydroHydrantMatchingViewModel.cs
@@ -0,0 +1,128 @@
+锘縩amespace Yw.WinFrmUI
+{
+    /// <summary>
+    /// 娑堢伀鏍撳尮閰峍iewModel
+    /// </summary>
+    public class HydroHydrantMatchingViewModel
+    {
+        /// <summary>
+        ///
+        /// </summary>
+        public HydroHydrantMatchingViewModel() { }
+
+        /// <summary>
+        ///
+        /// </summary>
+        public HydroHydrantMatchingViewModel(Yw.Model.HydroHydrantInfo rhs, Yw.Model.HydroModelInfo hydroInfo)
+        {
+            this.ID = rhs.ID;
+            this.Name = rhs.Name;
+            this.Code = rhs.Code;
+            this.DbLocked = rhs.DbLocked;
+            this.DbId = rhs.DbId;
+            this.ModelType = rhs.ModelType;
+            this.Material = rhs.Material;
+            this.Caliber = rhs.Caliber;
+            this.MinorLoss = rhs.MinorLoss;
+            this.Coefficient = rhs.Coefficient;
+        }
+
+        /// <summary>
+        ///
+        /// </summary>
+        public HydroHydrantMatchingViewModel(Yw.Model.HydroHydrantInfo rhs, Yw.Model.HydroModelInfo hydroInfo, HydroCalcuNodeResult calcuResult) : this(rhs, hydroInfo)
+        {
+
+        }
+
+        /// <summary>
+        ///
+        /// </summary>
+        public HydroHydrantMatchingViewModel(HydroHydrantViewModel rhs) : this(rhs.Vmo, rhs.HydroInfo)
+        {
+
+        }
+
+        /// <summary>
+        /// ID
+        /// </summary>
+        public long ID { get; set; }
+
+        /// <summary>
+        /// 缂栫爜
+        /// </summary>
+        public string Code { get; set; }
+
+        /// <summary>
+        /// 鍚嶇О
+        /// </summary>
+        public string Name { get; set; }
+
+        /// <summary>
+        /// Db閿佸畾
+        /// </summary>
+        public bool DbLocked { get; set; }
+
+        /// <summary>
+        /// DbId
+        /// </summary>
+        public string DbId { get; set; }
+
+        /// <summary>
+        /// 鍨嬪彿
+        /// </summary>
+        public string ModelType { get; set; }
+
+        /// <summary>
+        /// 鏉愯川
+        /// </summary>
+        public string Material { get; set; }
+
+        /// <summary>
+        /// 鍙e緞
+        /// </summary>
+        public double? Caliber { get; set; }
+
+        /// <summary>
+        /// 鎹熷け绯绘暟
+        /// </summary>
+        public double? MinorLoss { get; set; }
+
+        /// <summary>
+        /// 鍠峰皠绯绘暟
+        /// </summary>
+        public double Coefficient { get; set; }
+
+        /// <summary>
+        /// 鍖归厤鍨嬪彿
+        /// </summary>
+        public string MatchingModelType { get; set; }
+
+        /// <summary>
+        /// 鍖归厤Dbid
+        /// </summary>
+        public string MatchingDbId { get; set; }
+
+        /// <summary>
+        /// 鍖归厤鏉愯川
+        /// </summary>
+        public string MatchingMaterial { get; set; }
+
+        /// <summary>
+        /// 鍖归厤鍙e緞
+        /// </summary>
+        public double? MatchingCaliber { get; set; }
+
+        /// <summary>
+        /// 鍖归厤鎹熷け绯绘暟
+        /// </summary>
+        public double? MatchingMinorLoss { get; set; }
+
+        /// <summary>
+        /// 鍖归厤鍠峰皠绯绘暟
+        /// </summary>
+        public double? MatchingCoefficient { get; set; }
+
+
+    }
+}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/14-matching/09-nozzle/HydroNozzleMatchingViewModel.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/14-matching/09-nozzle/HydroNozzleMatchingViewModel.cs
new file mode 100644
index 0000000..7af3c13
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/14-matching/09-nozzle/HydroNozzleMatchingViewModel.cs
@@ -0,0 +1,128 @@
+锘縩amespace Yw.WinFrmUI
+{
+    /// <summary>
+    /// 鍠峰槾鍖归厤ViewModel
+    /// </summary>
+    public class HydroNozzleMatchingViewModel
+    {
+        /// <summary>
+        ///
+        /// </summary>
+        public HydroNozzleMatchingViewModel() { }
+
+        /// <summary>
+        ///
+        /// </summary>
+        public HydroNozzleMatchingViewModel(Yw.Model.HydroNozzleInfo rhs, Yw.Model.HydroModelInfo hydroInfo)
+        {
+            this.ID = rhs.ID;
+            this.Name = rhs.Name;
+            this.Code = rhs.Code;
+            this.DbLocked = rhs.DbLocked;
+            this.DbId = rhs.DbId;
+            this.ModelType = rhs.ModelType;
+            this.Material = rhs.Material;
+            this.Caliber = rhs.Caliber;
+            this.MinorLoss = rhs.MinorLoss;
+            this.Coefficient = rhs.Coefficient;
+        }
+
+        /// <summary>
+        ///
+        /// </summary>
+        public HydroNozzleMatchingViewModel(Yw.Model.HydroNozzleInfo rhs, Yw.Model.HydroModelInfo hydroInfo, HydroCalcuNodeResult calcuResult) : this(rhs, hydroInfo)
+        {
+
+        }
+
+        /// <summary>
+        ///
+        /// </summary>
+        public HydroNozzleMatchingViewModel(HydroNozzleViewModel rhs) : this(rhs.Vmo, rhs.HydroInfo)
+        {
+
+        }
+
+        /// <summary>
+        /// ID
+        /// </summary>
+        public long ID { get; set; }
+
+        /// <summary>
+        /// 缂栫爜
+        /// </summary>
+        public string Code { get; set; }
+
+        /// <summary>
+        /// 鍚嶇О
+        /// </summary>
+        public string Name { get; set; }
+
+        /// <summary>
+        /// Db閿佸畾
+        /// </summary>
+        public bool DbLocked { get; set; }
+
+        /// <summary>
+        /// DbId
+        /// </summary>
+        public string DbId { get; set; }
+
+        /// <summary>
+        /// 鍨嬪彿
+        /// </summary>
+        public string ModelType { get; set; }
+
+        /// <summary>
+        /// 鏉愯川
+        /// </summary>
+        public string Material { get; set; }
+
+        /// <summary>
+        /// 鍙e緞
+        /// </summary>
+        public double? Caliber { get; set; }
+
+        /// <summary>
+        /// 鎹熷け绯绘暟
+        /// </summary>
+        public double? MinorLoss { get; set; }
+
+        /// <summary>
+        /// 鍠峰皠绯绘暟
+        /// </summary>
+        public double Coefficient { get; set; }
+
+        /// <summary>
+        /// 鍖归厤鍨嬪彿
+        /// </summary>
+        public string MatchingModelType { get; set; }
+
+        /// <summary>
+        /// 鍖归厤Dbid
+        /// </summary>
+        public string MatchingDbId { get; set; }
+
+        /// <summary>
+        /// 鍖归厤鏉愯川
+        /// </summary>
+        public string MatchingMaterial { get; set; }
+
+        /// <summary>
+        /// 鍖归厤鍙e緞
+        /// </summary>
+        public double? MatchingCaliber { get; set; }
+
+        /// <summary>
+        /// 鍖归厤鎹熷け绯绘暟
+        /// </summary>
+        public double? MatchingMinorLoss { get; set; }
+
+        /// <summary>
+        /// 鍖归厤鍠峰皠绯绘暟
+        /// </summary>
+        public double? MatchingCoefficient { get; set; }
+
+
+    }
+}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/14-matching/10-meter/HydroMeterMatchingViewModel.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/14-matching/10-meter/HydroMeterMatchingViewModel.cs
new file mode 100644
index 0000000..51a7142
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/14-matching/10-meter/HydroMeterMatchingViewModel.cs
@@ -0,0 +1,96 @@
+锘縩amespace Yw.WinFrmUI
+{
+    /// <summary>
+    /// 姘磋〃鍖归厤ViewModel
+    /// </summary>
+    public class HydroMeterMatchingViewModel
+    {
+        /// <summary>
+        ///
+        /// </summary>
+        public HydroMeterMatchingViewModel() { }
+
+        /// <summary>
+        ///
+        /// </summary>
+        public HydroMeterMatchingViewModel(Yw.Model.HydroMeterInfo rhs, Yw.Model.HydroModelInfo hydroInfo)
+        {
+            this.ID = rhs.ID;
+            this.Name = rhs.Name;
+            this.Code = rhs.Code;
+            this.DbLocked = rhs.DbLocked;
+            this.DbId = rhs.DbId;
+            this.ModelType = rhs.ModelType;
+            this.MinorLoss = rhs.MinorLoss;
+        }
+
+        /// <summary>
+        ///
+        /// </summary>
+        public HydroMeterMatchingViewModel(Yw.Model.HydroMeterInfo rhs, Yw.Model.HydroModelInfo hydroInfo, HydroCalcuNodeResult calcuResult) : this(rhs, hydroInfo)
+        {
+
+        }
+
+        /// <summary>
+        ///
+        /// </summary>
+        public HydroMeterMatchingViewModel(HydroMeterViewModel rhs) : this(rhs.Vmo, rhs.HydroInfo)
+        {
+
+        }
+
+        /// <summary>
+        /// ID
+        /// </summary>
+        public long ID { get; set; }
+
+        /// <summary>
+        /// 缂栫爜
+        /// </summary>
+        public string Code { get; set; }
+
+        /// <summary>
+        /// 鍚嶇О
+        /// </summary>
+        public string Name { get; set; }
+
+        /// <summary>
+        /// Db閿佸畾
+        /// </summary>
+        public bool DbLocked { get; set; }
+
+        /// <summary>
+        /// DbId
+        /// </summary>
+        public string DbId { get; set; }
+
+        /// <summary>
+        /// 鍨嬪彿
+        /// </summary>
+        public string ModelType { get; set; }
+
+        /// <summary>
+        /// 鎹熷け绯绘暟
+        /// </summary>
+        public double? MinorLoss { get; set; }
+
+        /// <summary>
+        /// 鍖归厤鍨嬪彿
+        /// </summary>
+        public string MatchingModelType { get; set; }
+
+        /// <summary>
+        /// 鍖归厤Dbid
+        /// </summary>
+        public string MatchingDbId { get; set; }
+
+        /// <summary>
+        /// 鍖归厤鎹熷け绯绘暟
+        /// </summary>
+        public double? MatchingMinorLoss { get; set; }
+
+
+
+    }
+}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/14-matching/11-flowmeter/HydroFlowmeterMatchingViewModel.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/14-matching/11-flowmeter/HydroFlowmeterMatchingViewModel.cs
new file mode 100644
index 0000000..909af12
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/14-matching/11-flowmeter/HydroFlowmeterMatchingViewModel.cs
@@ -0,0 +1,96 @@
+锘縩amespace Yw.WinFrmUI
+{
+    /// <summary>
+    /// 娴侀噺璁″尮閰峍iewModel
+    /// </summary>
+    public class HydroFlowmeterMatchingViewModel
+    {
+        /// <summary>
+        ///
+        /// </summary>
+        public HydroFlowmeterMatchingViewModel() { }
+
+        /// <summary>
+        ///
+        /// </summary>
+        public HydroFlowmeterMatchingViewModel(Yw.Model.HydroFlowmeterInfo rhs, Yw.Model.HydroModelInfo hydroInfo)
+        {
+            this.ID = rhs.ID;
+            this.Name = rhs.Name;
+            this.Code = rhs.Code;
+            this.DbLocked = rhs.DbLocked;
+            this.DbId = rhs.DbId;
+            this.ModelType = rhs.ModelType;
+            this.MinorLoss = rhs.MinorLoss;
+        }
+
+        /// <summary>
+        ///
+        /// </summary>
+        public HydroFlowmeterMatchingViewModel(Yw.Model.HydroFlowmeterInfo rhs, Yw.Model.HydroModelInfo hydroInfo, HydroCalcuFlowmeterResult calcuResult) : this(rhs, hydroInfo)
+        {
+
+        }
+
+        /// <summary>
+        ///
+        /// </summary>
+        public HydroFlowmeterMatchingViewModel(HydroFlowmeterViewModel rhs) : this(rhs.Vmo, rhs.HydroInfo)
+        {
+
+        }
+
+        /// <summary>
+        /// ID
+        /// </summary>
+        public long ID { get; set; }
+
+        /// <summary>
+        /// 缂栫爜
+        /// </summary>
+        public string Code { get; set; }
+
+        /// <summary>
+        /// 鍚嶇О
+        /// </summary>
+        public string Name { get; set; }
+
+        /// <summary>
+        /// Db閿佸畾
+        /// </summary>
+        public bool DbLocked { get; set; }
+
+        /// <summary>
+        /// DbId
+        /// </summary>
+        public string DbId { get; set; }
+
+        /// <summary>
+        /// 鍨嬪彿
+        /// </summary>
+        public string ModelType { get; set; }
+
+        /// <summary>
+        /// 鎹熷け绯绘暟
+        /// </summary>
+        public double? MinorLoss { get; set; }
+
+        /// <summary>
+        /// 鍖归厤鍨嬪彿
+        /// </summary>
+        public string MatchingModelType { get; set; }
+
+        /// <summary>
+        /// 鍖归厤Dbid
+        /// </summary>
+        public string MatchingDbId { get; set; }
+
+        /// <summary>
+        /// 鍖归厤鎹熷け绯绘暟
+        /// </summary>
+        public double? MatchingMinorLoss { get; set; }
+
+
+
+    }
+}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/14-matching/12-pressmeter/HydroFlowmeterMatchingViewModel.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/14-matching/12-pressmeter/HydroFlowmeterMatchingViewModel.cs
new file mode 100644
index 0000000..cbda043
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/14-matching/12-pressmeter/HydroFlowmeterMatchingViewModel.cs
@@ -0,0 +1,96 @@
+锘縩amespace Yw.WinFrmUI
+{
+    /// <summary>
+    /// 鍘嬪姏琛ㄥ尮閰峍iewModel
+    /// </summary>
+    public class HydroPressmeterMatchingViewModel
+    {
+        /// <summary>
+        ///
+        /// </summary>
+        public HydroPressmeterMatchingViewModel() { }
+
+        /// <summary>
+        ///
+        /// </summary>
+        public HydroPressmeterMatchingViewModel(Yw.Model.HydroPressmeterInfo rhs, Yw.Model.HydroModelInfo hydroInfo)
+        {
+            this.ID = rhs.ID;
+            this.Name = rhs.Name;
+            this.Code = rhs.Code;
+            this.DbLocked = rhs.DbLocked;
+            this.DbId = rhs.DbId;
+            this.ModelType = rhs.ModelType;
+            this.MinorLoss = rhs.MinorLoss;
+        }
+
+        /// <summary>
+        ///
+        /// </summary>
+        public HydroPressmeterMatchingViewModel(Yw.Model.HydroPressmeterInfo rhs, Yw.Model.HydroModelInfo hydroInfo, HydroCalcuPressmeterResult calcuResult) : this(rhs, hydroInfo)
+        {
+
+        }
+
+        /// <summary>
+        ///
+        /// </summary>
+        public HydroPressmeterMatchingViewModel(HydroPressmeterViewModel rhs) : this(rhs.Vmo, rhs.HydroInfo)
+        {
+
+        }
+
+        /// <summary>
+        /// ID
+        /// </summary>
+        public long ID { get; set; }
+
+        /// <summary>
+        /// 缂栫爜
+        /// </summary>
+        public string Code { get; set; }
+
+        /// <summary>
+        /// 鍚嶇О
+        /// </summary>
+        public string Name { get; set; }
+
+        /// <summary>
+        /// Db閿佸畾
+        /// </summary>
+        public bool DbLocked { get; set; }
+
+        /// <summary>
+        /// DbId
+        /// </summary>
+        public string DbId { get; set; }
+
+        /// <summary>
+        /// 鍨嬪彿
+        /// </summary>
+        public string ModelType { get; set; }
+
+        /// <summary>
+        /// 鎹熷け绯绘暟
+        /// </summary>
+        public double? MinorLoss { get; set; }
+
+        /// <summary>
+        /// 鍖归厤鍨嬪彿
+        /// </summary>
+        public string MatchingModelType { get; set; }
+
+        /// <summary>
+        /// 鍖归厤Dbid
+        /// </summary>
+        public string MatchingDbId { get; set; }
+
+        /// <summary>
+        /// 鍖归厤鎹熷け绯绘暟
+        /// </summary>
+        public double? MatchingMinorLoss { get; set; }
+
+
+
+    }
+}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/14-matching/13-translation/HydroTranslationMatchingViewModel.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/14-matching/13-translation/HydroTranslationMatchingViewModel.cs
new file mode 100644
index 0000000..e50fd9e
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/14-matching/13-translation/HydroTranslationMatchingViewModel.cs
@@ -0,0 +1,156 @@
+锘縩amespace Yw.WinFrmUI
+{
+    /// <summary>
+    /// 杩囨浮浠跺尮閰峍iewModel
+    /// </summary>
+    public class HydroTranslationMatchingViewModel
+    {
+        /// <summary>
+        ///
+        /// </summary>
+        public HydroTranslationMatchingViewModel() { }
+
+        /// <summary>
+        ///
+        /// </summary>
+        public HydroTranslationMatchingViewModel(Yw.Model.HydroTranslationInfo rhs, Yw.Model.HydroModelInfo hydroInfo)
+        {
+            this.ID = rhs.ID;
+            this.Name = rhs.Name;
+            this.Code = rhs.Code;
+            this.DbLocked = rhs.DbLocked;
+            this.DbId = rhs.DbId;
+            this.ModelType = rhs.ModelType;
+            this.Material = rhs.Material;
+            this.Diameter = rhs.Diameter;
+            this.StartDiameter = rhs.StartDiameter;
+            this.EndDiameter = rhs.EndDiameter;
+            this.Roughness = rhs.Roughness;
+            this.MinorLoss = rhs.MinorLoss;
+            this.eAlgorithmType = eAlgorithmType.Hazen;
+        }
+
+        /// <summary>
+        ///
+        /// </summary>
+        public HydroTranslationMatchingViewModel(Yw.Model.HydroTranslationInfo rhs, Yw.Model.HydroModelInfo hydroInfo, HydroCalcuLinkResult calcuResult) : this(rhs, hydroInfo)
+        {
+
+        }
+
+        /// <summary>
+        ///
+        /// </summary>
+        public HydroTranslationMatchingViewModel(HydroTranslationViewModel rhs) : this(rhs.Vmo, rhs.HydroInfo)
+        {
+
+        }
+
+        /// <summary>
+        /// ID
+        /// </summary>
+        public long ID { get; set; }
+
+        /// <summary>
+        /// 缂栫爜
+        /// </summary>
+        public string Code { get; set; }
+
+        /// <summary>
+        /// 鍚嶇О
+        /// </summary>
+        public string Name { get; set; }
+
+        /// <summary>
+        /// Db閿佸畾
+        /// </summary>
+        public bool DbLocked { get; set; }
+
+        /// <summary>
+        ///DbId
+        /// </summary>
+        public string DbId { get; set; }
+
+        /// <summary>
+        /// 鍨嬪彿
+        /// </summary>
+        public string ModelType { get; set; }
+
+        /// <summary>
+        /// 鏉愯川
+        /// </summary>
+        public string Material { get; set; }
+
+        /// <summary>
+        /// 鐩村緞
+        /// </summary>
+        public double Diameter { get; set; }
+
+        /// <summary>
+        /// 涓婃父鐩村緞
+        /// </summary>
+        public double StartDiameter { get; set; }
+
+        /// <summary>
+        /// 涓嬫父鐩村緞
+        /// </summary>
+        public double EndDiameter { get; set; }
+
+        /// <summary>
+        /// 绮楃硻绯绘暟
+        /// </summary>
+        public double Roughness { get; set; }
+
+        /// <summary>
+        /// 鎹熷け绯绘暟
+        /// </summary>
+        public double MinorLoss { get; set; }
+
+        /// <summary>
+        /// 绠楁硶绫诲瀷
+        /// </summary>
+        public eAlgorithmType eAlgorithmType { get; set; }
+
+        /// <summary>
+        /// 鍖归厤鍨嬪彿
+        /// </summary>
+        public string MatchingModelType { get; set; }
+
+        /// <summary>
+        /// 鍖归厤Dbid
+        /// </summary>
+        public string MatchingDbId { get; set; }
+
+        /// <summary>
+        /// 鍖归厤鏉愯川
+        /// </summary>
+        public string MatchingMaterial { get; set; }
+
+        /// <summary>
+        /// 鍖归厤鐩村緞
+        /// </summary>
+        public double? MatchingDiameter { get; set; }
+
+        /// <summary>
+        /// 鍖归厤涓婃父鐩村緞
+        /// </summary>
+        public double? MatchingStartDiameter { get; set; }
+
+        /// <summary>
+        /// 鍖归厤涓嬫父鐩村緞
+        /// </summary>
+        public double? MatchingEndDiameter { get; set; }
+
+        /// <summary>
+        /// 鍖归厤绮楃硻绯绘暟
+        /// </summary>
+        public double? MatchingRoughness { get; set; }
+
+        /// <summary>
+        /// 鍖归厤鎹熷け绯绘暟
+        /// </summary>
+        public double? MatchingMinorLoss { get; set; }
+
+
+    }
+}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/14-matching/14-exchanger/HydroExchangerMatchingViewModel.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/14-matching/14-exchanger/HydroExchangerMatchingViewModel.cs
new file mode 100644
index 0000000..c4a2ab3
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/14-matching/14-exchanger/HydroExchangerMatchingViewModel.cs
@@ -0,0 +1,133 @@
+锘縩amespace Yw.WinFrmUI
+{
+    /// <summary>
+    /// 鎹㈢儹鍣ㄥ尮閰峍iewModel
+    /// </summary>
+    public class HydroExchangerMatchingViewModel
+    {
+        /// <summary>
+        ///
+        /// </summary>
+        public HydroExchangerMatchingViewModel() { }
+
+        /// <summary>
+        ///
+        /// </summary>
+        public HydroExchangerMatchingViewModel(Yw.Model.HydroExchangerInfo rhs, Yw.Model.HydroModelInfo hydroInfo)
+        {
+            this.ID = rhs.ID;
+            this.Name = rhs.Name;
+            this.Code = rhs.Code;
+            this.ModelType = rhs.ModelType;
+            this.DbLocked = rhs.DbLocked;
+            this.DbId = rhs.DbId;
+            this.CurveDbId = hydroInfo.Curves?.Find(x => x.Code == rhs.CurveQL)?.DbId;
+            this.Material = rhs.Material;
+            this.Diameter = rhs.Diameter;
+            this.MinorLoss = rhs.MinorLoss;
+        }
+
+        /// <summary>
+        ///
+        /// </summary>
+        public HydroExchangerMatchingViewModel(Yw.Model.HydroExchangerInfo rhs, Yw.Model.HydroModelInfo hydroInfo, HydroCalcuLinkResult calcuResult) : this(rhs, hydroInfo)
+        {
+
+        }
+
+        /// <summary>
+        ///
+        /// </summary>
+        public HydroExchangerMatchingViewModel(HydroExchangerViewModel rhs) : this(rhs.Vmo, rhs.HydroInfo)
+        {
+
+        }
+
+        /// <summary>
+        /// ID
+        /// </summary>
+        public long ID { get; set; }
+
+        /// <summary>
+        /// 缂栫爜
+        /// </summary>
+        public string Code { get; set; }
+
+        /// <summary>
+        /// 鍚嶇О
+        /// </summary>
+        public string Name { get; set; }
+
+        /// <summary>
+        /// Db閿佸畾
+        /// </summary>
+        public bool DbLocked { get; set; }
+
+        /// <summary>
+        /// 鍨嬪彿
+        /// </summary>
+        public string ModelType { get; set; }
+
+        /// <summary>
+        /// DbId
+        /// </summary>
+        public string DbId { get; set; }
+
+        /// <summary>
+        /// CurveDbId
+        /// </summary>
+        public string CurveDbId { get; set; }
+
+        /// <summary>
+        /// 鏉愯川
+        /// </summary>
+        public string Material { get; set; }
+
+        /// <summary>
+        /// 鐩村緞
+        /// </summary>
+        public double Diameter { get; set; }
+
+        /// <summary>
+        /// 鎹熷け绯绘暟
+        /// </summary>
+        public double MinorLoss { get; set; }
+
+        /// <summary>
+        /// 鍖归厤鍨嬪彿
+        /// </summary>
+        public string MatchingModelType { get; set; }
+
+        /// <summary>
+        /// 鍖归厤Dbid
+        /// </summary>
+        public string MatchingDbId { get; set; }
+
+        /// <summary>
+        /// 鍖归厤鏇茬嚎id
+        /// </summary>
+        public string MatchingCurveDbId { get; set; }
+
+        /// <summary>
+        /// 鍖归厤鏉愯川
+        /// </summary>
+        public string MatchingMaterial { get; set; }
+
+        /// <summary>
+        /// 鍖归厤鐩村緞
+        /// </summary>
+        public double? MatchingDiameter { get; set; }
+
+        /// <summary>
+        /// 鍖归厤鎹熷け绯绘暟
+        /// </summary>
+        public double? MatchingMinorLoss { get; set; }
+
+        /// <summary>
+        /// 鍖归厤姘村ご鎹熷け鏇茬嚎
+        /// </summary>
+        public List<HydroCurvePointViewModel> MatchingCurveQL { get; set; }
+
+
+    }
+}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/14-matching/15-compressor/HydroCompressorMatchingViewModel.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/14-matching/15-compressor/HydroCompressorMatchingViewModel.cs
new file mode 100644
index 0000000..90ef59c
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/14-matching/15-compressor/HydroCompressorMatchingViewModel.cs
@@ -0,0 +1,133 @@
+锘縩amespace Yw.WinFrmUI
+{
+    /// <summary>
+    /// 鍘嬬缉鏈哄尮閰峍iewModel
+    /// </summary>
+    public class HydroCompressorMatchingViewModel
+    {
+        /// <summary>
+        ///
+        /// </summary>
+        public HydroCompressorMatchingViewModel() { }
+
+        /// <summary>
+        ///
+        /// </summary>
+        public HydroCompressorMatchingViewModel(Yw.Model.HydroCompressorInfo rhs, Yw.Model.HydroModelInfo hydroInfo)
+        {
+            this.ID = rhs.ID;
+            this.Name = rhs.Name;
+            this.Code = rhs.Code;
+            this.ModelType = rhs.ModelType;
+            this.DbLocked = rhs.DbLocked;
+            this.DbId = rhs.DbId;
+            this.CurveDbId = hydroInfo.Curves?.Find(x => x.Code == rhs.CurveQL)?.DbId;
+            this.Material = rhs.Material;
+            this.Diameter = rhs.Diameter;
+            this.MinorLoss = rhs.MinorLoss;
+        }
+
+        /// <summary>
+        ///
+        /// </summary>
+        public HydroCompressorMatchingViewModel(Yw.Model.HydroCompressorInfo rhs, Yw.Model.HydroModelInfo hydroInfo, HydroCalcuLinkResult calcuResult) : this(rhs, hydroInfo)
+        {
+
+        }
+
+        /// <summary>
+        ///
+        /// </summary>
+        public HydroCompressorMatchingViewModel(HydroCompressorViewModel rhs) : this(rhs.Vmo, rhs.HydroInfo)
+        {
+
+        }
+
+        /// <summary>
+        /// ID
+        /// </summary>
+        public long ID { get; set; }
+
+        /// <summary>
+        /// 缂栫爜
+        /// </summary>
+        public string Code { get; set; }
+
+        /// <summary>
+        /// 鍚嶇О
+        /// </summary>
+        public string Name { get; set; }
+
+        /// <summary>
+        /// Db閿佸畾
+        /// </summary>
+        public bool DbLocked { get; set; }
+
+        /// <summary>
+        /// 鍨嬪彿
+        /// </summary>
+        public string ModelType { get; set; }
+
+        /// <summary>
+        /// DbId
+        /// </summary>
+        public string DbId { get; set; }
+
+        /// <summary>
+        /// CurveDbId
+        /// </summary>
+        public string CurveDbId { get; set; }
+
+        /// <summary>
+        /// 鏉愯川
+        /// </summary>
+        public string Material { get; set; }
+
+        /// <summary>
+        /// 鐩村緞
+        /// </summary>
+        public double Diameter { get; set; }
+
+        /// <summary>
+        /// 鎹熷け绯绘暟
+        /// </summary>
+        public double MinorLoss { get; set; }
+
+        /// <summary>
+        /// 鍖归厤鍨嬪彿
+        /// </summary>
+        public string MatchingModelType { get; set; }
+
+        /// <summary>
+        /// 鍖归厤Dbid
+        /// </summary>
+        public string MatchingDbId { get; set; }
+
+        /// <summary>
+        /// 鍖归厤鏇茬嚎id
+        /// </summary>
+        public string MatchingCurveDbId { get; set; }
+
+        /// <summary>
+        /// 鍖归厤鏉愯川
+        /// </summary>
+        public string MatchingMaterial { get; set; }
+
+        /// <summary>
+        /// 鍖归厤鐩村緞
+        /// </summary>
+        public double? MatchingDiameter { get; set; }
+
+        /// <summary>
+        /// 鍖归厤鎹熷け绯绘暟
+        /// </summary>
+        public double? MatchingMinorLoss { get; set; }
+
+        /// <summary>
+        /// 鍖归厤姘村ご鎹熷け鏇茬嚎
+        /// </summary>
+        public List<HydroCurvePointViewModel> MatchingCurveQL { get; set; }
+
+
+    }
+}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/14-matching/16-tank/HydroTankMatchingViewModel.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/14-matching/16-tank/HydroTankMatchingViewModel.cs
new file mode 100644
index 0000000..ef95a98
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/14-matching/16-tank/HydroTankMatchingViewModel.cs
@@ -0,0 +1,155 @@
+锘縩amespace Yw.WinFrmUI
+{
+    /// <summary>
+    /// 姘存睜鍖归厤ViewModel
+    /// </summary>
+    public class HydroTankMatchingViewModel
+    {
+        /// <summary>
+        ///
+        /// </summary>
+        public HydroTankMatchingViewModel() { }
+
+        /// <summary>
+        ///
+        /// </summary>
+        public HydroTankMatchingViewModel(Yw.Model.HydroTankInfo rhs, Yw.Model.HydroModelInfo hydroInfo)
+        {
+            this.ID = rhs.ID;
+            this.Name = rhs.Name;
+            this.Code = rhs.Code;
+            this.ModelType = rhs.ModelType;
+            this.DbLocked = rhs.DbLocked;
+            this.DbId = rhs.DbId;
+            this.CurveDbId = hydroInfo.Curves?.Find(x => x.Code == rhs.VolCurve)?.DbId;
+            this.MinLevel = rhs.MinLevel;
+            this.MaxLevel = rhs.MaxLevel;
+            this.DN = rhs.DN;
+            this.MinVol = rhs.MinVol;
+            this.OverFlow = rhs.OverFlow;
+        }
+
+        /// <summary>
+        ///
+        /// </summary>
+        public HydroTankMatchingViewModel(Yw.Model.HydroTankInfo rhs, Yw.Model.HydroModelInfo hydroInfo, HydroCalcuNodeResult calcuResult) : this(rhs, hydroInfo)
+        {
+
+        }
+
+        /// <summary>
+        ///
+        /// </summary>
+        public HydroTankMatchingViewModel(HydroTankViewModel rhs) : this(rhs.Vmo, rhs.HydroInfo)
+        {
+
+        }
+
+        /// <summary>
+        /// ID
+        /// </summary>
+        public long ID { get; set; }
+
+        /// <summary>
+        /// 缂栫爜
+        /// </summary>
+        public string Code { get; set; }
+
+        /// <summary>
+        /// 鍚嶇О
+        /// </summary>
+        public string Name { get; set; }
+
+        /// <summary>
+        /// Db閿佸畾
+        /// </summary>
+        public bool DbLocked { get; set; }
+
+        /// <summary>
+        /// 鍨嬪彿
+        /// </summary>
+        public string ModelType { get; set; }
+
+        /// <summary>
+        /// DbId
+        /// </summary>
+        public string DbId { get; set; }
+
+        /// <summary>
+        /// CurveDbId
+        /// </summary>
+        public string CurveDbId { get; set; }
+
+        /// <summary>
+        /// 鏈�浣庢按浣�
+        /// </summary>
+        public double MinLevel { get; set; }
+
+        /// <summary>
+        /// 鏈�楂樻按浣�
+        /// </summary>
+        public double MaxLevel { get; set; }
+
+        /// <summary>
+        /// 鍏О鐩村緞
+        /// </summary>
+        public double DN { get; set; }
+
+        /// <summary>
+        /// 鏈�灏忓绉�
+        /// </summary>
+        public double MinVol { get; set; }
+
+        /// <summary>
+        /// 鏄惁鍏佽婧㈡祦
+        /// </summary>
+        public bool OverFlow { get; set; }
+
+        /// <summary>
+        /// 鍖归厤鍨嬪彿
+        /// </summary>
+        public string MatchingModelType { get; set; }
+
+        /// <summary>
+        /// 鍖归厤Dbid
+        /// </summary>
+        public string MatchingDbId { get; set; }
+
+        /// <summary>
+        /// 鍖归厤鏇茬嚎id
+        /// </summary>
+        public string MatchingCurveDbId { get; set; }
+
+        /// <summary>
+        /// 鍖归厤鏈�浣庢按浣�
+        /// </summary>
+        public double? MatchingMinLevel { get; set; }
+
+        /// <summary>
+        /// 鍖归厤鏈�楂樻按浣�
+        /// </summary>
+        public double? MatchingMaxLevel { get; set; }
+
+        /// <summary>
+        /// 鍖归厤鍏О鐩村緞
+        /// </summary>
+        public double? MatchingDN { get; set; }
+
+        /// <summary>
+        /// 鍖归厤鏈�灏忓绉�
+        /// </summary>
+        public double? MatchingMinVol { get; set; }
+
+        /// <summary>
+        /// 鍖归厤鏄惁鍏佽婧㈡祦
+        /// </summary>
+        public bool? MatchingOverFlow { get; set; }
+
+        /// <summary>
+        /// 鍖归厤瀹圭Н鏇茬嚎
+        /// </summary>
+        public List<HydroCurvePointViewModel> MatchingVolCurve { get; set; }
+
+
+    }
+}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/13-q3d/HydroQ3dViewPage.Designer.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/99-view/01-q3d/HydroQ3dViewPage.Designer.cs
similarity index 100%
rename from WinFrmUI/Yw.WinFrmUI.Hydro.Core/13-q3d/HydroQ3dViewPage.Designer.cs
rename to WinFrmUI/Yw.WinFrmUI.Hydro.Core/99-view/01-q3d/HydroQ3dViewPage.Designer.cs
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/13-q3d/HydroQ3dViewPage.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/99-view/01-q3d/HydroQ3dViewPage.cs
similarity index 100%
rename from WinFrmUI/Yw.WinFrmUI.Hydro.Core/13-q3d/HydroQ3dViewPage.cs
rename to WinFrmUI/Yw.WinFrmUI.Hydro.Core/99-view/01-q3d/HydroQ3dViewPage.cs
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/13-q3d/HydroQ3dViewPage.resx b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/99-view/01-q3d/HydroQ3dViewPage.resx
similarity index 100%
rename from WinFrmUI/Yw.WinFrmUI.Hydro.Core/13-q3d/HydroQ3dViewPage.resx
rename to WinFrmUI/Yw.WinFrmUI.Hydro.Core/99-view/01-q3d/HydroQ3dViewPage.resx
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/14-l2d/HydroL2dViewPage.Designer.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/99-view/02-l2d/HydroL2dViewPage.Designer.cs
similarity index 100%
rename from WinFrmUI/Yw.WinFrmUI.Hydro.Core/14-l2d/HydroL2dViewPage.Designer.cs
rename to WinFrmUI/Yw.WinFrmUI.Hydro.Core/99-view/02-l2d/HydroL2dViewPage.Designer.cs
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/14-l2d/HydroL2dViewPage.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/99-view/02-l2d/HydroL2dViewPage.cs
similarity index 100%
rename from WinFrmUI/Yw.WinFrmUI.Hydro.Core/14-l2d/HydroL2dViewPage.cs
rename to WinFrmUI/Yw.WinFrmUI.Hydro.Core/99-view/02-l2d/HydroL2dViewPage.cs
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/14-l2d/HydroL2dViewPage.resx b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/99-view/02-l2d/HydroL2dViewPage.resx
similarity index 100%
rename from WinFrmUI/Yw.WinFrmUI.Hydro.Core/14-l2d/HydroL2dViewPage.resx
rename to WinFrmUI/Yw.WinFrmUI.Hydro.Core/99-view/02-l2d/HydroL2dViewPage.resx
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/15-l3d/HydroL3dViewPage.Designer.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/99-view/03-l3d/HydroL3dViewPage.Designer.cs
similarity index 100%
rename from WinFrmUI/Yw.WinFrmUI.Hydro.Core/15-l3d/HydroL3dViewPage.Designer.cs
rename to WinFrmUI/Yw.WinFrmUI.Hydro.Core/99-view/03-l3d/HydroL3dViewPage.Designer.cs
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/15-l3d/HydroL3dViewPage.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/99-view/03-l3d/HydroL3dViewPage.cs
similarity index 100%
rename from WinFrmUI/Yw.WinFrmUI.Hydro.Core/15-l3d/HydroL3dViewPage.cs
rename to WinFrmUI/Yw.WinFrmUI.Hydro.Core/99-view/03-l3d/HydroL3dViewPage.cs
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/15-l3d/HydroL3dViewPage.resx b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/99-view/03-l3d/HydroL3dViewPage.resx
similarity index 100%
rename from WinFrmUI/Yw.WinFrmUI.Hydro.Core/15-l3d/HydroL3dViewPage.resx
rename to WinFrmUI/Yw.WinFrmUI.Hydro.Core/99-view/03-l3d/HydroL3dViewPage.resx
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/GlobalUsings.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/GlobalUsings.cs
index 262089a..25c2335 100644
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/GlobalUsings.cs
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/GlobalUsings.cs
@@ -6,3 +6,4 @@
 global using System.ComponentModel.DataAnnotations;
 global using Yw.Vmo;
 global using System.Text;
+global using Yw.Pump;
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 b0ae3a0..7e8d9a4 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,8 @@
 	<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.8" />
+		<PackageReference Include="Yw.BLL.Hydro.Core" Version="3.5.9" />
+		<PackageReference Include="Yw.Pump.Core" Version="3.1.3" />
 	</ItemGroup>
 
 	<ItemGroup>
@@ -59,6 +60,12 @@
 		</Compile>
 		<Compile Update="02-model\HydroModelMgrPage.cs">
 			<SubType>UserControl</SubType>
+		</Compile>
+		<Compile Update="04-viewmodel\07-curve\01-view\HydroCurveViewDlg.cs">
+		  <SubType>Form</SubType>
+		</Compile>
+		<Compile Update="04-viewmodel\07-curve\02-set\SetHydroCurveDlg.cs">
+		  <SubType>Form</SubType>
 		</Compile>
 		<Compile Update="05-property\HydroVisualPropertyCtrl.cs">
 			<SubType>UserControl</SubType>
@@ -138,10 +145,10 @@
 		<Compile Update="06-visual\19-compressor\SetHydroCompressorListDlg.cs">
 			<SubType>Form</SubType>
 		</Compile>
-		<Compile Update="10-working\00-core\SetHydroWorkingBottomCtrl.cs">
+		<Compile Update="10-working\04-set\SetHydroWorkingBottomCtrl.cs">
 		  <SubType>UserControl</SubType>
 		</Compile>
-		<Compile Update="10-working\00-core\SetHydroWorkingDlg.cs">
+		<Compile Update="10-working\04-set\SetHydroWorkingDlg.cs">
 			<SubType>Form</SubType>
 		</Compile>
 		<Compile Update="10-working\02-visual\01-reservoir\SetHydroWorkingReservoirCtrl.cs">
@@ -159,16 +166,19 @@
 		<Compile Update="10-working\02-visual\05-valve\SetHydroWorkingValveCtrl.cs">
 			<SubType>UserControl</SubType>
 		</Compile>
+		<Compile Update="10-working\05-tree\HydroWorkingTreeCtrl.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">
+		<Compile Update="99-view\02-l2d\HydroL2dViewPage.cs">
 			<SubType>UserControl</SubType>
 		</Compile>
-		<Compile Update="15-l3d\HydroL3dViewPage.cs">
+		<Compile Update="99-view\03-l3d\HydroL3dViewPage.cs">
 			<SubType>UserControl</SubType>
 		</Compile>
 		<Compile Update="08-grading\04-tree\SelectHydroGradingPropTreeCtrl.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 ba33b37..9f86429 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
@@ -4,17 +4,11 @@
     <Compile Update="01-scene\AddHydroSceneDlg.cs">
       <SubType>Form</SubType>
     </Compile>
-    <Compile Update="04-viewmodel\07-curve\HydroCurveViewCtrl.cs">
+    <Compile Update="04-viewmodel\07-curve\01-view\HydroCurveViewCtrl.cs">
       <SubType>UserControl</SubType>
     </Compile>
-    <Compile Update="04-viewmodel\07-curve\HydroCurveViewDlg.cs">
-      <SubType>Form</SubType>
-    </Compile>
-    <Compile Update="04-viewmodel\07-curve\SetHydroCurveCtrl.cs">
+    <Compile Update="04-viewmodel\07-curve\02-set\SetHydroCurveCtrl.cs">
       <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Update="04-viewmodel\07-curve\SetHydroCurveDlg.cs">
-      <SubType>Form</SubType>
     </Compile>
     <Compile Update="05-property\HydroVisualPropertyDescriptionCtrl.cs">
       <SubType>UserControl</SubType>
@@ -34,7 +28,7 @@
     <Compile Update="09-check\01-control\HydroCheckResultCtrl.cs">
       <SubType>UserControl</SubType>
     </Compile>
-    <Compile Update="10-working\00-core\SetHydroWorkingCtrl.cs">
+    <Compile Update="10-working\04-set\SetHydroWorkingCtrl.cs">
       <SubType>UserControl</SubType>
     </Compile>
     <Compile Update="10-working\01-basic\SetHydroWorkingBasicCtrl.cs">
@@ -49,7 +43,7 @@
     <Compile Update="12-monitor\02-value\HydroVisualMonitorValueListCtrl.cs">
       <SubType>UserControl</SubType>
     </Compile>
-    <Compile Update="13-q3d\HydroQ3dViewPage.cs">
+    <Compile Update="99-view\01-q3d\HydroQ3dViewPage.cs">
       <SubType>UserControl</SubType>
     </Compile>
     <Compile Update="07-mark\03-view\SetHydroMarkDlg.cs">

--
Gitblit v1.9.3