From f47abf649b85ce5fd21725fedaebba359a6dfd1d Mon Sep 17 00:00:00 2001
From: duheng <2784771470@qq.com>
Date: 星期二, 24 十二月 2024 09:20:02 +0800
Subject: [PATCH] Merge branch 'master' of http://47.103.154.90:83/r/HStation/XHS.V1.0

---
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/21-curve/HydroCurveViewDlg.Designer.cs                                       |   94 +++
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/21-curve/HydroCurveEditCtrl.cs                                               |   92 ++
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/04-link/02-pump/HydroPumpViewModel.cs                           |   12 
 Hydro/Yw.Hydro.Core/ParseHelper.cs                                                                           |    6 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/21-curve/HydroCurveViewDlg.cs                                                |   65 ++
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/21-curve/HydroCurveEditDlg.cs                                                |   84 ++
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/04-link/04-resistance/01-exchanger/HydroExchangerViewModel.cs   |   14 
 Hydro/Yw.EPAnet.Calcu.Core/03-calcu/NetworkEnergyAnalyseExtensions.cs                                        |   16 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/21-curve/HydroCurveEditDlg.Designer.cs                                       |  167 +++++
 Hydro/Yw.EPAnet.Calcu.Core/03-calcu/00-core/NetworkCalcuExtensions.cs                                        |   36 
 Hydro/Yw.EPAnet.Calcu.Core/04-Inp/InpInteropHelper.cs                                                        |    4 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/03-node/01-source/02-tank/00-core/HydroTankViewModel.cs         |    6 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/04-link/04-resistance/00-core/HydroResistanceViewModel.cs       |   10 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/04-link/04-resistance/02-compressor/HydroCompressorViewModel.cs |   14 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/21-curve/HydroCurveEditCtrl.Designer.cs                                      |   58 +
 Hydro/Yw.EPAnet.Calcu.Core/01-network/04-link/01-pipe/Pipe.cs                                                |    8 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/05-property/HydroVisualPropertyCtrl.cs                                       |   60 +
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/21-curve/HydroCurveViewCtrl.cs                                               |   83 ++
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/05-property/HydroVisualPropertyCtrl.resx                                     |  247 +++++--
 Hydro/Yw.EPAnet.Calcu.Core/03-calcu/00-core/NetworkDirectionExtensions.cs                                    |    8 
 Hydro/HStation.Hydro.Core/TransferHelper.cs                                                                  |   20 
 WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/XhsProjectSimulationCorePage.cs              |    5 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/05-property/HydroVisualPropertyCtrl.Designer.cs                              |   92 ++
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/Yw.WinFrmUI.Hydro.Core.csproj                                                |    7 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/21-curve/HydroCurveEditDlg.resx                                              |  120 +++
 Hydro/Yw.EPAnet.Calcu.Core/03-calcu/NetworkPathAnalyseExtensions.cs                                          |    6 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/Yw.WinFrmUI.Hydro.Core.csproj.user                                           |    6 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/14-matching/00-core/HydroMatchingHelper.cs                                   |   18 
 WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/01-property/SimulationPropertyCtrl.cs                      |   43 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/21-curve/HydroCurveViewDlg.resx                                              |  120 +++
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/21-curve/HydroCurveViewCtrl.resx                                             |  120 +++
 Hydro/Yw.EPAnet.Calcu.Core/03-calcu/03-link/CalcuLink.cs                                                     |   14 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/21-curve/HydroCurveEditCtrl.resx                                             |  120 +++
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/21-curve/HydroCurveViewCtrl.Designer.cs                                      |   60 +
 34 files changed, 1,628 insertions(+), 207 deletions(-)

diff --git a/Hydro/HStation.Hydro.Core/TransferHelper.cs b/Hydro/HStation.Hydro.Core/TransferHelper.cs
index f355674..35d081c 100644
--- a/Hydro/HStation.Hydro.Core/TransferHelper.cs
+++ b/Hydro/HStation.Hydro.Core/TransferHelper.cs
@@ -42,6 +42,7 @@
                 foreach (var revitReservoir in revitModel.Reservoirs)
                 {
                     var reservoir = FromRevit(revitReservoir, ref allScenePropValueList);
+                    //reservoir.PropStatusList = null;//涓存椂浠g爜
                     hydro.Reservoirs.Add(reservoir);
                 }
             }
@@ -56,6 +57,7 @@
                 foreach (var revitTank in revitModel.Tanks)
                 {
                     var tank = FromRevit(revitTank, ref allScenePropValueList);
+                    //tank.PropStatusList = null;//涓存椂浠g爜
                     hydro.Tanks.Add(tank);
                 }
             }
@@ -70,6 +72,7 @@
                 foreach (var revitWaterbox in revitModel.Waterboxs)
                 {
                     var waterbox = FromRevit(revitWaterbox, ref allScenePropValueList);
+                    //waterbox.PropStatusList = null;//涓存椂浠g爜
                     hydro.Waterboxs.Add(waterbox);
                 }
             }
@@ -84,6 +87,7 @@
                 foreach (var revitJunction in revitModel.Junctions)
                 {
                     var junction = FromRevit(revitJunction, ref allScenePropValueList);
+                    //junction.PropStatusList = null;//涓存椂浠g爜
                     hydro.Junctions.Add(junction);
                 }
             }
@@ -98,6 +102,7 @@
                 foreach (var revitBlunthead in revitModel.Bluntheads)
                 {
                     var blunthead = FromRevit(revitBlunthead, ref allScenePropValueList);
+                    //blunthead.PropStatusList = null;//涓存椂浠g爜
                     hydro.Bluntheads.Add(blunthead);
                 }
             }
@@ -112,6 +117,7 @@
                 foreach (var revitElbow in revitModel.Elbows)
                 {
                     var elbow = FromRevit(revitElbow, ref allScenePropValueList);
+                    //elbow.PropStatusList = null;//涓存椂浠g爜
                     hydro.Elbows.Add(elbow);
                 }
             }
@@ -126,6 +132,7 @@
                 foreach (var revitThreelink in revitModel.Threelinks)
                 {
                     var threelink = FromRevit(revitThreelink, ref allScenePropValueList);
+                    //threelink.PropStatusList = null;//涓存椂浠g爜
                     hydro.Threelinks.Add(threelink);
                 }
             }
@@ -140,6 +147,7 @@
                 foreach (var revitFourlink in revitModel.Fourlinks)
                 {
                     var fourlink = FromRevit(revitFourlink, ref allScenePropValueList);
+                    //fourlink.PropStatusList = null;//涓存椂浠g爜
                     hydro.Fourlinks.Add(fourlink);
                 }
             }
@@ -154,6 +162,7 @@
                 foreach (var revitHydrant in revitModel.Hydrants)
                 {
                     var hydrant = FromRevit(revitHydrant, ref allScenePropValueList);
+                    //hydrant.PropStatusList = null;//涓存椂浠g爜
                     hydro.Hydrants.Add(hydrant);
                 }
             }
@@ -168,6 +177,7 @@
                 foreach (var revitNozzle in revitModel.Nozzles)
                 {
                     var nozzle = FromRevit(revitNozzle, ref allScenePropValueList);
+                    //nozzle.PropStatusList = null;//涓存椂浠g爜
                     hydro.Nozzles.Add(nozzle);
                 }
             }
@@ -182,6 +192,7 @@
                 foreach (var revitCooling in revitModel.Coolings)
                 {
                     var cooling = FromRevit(revitCooling, ref allScenePropValueList);
+                    //cooling.PropStatusList = null;//涓存椂浠g爜
                     hydro.Coolings.Add(cooling);
                 }
             }
@@ -196,6 +207,7 @@
                 foreach (var revitMeter in revitModel.Meters)
                 {
                     var meter = FromRevit(revitMeter, ref allScenePropValueList);
+                    //meter.PropStatusList = null;//涓存椂浠g爜
                     hydro.Meters.Add(meter);
                 }
             }
@@ -210,6 +222,7 @@
                 foreach (var revitFlowmeter in revitModel.Flowmeters)
                 {
                     var flowmeter = FromRevit(revitFlowmeter, ref allScenePropValueList);
+                    //flowmeter.PropStatusList = null;//涓存椂浠g爜
                     hydro.Flowmeters.Add(flowmeter);
                 }
             }
@@ -224,6 +237,7 @@
                 foreach (var revitPressmeter in revitModel.Pressmeters)
                 {
                     var pressmeter = FromRevit(revitPressmeter, ref allScenePropValueList);
+                    //pressmeter.PropStatusList = null;//涓存椂浠g爜
                     hydro.Pressmeters.Add(pressmeter);
                 }
             }
@@ -238,6 +252,7 @@
                 foreach (var revitPipe in revitModel.Pipes)
                 {
                     var pipe = FromRevit(revitPipe, ref allScenePropValueList);
+                    //pipe.PropStatusList = null;//涓存椂浠g爜
                     hydro.Pipes.Add(pipe);
                 }
             }
@@ -252,6 +267,7 @@
                 foreach (var revitTranslation in revitModel.Translations)
                 {
                     var translation = FromRevit(revitTranslation, ref allScenePropValueList);
+                    //translation.PropStatusList = null;//涓存椂浠g爜
                     hydro.Translations.Add(translation);
                 }
             }
@@ -266,6 +282,7 @@
                 foreach (var revitPump in revitModel.Pumps)
                 {
                     var pump = FromRevit(revitPump, ref allScenePropValueList);
+                    //pump.PropStatusList = null;//涓存椂浠g爜
                     hydro.Pumps.Add(pump);
                 }
             }
@@ -280,6 +297,7 @@
                 foreach (var revitValve in revitModel.Valves)
                 {
                     var valve = FromRevit(revitValve, ref allScenePropValueList);
+                    //valve.PropStatusList = null;//涓存椂浠g爜
                     hydro.Valves.Add(valve);
                 }
             }
@@ -294,6 +312,7 @@
                 foreach (var revitExchanger in revitModel.Exchangers)
                 {
                     var exchanger = FromRevit(revitExchanger, ref allScenePropValueList);
+                    //exchanger.PropStatusList = null;//涓存椂浠g爜
                     hydro.Exchangers.Add(exchanger);
                 }
             }
@@ -308,6 +327,7 @@
                 foreach (var revitCompressor in revitModel.Compressors)
                 {
                     var compressor = FromRevit(revitCompressor, ref allScenePropValueList);
+                    //compressor.PropStatusList = null;//涓存椂浠g爜
                     hydro.Compressors.Add(compressor);
                 }
             }
diff --git a/Hydro/Yw.EPAnet.Calcu.Core/01-network/04-link/01-pipe/Pipe.cs b/Hydro/Yw.EPAnet.Calcu.Core/01-network/04-link/01-pipe/Pipe.cs
index 15292ef..a45e7fe 100644
--- a/Hydro/Yw.EPAnet.Calcu.Core/01-network/04-link/01-pipe/Pipe.cs
+++ b/Hydro/Yw.EPAnet.Calcu.Core/01-network/04-link/01-pipe/Pipe.cs
@@ -18,7 +18,7 @@
             this.Diameter = rhs.Diameter;
             this.Length = rhs.Length;
             this.Roughness = rhs.Roughness;
-            this.MinorLoss = rhs.MinorLoss;
+            this.MinorLossCoeff = rhs.MinorLossCoeff;
         }
 
         /// <summary>
@@ -39,9 +39,9 @@
         /// <summary>
         /// 灞�闃荤郴鏁�
         /// </summary>
-        public double MinorLoss { get; set; }
-        public double EndMinorloss { get; set; }
-        public double StartMinorloss { get; set; }
+        public double MinorLossCoeff { get; set; }
+        public double EndMinorLossCoeff { get; set; }
+        public double StartMinorLossCoeff { get; set; }
     }
 
 
diff --git a/Hydro/Yw.EPAnet.Calcu.Core/03-calcu/00-core/NetworkCalcuExtensions.cs b/Hydro/Yw.EPAnet.Calcu.Core/03-calcu/00-core/NetworkCalcuExtensions.cs
index d919cfc..039b713 100644
--- a/Hydro/Yw.EPAnet.Calcu.Core/03-calcu/00-core/NetworkCalcuExtensions.cs
+++ b/Hydro/Yw.EPAnet.Calcu.Core/03-calcu/00-core/NetworkCalcuExtensions.cs
@@ -126,11 +126,17 @@
                             break;
 
                     }
+                }
+
+                {
+                    var v = calcuLink.HeadLoss;
                     if (linkdict[calcuLink.Id] is Pipe p)
                     {
-                        double minorloss1 = p.StartMinorloss * Math.Pow(calcuLink.Velocity, 2) / 2 / 9.81;
-                        double minorloss2 = p.EndMinorloss * Math.Pow(calcuLink.Velocity, 2) / 2 / 9.81;
-                        double minorloss = p.MinorLoss * Math.Pow(calcuLink.Velocity, 2) / 2 / 9.81;
+                        double minorloss1 = p.StartMinorLossCoeff * Math.Pow(calcuLink.Velocity, 2) / 2 / 9.81;
+                        double minorloss2 = p.EndMinorLossCoeff * Math.Pow(calcuLink.Velocity, 2) / 2 / 9.81;
+                        calcuLink.StartMinorLoss=minorloss1;
+                        calcuLink.EndMinorLoss=minorloss2;
+                        double minorloss = p.MinorLossCoeff * Math.Pow(calcuLink.Velocity, 2) / 2 / 9.81;
                         calcuLink.HeadLoss -= minorloss1 + minorloss2;
                         calcuLink.MinorLoss = minorloss;
                         calcuLink.FrictionLoss = calcuLink.HeadLoss - minorloss;
@@ -148,10 +154,6 @@
                     {
                         calcuLink.MinorLoss = v;
                     }
-
-
-
-
                 }
                 result.LinkList.Add(calcuLink);
             }
@@ -178,8 +180,8 @@
             {
                 if (link is Pipe p)
                 {
-                    p.StartMinorloss = 0;
-                    p.EndMinorloss = 0;
+                    p.StartMinorLossCoeff = 0;
+                    p.EndMinorLossCoeff = 0;
                 }
             }
             foreach (var node in allNodeList)
@@ -208,7 +210,7 @@
                     var prevLink = prevLinks[0] as Pipe;
                     if (prevLink != null)
                     {
-                        prevLink.EndMinorloss = elbow.MinorLoss.Value / 2f;
+                        prevLink.EndMinorLossCoeff = elbow.MinorLoss.Value / 2f;
                     }
                     if (nextLinks.Count != 1)
                     {
@@ -217,7 +219,7 @@
                     var nextLink = nextLinks[0] as Pipe;
                     if (nextLink != null)
                     {
-                        nextLink.StartMinorloss = elbow.MinorLoss.Value / 2f;
+                        nextLink.StartMinorLossCoeff = elbow.MinorLoss.Value / 2f;
                     }
                 }
                 else if (node is Threelink threelink)
@@ -262,9 +264,9 @@
                                 if (minorLoss.HasValue)
                                 {
                                     if (isNext)
-                                        branchPipe.StartMinorloss = minorLoss.Value;
+                                        branchPipe.StartMinorLossCoeff = minorLoss.Value;
                                     else
-                                        branchPipe.EndMinorloss = minorLoss.Value;
+                                        branchPipe.EndMinorLossCoeff = minorLoss.Value;
                                 }
                             }
                         }
@@ -277,9 +279,9 @@
                                 if (minorLoss.HasValue)
                                 {
                                     if (isNext)
-                                        branchPipe.StartMinorloss = minorLoss.Value;
+                                        branchPipe.StartMinorLossCoeff = minorLoss.Value;
                                     else
-                                        branchPipe.EndMinorloss = minorLoss.Value;
+                                        branchPipe.EndMinorLossCoeff = minorLoss.Value;
 
                                 }
                             }
@@ -310,11 +312,11 @@
                         {
                             if (isNext)
                             {
-                                pipe.StartMinorloss = fourlink.MinorLoss.Value;
+                                pipe.StartMinorLossCoeff = fourlink.MinorLoss.Value;
                             }
                             else
                             {
-                                pipe.EndMinorloss = fourlink.MinorLoss.Value;
+                                pipe.EndMinorLossCoeff = fourlink.MinorLoss.Value;
                             }
 
                         }
diff --git a/Hydro/Yw.EPAnet.Calcu.Core/03-calcu/00-core/NetworkDirectionExtensions.cs b/Hydro/Yw.EPAnet.Calcu.Core/03-calcu/00-core/NetworkDirectionExtensions.cs
index 823ab15..996f0b7 100644
--- a/Hydro/Yw.EPAnet.Calcu.Core/03-calcu/00-core/NetworkDirectionExtensions.cs
+++ b/Hydro/Yw.EPAnet.Calcu.Core/03-calcu/00-core/NetworkDirectionExtensions.cs
@@ -129,9 +129,9 @@
                     }
                     if (linkdict[calcuLink.Id] is Pipe p)
                     {
-                        double minorloss1 = p.StartMinorloss * Math.Pow(calcuLink.Velocity, 2) / 2 / 9.81;
-                        double minorloss2 = p.EndMinorloss * Math.Pow(calcuLink.Velocity, 2) / 2 / 9.81;
-                        double minorloss = p.MinorLoss * Math.Pow(calcuLink.Velocity, 2) / 2 / 9.81;
+                        double minorloss1 = p.StartMinorLossCoeff * Math.Pow(calcuLink.Velocity, 2) / 2 / 9.81;
+                        double minorloss2 = p.EndMinorLossCoeff * Math.Pow(calcuLink.Velocity, 2) / 2 / 9.81;
+                        double minorloss = p.MinorLossCoeff * Math.Pow(calcuLink.Velocity, 2) / 2 / 9.81;
                         calcuLink.HeadLoss -= minorloss1 + minorloss2;
                         calcuLink.MinorLoss = minorloss;
                         calcuLink.FrictionLoss = calcuLink.HeadLoss - minorloss;
@@ -295,7 +295,7 @@
                     x.Roughness = 110;
                 }
                 string statusString = x.LinkStatus == PipeStatus.Closed ? "CLOSED" : "";
-                double minorLoss = x.MinorLoss + x.EndMinorloss + x.StartMinorloss;
+                double minorLoss = x.MinorLossCoeff + x.EndMinorLossCoeff + x.StartMinorLossCoeff;
                 pipeSb.AppendLine($"{x.Id}\t{x.StartNode.Id}\t{x.EndNode.Id}\t{x.Length}\t{x.Diameter}\t{x.Roughness}\t{minorLoss}\t{statusString}\t;\t");// + $"{p.Level}");
                 if (x.LinkStatus != PipeStatus.Open)
                 {
diff --git a/Hydro/Yw.EPAnet.Calcu.Core/03-calcu/03-link/CalcuLink.cs b/Hydro/Yw.EPAnet.Calcu.Core/03-calcu/03-link/CalcuLink.cs
index 6072ddc..1a1e310 100644
--- a/Hydro/Yw.EPAnet.Calcu.Core/03-calcu/03-link/CalcuLink.cs
+++ b/Hydro/Yw.EPAnet.Calcu.Core/03-calcu/03-link/CalcuLink.cs
@@ -33,18 +33,26 @@
         public double Velocity { get; set; }
 
         /// <summary>
-        /// 姘村ご鎹熷け
+        /// 姘村ご鎹熷け(m)
         /// </summary>
         public double HeadLoss { get; set; }
 
         /// <summary>
-        /// 灞�闃绘按澶存崯澶�
+        /// 灞�闃绘按澶存崯澶�(m)
         /// </summary>
         public double MinorLoss { get; set; }
 
         /// <summary>
-        /// 娌跨▼姘村ご鎹熷け
+        /// 娌跨▼姘村ご鎹熷け(m)
         /// </summary>
         public double FrictionLoss { get; set; }
+        /// <summary>
+        /// 娌跨▼姘村ご鎹熷け_寮�濮�(m)
+        /// </summary>
+        public double StartMinorLoss { get;  set; }
+        /// <summary>
+        /// 娌跨▼姘村ご鎹熷け_缁撴潫(m)
+        /// </summary>
+        public double EndMinorLoss { get;  set; }
     }
 }
diff --git a/Hydro/Yw.EPAnet.Calcu.Core/03-calcu/NetworkEnergyAnalyseExtensions.cs b/Hydro/Yw.EPAnet.Calcu.Core/03-calcu/NetworkEnergyAnalyseExtensions.cs
index e283041..d927fcd 100644
--- a/Hydro/Yw.EPAnet.Calcu.Core/03-calcu/NetworkEnergyAnalyseExtensions.cs
+++ b/Hydro/Yw.EPAnet.Calcu.Core/03-calcu/NetworkEnergyAnalyseExtensions.cs
@@ -118,15 +118,15 @@
 
                     var cStartnode = (dictLinks[ link.Id].Flow > 0 ? link.StartNode : link.EndNode) as Node;
                     var cEndnode = (dictLinks[link.Id].Flow > 0 ? link.EndNode : link.StartNode) as Node;
-                    var endNodeMinorlossCoff = p.EndMinorloss;
-                    var startNodeMinorlossCoff = p.StartMinorloss;
+                    var endNodeMinorlossCoff = p.EndMinorLossCoeff;
+                    var startNodeMinorlossCoff = p.StartMinorLossCoeff;
                     //鏍规嵁p.diameter鍜宲.flow璁$畻娴侀��
                     double velocity = dictLinks[p.Id].Flow / (Math.PI * Math.Pow(p.Diameter / 2, 2));
                     var flow = Math.Abs(dictLinks[p.Id].Flow);
-                    if (p.StartMinorloss!=0)
+                    if (p.StartMinorLossCoeff!=0)
                     {
                         //鏍规嵁娴侀�熻绠楀眬閮ㄦ按澶存崯澶�
-                        double headminorloss1 = p.StartMinorloss * Math.Pow(velocity, 2) / 2 / 9.81;
+                        double headminorloss1 = p.StartMinorLossCoeff * Math.Pow(velocity, 2) / 2 / 9.81;
                         double energypower=GetEnergyPowerByQH(flow, headminorloss1);
                         var Id = cStartnode.Id;
                         if (!result.LossEnergy.ContainsKey(Id)) result.LossEnergy.Add(Id, new List<EnergyPoint>());
@@ -153,10 +153,10 @@
                         points.Add(point);
                     }
 
-                    if (p.EndMinorloss != 0)
+                    if (p.EndMinorLossCoeff != 0)
                     {
                         //鏍规嵁娴侀�熻绠楀眬閮ㄦ按澶存崯澶�
-                        double headminorloss2 = p.EndMinorloss * Math.Pow(velocity, 2) / 2 / 9.81;
+                        double headminorloss2 = p.EndMinorLossCoeff * Math.Pow(velocity, 2) / 2 / 9.81;
                         double energypower = GetEnergyPowerByQH(flow, headminorloss2);
                         var Id = cEndnode.Id;
                         if (!result.LossEnergy.ContainsKey(Id)) result.LossEnergy.Add(Id, new List<EnergyPoint>());
@@ -183,10 +183,10 @@
                     }
 
                     double pipeheadminorloss = 0;
-                    if (p.MinorLoss!=0)
+                    if (p.MinorLossCoeff!=0)
                     {
                         //鏍规嵁娴侀�熻绠楀眬閮ㄦ按澶存崯澶�
-                        pipeheadminorloss = p.MinorLoss * Math.Pow(velocity, 2) / 2 / 9.81;
+                        pipeheadminorloss = p.MinorLossCoeff * Math.Pow(velocity, 2) / 2 / 9.81;
                         double energypower = GetEnergyPowerByQH(flow, pipeheadminorloss);
                         var Id = p.Id;
                         if (!result.LossEnergy.ContainsKey(Id)) result.LossEnergy.Add(Id, new List<EnergyPoint>());
diff --git a/Hydro/Yw.EPAnet.Calcu.Core/03-calcu/NetworkPathAnalyseExtensions.cs b/Hydro/Yw.EPAnet.Calcu.Core/03-calcu/NetworkPathAnalyseExtensions.cs
index 3df4d85..d539e31 100644
--- a/Hydro/Yw.EPAnet.Calcu.Core/03-calcu/NetworkPathAnalyseExtensions.cs
+++ b/Hydro/Yw.EPAnet.Calcu.Core/03-calcu/NetworkPathAnalyseExtensions.cs
@@ -81,7 +81,7 @@
                     length += p.Length;
 
             }
-
+            nodeEnd.Distance = length;
             chartNodes.Add(nodeEnd);
 
             for (int i=0;i<links.Count;i++)
@@ -96,8 +96,8 @@
                     //鏍规嵁p.diameter鍜宲.flow璁$畻娴侀��
                     double velocity = dictLinks[ p.Id].Flow/ (Math.PI * Math.Pow(p.Diameter / 2, 2));
                     //鏍规嵁娴侀�熻绠楀眬閮ㄦ按澶存崯澶�
-                    double minorloss1 = p.StartMinorloss* Math.Pow(velocity, 2) / 2 / 9.81;
-                    double minorloss2 = p.EndMinorloss * Math.Pow(velocity, 2) / 2 / 9.81;
+                    double minorloss1 = dictLinks[p.Id].StartMinorLoss;
+                    double minorloss2 = dictLinks[p.Id].EndMinorLoss;
 
 
                     if (i < links.Count - 1)
diff --git a/Hydro/Yw.EPAnet.Calcu.Core/04-Inp/InpInteropHelper.cs b/Hydro/Yw.EPAnet.Calcu.Core/04-Inp/InpInteropHelper.cs
index 0a5bb8c..a143881 100644
--- a/Hydro/Yw.EPAnet.Calcu.Core/04-Inp/InpInteropHelper.cs
+++ b/Hydro/Yw.EPAnet.Calcu.Core/04-Inp/InpInteropHelper.cs
@@ -141,7 +141,7 @@
                     x.Roughness = 110;
                 }
                 string statusString = x.LinkStatus == PipeStatus.Closed ? "CLOSED" : "";
-                double minorLoss = x.MinorLoss + x.EndMinorloss + x.StartMinorloss;
+                double minorLoss = x.MinorLossCoeff + x.EndMinorLossCoeff + x.StartMinorLossCoeff;
                 pipeSb.AppendLine($"{x.Id}\t{x.StartNode.Id}\t{x.EndNode.Id}\t{x.Length}\t{x.Diameter}\t{x.Roughness}\t{minorLoss}\t{statusString}\t;\t");// + $"{p.Level}");
                 if (x.LinkStatus != PipeStatus.Open)
                 {
@@ -446,7 +446,7 @@
                                         p.Roughness = roughness;
                                     float minorLoss;
                                     if (float.TryParse(parts[6], out minorLoss))
-                                        p.MinorLoss = minorLoss;
+                                        p.MinorLossCoeff = minorLoss;
                                     p.LinkStatus = parts.Length > 7 ? (parts[7].ToUpper().Contains("CLOSE")? PipeStatus.Closed : PipeStatus.Open) : PipeStatus.Open;
                                     
                                     net.Pipes.Add(p);
diff --git a/Hydro/Yw.Hydro.Core/ParseHelper.cs b/Hydro/Yw.Hydro.Core/ParseHelper.cs
index d5ec8ac..356e8f1 100644
--- a/Hydro/Yw.Hydro.Core/ParseHelper.cs
+++ b/Hydro/Yw.Hydro.Core/ParseHelper.cs
@@ -324,7 +324,7 @@
                     pipeModel.Length = pipe.Length;
                     pipeModel.Diameter = pipe.Diameter;
                     pipeModel.Roughness = pipe.Roughness;
-                    pipeModel.MinorLoss = pipe.MinorLoss;
+                    pipeModel.MinorLossCoeff = pipe.MinorLoss;
                     netWork.Pipes.Add(pipeModel);
                 }
             }
@@ -344,7 +344,7 @@
                     translationModel.Length = translation.Length;
                     translationModel.Diameter = translation.Diameter;
                     translationModel.Roughness = translation.Roughness;
-                    translationModel.MinorLoss = translation.MinorLoss;
+                    translationModel.MinorLossCoeff = translation.MinorLoss;
                     netWork.Translations.Add(translationModel);
                 }
             }
@@ -391,7 +391,7 @@
                         pipeModel.Length = 0.01;
                         pipeModel.Diameter = valve.Diameter;
                         pipeModel.Roughness = 110;
-                        pipeModel.MinorLoss = valve.MinorLoss;
+                        pipeModel.MinorLossCoeff = valve.MinorLoss;
                         netWork.Pipes.Add(pipeModel);
                     }
                     else
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/01-property/SimulationPropertyCtrl.cs b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/01-property/SimulationPropertyCtrl.cs
index 129cd5e..5cdc0f6 100644
--- a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/01-property/SimulationPropertyCtrl.cs
+++ b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/01-property/SimulationPropertyCtrl.cs
@@ -2,6 +2,7 @@
 using HStation.WinFrmUI.PhartRelation;
 using HStation.WinFrmUI.Xhs;
 using Yw.Model;
+using Yw.WinFrmUI.HydroW3d;
 
 namespace HStation.WinFrmUI
 {
@@ -429,12 +430,16 @@
             {
                 case HydroCurve.Tank:
                     {
-                        if (long.TryParse(vm.DbId, out long longDbId))
+                        var tankViewModel = vm as HydroTankViewModel;
+                        var curveInfo = tankViewModel.HydroInfo.Curves?.Find(x => x.Code == tankViewModel.VolCurve);
+                        if (curveInfo != null)
                         {
-                            var tankViewModel = vm as HydroTankViewModel;
-                            var dlg = new AssetsTankCurveVOLViewDlg();
-                            dlg.SetBindingData(longDbId);
-                            dlg.ShowDialog();
+                            if (long.TryParse(curveInfo.DbId, out long longDbId))
+                            {
+                                var dlg = new AssetsTankCurveVOLViewDlg();
+                                dlg.SetBindingData(longDbId);
+                                dlg.ShowDialog();
+                            }
                         }
                     }
                     break;
@@ -473,24 +478,32 @@
 
                 case HydroCurve.Exchanger:
                     {
-                        if (long.TryParse(vm.DbId, out long longDbId))
+                        var exchangerViewModel = vm as HydroExchangerViewModel;
+                        var curveInfo = exchangerViewModel.HydroInfo.Curves?.Find(x => x.Code == exchangerViewModel.CurveQL);
+                        if (curveInfo != null)
                         {
-                            var exchangerViewModel = vm as HydroExchangerViewModel;
-                            var dlg = new AssetsExchangerCurveQLViewDlg();
-                            dlg.SetBindingData(longDbId);
-                            dlg.ShowDialog();
+                            if (long.TryParse(curveInfo.DbId, out long longDbId))
+                            {
+                                var dlg = new AssetsExchangerCurveQLViewDlg();
+                                dlg.SetBindingData(longDbId);
+                                dlg.ShowDialog();
+                            }
                         }
                     }
                     break;
 
                 case HydroCurve.Compressor:
                     {
-                        if (long.TryParse(vm.DbId, out long longDbId))
+                        var compressorViewModel = vm as HydroCompressorViewModel;
+                        var curveInfo = compressorViewModel.HydroInfo.Curves?.Find(x => x.Code == compressorViewModel.CurveQL);
+                        if (curveInfo != null)
                         {
-                            var compressorViewModel = vm as HydroCompressorViewModel;
-                            var dlg = new AssetsCompressorCurveQLViewDlg();
-                            dlg.SetBindingData(longDbId);
-                            dlg.ShowDialog();
+                            if (long.TryParse(curveInfo.DbId, out long longDbId))
+                            {
+                                var dlg = new AssetsCompressorCurveQLViewDlg();
+                                dlg.SetBindingData(longDbId);
+                                dlg.ShowDialog();
+                            }
                         }
                     }
                     break;
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 9c91753..7929d87 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
@@ -816,11 +816,10 @@
             {
                 return default;
             }
-            if (_allDecoratorCodes != null)
+            if (_allDecoratorCodes == null)
             {
-                return default;
+                _allDecoratorCodes = await BLLFactory<Yw.BLL.HydroDecoratorInfo>.Instance.GetCodeListByModelID(_hydroInfo.ID, null);
             }
-            _allDecoratorCodes = await BLLFactory<Yw.BLL.HydroDecoratorInfo>.Instance.GetCodeListByModelID(_hydroInfo.ID, null);
             if (_allDecoratorCodes == null)
             {
                 _allDecoratorCodes = new List<string>();
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/03-node/01-source/02-tank/00-core/HydroTankViewModel.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/03-node/01-source/02-tank/00-core/HydroTankViewModel.cs
index 01b387b..d2ac7aa 100644
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/03-node/01-source/02-tank/00-core/HydroTankViewModel.cs
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/03-node/01-source/02-tank/00-core/HydroTankViewModel.cs
@@ -114,7 +114,7 @@
         [PropertyOrder(1007)]
         [HydroCurvePro(HydroCurve.Tank, HydroCurveType.CurveVol)]
         [ShowEditorInView(true)]
-        [Browsable(true)]
+        [Browsable(false)]
         public string Curve
         {
             get
@@ -134,9 +134,9 @@
         [DisplayName("瀹圭Н鏇茬嚎")]
         [Display(Name = "瀹圭Н鏇茬嚎")]
         [PropertyOrder(1008)]
-        [HydroCurvePro(HydroCurve.TankVol, HydroCurveType.CurveVol)]
+        [HydroCurvePro(HydroCurve.Tank, HydroCurveType.CurveVol)]
         [ShowEditorInView(true)]
-        [Browsable(false)]
+        [Browsable(true)]
         public string VolCurve { get; set; }
 
         /// <summary>
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/04-link/02-pump/HydroPumpViewModel.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/04-link/02-pump/HydroPumpViewModel.cs
index 74099ca..b393a40 100644
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/04-link/02-pump/HydroPumpViewModel.cs
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/04-link/02-pump/HydroPumpViewModel.cs
@@ -194,8 +194,8 @@
         [Category("鏁版嵁")]
         [DisplayName("娴侀噺鎵▼鏇茬嚎")]
         [PropertyOrder(2010)]
-        [HydroCurvePro(HydroCurve.PumpQH, HydroCurveType.CurveQH)]
-        [Browsable(false)]
+        [HydroCurvePro(HydroCurve.Pump, HydroCurveType.CurveQH)]
+        [Browsable(true)]
         public string CurveQH { get; set; }
 
         /// <summary>
@@ -204,8 +204,8 @@
         [Category("鏁版嵁")]
         [DisplayName("娴侀噺鍔熺巼鏇茬嚎")]
         [PropertyOrder(2011)]
-        [HydroCurvePro(HydroCurve.PumpQP, HydroCurveType.CurveQP)]
-        [Browsable(false)]
+        [HydroCurvePro(HydroCurve.Pump, HydroCurveType.CurveQP)]
+        [Browsable(true)]
         public string CurveQP { get; set; }
 
         /// <summary>
@@ -214,8 +214,8 @@
         [Category("鏁版嵁")]
         [DisplayName("娴侀噺鏁堢巼鏇茬嚎")]
         [PropertyOrder(2012)]
-        [HydroCurvePro(HydroCurve.PumpQE, HydroCurveType.CurveQE)]
-        [Browsable(false)]
+        [HydroCurvePro(HydroCurve.Pump, HydroCurveType.CurveQE)]
+        [Browsable(true)]
         public string CurveQE { get; set; }
 
         /// <summary>
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/04-link/04-resistance/00-core/HydroResistanceViewModel.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/04-link/04-resistance/00-core/HydroResistanceViewModel.cs
index f8f408d..b017a86 100644
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/04-link/04-resistance/00-core/HydroResistanceViewModel.cs
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/04-link/04-resistance/00-core/HydroResistanceViewModel.cs
@@ -72,9 +72,9 @@
         /// </summary>
         [Category("鏁版嵁")]
         [DisplayName("姘村ご鎹熷け鏇茬嚎")]
-        [HydroCurvePro(HydroCurve.ResistanceQL, HydroCurveType.CurveQL)]
+        [HydroCurvePro(HydroCurve.Resistance, HydroCurveType.CurveQL)]
         [PropertyOrder(1004)]
-        [Browsable(true)]
+        [Browsable(false)]
         public virtual string Curve
         {
             get
@@ -93,9 +93,9 @@
         [Category("鏁版嵁")]
         [DisplayName("姘村ご鎹熷け鏇茬嚎")]
         [PropertyOrder(1005)]
-        [HydroCurvePro(HydroCurve.ResistanceQL, HydroCurveType.CurveQL)]
-        [Browsable(false)]
-        public string CurveQL { get; set; }
+        [HydroCurvePro(HydroCurve.Resistance, HydroCurveType.CurveQL)]
+        [Browsable(true)]
+        public virtual string CurveQL { get; set; }
 
         /// <summary>
         /// 娌跨▼鎹熷け
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/04-link/04-resistance/01-exchanger/HydroExchangerViewModel.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/04-link/04-resistance/01-exchanger/HydroExchangerViewModel.cs
index 299d167..8036979 100644
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/04-link/04-resistance/01-exchanger/HydroExchangerViewModel.cs
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/04-link/04-resistance/01-exchanger/HydroExchangerViewModel.cs
@@ -25,9 +25,9 @@
         /// </summary>
         [Category("鏁版嵁")]
         [DisplayName("姘村ご鎹熷け鏇茬嚎")]
-        [HydroCurvePro(HydroCurve.ExchangerQL)]
+        [HydroCurvePro(HydroCurve.Exchanger, HydroCurveType.CurveQL)]
         [PropertyOrder(1004)]
-        [Browsable(true)]
+        [Browsable(false)]
         public override string Curve
         {
             get
@@ -41,6 +41,16 @@
         }
 
         /// <summary>
+        /// 姘村ご鎹熷け鏇茬嚎
+        /// </summary>
+        [Category("鏁版嵁")]
+        [DisplayName("姘村ご鎹熷け鏇茬嚎")]
+        [PropertyOrder(1005)]
+        [HydroCurvePro(HydroCurve.Exchanger, HydroCurveType.CurveQL)]
+        [Browsable(true)]
+        public override string CurveQL { get; set; }
+
+        /// <summary>
         /// 
         /// </summary>
         [Browsable(false)]
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/04-link/04-resistance/02-compressor/HydroCompressorViewModel.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/04-link/04-resistance/02-compressor/HydroCompressorViewModel.cs
index 878f042..9a70a98 100644
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/04-link/04-resistance/02-compressor/HydroCompressorViewModel.cs
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/04-link/04-resistance/02-compressor/HydroCompressorViewModel.cs
@@ -23,9 +23,9 @@
         /// </summary>
         [Category("鏁版嵁")]
         [DisplayName("姘村ご鎹熷け鏇茬嚎")]
-        [HydroCurvePro(HydroCurve.CompressorQL)]
+        [HydroCurvePro(HydroCurve.Compressor, HydroCurveType.CurveQL)]
         [PropertyOrder(1004)]
-        [Browsable(true)]
+        [Browsable(false)]
         public override string Curve
         {
             get
@@ -39,6 +39,16 @@
         }
 
         /// <summary>
+        /// 姘村ご鎹熷け鏇茬嚎
+        /// </summary>
+        [Category("鏁版嵁")]
+        [DisplayName("姘村ご鎹熷け鏇茬嚎")]
+        [PropertyOrder(1005)]
+        [HydroCurvePro(HydroCurve.Compressor, HydroCurveType.CurveQL)]
+        [Browsable(true)]
+        public override string CurveQL { get; set; }
+
+        /// <summary>
         /// 
         /// </summary>
         [Browsable(false)]
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 9592014..b5164ad 100644
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/05-property/HydroVisualPropertyCtrl.Designer.cs
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/05-property/HydroVisualPropertyCtrl.Designer.cs
@@ -29,16 +29,16 @@
         private void InitializeComponent()
         {
             components = new Container();
+            DevExpress.Utils.SuperToolTip superToolTip8 = new DevExpress.Utils.SuperToolTip();
+            DevExpress.Utils.ToolTipItem toolTipItem8 = new DevExpress.Utils.ToolTipItem();
+            DevExpress.Utils.SuperToolTip superToolTip6 = new DevExpress.Utils.SuperToolTip();
+            DevExpress.Utils.ToolTipItem toolTipItem6 = new DevExpress.Utils.ToolTipItem();
+            DevExpress.Utils.SuperToolTip superToolTip7 = new DevExpress.Utils.SuperToolTip();
+            DevExpress.Utils.ToolTipItem toolTipItem7 = new DevExpress.Utils.ToolTipItem();
             ComponentResourceManager resources = new ComponentResourceManager(typeof(HydroVisualPropertyCtrl));
-            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.ToolTipItem toolTipItem3 = new DevExpress.Utils.ToolTipItem();
-            DevExpress.Utils.SuperToolTip superToolTip4 = new DevExpress.Utils.SuperToolTip();
-            DevExpress.Utils.ToolTipTitleItem toolTipTitleItem1 = new DevExpress.Utils.ToolTipTitleItem();
-            DevExpress.Utils.ToolTipItem toolTipItem4 = new DevExpress.Utils.ToolTipItem();
+            DevExpress.Utils.SuperToolTip superToolTip5 = new DevExpress.Utils.SuperToolTip();
+            DevExpress.Utils.ToolTipTitleItem toolTipTitleItem2 = new DevExpress.Utils.ToolTipTitleItem();
+            DevExpress.Utils.ToolTipItem toolTipItem5 = new DevExpress.Utils.ToolTipItem();
             layoutControl1 = new DevExpress.XtraLayout.LayoutControl();
             hydroVisualPropertyDescriptionCtrl1 = new HydroVisualPropertyDescriptionCtrl();
             propertyGridControl1 = new DevExpress.XtraVerticalGrid.PropertyGridControl();
@@ -59,6 +59,9 @@
             barDockControlBottom = new DevExpress.XtraBars.BarDockControl();
             barDockControlLeft = new DevExpress.XtraBars.BarDockControl();
             barDockControlRight = new DevExpress.XtraBars.BarDockControl();
+            barBtnEditCurve = new DevExpress.XtraBars.BarButtonItem();
+            barBtnViewCurve = new DevExpress.XtraBars.BarButtonItem();
+            radialMenu1 = new DevExpress.XtraBars.Ribbon.RadialMenu(components);
             ((ISupportInitialize)layoutControl1).BeginInit();
             layoutControl1.SuspendLayout();
             ((ISupportInitialize)propertyGridControl1).BeginInit();
@@ -68,6 +71,7 @@
             ((ISupportInitialize)layoutDescription).BeginInit();
             ((ISupportInitialize)splitterItem1).BeginInit();
             ((ISupportInitialize)barManager1).BeginInit();
+            ((ISupportInitialize)radialMenu1).BeginInit();
             SuspendLayout();
             // 
             // layoutControl1
@@ -165,8 +169,8 @@
             barManager1.DockControls.Add(barDockControlLeft);
             barManager1.DockControls.Add(barDockControlRight);
             barManager1.Form = this;
-            barManager1.Items.AddRange(new DevExpress.XtraBars.BarItem[] { barBtnHelp, barBtnExpandAll, barBtnCollpseAll, barBtnChangeLink, barBtnView, barBtnMatchingDb });
-            barManager1.MaxItemId = 22;
+            barManager1.Items.AddRange(new DevExpress.XtraBars.BarItem[] { barBtnHelp, barBtnExpandAll, barBtnCollpseAll, barBtnChangeLink, barBtnView, barBtnMatchingDb, barBtnEditCurve, barBtnViewCurve });
+            barManager1.MaxItemId = 24;
             // 
             // bar1
             // 
@@ -211,9 +215,9 @@
             barBtnMatchingDb.Id = 18;
             barBtnMatchingDb.ImageOptions.SvgImage = (DevExpress.Utils.Svg.SvgImage)resources.GetObject("barBtnMatchingDb.ImageOptions.SvgImage");
             barBtnMatchingDb.Name = "barBtnMatchingDb";
-            toolTipItem1.Text = "浠庝骇鍝佸簱涓繘琛岄�夋嫨";
-            superToolTip1.Items.Add(toolTipItem1);
-            barBtnMatchingDb.SuperTip = superToolTip1;
+            toolTipItem8.Text = "浠庝骇鍝佸簱涓繘琛岄�夋嫨";
+            superToolTip8.Items.Add(toolTipItem8);
+            barBtnMatchingDb.SuperTip = superToolTip8;
             barBtnMatchingDb.ItemClick += barBtnMatchingDb_ItemClick;
             // 
             // barBtnChangeLink
@@ -221,9 +225,9 @@
             barBtnChangeLink.Id = 16;
             barBtnChangeLink.ImageOptions.SvgImage = (DevExpress.Utils.Svg.SvgImage)resources.GetObject("barBtnChangeLink.ImageOptions.SvgImage");
             barBtnChangeLink.Name = "barBtnChangeLink";
-            toolTipItem2.Text = "璋冩暣涓婁笅娓�";
-            superToolTip2.Items.Add(toolTipItem2);
-            barBtnChangeLink.SuperTip = superToolTip2;
+            toolTipItem6.Text = "璋冩暣涓婁笅娓�";
+            superToolTip6.Items.Add(toolTipItem6);
+            barBtnChangeLink.SuperTip = superToolTip6;
             barBtnChangeLink.Visibility = DevExpress.XtraBars.BarItemVisibility.Never;
             barBtnChangeLink.ItemClick += barBtnChangeLink_ItemClick;
             // 
@@ -232,9 +236,9 @@
             barBtnView.Id = 17;
             barBtnView.ImageOptions.SvgImage = (DevExpress.Utils.Svg.SvgImage)resources.GetObject("barBtnView.ImageOptions.SvgImage");
             barBtnView.Name = "barBtnView";
-            toolTipItem3.Text = "鏌ョ湅";
-            superToolTip3.Items.Add(toolTipItem3);
-            barBtnView.SuperTip = superToolTip3;
+            toolTipItem7.Text = "鏌ョ湅";
+            superToolTip7.Items.Add(toolTipItem7);
+            barBtnView.SuperTip = superToolTip7;
             barBtnView.Visibility = DevExpress.XtraBars.BarItemVisibility.Never;
             barBtnView.ItemClick += barBtnView_ItemClick;
             // 
@@ -245,14 +249,14 @@
             barBtnHelp.ImageOptions.SvgImage = (DevExpress.Utils.Svg.SvgImage)resources.GetObject("barBtnHelp.ImageOptions.SvgImage");
             barBtnHelp.ImageOptions.SvgImageSize = new Size(20, 20);
             barBtnHelp.Name = "barBtnHelp";
-            toolTipTitleItem1.Appearance.Image = (Image)resources.GetObject("resource.Image");
-            toolTipTitleItem1.Appearance.Options.UseImage = true;
-            toolTipTitleItem1.ImageOptions.Image = (Image)resources.GetObject("resource.Image1");
-            toolTipItem4.LeftIndent = 6;
-            toolTipItem4.Text = "鎻忚堪淇℃伅";
-            superToolTip4.Items.Add(toolTipTitleItem1);
-            superToolTip4.Items.Add(toolTipItem4);
-            barBtnHelp.SuperTip = superToolTip4;
+            toolTipTitleItem2.Appearance.Image = (Image)resources.GetObject("resource.Image");
+            toolTipTitleItem2.Appearance.Options.UseImage = true;
+            toolTipTitleItem2.ImageOptions.Image = (Image)resources.GetObject("resource.Image1");
+            toolTipItem5.LeftIndent = 6;
+            toolTipItem5.Text = "鎻忚堪淇℃伅";
+            superToolTip5.Items.Add(toolTipTitleItem2);
+            superToolTip5.Items.Add(toolTipItem5);
+            barBtnHelp.SuperTip = superToolTip5;
             barBtnHelp.ItemClick += barBtnHelp_ItemClick;
             // 
             // barDockControlTop
@@ -287,6 +291,34 @@
             barDockControlRight.Manager = barManager1;
             barDockControlRight.Size = new Size(0, 602);
             // 
+            // barBtnEditCurve
+            // 
+            barBtnEditCurve.Caption = "缂栬緫鏇茬嚎";
+            barBtnEditCurve.CloseRadialMenuOnItemClick = true;
+            barBtnEditCurve.Id = 22;
+            barBtnEditCurve.ImageOptions.SvgImage = (DevExpress.Utils.Svg.SvgImage)resources.GetObject("barBtnEditCurve.ImageOptions.SvgImage");
+            barBtnEditCurve.ImageOptions.SvgImageSize = new Size(16, 16);
+            barBtnEditCurve.Name = "barBtnEditCurve";
+            barBtnEditCurve.ItemClick += barBtnEditCurve_ItemClick;
+            // 
+            // barBtnViewCurve
+            // 
+            barBtnViewCurve.Caption = "鏌ョ湅鏇茬嚎";
+            barBtnViewCurve.CloseRadialMenuOnItemClick = true;
+            barBtnViewCurve.Id = 23;
+            barBtnViewCurve.ImageOptions.SvgImage = (DevExpress.Utils.Svg.SvgImage)resources.GetObject("barBtnViewCurve.ImageOptions.SvgImage");
+            barBtnViewCurve.ImageOptions.SvgImageSize = new Size(16, 16);
+            barBtnViewCurve.Name = "barBtnViewCurve";
+            barBtnViewCurve.ItemClick += barBtnViewCurve_ItemClick;
+            // 
+            // radialMenu1
+            // 
+            radialMenu1.AutoExpand = true;
+            radialMenu1.Glyph = (Image)resources.GetObject("radialMenu1.Glyph");
+            radialMenu1.LinksPersistInfo.AddRange(new DevExpress.XtraBars.LinkPersistInfo[] { new DevExpress.XtraBars.LinkPersistInfo(barBtnEditCurve), new DevExpress.XtraBars.LinkPersistInfo(barBtnViewCurve) });
+            radialMenu1.Manager = barManager1;
+            radialMenu1.Name = "radialMenu1";
+            // 
             // HydroVisualPropertyCtrl
             // 
             AutoScaleDimensions = new SizeF(7F, 14F);
@@ -307,6 +339,7 @@
             ((ISupportInitialize)layoutDescription).EndInit();
             ((ISupportInitialize)splitterItem1).EndInit();
             ((ISupportInitialize)barManager1).EndInit();
+            ((ISupportInitialize)radialMenu1).EndInit();
             ResumeLayout(false);
             PerformLayout();
         }
@@ -333,5 +366,8 @@
         private DevExpress.XtraLayout.LayoutControlItem layoutDescription;
         private DevExpress.Utils.SvgImageCollection svgImg16;
         private DevExpress.XtraBars.BarButtonItem barBtnMatchingDb;
+        private DevExpress.XtraBars.BarButtonItem barBtnEditCurve;
+        private DevExpress.XtraBars.BarButtonItem barBtnViewCurve;
+        private DevExpress.XtraBars.Ribbon.RadialMenu radialMenu1;
     }
 }
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/05-property/HydroVisualPropertyCtrl.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/05-property/HydroVisualPropertyCtrl.cs
index 2228f50..9214e30 100644
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/05-property/HydroVisualPropertyCtrl.cs
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/05-property/HydroVisualPropertyCtrl.cs
@@ -1,4 +1,5 @@
-锘縰sing DevExpress.XtraBars;
+锘縰sing DevExpress.Utils.MVVM;
+using DevExpress.XtraBars;
 using DevExpress.XtraEditors;
 using DevExpress.XtraEditors.Controls;
 using DevExpress.XtraEditors.Repository;
@@ -360,7 +361,18 @@
                         {
                             return;
                         }
-                        this.SetCurveEvent?.Invoke(vm, curvePropAttri.Curve, curvePropAttri.CurveType);
+                        if (string.IsNullOrEmpty(curvePropAttri.CurveType))
+                        {
+                            this.SetCurveEvent?.Invoke(vm, curvePropAttri.Curve, curvePropAttri.CurveType);
+                        }
+                        else
+                        {
+                            if (e.Row.Properties.Value == null || string.IsNullOrEmpty(e.Row.Properties.Value.ToString()))
+                            {
+                                return;
+                            }
+                            this.radialMenu1.ShowPopup(MousePosition);
+                        }
                     };
                     e.RepositoryItem = buttonEdit;
                 }
@@ -770,6 +782,50 @@
 
         }
 
+        //鏌ョ湅鏇茬嚎
+        private void barBtnViewCurve_ItemClick(object sender, ItemClickEventArgs e)
+        {
+            var vm = this.SelectedObject;
+            if (vm == null)
+            {
+                return;
+            }
+            var row = this.propertyGridControl1.FocusedRow;
+            var code = row.Properties.Value?.ToString();
+            var curve = vm.HydroInfo.Curves?.Find(x => x.Code == code);
+            if (curve == null)
+            {
+                return;
+            }
+            var dlg = new HydroCurveViewDlg();
+            dlg.SetBindingData(curve);
+            dlg.ShowDialog();
+        }
+
+        //缂栬緫鏇茬嚎
+        private void barBtnEditCurve_ItemClick(object sender, ItemClickEventArgs e)
+        {
+            var vm = this.SelectedObject;
+            if (vm == null)
+            {
+                return;
+            }
+            var row = this.propertyGridControl1.FocusedRow;
+            var code = row.Properties.Value?.ToString();
+            var curve = vm.HydroInfo.Curves?.Find(x => x.Code == code);
+            if (curve == null)
+            {
+                return;
+            }
+            var dlg = new HydroCurveEditDlg();
+            dlg.ReloadDataEvent += (rhs) =>
+            {
+
+            };
+            dlg.SetBindingData(curve);
+            dlg.ShowDialog();
+        }
+
 
     }
 }
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/05-property/HydroVisualPropertyCtrl.resx b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/05-property/HydroVisualPropertyCtrl.resx
index 58704fa..704052d 100644
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/05-property/HydroVisualPropertyCtrl.resx
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/05-property/HydroVisualPropertyCtrl.resx
@@ -120,98 +120,13 @@
   <metadata name="svgImg16.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
     <value>17, 17</value>
   </metadata>
+  <metadata name="svgImg16.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
   <metadata name="barManager1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
     <value>151, 19</value>
   </metadata>
   <assembly alias="DevExpress.Data.v23.2" name="DevExpress.Data.v23.2, Culture=neutral, PublicKeyToken=b88d1754d700e49a" />
-  <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="barBtnMatchingDb.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
-    <value>
-        AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIzLjIsIFZlcnNpb249MjMuMi40
-        LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
-        dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAAMACAAAC77u/
-        PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi
-        IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv
-        MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh
-        Y2U9InByZXNlcnZlIiBpZD0iU2VsZWN0IiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAz
-        MiAzMiI+DQogIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CgkuQmxhY2t7ZmlsbDojNzI3MjcyO30KCS5C
-        bHVle2ZpbGw6IzExNzdENzt9Cgkuc3Qwe29wYWNpdHk6MC41O30KPC9zdHlsZT4NCiAgPGcgY2xhc3M9
-        InN0MCI+DQogICAgPHBhdGggZD0iTTEwLDEwSDZWNmg0VjEweiBNMjQsNkgxMnY0aDEyVjZ6IE0xMCwx
-        Mkg2djEyaDRWMTJ6IiBjbGFzcz0iQmx1ZSIgLz4NCiAgPC9nPg0KICA8cGF0aCBkPSJNMTYsMjhoLTEu
-        OEgxMkgzYy0wLjYsMC0xLTAuNC0xLTFWM2MwLTAuNiwwLjQtMSwxLTFoMjRjMC42LDAsMSwwLjQsMSwx
-        djl2Mi4ydjYuOWwtMi0ydi01VjEyVjRINHYyMmg4aDIuMSAgSDE2VjI4eiBNMjQuMiwyNkgzMEwxOCwx
-        NHYxNi41bDQtNGwyLDVjMC4yLDAuNCwwLjYsMC42LDEsMC40bDAuNy0wLjNjMC40LTAuMiwwLjYtMC42
-        LDAuNC0xTDI0LjIsMjZ6IiBjbGFzcz0iQmxhY2siIC8+DQo8L3N2Zz4L
-</value>
-  </data>
-  <data name="barBtnChangeLink.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
-    <value>
-        AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIzLjIsIFZlcnNpb249MjMuMi40
-        LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
-        dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAAK0BAAAC77u/
-        PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi
-        IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv
-        MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBlbmFibGUt
-        YmFja2dyb3VuZD0ibmV3IDAgMCAzMiAzMiIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgaWQ9IkxheWVyXzEi
-        Pg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLkdyZWVue2ZpbGw6IzAzOUMyMzt9Cjwvc3R5bGU+
-        DQogIDxwb2x5Z29uIHBvaW50cz0iMzAsMjIgMjIsMTYgMjIsMjAgMTIsMjAgMjgsNCAyMiw0IDIsNCAy
-        LDggMTgsOCAyLDI0IDIyLDI0IDIyLDI4ICIgZmlsbD0iIzAzOUMyMyIgY2xhc3M9IkdyZWVuIiAvPg0K
-        PC9zdmc+Cw==
-</value>
-  </data>
-  <data name="barBtnView.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
-    <value>
-        AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIzLjIsIFZlcnNpb249MjMuMi40
-        LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
-        dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAADUCAAAC77u/
-        PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi
-        IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv
-        MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh
-        Y2U9InByZXNlcnZlIiBpZD0iTGF5ZXJfMSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAg
-        MzIgMzIiPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLkJsdWV7ZmlsbDojMTE3N0Q3O30KCS5Z
-        ZWxsb3d7ZmlsbDojRkZCMTE1O30KCS5CbGFja3tmaWxsOiM3MjcyNzI7fQoJLkdyZWVue2ZpbGw6IzAz
-        OUMyMzt9CgkuUmVke2ZpbGw6I0QxMUMxQzt9Cgkuc3Qwe29wYWNpdHk6MC43NTt9Cgkuc3Qxe29wYWNp
-        dHk6MC41O30KPC9zdHlsZT4NCiAgPGcgaWQ9IlNlbmQiPg0KICAgIDxwb2x5Z29uIHBvaW50cz0iMiwy
-        MCA4LDIyLjQgMjQsMTAgMTIsMjQgMTIsMzAgMTYuMywyNS43IDIyLDI4IDMwLDIgICIgY2xhc3M9IkJs
-        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
@@ -268,4 +183,160 @@
         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
+        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="barBtnChangeLink.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIzLjIsIFZlcnNpb249MjMuMi40
+        LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
+        dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAAK0BAAAC77u/
+        PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi
+        IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv
+        MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBlbmFibGUt
+        YmFja2dyb3VuZD0ibmV3IDAgMCAzMiAzMiIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgaWQ9IkxheWVyXzEi
+        Pg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLkdyZWVue2ZpbGw6IzAzOUMyMzt9Cjwvc3R5bGU+
+        DQogIDxwb2x5Z29uIHBvaW50cz0iMzAsMjIgMjIsMTYgMjIsMjAgMTIsMjAgMjgsNCAyMiw0IDIsNCAy
+        LDggMTgsOCAyLDI0IDIyLDI0IDIyLDI4ICIgZmlsbD0iIzAzOUMyMyIgY2xhc3M9IkdyZWVuIiAvPg0K
+        PC9zdmc+Cw==
+</value>
+  </data>
+  <data name="barBtnView.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIzLjIsIFZlcnNpb249MjMuMi40
+        LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
+        dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAADUCAAAC77u/
+        PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi
+        IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv
+        MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh
+        Y2U9InByZXNlcnZlIiBpZD0iTGF5ZXJfMSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAg
+        MzIgMzIiPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLkJsdWV7ZmlsbDojMTE3N0Q3O30KCS5Z
+        ZWxsb3d7ZmlsbDojRkZCMTE1O30KCS5CbGFja3tmaWxsOiM3MjcyNzI7fQoJLkdyZWVue2ZpbGw6IzAz
+        OUMyMzt9CgkuUmVke2ZpbGw6I0QxMUMxQzt9Cgkuc3Qwe29wYWNpdHk6MC43NTt9Cgkuc3Qxe29wYWNp
+        dHk6MC41O30KPC9zdHlsZT4NCiAgPGcgaWQ9IlNlbmQiPg0KICAgIDxwb2x5Z29uIHBvaW50cz0iMiwy
+        MCA4LDIyLjQgMjQsMTAgMTIsMjQgMTIsMzAgMTYuMywyNS43IDIyLDI4IDMwLDIgICIgY2xhc3M9IkJs
+        dWUiIC8+DQogIDwvZz4NCjwvc3ZnPgs=
+</value>
+  </data>
+  <data name="barBtnMatchingDb.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIzLjIsIFZlcnNpb249MjMuMi40
+        LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
+        dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAAMACAAAC77u/
+        PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi
+        IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv
+        MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh
+        Y2U9InByZXNlcnZlIiBpZD0iU2VsZWN0IiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAz
+        MiAzMiI+DQogIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CgkuQmxhY2t7ZmlsbDojNzI3MjcyO30KCS5C
+        bHVle2ZpbGw6IzExNzdENzt9Cgkuc3Qwe29wYWNpdHk6MC41O30KPC9zdHlsZT4NCiAgPGcgY2xhc3M9
+        InN0MCI+DQogICAgPHBhdGggZD0iTTEwLDEwSDZWNmg0VjEweiBNMjQsNkgxMnY0aDEyVjZ6IE0xMCwx
+        Mkg2djEyaDRWMTJ6IiBjbGFzcz0iQmx1ZSIgLz4NCiAgPC9nPg0KICA8cGF0aCBkPSJNMTYsMjhoLTEu
+        OEgxMkgzYy0wLjYsMC0xLTAuNC0xLTFWM2MwLTAuNiwwLjQtMSwxLTFoMjRjMC42LDAsMSwwLjQsMSwx
+        djl2Mi4ydjYuOWwtMi0ydi01VjEyVjRINHYyMmg4aDIuMSAgSDE2VjI4eiBNMjQuMiwyNkgzMEwxOCwx
+        NHYxNi41bDQtNGwyLDVjMC4yLDAuNCwwLjYsMC42LDEsMC40bDAuNy0wLjNjMC40LTAuMiwwLjYtMC42
+        LDAuNC0xTDI0LjIsMjZ6IiBjbGFzcz0iQmxhY2siIC8+DQo8L3N2Zz4L
+</value>
+  </data>
+  <data name="barBtnEditCurve.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIzLjIsIFZlcnNpb249MjMuMi40
+        LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
+        dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAABwFAAAC77u/
+        PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi
+        IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv
+        MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh
+        Y2U9InByZXNlcnZlIiBpZD0iTGF5ZXJfMSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAg
+        MzIgMzIiPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLlllbGxvd3tmaWxsOiNGRkIxMTU7fQoJ
+        LlJlZHtmaWxsOiNEMTFDMUM7fQoJLkJsYWNre2ZpbGw6IzcyNzI3Mjt9CgkuQmx1ZXtmaWxsOiMxMTc3
+        RDc7fQoJLldoaXRle2ZpbGw6I0ZGRkZGRjt9CgkuR3JlZW57ZmlsbDojMDM5QzIzO30KCS5zdDB7b3Bh
+        Y2l0eTowLjc1O30KCS5zdDF7b3BhY2l0eTowLjU7fQoJLnN0MntvcGFjaXR5OjAuMjU7fQoJLnN0M3tm
+        aWxsOiNGRkIxMTU7fQo8L3N0eWxlPg0KICA8ZyAvPg0KICA8ZyBpZD0iUmVuYW1lXzFfIj4NCiAgICA8
+        cGF0aCBkPSJNMi4xLDE2aDIuMmwwLjYtMi4zaDMuMkw4LjgsMTZIMTFMNy44LDZINS40TDIuMSwxNnog
+        TTYuNCw4LjdjMC4xLTAuMywwLjEtMC42LDAuMS0wLjloMC4xICAgYzAsMC4zLDAuMSwwLjYsMC4xLDAu
+        OWwxLDMuM0g1LjRMNi40LDguN3ogTTE3LjUsMTAuNmMwLjYtMC4yLDEuMS0wLjUsMS41LTAuOWMwLjQt
+        MC40LDAuNi0wLjksMC42LTEuNGMwLTAuNy0wLjMtMS4zLTAuOS0xLjcgICBDMTguMSw2LjIsMTcuMSw2
+        LDE1LjksNkgxMnY5LjlWMTZoNGMxLjIsMCwyLjItMC4yLDIuOS0wLjhDMTkuNywxNC42LDIwLDE0LDIw
+        LDEzYzAtMC42LTAuMi0xLjItMC43LTEuNiAgIEMxOC45LDExLDE4LjMsMTAuNywxNy41LDEwLjZ6IE0x
+        NC40LDcuN2gwLjljMS4xLDAsMS43LDAuNCwxLjcsMS4xYzAsMC40LTAuMSwwLjctMC40LDAuOUMxNi40
+        LDkuOSwxNiwxMCwxNS41LDEwaC0xLjFWNy43eiAgICBNMTcsMTMuOGMtMC4zLDAuMi0wLjgsMC40LTEu
+        MywwLjRoLTEuM3YtMi42aDEuM2MwLjUsMCwwLjksMC4xLDEuMywwLjNjMC4zLDAuMiwwLjUsMC42LDAu
+        NSwwLjlDMTcuNSwxMy4zLDE3LjQsMTMuNiwxNywxMy44eiIgY2xhc3M9IkJsYWNrIiAvPg0KICAgIDxw
+        YXRoIGQ9Ik0yNywxOWwtOCw4bC00LTRsOC04TDI3LDE5eiBNMjgsMThsMS43LTEuN2MwLjQtMC40LDAu
+        NC0xLDAtMS4zTDI3LDEyLjNjLTAuNC0wLjQtMS0wLjQtMS4zLDBMMjQsMTRMMjgsMTh6ICAgIE0xNCwy
+        NHY0aDRMMTQsMjR6IiBjbGFzcz0iQmx1ZSIgLz4NCiAgPC9nPg0KPC9zdmc+Cw==
+</value>
+  </data>
+  <data name="barBtnViewCurve.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>
+  <metadata name="radialMenu1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>286, 19</value>
+  </metadata>
+  <data name="radialMenu1.Glyph" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAAAE3RFWHRUaXRsZQBTcGxpbmU7
+        Q2hhcnQ78fOrVwAAAcFJREFUWEfF1M8rBGEcBnAStfwF4sqJUuTkP/AjFFLKhTMuLg6yy9KWwmUPihQ5
+        2ISwDk5OysERKRxckYu0WeP5bvNu77zzbL2zh9fh0+w839nnuzu7TYXnef+Khi7R0CUaukRDl2joEg1n
+        99PlGoUr+IZ32IUOKF5j7goFQn9DBFtwDyNQBw0wB18wCYXrzF2hQKiLI1iAW6jVMtXVDXmoUZkuFAi5
+        MIJq+IFWLSvQ+nZgWc+UUCBUgaVxuDSyAq2vGX6hUt8jAiflQGkGZthM6Y1fTA8kz3LDqaN1cxY4KQeW
+        P0E7myn4AC/6URc4iQqLq0D+YDE2V+QOyHI5mrPASVSDydN5yLNiWzS01ZfIvsqR3VpbNLQ1lDpeLXVr
+        bdHQFn77LrhjM1s0lG9k882wvAdu2MwWDWW5HNVvXAqWT8Ehm9mi4dha5qR/6fxzIr1Hn14KZpuwyGa2
+        aKig/BE6QV4zz9BmZEWs00RDBSUJ2NZLNXG4NrIA1mmioYKSGDzAhv9askZYgQ9o8TOKdZpoqPhF9ZCF
+        nO8NDqAJAgtNrNNEQ8UolOe+ugtWWKeJhi7R0CUaukRDl2joEg3d8Sr+ANJg/Rqdan19AAAAAElFTkSu
+        QmCC
+</value>
+  </data>
 </root>
\ No newline at end of file
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
index 5791993..ca67a33 100644
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/14-matching/00-core/HydroMatchingHelper.cs
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/14-matching/00-core/HydroMatchingHelper.cs
@@ -1121,7 +1121,7 @@
                         curvevol.ModelType = string.Empty;
                         curvevol.DbLocked = false;
                         curvevol.DbId = matching.MatchingCurveDbId;
-                        curvevol.CurveType = Yw.WinFrmUI.HydroCurve.TankVol;
+                        curvevol.CurveType = Yw.WinFrmUI.HydroCurveType.CurveVol;
                         curvevol.CurveData = matching.MatchingVolCurve?.Select(x => new Yw.Model.Hydro.CurvePoint(x.X, x.Y)).ToList();
                         if (hydroInfo.Curves == null)
                         {
@@ -2155,7 +2155,7 @@
                         curveqh.ModelType = string.Empty;
                         curveqh.DbLocked = false;
                         curveqh.DbId = matching.MatchingCurveDbId;
-                        curveqh.CurveType = Yw.WinFrmUI.HydroCurve.PumpQH;
+                        curveqh.CurveType = Yw.WinFrmUI.HydroCurveType.CurveQH;
                         curveqh.CurveData = matching.MatchingCurveQH?.Select(x => new Yw.Model.Hydro.CurvePoint(x.X, x.Y)).ToList();
                         if (hydroInfo.Curves == null)
                         {
@@ -2187,7 +2187,7 @@
                         curveqp.ModelType = string.Empty;
                         curveqp.DbLocked = false;
                         curveqp.DbId = matching.MatchingCurveDbId;
-                        curveqp.CurveType = Yw.WinFrmUI.HydroCurve.PumpQP;
+                        curveqp.CurveType = Yw.WinFrmUI.HydroCurveType.CurveQP;
                         curveqp.CurveData = matching.MatchingCurveQP?.Select(x => new Yw.Model.Hydro.CurvePoint(x.X, x.Y)).ToList();
                         if (hydroInfo.Curves == null)
                         {
@@ -2219,7 +2219,7 @@
                         curveqe.ModelType = string.Empty;
                         curveqe.DbLocked = false;
                         curveqe.DbId = matching.MatchingCurveDbId;
-                        curveqe.CurveType = Yw.WinFrmUI.HydroCurve.PumpQE;
+                        curveqe.CurveType = Yw.WinFrmUI.HydroCurveType.CurveQE;
                         curveqe.CurveData = matching.MatchingCurveQE?.Select(x => new Yw.Model.Hydro.CurvePoint(x.X, x.Y)).ToList();
                         if (hydroInfo.Curves == null)
                         {
@@ -2384,7 +2384,7 @@
                                     curveol.ModelType = visual.ModelType;
                                     curveol.DbLocked = false;
                                     curveol.DbId = matching.MatchingCurveDbId;
-                                    curveol.CurveType = Yw.WinFrmUI.HydroCurve.ValveOL;
+                                    curveol.CurveType = Yw.WinFrmUI.HydroCurveType.CurveOL;
                                     curveol.CurveData = matching.MatchingCurveOL?.Select(x => new Yw.Model.Hydro.CurvePoint(x.X, x.Y)).ToList();
                                     if (hydroInfo.Curves == null)
                                     {
@@ -2410,7 +2410,7 @@
                         {
                             if (!string.IsNullOrEmpty(matching.MatchingCurveDbId))
                             {
-                                //闃�闂ㄥ紑搴︽崯澶辩郴鏁版洸绾�
+                                //姘村ご鎹熷け鏇茬嚎
                                 var curveql = hydroInfo.Curves?.Find(x => x.Code == visual.ValveSetting);
                                 if (curveql == null)
                                 {
@@ -2421,7 +2421,7 @@
                                     curveql.ModelType = visual.ModelType;
                                     curveql.DbLocked = false;
                                     curveql.DbId = matching.MatchingCurveDbId;
-                                    curveql.CurveType = Yw.WinFrmUI.HydroCurve.ValveOL;
+                                    curveql.CurveType = Yw.WinFrmUI.HydroCurveType.CurveQL;
                                     curveql.CurveData = matching.MatchingCurveQL?.Select(x => new Yw.Model.Hydro.CurvePoint(x.X, x.Y)).ToList();
                                     if (hydroInfo.Curves == null)
                                     {
@@ -2533,7 +2533,7 @@
                         curvevql.ModelType = string.Empty;
                         curvevql.DbLocked = false;
                         curvevql.DbId = matching.MatchingCurveDbId;
-                        curvevql.CurveType = Yw.WinFrmUI.HydroCurve.ExchangerQL;
+                        curvevql.CurveType = Yw.WinFrmUI.HydroCurveType.CurveQL;
                         curvevql.CurveData = matching.MatchingCurveQL?.Select(x => new Yw.Model.Hydro.CurvePoint(x.X, x.Y)).ToList();
                         if (hydroInfo.Curves == null)
                         {
@@ -2642,7 +2642,7 @@
                         curvevql.ModelType = string.Empty;
                         curvevql.DbLocked = false;
                         curvevql.DbId = matching.MatchingCurveDbId;
-                        curvevql.CurveType = Yw.WinFrmUI.HydroCurve.CompressorQL;
+                        curvevql.CurveType = Yw.WinFrmUI.HydroCurveType.CurveQL;
                         curvevql.CurveData = matching.MatchingCurveQL?.Select(x => new Yw.Model.Hydro.CurvePoint(x.X, x.Y)).ToList();
                         if (hydroInfo.Curves == null)
                         {
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/21-curve/HydroCurveEditCtrl.Designer.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/21-curve/HydroCurveEditCtrl.Designer.cs
new file mode 100644
index 0000000..38dd771
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/21-curve/HydroCurveEditCtrl.Designer.cs
@@ -0,0 +1,58 @@
+锘縩amespace Yw.WinFrmUI
+{
+    partial class HydroCurveEditCtrl
+    {
+        /// <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()
+        {
+            universalChartExcelEditCtrl1 = new Phart.UniversalChartExcelEditCtrl();
+            SuspendLayout();
+            // 
+            // universalChartExcelEditCtrl1
+            // 
+            universalChartExcelEditCtrl1.Appearance.BackColor = SystemColors.Control;
+            universalChartExcelEditCtrl1.Appearance.Options.UseBackColor = true;
+            universalChartExcelEditCtrl1.Dock = DockStyle.Fill;
+            universalChartExcelEditCtrl1.Location = new Point(0, 0);
+            universalChartExcelEditCtrl1.Name = "universalChartExcelEditCtrl1";
+            universalChartExcelEditCtrl1.Size = new Size(947, 568);
+            universalChartExcelEditCtrl1.TabIndex = 0;
+            // 
+            // HydroCurveEditCtrl
+            // 
+            AutoScaleDimensions = new SizeF(7F, 14F);
+            AutoScaleMode = AutoScaleMode.Font;
+            Controls.Add(universalChartExcelEditCtrl1);
+            Name = "HydroCurveEditCtrl";
+            Size = new Size(947, 568);
+            ResumeLayout(false);
+        }
+
+        #endregion
+
+        private Phart.UniversalChartExcelEditCtrl universalChartExcelEditCtrl1;
+    }
+}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/21-curve/HydroCurveEditCtrl.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/21-curve/HydroCurveEditCtrl.cs
new file mode 100644
index 0000000..a9e1419
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/21-curve/HydroCurveEditCtrl.cs
@@ -0,0 +1,92 @@
+锘縰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 HydroCurveEditCtrl : DevExpress.XtraEditors.XtraUserControl
+    {
+        public HydroCurveEditCtrl()
+        {
+            InitializeComponent();
+        }
+
+        private Yw.Model.HydroCurveInfo _curve = null;//鏇茬嚎
+
+        /// <summary>
+        /// 缁戝畾鏁版嵁
+        /// </summary>
+        public void SetBindingData(Yw.Model.HydroCurveInfo curve)
+        {
+            if (curve == null)
+            {
+                return;
+            }
+            _curve = curve;
+            var curveType = Yw.Ahart.eCurveType.QH;
+            switch (curve.CurveType)
+            {
+                case Yw.WinFrmUI.HydroCurveType.CurveQH:
+                    {
+                        curveType = Yw.Ahart.eCurveType.QH;
+                    }
+                    break;
+                case HydroCurveType.CurveQP:
+                    {
+                        curveType = Yw.Ahart.eCurveType.QE;
+                    }
+                    break;
+                case HydroCurveType.CurveQE:
+                    {
+                        curveType = Yw.Ahart.eCurveType.QP;
+                    }
+                    break;
+                case HydroCurveType.CurveQL:
+                    {
+                        curveType = Yw.Ahart.eCurveType.QL;
+                    }
+                    break;
+                case HydroCurveType.CurveOL:
+                    {
+                        curveType = Yw.Ahart.eCurveType.OL;
+                    }
+                    break;
+                case HydroCurveType.CurveVol:
+                    {
+                        curveType = Yw.Ahart.eCurveType.VOL;
+                    }
+                    break;
+                default: break;
+            }
+            var pts = curve.CurveData?.Select(x => new Yw.Geometry.Point2d(x.X, x.Y)).ToList();
+            this.universalChartExcelEditCtrl1.SetBindingData(curveType, pts);
+        }
+
+        /// <summary>
+        /// 鑾峰彇
+        /// </summary>
+        public Yw.Model.HydroCurveInfo GetCurveInfo()
+        {
+            if (_curve == null)
+            {
+                return default;
+            }
+            var bol = this.universalChartExcelEditCtrl1.Get(out Ahart.eFeatType featType, out List<Yw.Geometry.Point2d> pts);
+            if (!bol)
+            {
+                return default;
+            }
+            _curve.CurveData = pts?.Select(x => new Model.Hydro.CurvePoint(x.X, x.Y)).ToList();
+            return _curve;
+        }
+
+
+    }
+}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/21-curve/HydroCurveEditCtrl.resx b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/21-curve/HydroCurveEditCtrl.resx
new file mode 100644
index 0000000..af32865
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/21-curve/HydroCurveEditCtrl.resx
@@ -0,0 +1,120 @@
+锘�<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!--
+    Microsoft ResX Schema 
+
+    Version 2.0
+
+    The primary goals of this format is to allow a simple XML format
+    that is mostly human readable. The generation and parsing of the
+    various data types are done through the TypeConverter classes
+    associated with the data types.
+
+    Example:
+
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+
+    There are any number of "resheader" rows that contain simple
+    name/value pairs.
+
+    Each data row contains a name, and value. The row also contains a
+    type or mimetype. Type corresponds to a .NET class that support
+    text/value conversion through the TypeConverter architecture.
+    Classes that don't support this are serialized and stored with the
+    mimetype set.
+
+    The mimetype is used for serialized objects, and tells the
+    ResXResourceReader how to depersist the object. This is currently not
+    extensible. For a given mimetype the value must be set accordingly:
+
+    Note - application/x-microsoft.net.object.binary.base64 is the format
+    that the ResXResourceWriter will generate, however the reader can
+    read any of the formats listed below.
+
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
\ No newline at end of file
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/21-curve/HydroCurveEditDlg.Designer.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/21-curve/HydroCurveEditDlg.Designer.cs
new file mode 100644
index 0000000..61647f3
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/21-curve/HydroCurveEditDlg.Designer.cs
@@ -0,0 +1,167 @@
+锘縩amespace Yw.WinFrmUI
+{
+    partial class HydroCurveEditDlg
+    {
+        /// <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();
+            hydroCurveEditCtrl1 = new HydroCurveEditCtrl();
+            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(953, 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(hydroCurveEditCtrl1);
+            layoutControl1.Dock = DockStyle.Fill;
+            layoutControl1.Location = new Point(0, 32);
+            layoutControl1.Name = "layoutControl1";
+            layoutControl1.Root = Root;
+            layoutControl1.Size = new Size(953, 583);
+            layoutControl1.TabIndex = 3;
+            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(5, 5, 5, 5);
+            Root.Size = new Size(953, 583);
+            Root.TextVisible = false;
+            // 
+            // hydroCurveEditCtrl1
+            // 
+            hydroCurveEditCtrl1.Location = new Point(7, 7);
+            hydroCurveEditCtrl1.Name = "hydroCurveEditCtrl1";
+            hydroCurveEditCtrl1.Size = new Size(939, 539);
+            hydroCurveEditCtrl1.TabIndex = 4;
+            // 
+            // layoutControlItem1
+            // 
+            layoutControlItem1.Control = hydroCurveEditCtrl1;
+            layoutControlItem1.Location = new Point(0, 0);
+            layoutControlItem1.Name = "layoutControlItem1";
+            layoutControlItem1.Size = new Size(943, 543);
+            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(7, 550);
+            generalOkAndCancelCtrl1.Name = "generalOkAndCancelCtrl1";
+            generalOkAndCancelCtrl1.Size = new Size(939, 26);
+            generalOkAndCancelCtrl1.TabIndex = 5;
+            // 
+            // layoutControlItem2
+            // 
+            layoutControlItem2.Control = generalOkAndCancelCtrl1;
+            layoutControlItem2.Location = new Point(0, 543);
+            layoutControlItem2.MaxSize = new Size(0, 30);
+            layoutControlItem2.MinSize = new Size(205, 30);
+            layoutControlItem2.Name = "layoutControlItem2";
+            layoutControlItem2.Size = new Size(943, 30);
+            layoutControlItem2.SizeConstraintsType = DevExpress.XtraLayout.SizeConstraintsType.Custom;
+            layoutControlItem2.TextSize = new Size(0, 0);
+            layoutControlItem2.TextVisible = false;
+            // 
+            // HydroCurveEditDlg
+            // 
+            AutoScaleDimensions = new SizeF(7F, 14F);
+            AutoScaleMode = AutoScaleMode.Font;
+            ClientSize = new Size(953, 615);
+            Controls.Add(layoutControl1);
+            Controls.Add(ribbon);
+            FormBorderStyle = FormBorderStyle.SizableToolWindow;
+            Name = "HydroCurveEditDlg";
+            Ribbon = ribbon;
+            RibbonVisibility = DevExpress.XtraBars.Ribbon.RibbonVisibility.Hidden;
+            StartPosition = FormStartPosition.CenterParent;
+            Text = "缂栬緫鏇茬嚎";
+            ((ISupportInitialize)ribbon).EndInit();
+            ((ISupportInitialize)layoutControl1).EndInit();
+            layoutControl1.ResumeLayout(false);
+            ((ISupportInitialize)Root).EndInit();
+            ((ISupportInitialize)layoutControlItem1).EndInit();
+            ((ISupportInitialize)layoutControlItem2).EndInit();
+            ResumeLayout(false);
+            PerformLayout();
+        }
+
+        #endregion
+
+        private DevExpress.XtraBars.Ribbon.RibbonControl ribbon;
+        private DevExpress.XtraBars.Ribbon.RibbonPage ribbonPage1;
+        private DevExpress.XtraBars.Ribbon.RibbonPageGroup ribbonPageGroup1;
+        private DevExpress.XtraLayout.LayoutControl layoutControl1;
+        private DevExpress.XtraLayout.LayoutControlGroup Root;
+        private GeneralOkAndCancelCtrl generalOkAndCancelCtrl1;
+        private HydroCurveEditCtrl hydroCurveEditCtrl1;
+        private DevExpress.XtraLayout.LayoutControlItem layoutControlItem1;
+        private DevExpress.XtraLayout.LayoutControlItem layoutControlItem2;
+    }
+}
\ No newline at end of file
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/21-curve/HydroCurveEditDlg.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/21-curve/HydroCurveEditDlg.cs
new file mode 100644
index 0000000..3dd3279
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/21-curve/HydroCurveEditDlg.cs
@@ -0,0 +1,84 @@
+锘縩amespace Yw.WinFrmUI
+{
+    public partial class HydroCurveEditDlg : DevExpress.XtraBars.Ribbon.RibbonForm
+    {
+        public HydroCurveEditDlg()
+        {
+            InitializeComponent();
+            this.IconOptions.Icon = Yw.WinFrmUI.GlobalParas.AppIcon;
+            this.layoutControl1.SetupLayoutControl();
+            this.generalOkAndCancelCtrl1.OkEvent += GeneralOkAndCancelCtrl1_OkEvent;
+        }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public event Action<Yw.Model.HydroCurveInfo> ReloadDataEvent;
+
+        private Yw.Model.HydroCurveInfo _curve = null;//鏇茬嚎
+
+        /// <summary>
+        /// 缁戝畾鏁版嵁
+        /// </summary>
+        public void SetBindingData(Yw.Model.HydroCurveInfo curve)
+        {
+            if (curve == null)
+            {
+                return;
+            }
+            _curve = curve;
+            this.hydroCurveEditCtrl1.SetBindingData(curve);
+            switch (curve.CurveType)
+            {
+                case Yw.WinFrmUI.HydroCurveType.CurveQH:
+                    {
+                        this.Text = "娴侀噺鎵▼鏇茬嚎";
+                    }
+                    break;
+                case HydroCurveType.CurveQP:
+                    {
+                        this.Text = "娴侀噺鍔熺巼鏇茬嚎";
+                    }
+                    break;
+                case HydroCurveType.CurveQE:
+                    {
+                        this.Text = "娴侀噺鏁堢巼鏇茬嚎";
+                    }
+                    break;
+                case HydroCurveType.CurveQL:
+                    {
+                        this.Text = "姘村ご鎹熷け鏇茬嚎";
+                    }
+                    break;
+                case HydroCurveType.CurveOL:
+                    {
+                        this.Text = "寮�搴︽崯澶辨洸绾�";
+                    }
+                    break;
+                case HydroCurveType.CurveVol:
+                    {
+                        this.Text = "瀹圭Н鏇茬嚎";
+                    }
+                    break;
+                default: break;
+            }
+        }
+
+        //纭畾
+        private void GeneralOkAndCancelCtrl1_OkEvent()
+        {
+            var curve = this.hydroCurveEditCtrl1.GetCurveInfo();
+            if (curve == null)
+            {
+                TipFormHelper.ShowWarn("鏇存柊澶辫触锛�");
+                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/21-curve/HydroCurveEditDlg.resx b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/21-curve/HydroCurveEditDlg.resx
new file mode 100644
index 0000000..af32865
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/21-curve/HydroCurveEditDlg.resx
@@ -0,0 +1,120 @@
+锘�<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!--
+    Microsoft ResX Schema 
+
+    Version 2.0
+
+    The primary goals of this format is to allow a simple XML format
+    that is mostly human readable. The generation and parsing of the
+    various data types are done through the TypeConverter classes
+    associated with the data types.
+
+    Example:
+
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+
+    There are any number of "resheader" rows that contain simple
+    name/value pairs.
+
+    Each data row contains a name, and value. The row also contains a
+    type or mimetype. Type corresponds to a .NET class that support
+    text/value conversion through the TypeConverter architecture.
+    Classes that don't support this are serialized and stored with the
+    mimetype set.
+
+    The mimetype is used for serialized objects, and tells the
+    ResXResourceReader how to depersist the object. This is currently not
+    extensible. For a given mimetype the value must be set accordingly:
+
+    Note - application/x-microsoft.net.object.binary.base64 is the format
+    that the ResXResourceWriter will generate, however the reader can
+    read any of the formats listed below.
+
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
\ No newline at end of file
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/21-curve/HydroCurveViewCtrl.Designer.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/21-curve/HydroCurveViewCtrl.Designer.cs
new file mode 100644
index 0000000..b7f9621
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/21-curve/HydroCurveViewCtrl.Designer.cs
@@ -0,0 +1,60 @@
+锘縩amespace Yw.WinFrmUI
+{
+    partial class HydroCurveViewCtrl
+    {
+        /// <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()
+        {
+            universalViewChart1 = new Phart.UniversalViewChart();
+            SuspendLayout();
+            // 
+            // universalViewChart1
+            // 
+            universalViewChart1.AxisXTitle = "娴侀噺 锛坢鲁/h锛�";
+            universalViewChart1.AxisYTitle = "鎵▼/m";
+            universalViewChart1.Dock = DockStyle.Fill;
+            universalViewChart1.LineVisible = false;
+            universalViewChart1.Location = new Point(0, 0);
+            universalViewChart1.Margin = new Padding(2, 2, 2, 2);
+            universalViewChart1.Name = "universalViewChart1";
+            universalViewChart1.Size = new Size(877, 550);
+            universalViewChart1.TabIndex = 0;
+            // 
+            // HydroCurveViewCtrl
+            // 
+            AutoScaleDimensions = new SizeF(7F, 14F);
+            AutoScaleMode = AutoScaleMode.Font;
+            Controls.Add(universalViewChart1);
+            Name = "HydroCurveViewCtrl";
+            Size = new Size(877, 550);
+            ResumeLayout(false);
+        }
+
+        #endregion
+
+        private Phart.UniversalViewChart universalViewChart1;
+    }
+}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/21-curve/HydroCurveViewCtrl.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/21-curve/HydroCurveViewCtrl.cs
new file mode 100644
index 0000000..b17d568
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/21-curve/HydroCurveViewCtrl.cs
@@ -0,0 +1,83 @@
+锘縰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 HydroCurveViewCtrl : DevExpress.XtraEditors.XtraUserControl
+    {
+        public HydroCurveViewCtrl()
+        {
+            InitializeComponent();
+        }
+
+        private Yw.Model.HydroCurveInfo _curve = null;//鏇茬嚎淇℃伅
+
+        /// <summary>
+        /// 缁戝畾鏁版嵁
+        /// </summary>
+        public void SetBindingData(Yw.Model.HydroCurveInfo curve)
+        {
+            if (curve == null)
+            {
+                return;
+            }
+            if (curve.CurveData == null || curve.CurveData.Count < 1)
+            {
+                return;
+            }
+            var pts = curve.CurveData.Select(x => new Yw.Geometry.Point2d(x.X, x.Y)).ToList();
+            this.universalViewChart1.SetBindingData(pts);
+            switch (curve.CurveType)
+            {
+                case Yw.WinFrmUI.HydroCurveType.CurveQH:
+                    {
+                        this.universalViewChart1.AxisXTitle = "娴侀噺锛坢鲁/h锛�";
+                        this.universalViewChart1.AxisYTitle = "鎵▼锛坢锛�";
+                    }
+                    break;
+                case HydroCurveType.CurveQP:
+                    {
+                        this.universalViewChart1.AxisXTitle = "娴侀噺锛坢鲁/h锛�";
+                        this.universalViewChart1.AxisYTitle = "鍔熺巼锛坘W锛�";
+                    }
+                    break;
+                case HydroCurveType.CurveQE:
+                    {
+                        this.universalViewChart1.AxisXTitle = "娴侀噺锛坢鲁/h锛�";
+                        this.universalViewChart1.AxisYTitle = "鏁堢巼锛�%锛�";
+                    }
+                    break;
+                case HydroCurveType.CurveQL:
+                    {
+                        this.universalViewChart1.AxisXTitle = "娴侀噺锛坢鲁/h锛�";
+                        this.universalViewChart1.AxisYTitle = "姘村ご鎹熷け锛坢锛�";
+                    }
+                    break;
+                case HydroCurveType.CurveOL:
+                    {
+                        this.universalViewChart1.AxisXTitle = "寮�搴︼紙掳锛�";
+                        this.universalViewChart1.AxisYTitle = "姘村ご鎹熷け锛坢锛�";
+                    }
+                    break;
+                case HydroCurveType.CurveVol:
+                    {
+                        this.universalViewChart1.AxisXTitle = "娴侀噺锛坢鲁/h锛�";
+                        this.universalViewChart1.AxisYTitle = "瀹圭Н锛坢鲁锛�";
+                    }
+                    break;
+                default: break;
+            }
+        }
+
+
+
+    }
+}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/21-curve/HydroCurveViewCtrl.resx b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/21-curve/HydroCurveViewCtrl.resx
new file mode 100644
index 0000000..af32865
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/21-curve/HydroCurveViewCtrl.resx
@@ -0,0 +1,120 @@
+锘�<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!--
+    Microsoft ResX Schema 
+
+    Version 2.0
+
+    The primary goals of this format is to allow a simple XML format
+    that is mostly human readable. The generation and parsing of the
+    various data types are done through the TypeConverter classes
+    associated with the data types.
+
+    Example:
+
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+
+    There are any number of "resheader" rows that contain simple
+    name/value pairs.
+
+    Each data row contains a name, and value. The row also contains a
+    type or mimetype. Type corresponds to a .NET class that support
+    text/value conversion through the TypeConverter architecture.
+    Classes that don't support this are serialized and stored with the
+    mimetype set.
+
+    The mimetype is used for serialized objects, and tells the
+    ResXResourceReader how to depersist the object. This is currently not
+    extensible. For a given mimetype the value must be set accordingly:
+
+    Note - application/x-microsoft.net.object.binary.base64 is the format
+    that the ResXResourceWriter will generate, however the reader can
+    read any of the formats listed below.
+
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
\ No newline at end of file
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/21-curve/HydroCurveViewDlg.Designer.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/21-curve/HydroCurveViewDlg.Designer.cs
new file mode 100644
index 0000000..e64a799
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/21-curve/HydroCurveViewDlg.Designer.cs
@@ -0,0 +1,94 @@
+锘縩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(953, 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(953, 583);
+            hydroCurveViewCtrl1.TabIndex = 1;
+            // 
+            // HydroCurveViewDlg
+            // 
+            AutoScaleDimensions = new SizeF(7F, 14F);
+            AutoScaleMode = AutoScaleMode.Font;
+            ClientSize = new Size(953, 615);
+            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/21-curve/HydroCurveViewDlg.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/21-curve/HydroCurveViewDlg.cs
new file mode 100644
index 0000000..3fdf86b
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/21-curve/HydroCurveViewDlg.cs
@@ -0,0 +1,65 @@
+锘縩amespace Yw.WinFrmUI
+{
+    public partial class HydroCurveViewDlg : DevExpress.XtraBars.Ribbon.RibbonForm
+    {
+        public HydroCurveViewDlg()
+        {
+            InitializeComponent();
+            this.IconOptions.Icon = Yw.WinFrmUI.GlobalParas.AppIcon;
+        }
+
+        private Yw.Model.HydroCurveInfo _curve = null;//鏇茬嚎
+
+        /// <summary>
+        /// 缁戝畾鏁版嵁
+        /// </summary>
+        public void SetBindingData(Yw.Model.HydroCurveInfo curve)
+        {
+            if (curve == null)
+            {
+                return;
+            }
+            _curve = curve;
+            this.hydroCurveViewCtrl1.SetBindingData(curve);
+            switch (curve.CurveType)
+            {
+                case Yw.WinFrmUI.HydroCurveType.CurveQH:
+                    {
+                        this.Text = "娴侀噺鎵▼鏇茬嚎";
+                    }
+                    break;
+                case HydroCurveType.CurveQP:
+                    {
+                        this.Text = "娴侀噺鍔熺巼鏇茬嚎";
+                    }
+                    break;
+                case HydroCurveType.CurveQE:
+                    {
+                        this.Text = "娴侀噺鏁堢巼鏇茬嚎";
+                    }
+                    break;
+                case HydroCurveType.CurveQL:
+                    {
+                        this.Text = "姘村ご鎹熷け鏇茬嚎";
+                    }
+                    break;
+                case HydroCurveType.CurveOL:
+                    {
+                        this.Text = "寮�搴︽崯澶辨洸绾�";
+                    }
+                    break;
+                case HydroCurveType.CurveVol:
+                    {
+                        this.Text = "瀹圭Н鏇茬嚎";
+                    }
+                    break;
+                default: break;
+            }
+        }
+
+
+
+
+
+    }
+}
\ No newline at end of file
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/21-curve/HydroCurveViewDlg.resx b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/21-curve/HydroCurveViewDlg.resx
new file mode 100644
index 0000000..af32865
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/21-curve/HydroCurveViewDlg.resx
@@ -0,0 +1,120 @@
+锘�<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!--
+    Microsoft ResX Schema 
+
+    Version 2.0
+
+    The primary goals of this format is to allow a simple XML format
+    that is mostly human readable. The generation and parsing of the
+    various data types are done through the TypeConverter classes
+    associated with the data types.
+
+    Example:
+
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+
+    There are any number of "resheader" rows that contain simple
+    name/value pairs.
+
+    Each data row contains a name, and value. The row also contains a
+    type or mimetype. Type corresponds to a .NET class that support
+    text/value conversion through the TypeConverter architecture.
+    Classes that don't support this are serialized and stored with the
+    mimetype set.
+
+    The mimetype is used for serialized objects, and tells the
+    ResXResourceReader how to depersist the object. This is currently not
+    extensible. For a given mimetype the value must be set accordingly:
+
+    Note - application/x-microsoft.net.object.binary.base64 is the format
+    that the ResXResourceWriter will generate, however the reader can
+    read any of the formats listed below.
+
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
\ No newline at end of file
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/Yw.WinFrmUI.Hydro.Core.csproj b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/Yw.WinFrmUI.Hydro.Core.csproj
index 82bd338..0ee1be5 100644
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/Yw.WinFrmUI.Hydro.Core.csproj
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/Yw.WinFrmUI.Hydro.Core.csproj
@@ -53,6 +53,7 @@
 		<ProjectReference Include="..\Yw.WinFrmUI.Hydro.L3d.Core\Yw.WinFrmUI.Hydro.L3d.Core.csproj" />
 		<ProjectReference Include="..\Yw.WinFrmUI.Hydro.Q3d.Core\Yw.WinFrmUI.Hydro.Q3d.Core.csproj" />
 		<ProjectReference Include="..\Yw.WinFrmUI.Hydro.W3d.Core\Yw.WinFrmUI.Hydro.W3d.Core.csproj" />
+		<ProjectReference Include="..\Yw.WinFrmUI.Phart.Core\Yw.WinFrmUI.Phart.Core.csproj" />
 	</ItemGroup>
 
 	<ItemGroup>
@@ -251,6 +252,12 @@
 		<Compile Update="20-energy\02-total\HydroEnergyTotalHorizViewCtrl.cs">
 		  <SubType>UserControl</SubType>
 		</Compile>
+		<Compile Update="21-curve\HydroCurveEditDlg.cs">
+		  <SubType>Form</SubType>
+		</Compile>
+		<Compile Update="21-curve\HydroCurveViewDlg.cs">
+		  <SubType>Form</SubType>
+		</Compile>
 		<Compile Update="99-view\02-l2d\HydroL2dViewPage.cs">
 			<SubType>UserControl</SubType>
 		</Compile>
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/Yw.WinFrmUI.Hydro.Core.csproj.user b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/Yw.WinFrmUI.Hydro.Core.csproj.user
index 7caad03..161736c 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
@@ -88,6 +88,12 @@
     <Compile Update="20-energy\02-total\HydroEnergyTotalViewCtrl.cs">
       <SubType>UserControl</SubType>
     </Compile>
+    <Compile Update="21-curve\HydroCurveEditCtrl.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Update="21-curve\HydroCurveViewCtrl.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
     <Compile Update="99-view\01-q3d\HydroQ3dViewPage.cs">
       <SubType>UserControl</SubType>
     </Compile>

--
Gitblit v1.9.3