From 0f99d4d12f2eae29bbe343f4b3131f2faeccda5d Mon Sep 17 00:00:00 2001
From: Shuxia Ning <NingShuxia0927@outlook.com>
Date: 星期二, 14 一月 2025 17:31:20 +0800
Subject: [PATCH] 泵曲线修改

---
 WinFrmUI/Yw.WinFrmUI.Phart.Core/00-core/01-helper/PhartGraphHelper.cs                          |   63 
 WinFrmUI/Yw.WinFrmUI.Phart.Core/01-pump/00-core/01-coordinate/PumpCoordinate_Disp.cs           |   24 
 WinFrmUI/HStation.WinFrmUI.PhartRelation.Core/00-core/等效线/EqualParaCurveEListHelper.cs         |    3 
 WinFrmUI/HStation.WinFrmUI.PhartRelation.Core/Resources/actions_addcircled2.svg                |   15 
 WinFrmUI/Yw.WinFrmUI.Phart.Core/01-pump/04-special/04-variable-speed/SetValueDlg.cs            |    1 
 WinFrmUI/Yw.WinFrmUI.Phart.Core/Yw.WinFrmUI.Phart.Core.csproj                                  |    4 
 WinFrmUI/Yw.WinFrmUI.Phart.Core/01-pump/04-special/03-run-view/PumpRunViewChart.cs             |   46 
 WinFrmUI/HStation.WinFrmUI.Assets.Core/01-pump/07-PumpChart/PumpChartMainPage.cs               |    8 
 WinFrmUI/HStation.WinFrmUI.PhartRelation.Core/01-pump/01-view/PumpChartViewCtrl.Designer.cs    |   51 
 WinFrmUI/HStation.WinFrmUI.PhartRelation.Core/Properties/Resources.resx                        |   18 
 WinFrmUI/HStation.WinFrmUI.PhartRelation.Core/Properties/Resources.Designer.cs                 |   60 
 WinFrmUI/Yw.WinFrmUI.Phart.Core/02-universal/00-core/01-coordinate/UniversalCoordinate_Disp.cs |   16 
 WinFrmUI/Yw.WinFrmUI.Phart.Core/03-valve/01-view/ValveViewChart.cs                             |  208 +-
 WinFrmUI/Yw.WinFrmUI.Phart.Core/01-pump/03-import/03-point/PumpChartPointImportCtrl.cs         |   30 
 Vmo/HStation.Vmo.PhartRelation.Core/HStation.Vmo.PhartRelation.Core.csproj                     |    2 
 WinFrmUI/Yw.WinFrmUI.Phart.Core/01-pump/04-special/04-parallel/PumpParallelChart.cs            |   38 
 WinFrmUI/Yw.WinFrmUI.Phart.Core/01-pump/01-view/PumpViewChart - 复制.cs                          | 1064 ++++++++++++++++
 WinFrmUI/HStation.WinFrmUI.PhartRelation.Core/Resources/actions_addcircled3.svg                |   15 
 WinFrmUI/Yw.WinFrmUI.Phart.Core/01-pump/01-view/PumpViewChart - 复制.resx                        |  120 +
 WinFrmUI/HStation.WinFrmUI.Assets.Core/HStation.WinFrmUI.Assets.Core.csproj                    |    2 
 WinFrmUI/HStation.WinFrmUI.PhartRelation.Core/Resources/actions_addcircled.svg                 |   15 
 WinFrmUI/HStation.WinFrmUI.PhartRelation.Core/Resources/actions_add.svg                        |   15 
 WinFrmUI/Yw.WinFrmUI.Phart.Core/01-pump/04-special/01-operation/PumpOperationChart.cs          |   52 
 WinFrmUI/HStation.WinFrmUI.PhartRelation.Core/01-pump/01-view/PumpChartViewCtrl.cs             |  618 ++++++--
 WinFrmUI/HStation.WinFrmUI.PhartRelation.Core/HStation.WinFrmUI.PhartRelation.Core.csproj      |    2 
 WinFrmUI/Yw.WinFrmUI.Phart.Core/01-pump/01-view/PumpViewChart.cs                               |  933 ++++++++------
 WinFrmUI/Yw.WinFrmUI.Phart.Core/01-pump/04-special/02-working-view/PumpWorkingViewChart.cs     |   42 
 WinFrmUI/HStation.WinFrmUI.PhartRelation.Core/03-valve/02-edit/ValveChartEditCtrl.cs           |    2 
 WinFrmUI/Yw.WinFrmUI.Phart.Core/00-core/03-view-model/01-curve/EqualEViewModel.cs              |    7 
 WinFrmUI/HStation.WinFrmUI.PhartRelation.Core/Resources/actions_add1.svg                       |   15 
 WinFrmUI/Yw.WinFrmUI.Phart.Core/01-pump/01-view/01-viewmodel/PumpCurveViewModel.cs             |   10 
 WinFrmUI/Yw.WinFrmUI.Phart.Core/01-pump/01-view/PumpViewChart - 复制.Designer.cs                 |  198 +++
 Desktop/HStation.Desktop.Xhs.Core/DbFirstHelper.cs                                             |    4 
 WinFrmUI/HStation.WinFrmUI.PhartRelation.Core/Resources/actions_addcircled1.svg                |   15 
 WinFrmUI/Yw.WinFrmUI.Phart.Core/01-pump/01-view/PumpViewChartViewModel.cs                      |   61 
 35 files changed, 2,893 insertions(+), 884 deletions(-)

diff --git a/Desktop/HStation.Desktop.Xhs.Core/DbFirstHelper.cs b/Desktop/HStation.Desktop.Xhs.Core/DbFirstHelper.cs
index bec331e..1256b20 100644
--- a/Desktop/HStation.Desktop.Xhs.Core/DbFirstHelper.cs
+++ b/Desktop/HStation.Desktop.Xhs.Core/DbFirstHelper.cs
@@ -19,7 +19,9 @@
             new Yw.BLL.HydroDbFirstHelper().Initial();//hydro
 
             new Yw.BLL.AuthDbFirstHelper().Initial();//auth
-            new BLL.AssetsDbFirstHelper().Initial();
+            new BLL.PhartRelationDbFirstHelper().Initial();
+
+            new Yw.BLL.PhartDbFirstHelper().Initial();
             new BLL.PhartRelationDbFirstHelper().Initial();
         }
     }
diff --git a/Vmo/HStation.Vmo.PhartRelation.Core/HStation.Vmo.PhartRelation.Core.csproj b/Vmo/HStation.Vmo.PhartRelation.Core/HStation.Vmo.PhartRelation.Core.csproj
index 0b8d4a5..69fec07 100644
--- a/Vmo/HStation.Vmo.PhartRelation.Core/HStation.Vmo.PhartRelation.Core.csproj
+++ b/Vmo/HStation.Vmo.PhartRelation.Core/HStation.Vmo.PhartRelation.Core.csproj
@@ -13,7 +13,7 @@
   </ItemGroup>
 
   <ItemGroup>
-    <PackageReference Include="Yw.Vmo.Phart.Core" Version="3.0.1" />
+    <PackageReference Include="Yw.Vmo.Phart.Core" Version="3.0.2" />
   </ItemGroup>
 
   <ItemGroup>
diff --git a/WinFrmUI/HStation.WinFrmUI.Assets.Core/01-pump/07-PumpChart/PumpChartMainPage.cs b/WinFrmUI/HStation.WinFrmUI.Assets.Core/01-pump/07-PumpChart/PumpChartMainPage.cs
index ec9ca1b..3e057cc 100644
--- a/WinFrmUI/HStation.WinFrmUI.Assets.Core/01-pump/07-PumpChart/PumpChartMainPage.cs
+++ b/WinFrmUI/HStation.WinFrmUI.Assets.Core/01-pump/07-PumpChart/PumpChartMainPage.cs
@@ -9,8 +9,7 @@
         public PumpChartMainPage()
         {
             InitializeComponent();
-            this.phartDiagramRelationListCtrl1.SelectedChangedEvent += PhartDiagramRelationListCtrl1_SelectedChangedEvent;
-            this.pumpChartViewCtrl1.DataChangedEvent += PumpChartViewCtrl1_DataChangedEvent;
+            this.phartDiagramRelationListCtrl1.SelectedChangedEvent += PhartDiagramRelationListCtrl1_SelectedChangedEvent; 
         }
 
         private AssetsPumpMainVmo _vmo;
@@ -33,18 +32,19 @@
             this.phartDiagramRelationListCtrl1.SetBindingData(_allBindingList);
         }
 
-        private async void PumpChartViewCtrl1_DataChangedEvent(Yw.Vmo.PhartDiagramExGraphListVmo vmo)
+        private async Task<bool>  PumpChartViewCtrl1_DataChangedEvent(Yw.Vmo.PhartDiagramExGraphListVmo vmo)
         {
             var bol = await BLLFactory<Yw.BLL.PhartDiagramExtensions>.Instance.Update(vmo);
             if (!bol)
             {
                 TipFormHelper.ShowError("鏇存柊澶辫触锛�");
-                return;
+            
             }
             else
             {
                 TipFormHelper.ShowSucceed("鏇存柊鎴愬姛锛�");
             }
+            return bol;
         }
 
         //閫夋嫨鏀瑰彉
diff --git a/WinFrmUI/HStation.WinFrmUI.Assets.Core/HStation.WinFrmUI.Assets.Core.csproj b/WinFrmUI/HStation.WinFrmUI.Assets.Core/HStation.WinFrmUI.Assets.Core.csproj
index 2b8d43c..0071fa5 100644
--- a/WinFrmUI/HStation.WinFrmUI.Assets.Core/HStation.WinFrmUI.Assets.Core.csproj
+++ b/WinFrmUI/HStation.WinFrmUI.Assets.Core/HStation.WinFrmUI.Assets.Core.csproj
@@ -219,7 +219,7 @@
     <PackageReference Include="DevExpress.Win.Design" Version="23.2.4" />
     <PackageReference Include="Microsoft.Web.WebView2" Version="1.0.2535.41" />
     <PackageReference Include="Yw.BLL.Assets.Core" Version="3.0.1" />
-    <PackageReference Include="Yw.BLL.Phart.Core" Version="3.0.5" />
+    <PackageReference Include="Yw.BLL.Phart.Core" Version="3.0.6" />
   </ItemGroup>
 
   <ItemGroup>
diff --git "a/WinFrmUI/HStation.WinFrmUI.PhartRelation.Core/00-core/\347\255\211\346\225\210\347\272\277/EqualParaCurveEListHelper.cs" "b/WinFrmUI/HStation.WinFrmUI.PhartRelation.Core/00-core/\347\255\211\346\225\210\347\272\277/EqualParaCurveEListHelper.cs"
index 0f5837f..2d0353f 100644
--- "a/WinFrmUI/HStation.WinFrmUI.PhartRelation.Core/00-core/\347\255\211\346\225\210\347\272\277/EqualParaCurveEListHelper.cs"
+++ "b/WinFrmUI/HStation.WinFrmUI.PhartRelation.Core/00-core/\347\255\211\346\225\210\347\272\277/EqualParaCurveEListHelper.cs"
@@ -1383,6 +1383,7 @@
                 equalCurve.IsClosed = false;
                 equalCurve.DefinePoints = curveSmall;
                 equalCurve.Eff = currentEta;
+                equalCurve.IsUShaped = true;
                 equalCurves.Add(equalCurve);
             }
             else
@@ -1393,6 +1394,7 @@
                     equalCurve.IsClosed = false;
                     equalCurve.DefinePoints = curveSmall;
                     equalCurve.Eff = currentEta;
+                    equalCurve.IsUShaped = false;
                     equalCurves.Add(equalCurve);
                 }
                 if (!isMergeCurve)
@@ -1403,6 +1405,7 @@
                         equalCurve.IsClosed = false;
                         equalCurve.DefinePoints = curveLarge;
                         equalCurve.Eff = currentEta;
+                        equalCurve.IsUShaped = false;
                         equalCurves.Add(equalCurve);
                     }
                 }
diff --git a/WinFrmUI/HStation.WinFrmUI.PhartRelation.Core/01-pump/01-view/PumpChartViewCtrl.Designer.cs b/WinFrmUI/HStation.WinFrmUI.PhartRelation.Core/01-pump/01-view/PumpChartViewCtrl.Designer.cs
index beb1295..627be70 100644
--- a/WinFrmUI/HStation.WinFrmUI.PhartRelation.Core/01-pump/01-view/PumpChartViewCtrl.Designer.cs
+++ b/WinFrmUI/HStation.WinFrmUI.PhartRelation.Core/01-pump/01-view/PumpChartViewCtrl.Designer.cs
@@ -45,7 +45,6 @@
             barCekEqulEffVisible = new DevExpress.XtraBars.BarCheckItem();
             barCekEqVisible = new DevExpress.XtraBars.BarCheckItem();
             barBtnEqClear = new DevExpress.XtraBars.BarButtonItem();
-            bar2 = new DevExpress.XtraBars.Bar();
             barBtnAddVariableSpeedMenu = new DevExpress.XtraBars.BarSubItem();
             barBtnAddVariableSpeedByN = new DevExpress.XtraBars.BarButtonItem();
             barBtnAddVariableSpeedByHz = new DevExpress.XtraBars.BarButtonItem();
@@ -65,21 +64,22 @@
             // pumpViewChart1
             // 
             pumpViewChart1.Dock = DockStyle.Fill;
-            pumpViewChart1.Location = new Point(0, 69);
+            pumpViewChart1.LineVisible = false;
+            pumpViewChart1.Location = new Point(0, 68);
             pumpViewChart1.Name = "pumpViewChart1";
-            pumpViewChart1.Size = new Size(1369, 855);
+            pumpViewChart1.Size = new Size(1369, 856);
+            pumpViewChart1.SplitPanel = false;
             pumpViewChart1.TabIndex = 0;
             // 
             // barManager1
             // 
-            barManager1.Bars.AddRange(new DevExpress.XtraBars.Bar[] { bar1, bar2 });
+            barManager1.Bars.AddRange(new DevExpress.XtraBars.Bar[] { bar1 });
             barManager1.DockControls.Add(barDockControlTop);
             barManager1.DockControls.Add(barDockControlBottom);
             barManager1.DockControls.Add(barDockControlLeft);
             barManager1.DockControls.Add(barDockControlRight);
             barManager1.Form = this;
             barManager1.Items.AddRange(new DevExpress.XtraBars.BarItem[] { barCekSplitPanel, barCekEffVisible, barCekPowerVisible, barTxtStartHead, barTxtPipeQ, barTxtPipeHead, barBtnSetEqPt, barCekEqVisible, barCekEqulEffVisible, barBtnEqClear, barBtnAddVariableSpeedMenu, barBtnAddVariableSpeedByN, barBtnAddVariableSpeedByHz, barBtnAddVariableSpeedByPoint, barBtnAddEqualEffMenu, barBtnAddEqualEffByEff });
-            barManager1.MainMenu = bar2;
             barManager1.MaxItemId = 25;
             barManager1.RepositoryItems.AddRange(new DevExpress.XtraEditors.Repository.RepositoryItem[] { repTxtStartHead, repTxtPipeQ, repTxtPipeHead });
             // 
@@ -89,7 +89,7 @@
             bar1.DockCol = 0;
             bar1.DockRow = 0;
             bar1.DockStyle = DevExpress.XtraBars.BarDockStyle.Top;
-            bar1.LinksPersistInfo.AddRange(new DevExpress.XtraBars.LinkPersistInfo[] { new DevExpress.XtraBars.LinkPersistInfo(barCekSplitPanel), new DevExpress.XtraBars.LinkPersistInfo(barCekEffVisible), new DevExpress.XtraBars.LinkPersistInfo(barCekPowerVisible), new DevExpress.XtraBars.LinkPersistInfo(barTxtPipeQ), new DevExpress.XtraBars.LinkPersistInfo(barTxtPipeHead), new DevExpress.XtraBars.LinkPersistInfo(barTxtStartHead), new DevExpress.XtraBars.LinkPersistInfo(barBtnSetEqPt), new DevExpress.XtraBars.LinkPersistInfo(barCekEqulEffVisible), new DevExpress.XtraBars.LinkPersistInfo(barCekEqVisible), new DevExpress.XtraBars.LinkPersistInfo(barBtnEqClear) });
+            bar1.LinksPersistInfo.AddRange(new DevExpress.XtraBars.LinkPersistInfo[] { new DevExpress.XtraBars.LinkPersistInfo(barBtnAddVariableSpeedMenu), new DevExpress.XtraBars.LinkPersistInfo(barBtnAddEqualEffMenu), new DevExpress.XtraBars.LinkPersistInfo(barCekSplitPanel), new DevExpress.XtraBars.LinkPersistInfo(barCekEffVisible), new DevExpress.XtraBars.LinkPersistInfo(barCekPowerVisible), new DevExpress.XtraBars.LinkPersistInfo(barTxtPipeQ), new DevExpress.XtraBars.LinkPersistInfo(barTxtPipeHead), new DevExpress.XtraBars.LinkPersistInfo(barTxtStartHead), new DevExpress.XtraBars.LinkPersistInfo(barBtnSetEqPt), new DevExpress.XtraBars.LinkPersistInfo(barCekEqulEffVisible), new DevExpress.XtraBars.LinkPersistInfo(barCekEqVisible), new DevExpress.XtraBars.LinkPersistInfo(barBtnEqClear) });
             bar1.OptionsBar.AllowQuickCustomization = false;
             bar1.OptionsBar.DrawBorder = false;
             bar1.OptionsBar.MultiLine = true;
@@ -215,45 +215,36 @@
             barBtnEqClear.PaintStyle = DevExpress.XtraBars.BarItemPaintStyle.CaptionGlyph;
             barBtnEqClear.ItemClick += barBtnEqClear_ItemClick;
             // 
-            // bar2
-            // 
-            bar2.BarName = "Custom 3";
-            bar2.DockCol = 0;
-            bar2.DockRow = 1;
-            bar2.DockStyle = DevExpress.XtraBars.BarDockStyle.Top;
-            bar2.LinksPersistInfo.AddRange(new DevExpress.XtraBars.LinkPersistInfo[] { new DevExpress.XtraBars.LinkPersistInfo(barBtnAddVariableSpeedMenu), new DevExpress.XtraBars.LinkPersistInfo(barBtnAddEqualEffMenu) });
-            bar2.OptionsBar.DrawBorder = false;
-            bar2.OptionsBar.MultiLine = true;
-            bar2.OptionsBar.UseWholeRow = true;
-            bar2.Text = "Custom 3";
-            // 
             // barBtnAddVariableSpeedMenu
             // 
             barBtnAddVariableSpeedMenu.Caption = "鍙橀�熸洸绾�";
             barBtnAddVariableSpeedMenu.Id = 17;
-            barBtnAddVariableSpeedMenu.ImageOptions.SvgImage = PhartRelation.Core.Properties.Resources.menu;
+            barBtnAddVariableSpeedMenu.ImageOptions.SvgImage = PhartRelation.Core.Properties.Resources.actions_add;
             barBtnAddVariableSpeedMenu.LinksPersistInfo.AddRange(new DevExpress.XtraBars.LinkPersistInfo[] { new DevExpress.XtraBars.LinkPersistInfo(barBtnAddVariableSpeedByN), new DevExpress.XtraBars.LinkPersistInfo(barBtnAddVariableSpeedByHz), new DevExpress.XtraBars.LinkPersistInfo(barBtnAddVariableSpeedByPoint) });
             barBtnAddVariableSpeedMenu.Name = "barBtnAddVariableSpeedMenu";
             barBtnAddVariableSpeedMenu.PaintStyle = DevExpress.XtraBars.BarItemPaintStyle.CaptionGlyph;
             // 
             // barBtnAddVariableSpeedByN
             // 
-            barBtnAddVariableSpeedByN.Caption = "娣诲姞(杞��)";
+            barBtnAddVariableSpeedByN.Caption = "杞��";
             barBtnAddVariableSpeedByN.Id = 18;
+            barBtnAddVariableSpeedByN.ImageOptions.SvgImage = PhartRelation.Core.Properties.Resources.actions_addcircled;
             barBtnAddVariableSpeedByN.Name = "barBtnAddVariableSpeedByN";
             barBtnAddVariableSpeedByN.ItemClick += barBtnAddVariableSpeedByN_ItemClick;
             // 
             // barBtnAddVariableSpeedByHz
             // 
-            barBtnAddVariableSpeedByHz.Caption = "娣诲姞(棰戠巼)";
+            barBtnAddVariableSpeedByHz.Caption = "棰戠巼";
             barBtnAddVariableSpeedByHz.Id = 19;
+            barBtnAddVariableSpeedByHz.ImageOptions.SvgImage = PhartRelation.Core.Properties.Resources.actions_addcircled1;
             barBtnAddVariableSpeedByHz.Name = "barBtnAddVariableSpeedByHz";
             barBtnAddVariableSpeedByHz.ItemClick += barBtnAddVariableSpeedByHz_ItemClick;
             // 
             // barBtnAddVariableSpeedByPoint
             // 
-            barBtnAddVariableSpeedByPoint.Caption = "娣诲姞(鐐�)";
+            barBtnAddVariableSpeedByPoint.Caption = "璁捐鐐�";
             barBtnAddVariableSpeedByPoint.Id = 20;
+            barBtnAddVariableSpeedByPoint.ImageOptions.SvgImage = PhartRelation.Core.Properties.Resources.actions_addcircled2;
             barBtnAddVariableSpeedByPoint.Name = "barBtnAddVariableSpeedByPoint";
             barBtnAddVariableSpeedByPoint.ItemClick += barBtnAddVariableSpeedByPoint_ItemClick;
             // 
@@ -261,15 +252,16 @@
             // 
             barBtnAddEqualEffMenu.Caption = "绛夋晥绾�";
             barBtnAddEqualEffMenu.Id = 23;
-            barBtnAddEqualEffMenu.ImageOptions.SvgImage = PhartRelation.Core.Properties.Resources.menu1;
+            barBtnAddEqualEffMenu.ImageOptions.SvgImage = PhartRelation.Core.Properties.Resources.actions_add1;
             barBtnAddEqualEffMenu.LinksPersistInfo.AddRange(new DevExpress.XtraBars.LinkPersistInfo[] { new DevExpress.XtraBars.LinkPersistInfo(barBtnAddEqualEffByEff) });
             barBtnAddEqualEffMenu.Name = "barBtnAddEqualEffMenu";
             barBtnAddEqualEffMenu.PaintStyle = DevExpress.XtraBars.BarItemPaintStyle.CaptionGlyph;
             // 
             // barBtnAddEqualEffByEff
             // 
-            barBtnAddEqualEffByEff.Caption = "娣诲姞(鏁堢巼)";
+            barBtnAddEqualEffByEff.Caption = "鏁堢巼鐐�";
             barBtnAddEqualEffByEff.Id = 24;
+            barBtnAddEqualEffByEff.ImageOptions.SvgImage = PhartRelation.Core.Properties.Resources.actions_addcircled3;
             barBtnAddEqualEffByEff.Name = "barBtnAddEqualEffByEff";
             barBtnAddEqualEffByEff.ItemClick += barBtnAddEqualEffByEff_ItemClick;
             // 
@@ -279,7 +271,7 @@
             barDockControlTop.Dock = DockStyle.Top;
             barDockControlTop.Location = new Point(0, 0);
             barDockControlTop.Manager = barManager1;
-            barDockControlTop.Size = new Size(1369, 69);
+            barDockControlTop.Size = new Size(1369, 68);
             // 
             // barDockControlBottom
             // 
@@ -293,17 +285,17 @@
             // 
             barDockControlLeft.CausesValidation = false;
             barDockControlLeft.Dock = DockStyle.Left;
-            barDockControlLeft.Location = new Point(0, 69);
+            barDockControlLeft.Location = new Point(0, 68);
             barDockControlLeft.Manager = barManager1;
-            barDockControlLeft.Size = new Size(0, 855);
+            barDockControlLeft.Size = new Size(0, 856);
             // 
             // barDockControlRight
             // 
             barDockControlRight.CausesValidation = false;
             barDockControlRight.Dock = DockStyle.Right;
-            barDockControlRight.Location = new Point(1369, 69);
+            barDockControlRight.Location = new Point(1369, 68);
             barDockControlRight.Manager = barManager1;
-            barDockControlRight.Size = new Size(0, 855);
+            barDockControlRight.Size = new Size(0, 856);
             // 
             // PumpChartViewCtrl
             // 
@@ -346,7 +338,6 @@
         private DevExpress.XtraBars.BarCheckItem barCekEqVisible;
         private DevExpress.XtraBars.BarCheckItem barCekEqulEffVisible;
         private DevExpress.XtraBars.BarButtonItem barBtnEqClear;
-        private DevExpress.XtraBars.Bar bar2;
         private DevExpress.XtraBars.BarSubItem barBtnAddVariableSpeedMenu;
         private DevExpress.XtraBars.BarButtonItem barBtnAddVariableSpeedByN;
         private DevExpress.XtraBars.BarButtonItem barBtnAddVariableSpeedByHz;
diff --git a/WinFrmUI/HStation.WinFrmUI.PhartRelation.Core/01-pump/01-view/PumpChartViewCtrl.cs b/WinFrmUI/HStation.WinFrmUI.PhartRelation.Core/01-pump/01-view/PumpChartViewCtrl.cs
index e24c35a..edbcbc1 100644
--- a/WinFrmUI/HStation.WinFrmUI.PhartRelation.Core/01-pump/01-view/PumpChartViewCtrl.cs
+++ b/WinFrmUI/HStation.WinFrmUI.PhartRelation.Core/01-pump/01-view/PumpChartViewCtrl.cs
@@ -1,4 +1,7 @@
 锘縰sing DevExpress.Spreadsheet;
+using Mapster;
+using StackExchange.Profiling.Internal;
+using Yw.Ahart;
 using Yw.Geometry;
 using Yw.Pump;
 using Yw.WinFrmUI.Phart;
@@ -12,25 +15,24 @@
             InitializeComponent();
             this.barCekEqVisible.Checked = true;
             this.barCekEqulEffVisible.Checked = true;
-            this.bar2.Visible = false;
-            this.barCekEqulEffVisible.Visibility = DevExpress.XtraBars.BarItemVisibility.Never;
+            this.barCekPowerVisible.Visibility = DevExpress.XtraBars.BarItemVisibility.Never;
+            this.barCekEqVisible.Visibility = DevExpress.XtraBars.BarItemVisibility.Never;
+
+            this.barBtnAddVariableSpeedMenu.Visibility = DevExpress.XtraBars.BarItemVisibility.Never;
+            this.barBtnAddEqualEffMenu.Visibility = DevExpress.XtraBars.BarItemVisibility.Never;
+            this.barCekEqulEffVisible.Visibility = DevExpress.XtraBars.BarItemVisibility.Never; 
         }
 
-        private Yw.Vmo.PhartDiagramExGraphListVmo _vmo = null;
-        private Yw.WinFrmUI.Phart.PumpPerformCurveViewModel _model = null;
-        private Yw.WinFrmUI.Phart.PumpCurveViewModel _vm = null;
 
-        private bool _default_visible = true;
+        private Yw.Vmo.PhartDiagramExGraphListVmo _vmo = null;
+        private List<Yw.WinFrmUI.Phart.PumpViewChartViewModel> _vm_list = null;
+
+        private string _coordinate = null;
         private bool _power_visible = true;
         private bool _eff_visible = true;
         private bool _equal_eff_visible = true;
         private bool _split_panel = true;
-        private double _nr;
-
-        /// <summary>
-        /// 鏁版嵁鍙樻洿浜嬩欢
-        /// </summary>
-        public event Action<Yw.Vmo.PhartDiagramExGraphListVmo> DataChangedEvent;
+        private double _nr; 
 
         /// <summary>
         /// 缁戝畾鏁版嵁
@@ -39,118 +41,188 @@
         {
             _vmo = vmo;
             _nr = nr;
+            _vm_list = null;
+            _coordinate = null;
             if (vmo == null)
             {
                 ClearBindingData();
                 return;
             }
-            var vm_list = vmo.GetPumpCurveViewMdoelList();
-            if (vm_list == null || !vm_list.Any())
+
+            var vm_list = new List<Yw.WinFrmUI.Phart.PumpViewChartViewModel>();
+            if (vmo.GraphList == null || !vmo.GraphList.Any())
             {
                 ClearBindingData();
                 return;
             }
-            _model = vmo.GetDefaultPumpCurveViewMdoel();
-            if (_model == null)
+            _coordinate = vmo.DispParas;
+
+            foreach (var graph in vmo.GraphList)
+            {
+                double hz = 50;
+                double n = nr;
+                var curve_type = (Yw.Ahart.eCurveType)graph.GraphType;
+                switch (curve_type)
+                {
+                    case Yw.Ahart.eCurveType.QH:
+                        {
+                            var paras = PhartGraphHelper.GetGraphParas<Yw.WinFrmUI.Phart.QHGraphParasViewModel>(curve_type, graph.GraphParas);
+                            hz = paras.Hz;
+                            n = paras.N;
+                        }
+                        break;
+                    case Yw.Ahart.eCurveType.QP:
+                        {
+                            var paras = PhartGraphHelper.GetGraphParas<Yw.WinFrmUI.Phart.QPGraphParasViewModel>(curve_type, graph.GraphParas);
+                            hz = paras.Hz;
+                            n = paras.N;
+                        }
+                        break;
+                    case Yw.Ahart.eCurveType.QE:
+                        {
+                            var paras = PhartGraphHelper.GetGraphParas<Yw.WinFrmUI.Phart.QEGraphParasViewModel>(curve_type, graph.GraphParas);
+                            hz = paras.Hz;
+                            n = paras.N;
+                        }
+                        break;
+                }
+
+                var feat_curve = PhartGraphHelper.GetPerformCurve(curve_type, graph.GeometryInfo);
+                var geometry_paras = PhartGraphHelper.GetGeometryParas(curve_type, graph.GeometryParas);
+                var annotation_list = PhartGraphHelper.GetAnnotationParasList(curve_type, graph.AnnotationParas);
+                if (curve_type == eCurveType.QE)
+                    annotation_list = null;
+                    var vm = new Yw.WinFrmUI.Phart.PumpViewChartViewModel();
+                vm.Id = graph.ID.ToString();
+                vm.Hz = hz;
+                vm.N = n;
+                vm.AnnotationList = annotation_list;
+                vm.CurveType = feat_curve.CurveType;
+                vm.FeatType = feat_curve.FeatType;
+                vm.DefPointList = geometry_paras?.DefinePoints;
+                vm.FitPointList = feat_curve.FeatCurve.GetPointList(100);
+                if (vm.CurveType== eCurveType.EqualE)
+                    vm.FitPointList = feat_curve.FeatCurve.GetPointList(10);
+
+                vm.GraphParas = graph.GraphParas;
+                vm_list.Add(vm);
+            }
+ 
+            _vm_list = vm_list;
+            _vm_list[0].IsSelect = true;
+             
+            SetColor(_vm_list);
+            SetBindingData(_vm_list, _coordinate, _split_panel, _eff_visible, _power_visible, _equal_eff_visible);
+        }
+
+        /// <summary>
+        /// 
+        /// </summary> 
+        private void SetColor(List<Yw.WinFrmUI.Phart.PumpViewChartViewModel> vm_list)
+        {
+            if (vm_list == null || !vm_list.Any())
                 return;
-
-            var vm_equal_eff_list = vmo.GetCurveEqualEViewMdoelList();
-            var vm_variable_speed_eff_list = vmo.GetVariableSpeedPumpCurveViewMdoelList();
-
-            var vm = new Yw.WinFrmUI.Phart.PumpCurveViewModel();
-            vm.Id = "";
-            vm.ColorQH = Color.Blue;
-            vm.ColorQE = Color.Green;
-            vm.ColorQP = Color.Red;
-            vm.CurveQHName = $"{_nr}rpm({50}hz)";
-            vm.CurveQPName = $"{_nr}rpm({50}hz)";
-            vm.CurveQH = _model.CurveQH.FeatCurve.GetPointList(50);
-            vm.CurveQE = _model.CurveQE?.FeatCurve.GetPointList(50);
-            vm.CurveQP = _model.CurveQP?.FeatCurve.GetPointList(50);
-            vm.PointListQH = vm.CurveQH;
-            vm.PointListQE = vm.CurveQE;
-            vm.PointListQP = vm.CurveQP;
-            vm.Equip = null;
-            if (vm_equal_eff_list != null && vm_equal_eff_list.Any())
+            var group = vm_list.GroupBy(x => x.Hz);
+            if (group.Count() > 1)
             {
-                vm.EqualEffList = new();
-                foreach (var item in vm_equal_eff_list)
+                for (int i = 0; i < group.Count(); i++)
                 {
-                    var eff_vm = new Yw.WinFrmUI.Phart.PumpCurveEqualEffViewModel();
-                    eff_vm.Id = Guid.NewGuid().ToString();
-                    eff_vm.CurveName = $"{item.Eff:N1}";
-                    eff_vm.Color = Color.DarkGreen;
-                    eff_vm.CurveEqualEff = item.DefinePoints;
-                    eff_vm.Tension = item.Tension;
-                    eff_vm.IsClosed = item.IsClosed;
-                    vm.EqualEffList.Add(eff_vm);
+                    var color = Yw.WinFrmUI.PhartColorHelper.Get(i);
+                    var item = group.ElementAt(i);
+                    foreach (var vm in item)
+                    {
+                        vm.Color = color;
+                        if (vm.CurveType == eCurveType.EqualE)
+                            vm.Color = Color.DarkGreen;
+                    }
                 }
             }
-
-            if (vm_variable_speed_eff_list != null && vm_variable_speed_eff_list.Any())
+            else
             {
-                vm.VariableSpeedList = new();
-                var index = 0;
-                foreach (var item in vm_variable_speed_eff_list)
+                var item = group.ElementAt(0);
+                foreach (var vm in item)
                 {
-                    var vs_color = Yw.WinFrmUI.PhartColorHelper.Get(index);
-                    var vs_vm = new Yw.WinFrmUI.Phart.PumpCurveVariableSpeedViewModel();
-                    vs_vm.Id = Guid.NewGuid().ToString();
-                    vs_vm.ColorQH = vs_color;
-                    vs_vm.ColorQE = vs_color;
-                    vs_vm.ColorQP = vs_color;
-                    vs_vm.CurveQHName = $"{item.N}rpm({item.Hz}hz)";
-                    vs_vm.CurveQPName = $"{item.N}rpm({item.Hz}hz)";
-                    vs_vm.CurveQH = item.CurveQH.FeatCurve.GetPointList(30);
-                    vs_vm.CurveQE = item.CurveQE.FeatCurve.GetPointList(30);
-                    vs_vm.CurveQP = item.CurveQP.FeatCurve.GetPointList(30);
-                    vs_vm.N = item.N;
-                    vs_vm.Hz = item.Hz;
-                    vm.VariableSpeedList.Add(vs_vm);
-                    index++;
-                }
+                    switch (vm.CurveType)
+                    {
+                        case Yw.Ahart.eCurveType.QH: vm.Color = Yw.WinFrmUI.Phart.PumpChartDisplay.CurveColorQH; break;
+                        case Yw.Ahart.eCurveType.QP: vm.Color = Yw.WinFrmUI.Phart.PumpChartDisplay.CurveColorQP; break;
+                        case Yw.Ahart.eCurveType.QE: vm.Color = Yw.WinFrmUI.Phart.PumpChartDisplay.CurveColorQE; break;
+                    }
+                } 
             }
-
-            vm.VariableSpeedList = new List<PumpCurveVariableSpeedViewModel>();
-            vm.EqualEffList = new List<PumpCurveEqualEffViewModel>();
-            vm.EqualPowerList = new();
-
-            SetBindingData(vm, _default_visible, _split_panel, _eff_visible, _power_visible, _equal_eff_visible);
         }
 
         /// <summary>
         /// 缁戝畾鏁版嵁
         /// </summary>
-        public void SetBindingData(Yw.WinFrmUI.Phart.PumpCurveViewModel vm, bool default_visible, bool split_panel, bool eff_visible, bool power_visible, bool equal_eff_visible)
+        private void SetBindingData(List<Yw.WinFrmUI.Phart.PumpViewChartViewModel> vm_list, string coordinate, bool split_panel, bool eff_visible, bool power_visible, bool equal_eff_visible)
         {
-            _vm = vm;
-            if (vm == null)
+            if (IsInvalidData())
             {
                 ClearBindingData();
                 return;
             }
-            if (vm.VariableSpeedList != null && vm.VariableSpeedList.Any())
+            var list = new List<Yw.WinFrmUI.Phart.PumpViewChartViewModel>();
+            foreach (var item in vm_list)
             {
-                vm.ColorQH = vm.ColorQE = vm.ColorQP = Color.Black;
+                if (!eff_visible)
+                {
+                    if (item.CurveType == eCurveType.QE)
+                    {
+                        continue;
+                    };
+                }
+
+                if (!power_visible)
+                {
+                    if (item.CurveType == eCurveType.QP)
+                    {
+                        continue;
+                    };
+                }
+
+                if (!equal_eff_visible)
+                {
+                    if (item.CurveType == eCurveType.EqualE)
+                    {
+                        continue;
+                    };
+                }
+
+                list.Add(item);
             }
-            this.pumpViewChart1.SetBindingData(vm, default_visible, split_panel, eff_visible, power_visible, equal_eff_visible);
+
+            this.pumpViewChart1.SetBindingData(list, coordinate, split_panel, eff_visible, power_visible, equal_eff_visible);
         }
 
+        //鏄惁鏄棤鏁堟暟鎹�
+        private bool IsInvalidData()
+        {
+            if (_vm_list == null || !_vm_list.Any())
+            {
+                return true;
+            }
+            if (!_vm_list.Exists(x => x.CurveType == Yw.Ahart.eCurveType.QH))
+            {
+                return true;
+            }
+            return false;
+        }
 
         /// <summary>
         /// 娓呯┖缁戝畾鏁版嵁
         /// </summary>
         public void ClearBindingData()
         {
-            this.pumpViewChart1.ClearBindingData();
+            this.pumpViewChart1.Clear();
         }
 
 
         private void SetEquip()
         {
-            if (_vm == null)
+            if (_vmo == null)
                 return;
-            if (!_vm.IsValid())
+            if (_vm_list == null || !_vm_list.Any())
                 return;
             if (this.barTxtStartHead.EditValue == null)
                 return;
@@ -159,59 +231,57 @@
             if (this.barTxtPipeQ.EditValue == null)
                 return;
 
+            var qh50 = _vm_list.Find(x => x.Hz == 50 && x.CurveType == Yw.Ahart.eCurveType.QH);
+            if (qh50 == null)
+                return;
+
             var start_head = Convert.ToDouble(this.barTxtStartHead.EditValue);
             var pipe_head = Convert.ToDouble(this.barTxtPipeHead.EditValue);
             var pipe_flow = Convert.ToDouble(this.barTxtPipeQ.EditValue);
 
             var equip_pt = new Yw.Geometry.Point2d(pipe_flow, pipe_head);
-            var qh_line = new Yw.Ahart.CurveQH(Yw.Ahart.eFeatType.Cubic, _vm.CurveQH);
-            var equip_line = Yw.Pump.PerformParabolaHelper.GetEquipCurvePointListByQH(qh_line, equip_pt, start_head, 30, true, out Yw.Geometry.Point2d sect_pt);
-            if (equip_line == null || sect_pt == null)
+            var equip_pt_list = Yw.Pump.PerformParabolaHelper.GetEquipCurvePointListByQH(qh50.FitPointList, equip_pt, start_head, 30, true, out Yw.Geometry.Point2d sect_pt);
+            if (equip_pt_list == null || sect_pt == null)
             {
                 XtraMessageBox.Show("璁$畻澶辫触,璁捐鐐逛笉鍚堢悊!");
                 return;
             }
 
-            _vm.Equip = new Yw.WinFrmUI.Phart.PumpCurveEquipViewModel();
-            _vm.Equip.Id = Guid.NewGuid().ToString();
-            _vm.Equip.Color = Color.Black;
-            _vm.Equip.StartH = start_head;
-            _vm.Equip.PipeQ = pipe_flow;
-            _vm.Equip.PipeH = pipe_head;
+            var pump_sect_pt = new Yw.WinFrmUI.Phart.PumpSectPointViewModel();
+            pump_sect_pt.Q = sect_pt.X;
+            pump_sect_pt.H = sect_pt.Y;
 
-            _vm.Equip.SectQ = sect_pt.X;
-            _vm.Equip.SectH = sect_pt.Y;
-
-            if (_vm.CurveQP != null && _vm.CurveQP.Any())
+            var qe50 = _vm_list.Find(x => x.Hz == 50 && x.CurveType == Yw.Ahart.eCurveType.QE);
+            if (qe50 != null)
             {
-                _vm.Equip.SectP = _vm.CurveQP.GetInterPointsY(sect_pt.X)?.FirstOrDefault();
+                pump_sect_pt.E = qe50?.FitPointList?.GetInterPointsY(sect_pt.X)?.FirstOrDefault();
             }
 
-            if (_vm.CurveQE != null && _vm.CurveQE.Any())
+            var qp50 = _vm_list.Find(x => x.Hz == 50 && x.CurveType == Yw.Ahart.eCurveType.QP);
+            if (qp50 != null)
             {
-                _vm.Equip.SectE = _vm.CurveQE.GetInterPointsY(sect_pt.X)?.FirstOrDefault();
+                pump_sect_pt.P = qp50?.FitPointList?.GetInterPointsY(sect_pt.X)?.FirstOrDefault();
             }
 
-            _vm.Equip.CurveEquip = equip_line.GetPointList(Yw.Ahart.eFeatType.Cubic);
-            SetBindingData(_vm, _default_visible, _split_panel, _eff_visible, _power_visible, _equal_eff_visible);
+            this.pumpViewChart1.SetEquip(equip_pt_list, pump_sect_pt);
         }
 
         private void barCekEffVisible_CheckedChanged(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
         {
             _eff_visible = this.barCekEffVisible.Checked;
-            SetBindingData(_vm, _default_visible, _split_panel, _eff_visible, _power_visible, _equal_eff_visible);
+            SetBindingData(_vm_list,_coordinate, _split_panel, _eff_visible, _power_visible, _equal_eff_visible);
         }
 
         private void barCekPowerVisible_CheckedChanged(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
         {
             _power_visible = this.barCekPowerVisible.Checked;
-            SetBindingData(_vm, _default_visible, _split_panel, _eff_visible, _power_visible, _equal_eff_visible);
+            SetBindingData(_vm_list,_coordinate, _split_panel,  _eff_visible, _power_visible, _equal_eff_visible);
         }
 
         private void barCekSplitPanel_CheckedChanged(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
         {
             _split_panel = this.barCekSplitPanel.Checked;
-            SetBindingData(_vm, _default_visible, _split_panel, _eff_visible, _power_visible, _equal_eff_visible);
+            SetBindingData(_vm_list,_coordinate, _split_panel,  _eff_visible, _power_visible, _equal_eff_visible);
         }
 
         private void barCekEqVisible_CheckedChanged(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
@@ -222,15 +292,14 @@
             }
             else
             {
-                _vm.Equip = null;
-                SetBindingData(_vm, _default_visible, _split_panel, _eff_visible, _power_visible, _equal_eff_visible);
+                this.pumpViewChart1.SetEquip(null,null);
             }
         }
 
         private void barCekEqulEffVisible_CheckedChanged(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
         {
             _equal_eff_visible = this.barCekEqulEffVisible.Checked;
-            SetBindingData(_vm, _default_visible, _split_panel, _eff_visible, _power_visible, _equal_eff_visible);
+            SetBindingData(_vm_list,_coordinate, _split_panel,  _eff_visible, _power_visible, _equal_eff_visible);
         }
 
         private void barBtnEqClear_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
@@ -239,8 +308,7 @@
             this.barTxtPipeQ.EditValue = null;
             this.barTxtPipeHead.EditValue = null;
 
-            _vm.Equip = null;
-            SetBindingData(_vm, _default_visible, _split_panel, _eff_visible, _power_visible, _equal_eff_visible);
+            this.pumpViewChart1.SetEquip(null, null);
         }
 
         private void barBtnSetEqPt_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
@@ -270,9 +338,15 @@
 
         private void AddByN()
         {
-            if (_vm == null)
+            if (IsInvalidData())
                 return;
-            var dlg = new SetValueDlg();
+            var qh50 = _vm_list.Find(x => x.Hz == 50 && x.CurveType == Yw.Ahart.eCurveType.QH);
+            if (qh50 == null)
+                return;
+            var qe50 = _vm_list.Find(x => x.Hz == 50 && x.CurveType == Yw.Ahart.eCurveType.QE);
+            var qp50 = _vm_list.Find(x => x.Hz == 50 && x.CurveType == Yw.Ahart.eCurveType.QP);
+
+            var dlg = new Yw.WinFrmUI.Phart.SetValueDlg();
             dlg.SetBindingData(_nr);
             dlg.VerifyValueChanged += (speed) =>
             {
@@ -281,25 +355,18 @@
                 {
                     return false;
                 }
+                if (_vm_list.Exists(x => x.N == speed))
+                {
+                    TipFormHelper.ShowWarn("杞�熷凡瀛樺湪");
+                    return false;
+                }
+                hz = Math.Round(hz, 1);  
 
-                var index = _vm.VariableSpeedList?.Count + 1 ?? 1;
-                var vs_color = Yw.WinFrmUI.PhartColorHelper.Get(index);
-                var vs_vm = new Yw.WinFrmUI.Phart.PumpCurveVariableSpeedViewModel();
-                vs_vm.Id = Guid.NewGuid().ToString();
-                vs_vm.ColorQH = vs_color;
-                vs_vm.ColorQE = vs_color;
-                vs_vm.ColorQP = vs_color;
-                vs_vm.CurveQHName = $"{speed}rpm({hz}hz)";
-                vs_vm.CurveQPName = $"{speed}rpm({hz}hz)";
-                vs_vm.CurveQH = _vm.CurveQH.GetQHPointListByN(50, hz);
-                vs_vm.CurveQE = _vm.CurveQE.GetQEPointListByN(50, hz);
-                vs_vm.CurveQP = _vm.CurveQP.GetQEPointListByN(50, hz);
-                vs_vm.N = speed;
-                vs_vm.Hz = hz;
-                _vm.VariableSpeedList.Add(vs_vm);
-                SetBindingData(_vm, _default_visible, _split_panel, _eff_visible, _power_visible, _equal_eff_visible);
+                var pt_qh_list = qh50.FitPointList.GetQHPointListByN(50, hz);
+                var pt_qe_list = qe50?.FitPointList?.GetQEPointListByN(50, hz);
+                var pt_qp_list = qp50?.FitPointList?.GetQPPointListByN(50, hz);
 
-                //this.DataChangedEvent?.Invoke();
+                Insert(hz,speed,pt_qh_list,pt_qe_list,pt_qp_list); 
                 return true;
             };
             dlg.ShowDialog();
@@ -307,33 +374,36 @@
 
         private void AddByHz()
         {
-            if (_vm == null)
+            if (IsInvalidData())
                 return;
-            var dlg = new SetValueDlg();
+
+            var qh50 = _vm_list.Find(x => x.Hz == 50 && x.CurveType == Yw.Ahart.eCurveType.QH);
+            if (qh50 == null)
+                return;
+            var qe50 = _vm_list.Find(x => x.Hz == 50 && x.CurveType == Yw.Ahart.eCurveType.QE);
+            var qp50 = _vm_list.Find(x => x.Hz == 50 && x.CurveType == Yw.Ahart.eCurveType.QP);
+
+            var dlg = new Yw.WinFrmUI.Phart.SetValueDlg();
             dlg.VerifyValueChanged += (hz) =>
             {
                 if (hz > 50 || hz < 10)
                 {
                     return false;
                 }
+                if (_vm_list.Exists(x => x.Hz == hz))
+                {
+                    TipFormHelper.ShowWarn("棰戠巼宸插瓨鍦�");
+                    return false;
+                }
                 var speed = Math.Round(hz / 50 * _nr);
-                var index = _vm.VariableSpeedList?.Count + 1 ?? 1;
-                var vs_color = Yw.WinFrmUI.PhartColorHelper.Get(index);
-                var vs_vm = new Yw.WinFrmUI.Phart.PumpCurveVariableSpeedViewModel();
-                vs_vm.Id = Guid.NewGuid().ToString();
-                vs_vm.ColorQH = vs_color;
-                vs_vm.ColorQE = vs_color;
-                vs_vm.ColorQP = vs_color;
-                vs_vm.CurveQHName = $"{speed}rpm({hz}hz)";
-                vs_vm.CurveQPName = $"{speed}rpm({hz}hz)";
-                vs_vm.CurveQH = _vm.CurveQH.GetQHPointListByN(50, hz);
-                vs_vm.CurveQE = _vm.CurveQE.GetQEPointListByN(50, hz);
-                vs_vm.CurveQP = _vm.CurveQP.GetQEPointListByN(50, hz);
-                vs_vm.N = speed;
-                vs_vm.Hz = hz;
-                _vm.VariableSpeedList.Add(vs_vm);
-                SetBindingData(_vm, _default_visible, _split_panel, _eff_visible, _power_visible, _equal_eff_visible);
+                speed = Math.Round(speed, 1);
+              
 
+                var pt_qh_list = qh50.FitPointList.GetQHPointListByN(50, hz);
+                var pt_qe_list = qe50?.FitPointList?.GetQEPointListByN(50, hz);
+                var pt_qp_list = qp50?.FitPointList?.GetQPPointListByN(50, hz); 
+
+                Insert(hz, speed, pt_qh_list, pt_qe_list, pt_qp_list);  
                 return true;
             };
             dlg.ShowDialog();
@@ -341,16 +411,22 @@
 
         private void AddByPoint()
         {
-            if (_vm == null)
+            if (IsInvalidData())
                 return;
-            if (!_vm.IsValid())
+
+            var qh50 = _vm_list.Find(x => x.Hz == 50 && x.CurveType == Yw.Ahart.eCurveType.QH);
+            if (qh50 == null)
                 return;
-            var dlg = new SetPointDlg();
+            var qe50 = _vm_list.Find(x => x.Hz == 50 && x.CurveType == Yw.Ahart.eCurveType.QE);
+            var qp50 = _vm_list.Find(x => x.Hz == 50 && x.CurveType == Yw.Ahart.eCurveType.QP);
+
+            var dlg = new Yw.WinFrmUI.Phart.SetPointDlg();
             dlg.SetBindingData();
             dlg.VerifyValueChanged += (x, y) =>
             {
                 var pt = new Yw.Geometry.Point2d(x, y);
-                var sect_pt = Yw.Pump.PerformParabolaHelper.GetQHSectPoint(_model.CurveQH, pt);
+                var curve = new Yw.Pump. CurveQH(qh50.FeatType, qh50.DefPointList);
+                var sect_pt = Yw.Pump.PerformParabolaHelper.GetQHSectPoint(curve, pt);
                 if (sect_pt == null || sect_pt.IsZeroPoint())
                     return false;
 
@@ -361,23 +437,16 @@
                     return false;
                 }
                 speed = Math.Round(speed, 1);
-                var index = _vm.VariableSpeedList?.Count + 1 ?? 1;
-                var vs_color = Yw.WinFrmUI.PhartColorHelper.Get(index);
-                var vs_vm = new Yw.WinFrmUI.Phart.PumpCurveVariableSpeedViewModel();
-                vs_vm.Id = Guid.NewGuid().ToString();
-                vs_vm.ColorQH = vs_color;
-                vs_vm.ColorQE = vs_color;
-                vs_vm.ColorQP = vs_color;
-                vs_vm.CurveQHName = $"{speed}rpm({hz}hz)";
-                vs_vm.CurveQPName = $"{speed}rpm({hz}hz)";
-                vs_vm.CurveQH = _vm.CurveQH.GetQHPointListByN(50, hz);
-                vs_vm.CurveQE = _vm.CurveQE.GetQEPointListByN(50, hz);
-                vs_vm.CurveQP = _vm.CurveQP.GetQEPointListByN(50, hz);
-                vs_vm.N = speed;
-                vs_vm.Hz = hz;
-                _vm.VariableSpeedList.Add(vs_vm);
-                SetBindingData(_vm, _default_visible, _split_panel, _eff_visible, _power_visible, _equal_eff_visible);
+                if (_vm_list.Exists(x => x.N == speed))
+                {
+                    TipFormHelper.ShowWarn("杞�熷凡瀛樺湪");
+                    return false;
+                }
+                var pt_qh_list = qh50.FitPointList.GetQHPointListByN(50, hz);
+                var pt_qe_list = qe50?.FitPointList?.GetQEPointListByN(50, hz);
+                var pt_qp_list = qp50?.FitPointList?.GetQPPointListByN(50, hz);
 
+                Insert(hz, speed, pt_qh_list, pt_qe_list, pt_qp_list);
                 return true;
             };
             dlg.ShowDialog();
@@ -385,52 +454,229 @@
 
         private void AddByEff()
         {
-            if (_vm == null)
+            if (IsInvalidData())
                 return;
-            if (!_vm.IsValid())
+            var qh50 = _vm_list.Find(x => x.Hz == 50 && x.CurveType == Yw.Ahart.eCurveType.QH);
+            if (qh50 == null)
                 return;
-            if (_vm.CurveQE == null || !_vm.CurveQE.Any())
+            var qe50 = _vm_list.Find(x => x.Hz == 50 && x.CurveType == Yw.Ahart.eCurveType.QE);
+            if (qe50 == null)
                 return;
+
             var dlg = new SetEffDlg();
             dlg.SetBindingData();
             dlg.VerifyValueChanged += (eff_double_list) =>
             {
                 double max_hz = 50;
                 double min_hz = 30;
-                if (_vm.VariableSpeedList != null && _vm.VariableSpeedList.Any())
-                {
-                    max_hz = Math.Max(max_hz, _vm.VariableSpeedList.Max(x => x.Hz));
-                    min_hz = Math.Min(min_hz, _vm.VariableSpeedList.Min(x => x.Hz));
-                }
+
+                max_hz = Math.Max(max_hz, _vm_list.Max(x => x.Hz));
+                min_hz = Math.Min(min_hz, _vm_list.Min(x => x.Hz));
+
+                var qh = new Yw.Pump.CurveQH(qh50.FeatType, qh50.DefPointList);
+                var qe = new Yw.Pump.CurveQE(qe50.FeatType, qe50.DefPointList);
 
                 foreach (var eff in eff_double_list)
                 {
-                    var eff_list = EqualParaCurveEListHelper.CalcEqualParaCurveE(_model.CurveQH, _model.CurveQE, max_hz, min_hz, eff);
+                    var eff_list = EqualParaCurveEListHelper.CalcEqualParaCurveE(qh, qe, max_hz, min_hz, eff);
                     if (eff_list != null && eff_list.Any())
                     {
                         foreach (var item in eff_list)
-                        {
-                            var def_pt_list = item.DefinePoints;
-                            var eff_vm = new Yw.WinFrmUI.Phart.PumpCurveEqualEffViewModel();
-                            eff_vm.Id = Guid.NewGuid().ToString();
-                            eff_vm.CurveName = $"{item.Eff:N1}";
-                            eff_vm.Color = Color.DarkGreen;
-                            eff_vm.CurveEqualEff = item.DefinePoints;
-                            eff_vm.Tension = item.Tension;
-                            eff_vm.IsClosed = item.IsClosed;
-                            _vm.EqualEffList.Add(eff_vm);
+                        {  
+                            Insert(item.Eff,item.Tension,item.IsClosed,item.IsUShaped,item.DefinePoints);
                         }
                     }
                 }
-
-                SetBindingData(_vm, _default_visible, _split_panel, _eff_visible, _power_visible, _equal_eff_visible);
-
+                 
                 return true;
             };
             dlg.ShowDialog();
 
         }
 
+
+        private async void Insert(double hz, double speed, List<Yw.Geometry.Point2d> pt_qh_list, List<Yw.Geometry.Point2d> pt_qe_list, List<Yw.Geometry.Point2d> pt_qp_list)
+        { 
+            var list = new List<Yw.Vmo.PhartGraphVmo>();
+            var graph_qh = new Yw.Vmo.PhartGraphVmo()
+            {
+                Name = "鎵▼绾�",
+                GraphType = (int)Yw.Ahart.eCurveType.QH,
+                GraphParas = new QHGraphParasViewModel()
+                {
+                    Hz = hz,
+                    N = speed,
+                }.ToJson(),
+                GeometryParas = new Yw.WinFrmUI.Phart.CurveGeometryParasViewModel
+                {
+                    DefinePoints = pt_qh_list
+                }.ToJson(),
+                GeometryStyle = (int)HStation.PhartRelation.eGeometryStyle.FeatCurve,
+                GeometryInfo = pt_qh_list.ToDbString(Yw.Ahart.eCurveType.QH, Yw.Ahart.eFeatType.Cubic),
+                AnnotationParas = new List<Yw.WinFrmUI.Phart.AnnotationParasViewModel>()
+                    {
+                       new  ()
+                       {
+                            X = pt_qh_list.Last().X,
+                            Y = pt_qh_list.Last().Y,
+                            Text = $"{speed}rpm({hz}hz)",
+                            Aligment = eTextAligment.Right
+                       }
+                    }.ToJson()
+            };
+
+            list.Add(graph_qh);
+            if (pt_qe_list != null && pt_qe_list.Any())
+            {
+                var graph_qe = new Yw.Vmo.PhartGraphVmo()
+                {
+                    Name = "鏁堢巼绾�",
+                    GraphType = (int)Yw.Ahart.eCurveType.QE,
+                    GraphParas = new QEGraphParasViewModel()
+                    {
+                        Hz = hz,
+                        N = speed,
+                    }.ToJson(),
+                    GeometryParas = new Yw.WinFrmUI.Phart.CurveGeometryParasViewModel
+                    {
+                        DefinePoints = pt_qe_list
+                    }.ToJson(),
+                    GeometryStyle = (int)HStation.PhartRelation.eGeometryStyle.FeatCurve,
+                    GeometryInfo = pt_qe_list.ToDbString(Yw.Ahart.eCurveType.QE, Yw.Ahart.eFeatType.Cubic),
+                    AnnotationParas = new List<Yw.WinFrmUI.Phart.AnnotationParasViewModel>()
+                    {
+                       new  ()
+                       {
+                            X = pt_qe_list.Last().X,
+                            Y = pt_qe_list.Last().Y,
+                            Text = $"{speed}rpm({hz}hz)",
+                            Aligment = eTextAligment.Right
+                       }
+                    }.ToJson()
+                };
+
+                list.Add(graph_qe);
+            }
+
+
+            if (pt_qp_list != null && pt_qp_list.Any())
+            {
+                var graph_qp = new Yw.Vmo.PhartGraphVmo()
+                {
+                    Name = "鍔熺巼绾�",
+                    GraphType = (int)Yw.Ahart.eCurveType.QP,
+                    GraphParas = new QPGraphParasViewModel()
+                    {
+                        Hz = hz,
+                        N = speed,
+                    }.ToJson(),
+                    GeometryParas = new Yw.WinFrmUI.Phart.CurveGeometryParasViewModel
+                    {
+                        DefinePoints = pt_qp_list
+                    }.ToJson(),
+                    GeometryStyle = (int)HStation.PhartRelation.eGeometryStyle.FeatCurve,
+                    GeometryInfo = pt_qp_list.ToDbString(Yw.Ahart.eCurveType.QP, Yw.Ahart.eFeatType.Cubic),
+                    AnnotationParas = new List<Yw.WinFrmUI.Phart.AnnotationParasViewModel>()
+                    {
+                       new  ()
+                       {
+                            X = pt_qp_list.Last().X,
+                            Y = pt_qp_list.Last().Y,
+                            Text = $"{speed}rpm({hz}hz)",
+                            Aligment = eTextAligment.Right
+                       }
+                    }.ToJson()
+                };
+
+                list.Add(graph_qp);
+            }
+
+ 
+            list.ForEach(x => x.DiagramID = _vmo.ID);
+            var bol = await new Yw.BLL.PhartGraph().Inserts(list);
+            if (!bol)
+            {
+                TipFormHelper.ShowWarn("娣诲姞澶辫触!");
+                return;
+            }
+              
+            var newVmo = await new Yw.BLL.PhartDiagramExtensions().GetByID(_vmo.ID);
+            if (newVmo == null)
+            {
+                TipFormHelper.ShowWarn("鑾峰彇澶辫触!");
+                return;
+            }
+
+            SetBindingData(newVmo, _nr);
+            SetEquip();
+        }
+
+        private async void Insert(double eff, double tension, bool is_closed,bool is_u, List<Yw.Geometry.Point2d> pt_equal_e_list)
+        {
+            if (tension<=0)
+            {
+                tension = 0.5;
+            }
+            var list = new List<Yw.Vmo.PhartGraphVmo>();
+            var graph_equal_e = new Yw.Vmo.PhartGraphVmo()
+            {
+                Name = "鎵▼绾�",
+                GraphType = (int)Yw.Ahart.eCurveType.EqualE,
+                GraphParas = new EqualEGraphParasViewModel()
+                {
+                    Eff = eff,
+                    Tension = tension,
+                    IsClosed = is_closed,
+                }.ToJson(),
+                GeometryParas = new Yw.WinFrmUI.Phart.CurveGeometryParasViewModel
+                {
+                    DefinePoints = pt_equal_e_list
+                }.ToJson(),
+                GeometryStyle = (int)HStation.PhartRelation.eGeometryStyle.FeatCurve,
+                GeometryInfo = pt_equal_e_list.ToDbString(Yw.Ahart.eCurveType.EqualE, Yw.Ahart.eFeatType.Cubic),
+               
+            };
+
+            var annotation_list = new List<Yw.WinFrmUI.Phart.AnnotationParasViewModel>();
+            annotation_list.Add(new()
+            {
+                X = pt_equal_e_list.Last().X,
+                Y = pt_equal_e_list.Last().Y,
+                Text = $"{eff}%",
+                Aligment = eTextAligment.Right
+            });
+            if (is_u)
+            {
+                var first = pt_equal_e_list.First();
+                annotation_list.Add(new()
+                {
+                    X = first.X,
+                    Y = first.Y,
+                    Text = $"{eff}%",
+                    Aligment = eTextAligment.Right
+                });
+            }
+            graph_equal_e.AnnotationParas = annotation_list.ToJson();
+            list.Add(graph_equal_e);
+            list.ForEach(x => x.DiagramID = _vmo.ID);
+            var bol = await new Yw.BLL.PhartGraph().Inserts(list);
+            if (!bol)
+            {
+                TipFormHelper.ShowWarn("娣诲姞澶辫触!");
+                return;
+            }
+
+            var newVmo = await new Yw.BLL.PhartDiagramExtensions().GetByID(_vmo.ID);
+            if (newVmo == null)
+            {
+                TipFormHelper.ShowWarn("鑾峰彇澶辫触!");
+                return;
+            }
+
+            SetBindingData(newVmo, _nr);
+            SetEquip();
+        }
+
         /// <summary>
         /// 鑾峰彇
         /// </summary> 
diff --git a/WinFrmUI/HStation.WinFrmUI.PhartRelation.Core/03-valve/02-edit/ValveChartEditCtrl.cs b/WinFrmUI/HStation.WinFrmUI.PhartRelation.Core/03-valve/02-edit/ValveChartEditCtrl.cs
index 51ca3be..ced4060 100644
--- a/WinFrmUI/HStation.WinFrmUI.PhartRelation.Core/03-valve/02-edit/ValveChartEditCtrl.cs
+++ b/WinFrmUI/HStation.WinFrmUI.PhartRelation.Core/03-valve/02-edit/ValveChartEditCtrl.cs
@@ -30,7 +30,7 @@
                 if (feat_curve == null || feat_curve.IsInvalid())
                     continue;
 
-                var geometry_paras = Yw.WinFrmUI.PhartGraphHelper.GetGeometryParas<Yw.WinFrmUI.Phart.CurveGeometryParasViewModel>(curve_type, graph.GeometryParas);
+                var geometry_paras = Yw.WinFrmUI.PhartGraphHelper.GetGeometryParas(curve_type, graph.GeometryParas);
                 var graph_paras = Yw.WinFrmUI.PhartGraphHelper.GetGraphParas<Yw.WinFrmUI.Phart.QLGraphParasViewModel>(curve_type, graph.GraphParas);
 
                 var vm = new Yw.WinFrmUI.Phart.ValveEditChartViewModel();
diff --git a/WinFrmUI/HStation.WinFrmUI.PhartRelation.Core/HStation.WinFrmUI.PhartRelation.Core.csproj b/WinFrmUI/HStation.WinFrmUI.PhartRelation.Core/HStation.WinFrmUI.PhartRelation.Core.csproj
index 4ca551d..26af384 100644
--- a/WinFrmUI/HStation.WinFrmUI.PhartRelation.Core/HStation.WinFrmUI.PhartRelation.Core.csproj
+++ b/WinFrmUI/HStation.WinFrmUI.PhartRelation.Core/HStation.WinFrmUI.PhartRelation.Core.csproj
@@ -62,7 +62,7 @@
   <ItemGroup>
     <PackageReference Include="DevExpress.Win.Design" Version="23.2.4" />
     <PackageReference Include="NPOI" Version="2.7.1" />
-    <PackageReference Include="Yw.BLL.Phart.Core" Version="3.0.5" />
+    <PackageReference Include="Yw.BLL.Phart.Core" Version="3.0.6" />
   </ItemGroup>
 
   <ItemGroup>
diff --git a/WinFrmUI/HStation.WinFrmUI.PhartRelation.Core/Properties/Resources.Designer.cs b/WinFrmUI/HStation.WinFrmUI.PhartRelation.Core/Properties/Resources.Designer.cs
index ec2aad8..3f5f7c1 100644
--- a/WinFrmUI/HStation.WinFrmUI.PhartRelation.Core/Properties/Resources.Designer.cs
+++ b/WinFrmUI/HStation.WinFrmUI.PhartRelation.Core/Properties/Resources.Designer.cs
@@ -63,6 +63,66 @@
         /// <summary>
         ///   鏌ユ壘 DevExpress.Utils.Svg.SvgImage 绫诲瀷鐨勬湰鍦板寲璧勬簮銆�
         /// </summary>
+        internal static DevExpress.Utils.Svg.SvgImage actions_add {
+            get {
+                object obj = ResourceManager.GetObject("actions_add", resourceCulture);
+                return ((DevExpress.Utils.Svg.SvgImage)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   鏌ユ壘 DevExpress.Utils.Svg.SvgImage 绫诲瀷鐨勬湰鍦板寲璧勬簮銆�
+        /// </summary>
+        internal static DevExpress.Utils.Svg.SvgImage actions_add1 {
+            get {
+                object obj = ResourceManager.GetObject("actions_add1", resourceCulture);
+                return ((DevExpress.Utils.Svg.SvgImage)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   鏌ユ壘 DevExpress.Utils.Svg.SvgImage 绫诲瀷鐨勬湰鍦板寲璧勬簮銆�
+        /// </summary>
+        internal static DevExpress.Utils.Svg.SvgImage actions_addcircled {
+            get {
+                object obj = ResourceManager.GetObject("actions_addcircled", resourceCulture);
+                return ((DevExpress.Utils.Svg.SvgImage)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   鏌ユ壘 DevExpress.Utils.Svg.SvgImage 绫诲瀷鐨勬湰鍦板寲璧勬簮銆�
+        /// </summary>
+        internal static DevExpress.Utils.Svg.SvgImage actions_addcircled1 {
+            get {
+                object obj = ResourceManager.GetObject("actions_addcircled1", resourceCulture);
+                return ((DevExpress.Utils.Svg.SvgImage)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   鏌ユ壘 DevExpress.Utils.Svg.SvgImage 绫诲瀷鐨勬湰鍦板寲璧勬簮銆�
+        /// </summary>
+        internal static DevExpress.Utils.Svg.SvgImage actions_addcircled2 {
+            get {
+                object obj = ResourceManager.GetObject("actions_addcircled2", resourceCulture);
+                return ((DevExpress.Utils.Svg.SvgImage)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   鏌ユ壘 DevExpress.Utils.Svg.SvgImage 绫诲瀷鐨勬湰鍦板寲璧勬簮銆�
+        /// </summary>
+        internal static DevExpress.Utils.Svg.SvgImage actions_addcircled3 {
+            get {
+                object obj = ResourceManager.GetObject("actions_addcircled3", resourceCulture);
+                return ((DevExpress.Utils.Svg.SvgImage)(obj));
+            }
+        }
+        
+        /// <summary>
+        ///   鏌ユ壘 DevExpress.Utils.Svg.SvgImage 绫诲瀷鐨勬湰鍦板寲璧勬簮銆�
+        /// </summary>
         internal static DevExpress.Utils.Svg.SvgImage clearall {
             get {
                 object obj = ResourceManager.GetObject("clearall", resourceCulture);
diff --git a/WinFrmUI/HStation.WinFrmUI.PhartRelation.Core/Properties/Resources.resx b/WinFrmUI/HStation.WinFrmUI.PhartRelation.Core/Properties/Resources.resx
index 97f7da5..daf2aae 100644
--- a/WinFrmUI/HStation.WinFrmUI.PhartRelation.Core/Properties/Resources.resx
+++ b/WinFrmUI/HStation.WinFrmUI.PhartRelation.Core/Properties/Resources.resx
@@ -133,4 +133,22 @@
   <data name="menu1" type="System.Resources.ResXFileRef, System.Windows.Forms">
     <value>..\Resources\menu1.svg;DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2, Version=23.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value>
   </data>
+  <data name="actions_add" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\actions_add.svg;DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2, Version=23.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value>
+  </data>
+  <data name="actions_add1" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\actions_add1.svg;DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2, Version=23.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value>
+  </data>
+  <data name="actions_addcircled" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\actions_addcircled.svg;DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2, Version=23.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value>
+  </data>
+  <data name="actions_addcircled1" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\actions_addcircled1.svg;DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2, Version=23.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value>
+  </data>
+  <data name="actions_addcircled2" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\actions_addcircled2.svg;DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2, Version=23.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value>
+  </data>
+  <data name="actions_addcircled3" type="System.Resources.ResXFileRef, System.Windows.Forms">
+    <value>..\Resources\actions_addcircled3.svg;DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2, Version=23.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value>
+  </data>
 </root>
\ No newline at end of file
diff --git a/WinFrmUI/HStation.WinFrmUI.PhartRelation.Core/Resources/actions_add.svg b/WinFrmUI/HStation.WinFrmUI.PhartRelation.Core/Resources/actions_add.svg
new file mode 100644
index 0000000..0f7c9b6
--- /dev/null
+++ b/WinFrmUI/HStation.WinFrmUI.PhartRelation.Core/Resources/actions_add.svg
@@ -0,0 +1,15 @@
+锘�<?xml version='1.0' encoding='UTF-8'?>
+<svg x="0px" y="0px" viewBox="0 0 32 32" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" id="Layer_1" style="enable-background:new 0 0 32 32">
+  <style type="text/css">
+	.Blue{fill:#1177D7;}
+	.Yellow{fill:#FFB115;}
+	.Black{fill:#727272;}
+	.Green{fill:#039C23;}
+	.Red{fill:#D11C1C;}
+	.st0{opacity:0.75;}
+	.st1{opacity:0.5;}
+</style>
+  <g id="Add">
+    <path d="M27,14h-9V5c0-0.5-0.5-1-1-1h-2c-0.5,0-1,0.5-1,1v9H5c-0.5,0-1,0.5-1,1v2c0,0.5,0.5,1,1,1h9v9   c0,0.5,0.5,1,1,1h2c0.5,0,1-0.5,1-1v-9h9c0.5,0,1-0.5,1-1v-2C28,14.5,27.5,14,27,14z" class="Green" />
+  </g>
+</svg>
\ No newline at end of file
diff --git a/WinFrmUI/HStation.WinFrmUI.PhartRelation.Core/Resources/actions_add1.svg b/WinFrmUI/HStation.WinFrmUI.PhartRelation.Core/Resources/actions_add1.svg
new file mode 100644
index 0000000..0f7c9b6
--- /dev/null
+++ b/WinFrmUI/HStation.WinFrmUI.PhartRelation.Core/Resources/actions_add1.svg
@@ -0,0 +1,15 @@
+锘�<?xml version='1.0' encoding='UTF-8'?>
+<svg x="0px" y="0px" viewBox="0 0 32 32" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" id="Layer_1" style="enable-background:new 0 0 32 32">
+  <style type="text/css">
+	.Blue{fill:#1177D7;}
+	.Yellow{fill:#FFB115;}
+	.Black{fill:#727272;}
+	.Green{fill:#039C23;}
+	.Red{fill:#D11C1C;}
+	.st0{opacity:0.75;}
+	.st1{opacity:0.5;}
+</style>
+  <g id="Add">
+    <path d="M27,14h-9V5c0-0.5-0.5-1-1-1h-2c-0.5,0-1,0.5-1,1v9H5c-0.5,0-1,0.5-1,1v2c0,0.5,0.5,1,1,1h9v9   c0,0.5,0.5,1,1,1h2c0.5,0,1-0.5,1-1v-9h9c0.5,0,1-0.5,1-1v-2C28,14.5,27.5,14,27,14z" class="Green" />
+  </g>
+</svg>
\ No newline at end of file
diff --git a/WinFrmUI/HStation.WinFrmUI.PhartRelation.Core/Resources/actions_addcircled.svg b/WinFrmUI/HStation.WinFrmUI.PhartRelation.Core/Resources/actions_addcircled.svg
new file mode 100644
index 0000000..0c97b24
--- /dev/null
+++ b/WinFrmUI/HStation.WinFrmUI.PhartRelation.Core/Resources/actions_addcircled.svg
@@ -0,0 +1,15 @@
+锘�<?xml version='1.0' encoding='UTF-8'?>
+<svg x="0px" y="0px" viewBox="0 0 32 32" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" id="Layer_1" style="enable-background:new 0 0 32 32">
+  <style type="text/css">
+	.Blue{fill:#1177D7;}
+	.Yellow{fill:#FFB115;}
+	.Black{fill:#727272;}
+	.Green{fill:#039C23;}
+	.Red{fill:#D11C1C;}
+	.st0{opacity:0.75;}
+	.st1{opacity:0.5;}
+</style>
+  <g id="AddCircled">
+    <path d="M16,4C9.4,4,4,9.4,4,16s5.4,12,12,12s12-5.4,12-12S22.6,4,16,4z M24,18h-6v6h-4v-6H8v-4h6V8h4v6h6V18z" class="Green" />
+  </g>
+</svg>
\ No newline at end of file
diff --git a/WinFrmUI/HStation.WinFrmUI.PhartRelation.Core/Resources/actions_addcircled1.svg b/WinFrmUI/HStation.WinFrmUI.PhartRelation.Core/Resources/actions_addcircled1.svg
new file mode 100644
index 0000000..0c97b24
--- /dev/null
+++ b/WinFrmUI/HStation.WinFrmUI.PhartRelation.Core/Resources/actions_addcircled1.svg
@@ -0,0 +1,15 @@
+锘�<?xml version='1.0' encoding='UTF-8'?>
+<svg x="0px" y="0px" viewBox="0 0 32 32" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" id="Layer_1" style="enable-background:new 0 0 32 32">
+  <style type="text/css">
+	.Blue{fill:#1177D7;}
+	.Yellow{fill:#FFB115;}
+	.Black{fill:#727272;}
+	.Green{fill:#039C23;}
+	.Red{fill:#D11C1C;}
+	.st0{opacity:0.75;}
+	.st1{opacity:0.5;}
+</style>
+  <g id="AddCircled">
+    <path d="M16,4C9.4,4,4,9.4,4,16s5.4,12,12,12s12-5.4,12-12S22.6,4,16,4z M24,18h-6v6h-4v-6H8v-4h6V8h4v6h6V18z" class="Green" />
+  </g>
+</svg>
\ No newline at end of file
diff --git a/WinFrmUI/HStation.WinFrmUI.PhartRelation.Core/Resources/actions_addcircled2.svg b/WinFrmUI/HStation.WinFrmUI.PhartRelation.Core/Resources/actions_addcircled2.svg
new file mode 100644
index 0000000..0c97b24
--- /dev/null
+++ b/WinFrmUI/HStation.WinFrmUI.PhartRelation.Core/Resources/actions_addcircled2.svg
@@ -0,0 +1,15 @@
+锘�<?xml version='1.0' encoding='UTF-8'?>
+<svg x="0px" y="0px" viewBox="0 0 32 32" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" id="Layer_1" style="enable-background:new 0 0 32 32">
+  <style type="text/css">
+	.Blue{fill:#1177D7;}
+	.Yellow{fill:#FFB115;}
+	.Black{fill:#727272;}
+	.Green{fill:#039C23;}
+	.Red{fill:#D11C1C;}
+	.st0{opacity:0.75;}
+	.st1{opacity:0.5;}
+</style>
+  <g id="AddCircled">
+    <path d="M16,4C9.4,4,4,9.4,4,16s5.4,12,12,12s12-5.4,12-12S22.6,4,16,4z M24,18h-6v6h-4v-6H8v-4h6V8h4v6h6V18z" class="Green" />
+  </g>
+</svg>
\ No newline at end of file
diff --git a/WinFrmUI/HStation.WinFrmUI.PhartRelation.Core/Resources/actions_addcircled3.svg b/WinFrmUI/HStation.WinFrmUI.PhartRelation.Core/Resources/actions_addcircled3.svg
new file mode 100644
index 0000000..0c97b24
--- /dev/null
+++ b/WinFrmUI/HStation.WinFrmUI.PhartRelation.Core/Resources/actions_addcircled3.svg
@@ -0,0 +1,15 @@
+锘�<?xml version='1.0' encoding='UTF-8'?>
+<svg x="0px" y="0px" viewBox="0 0 32 32" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" id="Layer_1" style="enable-background:new 0 0 32 32">
+  <style type="text/css">
+	.Blue{fill:#1177D7;}
+	.Yellow{fill:#FFB115;}
+	.Black{fill:#727272;}
+	.Green{fill:#039C23;}
+	.Red{fill:#D11C1C;}
+	.st0{opacity:0.75;}
+	.st1{opacity:0.5;}
+</style>
+  <g id="AddCircled">
+    <path d="M16,4C9.4,4,4,9.4,4,16s5.4,12,12,12s12-5.4,12-12S22.6,4,16,4z M24,18h-6v6h-4v-6H8v-4h6V8h4v6h6V18z" class="Green" />
+  </g>
+</svg>
\ No newline at end of file
diff --git a/WinFrmUI/Yw.WinFrmUI.Phart.Core/00-core/01-helper/PhartGraphHelper.cs b/WinFrmUI/Yw.WinFrmUI.Phart.Core/00-core/01-helper/PhartGraphHelper.cs
index a58aed2..45704f4 100644
--- a/WinFrmUI/Yw.WinFrmUI.Phart.Core/00-core/01-helper/PhartGraphHelper.cs
+++ b/WinFrmUI/Yw.WinFrmUI.Phart.Core/00-core/01-helper/PhartGraphHelper.cs
@@ -200,14 +200,14 @@
         /// <summary>
         /// 鑾峰彇 GeometryParas
         /// </summary>
-        public static object GetGeometryParas(Yw.Ahart.eCurveType curveType, string geometryParas)
+        public static CurveGeometryParasViewModel GetGeometryParas(Yw.Ahart.eCurveType curveType, string geometryParas)
         {
             if (string.IsNullOrEmpty(geometryParas))
             {
                 return default;
             }
 
-            object obj = null;
+            CurveGeometryParasViewModel obj = null;
             switch (curveType)
             {
                 case Ahart.eCurveType.QH:
@@ -262,23 +262,7 @@
             return obj;
         }
 
-        /// <summary>
-        /// 鑾峰彇 GeometryParas
-        /// </summary>
-        public static T GetGeometryParas<T>(Yw.Ahart.eCurveType curveType, string graphParas)
-        {
-            if (string.IsNullOrEmpty(graphParas))
-            {
-                return default;
-            }
 
-            var obj = GetGeometryParas(curveType, graphParas);
-            if (obj is T t)
-            {
-                return t;
-            }
-            return default;
-        }
 
         #endregion
 
@@ -287,84 +271,67 @@
         /// <summary>
         /// 鑾峰彇 AnnotationParas
         /// </summary>
-        public static object GetAnnotationParas(Yw.Ahart.eCurveType curveType, string annotationParas)
+        public static List<AnnotationParasViewModel> GetAnnotationParasList(Yw.Ahart.eCurveType curveType, string annotationParas)
         {
             if (string.IsNullOrEmpty(annotationParas))
             {
                 return default;
             }
 
-            object obj = null;
+            List<AnnotationParasViewModel> list = null;
             switch (curveType)
             {
                 case Ahart.eCurveType.QH:
                     {
-                        obj = AnnotationParasViewModel.ToList(annotationParas);
+                        list = AnnotationParasViewModel.ToList(annotationParas);
                     }
                     break;
                 case Ahart.eCurveType.QP:
                     {
-                        obj = AnnotationParasViewModel.ToModel(annotationParas);
+                        list = AnnotationParasViewModel.ToList(annotationParas);
                     }
                     break;
                 case Ahart.eCurveType.QE:
                     {
-                        obj = AnnotationParasViewModel.ToModel(annotationParas);
+                        list = AnnotationParasViewModel.ToList(annotationParas);
                     }
                     break;
                 case Ahart.eCurveType.QNPSH:
                     {
-                        obj = AnnotationParasViewModel.ToList(annotationParas);
+                        list = AnnotationParasViewModel.ToList(annotationParas);
                     }
                     break;
                 case Ahart.eCurveType.EqualE:
                     {
-                        obj = AnnotationParasViewModel.ToList(annotationParas);
+                        list = AnnotationParasViewModel.ToList(annotationParas);
                     }
                     break;
                 case Ahart.eCurveType.EqualP:
                     {
-                        obj = AnnotationParasViewModel.ToList(annotationParas);
+                        list = AnnotationParasViewModel.ToList(annotationParas);
                     }
                     break;
                 case Ahart.eCurveType.QL:
                     {
-                        obj = AnnotationParasViewModel.ToList(annotationParas);
+                        list = AnnotationParasViewModel.ToList(annotationParas);
                     }
                     break;
                 case Ahart.eCurveType.OL:
                     {
-                        obj = AnnotationParasViewModel.ToList(annotationParas);
+                        list = AnnotationParasViewModel.ToList(annotationParas);
                     }
                     break;
                 case Ahart.eCurveType.VOL:
                     {
-                        obj = AnnotationParasViewModel.ToList(annotationParas);
+                        list = AnnotationParasViewModel.ToList(annotationParas);
                     }
                     break;
                 default:
                     break;
             }
-            return obj;
+            return list;
         }
-
-        /// <summary>
-        /// 鑾峰彇 AnnotationParas
-        /// </summary>
-        public static T GetAnnotationParas<T>(Yw.Ahart.eCurveType curveType, string annotationParas)
-        {
-            if (string.IsNullOrEmpty(annotationParas))
-            {
-                return default;
-            }
-
-            var obj = GetGeometryParas(curveType, annotationParas);
-            if (obj is T t)
-            {
-                return t;
-            }
-            return default;
-        }
+ 
         #endregion
 
         #region 鑾峰彇瀛樺偍瀛楃涓�
diff --git a/WinFrmUI/Yw.WinFrmUI.Phart.Core/00-core/03-view-model/01-curve/EqualEViewModel.cs b/WinFrmUI/Yw.WinFrmUI.Phart.Core/00-core/03-view-model/01-curve/EqualEViewModel.cs
index 21d23d9..93b94ca 100644
--- a/WinFrmUI/Yw.WinFrmUI.Phart.Core/00-core/03-view-model/01-curve/EqualEViewModel.cs
+++ b/WinFrmUI/Yw.WinFrmUI.Phart.Core/00-core/03-view-model/01-curve/EqualEViewModel.cs
@@ -22,7 +22,7 @@
             this.Eff = graph_paras.Eff;
             this.Tension = graph_paras.Tension;
             this.IsClosed = graph_paras.IsClosed;
-            this.DefinePoints = geometry_paras.DefinePoints;
+            this.DefinePoints = geometry_paras.DefinePoints; 
         }
 
         /// <summary>
@@ -41,6 +41,11 @@
         public bool IsClosed { get; set; }
 
         /// <summary>
+        /// 鏄惁U褰㈢姸
+        /// </summary>
+        public bool IsUShaped { get; set; }
+
+        /// <summary>
         /// 瀹氫箟鐐瑰垪琛�
         /// </summary>
         public List<Yw.Geometry.Point2d> DefinePoints { get; set; }
diff --git a/WinFrmUI/Yw.WinFrmUI.Phart.Core/01-pump/00-core/01-coordinate/PumpCoordinate_Disp.cs b/WinFrmUI/Yw.WinFrmUI.Phart.Core/01-pump/00-core/01-coordinate/PumpCoordinate_Disp.cs
index d9f192d..8824ee8 100644
--- a/WinFrmUI/Yw.WinFrmUI.Phart.Core/01-pump/00-core/01-coordinate/PumpCoordinate_Disp.cs
+++ b/WinFrmUI/Yw.WinFrmUI.Phart.Core/01-pump/00-core/01-coordinate/PumpCoordinate_Disp.cs
@@ -207,12 +207,12 @@
             if (min_head > max_head - 0.01)
                 return null;
 
-            var validGridNumH = 6;
+            var valid_grid_num_h = 6;
             var coordinate_paras = new PumpCoordinate();
             coordinate_paras.GridNumberX = 10;//10
             coordinate_paras.GridNumberY = 18;//18
             CalcCoordinateQ(min_flow, max_flow, ref coordinate_paras, coordinate_paras.GridNumberX);
-            CalcCoordinateH(min_head, max_head, validGridNumH, ref coordinate_paras, out double disMinH, out double disMaxH);
+            CalcCoordinateH(min_head, max_head, valid_grid_num_h, ref coordinate_paras, out double disMinH, out double disMaxH);
 
             if (max_power > min_power + 0.01)
                 CalcCoordinateP(min_power, max_power, disMaxH, 0, ref coordinate_paras);
@@ -269,11 +269,11 @@
         /// </summary>
         /// <param name="min_head">鏈�灏忔壃绋�</param>
         /// <param name="max_head">鏈�澶ф壃绋�</param>
-        /// <param name="validGridNumH">鏈夋晥鎵▼鍒诲害鏁�</param>
+        /// <param name="valid_grid_num_h">鏈夋晥鎵▼鍒诲害鏁�</param>
         /// <param name="coordinate_paras">鍧愭爣Model</param>
         /// <param name="disMinH">鏈�灏忔樉绀烘壃绋�</param>
         /// <param name="disMaxH">鏈�澶ф樉绀烘壃绋�</param>
-        public static void CalcCoordinateH_Filter(double min_head, double max_head, int validGridNumH, ref PumpCoordinate coordinate_paras, out double disMinH, out double disMaxH)
+        public static void CalcCoordinateH_Filter(double min_head, double max_head, int valid_grid_num_h, ref PumpCoordinate coordinate_paras, out double disMinH, out double disMaxH)
         {
             if (max_head < 1.0)
             {
@@ -322,7 +322,7 @@
             }
             else
             {
-                CalcCoordinateH(min_head, max_head, validGridNumH, ref coordinate_paras, out disMinH, out disMaxH);
+                CalcCoordinateH(min_head, max_head, valid_grid_num_h, ref coordinate_paras, out disMinH, out disMaxH);
             }
         }
 
@@ -331,13 +331,13 @@
         /// </summary>
         /// <param name="min_head">鏈�灏忔壃绋�</param>
         /// <param name="max_head">鏈�澶ф壃绋�</param>
-        /// <param name="validGridNumH">鏈夋晥鎵▼鍒诲害鏁�</param>
+        /// <param name="valid_grid_num_h">鏈夋晥鎵▼鍒诲害鏁�</param>
         /// <param name="coordinate_paras">鍧愭爣Model</param>
         /// <param name="disMinH">鏈�灏忔樉绀烘壃绋�</param>
         /// <param name="disMaxH">鏈�澶ф樉绀烘壃绋�</param>
-        public static void CalcCoordinateH(double min_head, double max_head, int validGridNumH, ref PumpCoordinate coordinate_paras, out double disMinH, out double disMaxH)
+        public static void CalcCoordinateH(double min_head, double max_head, int valid_grid_num_h, ref PumpCoordinate coordinate_paras, out double disMinH, out double disMaxH)
         {
-            var coordSpaceH = PhartCoordinateHelper.GetOptimalSpaceMax(min_head, max_head, validGridNumH, out disMinH, out disMaxH);
+            var coordSpaceH = PhartCoordinateHelper.GetOptimalSpaceMax(min_head, max_head, valid_grid_num_h, out disMinH, out disMaxH);
             int endLineNoH = coordinate_paras.GridNumberY;
             int stratLineNoH = endLineNoH;
 
@@ -396,13 +396,7 @@
                 coordinate_paras.StartLineNoP += diff_num;
             }
 
-            //纭鍒诲害鍦ㄦ湁鏁堝埢搴﹀唴 nsx
-            var diff_line = coordinate_paras.EndLineNoP - coordinate_paras.StartLineNoP;
-            if (diff_line < spaceNum)
-            {
-                coordinate_paras.StartLineNoP -= spaceNum - diff_line;
-            }
-
+       
 
             coordinate_paras.CoordMinH = PhartCoordinateHelper.GetByPlacesLength(disMaxH - coordinate_paras.EndLineNoH * coordinate_paras.CoordSpaceH, 3);
             coordinate_paras.CoordMinP = PhartCoordinateHelper.GetByPlacesLength(disMaxP - coordinate_paras.EndLineNoP * coordinate_paras.CoordSpaceP, 3);
diff --git a/WinFrmUI/Yw.WinFrmUI.Phart.Core/01-pump/01-view/01-viewmodel/PumpCurveViewModel.cs b/WinFrmUI/Yw.WinFrmUI.Phart.Core/01-pump/01-view/01-viewmodel/PumpCurveViewModel.cs
index e02d80a..7ceaf6b 100644
--- a/WinFrmUI/Yw.WinFrmUI.Phart.Core/01-pump/01-view/01-viewmodel/PumpCurveViewModel.cs
+++ b/WinFrmUI/Yw.WinFrmUI.Phart.Core/01-pump/01-view/01-viewmodel/PumpCurveViewModel.cs
@@ -23,7 +23,7 @@
             this.Equip = rhs.Equip;
             this.VariableSpeedList = rhs.VariableSpeedList;
             this.EqualEffList = rhs.EqualEffList;
-            this.EqualPowerList = rhs.EqualPowerList;
+            //this.EqualPowerList = rhs.EqualPowerList;
         }
 
 
@@ -102,10 +102,10 @@
         /// </summary>
         public List<PumpCurveEqualEffViewModel> EqualEffList { get; set; }
 
-        /// <summary>
-        /// 绛夊姛鐜囧垪琛�
-        /// </summary>
-        public List<PumpCurveEqualPowerViewModel> EqualPowerList { get; set; }
+        ///// <summary>
+        ///// 绛夊姛鐜囧垪琛�
+        ///// </summary>
+        //public List<PumpCurveEqualPowerViewModel> EqualPowerList { get; set; }
 
         /// <summary>
         /// 鍧愭爣
diff --git "a/WinFrmUI/Yw.WinFrmUI.Phart.Core/01-pump/01-view/PumpViewChart - \345\244\215\345\210\266.Designer.cs" "b/WinFrmUI/Yw.WinFrmUI.Phart.Core/01-pump/01-view/PumpViewChart - \345\244\215\345\210\266.Designer.cs"
new file mode 100644
index 0000000..1bf5539
--- /dev/null
+++ "b/WinFrmUI/Yw.WinFrmUI.Phart.Core/01-pump/01-view/PumpViewChart - \345\244\215\345\210\266.Designer.cs"
@@ -0,0 +1,198 @@
+锘縩amespace Yw.WinFrmUI.Phart
+{
+    partial class PumpViewChart
+    {
+        /// <summary> 
+        /// Requipuired 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> 
+        /// Requipuired method for Designer support - do not modify 
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            DevExpress.XtraCharts.XYDiagram xyDiagram1 = new DevExpress.XtraCharts.XYDiagram();
+            DevExpress.XtraCharts.ConstantLine constantLine1 = new DevExpress.XtraCharts.ConstantLine();
+            DevExpress.XtraCharts.ConstantLine constantLine2 = new DevExpress.XtraCharts.ConstantLine();
+            DevExpress.XtraCharts.LayoutDefinition layoutDefinition1 = new DevExpress.XtraCharts.LayoutDefinition();
+            DevExpress.XtraCharts.LayoutDefinition layoutDefinition2 = new DevExpress.XtraCharts.LayoutDefinition();
+            DevExpress.XtraCharts.LayoutDefinition layoutDefinition3 = new DevExpress.XtraCharts.LayoutDefinition();
+            DevExpress.XtraCharts.XYDiagramPane xyDiagramPane1 = new DevExpress.XtraCharts.XYDiagramPane();
+            DevExpress.XtraCharts.SecondaryAxisY secondaryAxisy1 = new DevExpress.XtraCharts.SecondaryAxisY();
+            DevExpress.XtraCharts.SecondaryAxisY secondaryAxisy2 = new DevExpress.XtraCharts.SecondaryAxisY();
+            DevExpress.XtraCharts.Series series1 = new DevExpress.XtraCharts.Series();
+            DevExpress.XtraCharts.SplineSeriesView splineSeriesView1 = new DevExpress.XtraCharts.SplineSeriesView();
+            DevExpress.XtraCharts.Series series2 = new DevExpress.XtraCharts.Series();
+            DevExpress.XtraCharts.SplineSeriesView splineSeriesView2 = new DevExpress.XtraCharts.SplineSeriesView();
+            DevExpress.XtraCharts.Series series3 = new DevExpress.XtraCharts.Series();
+            DevExpress.XtraCharts.SplineSeriesView splineSeriesView3 = new DevExpress.XtraCharts.SplineSeriesView();
+            chartControl1 = new DevExpress.XtraCharts.ChartControl();
+            bar1 = new DevExpress.XtraBars.Bar();
+            ((System.ComponentModel.ISupportInitialize)chartControl1).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)xyDiagram1).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)constantLine1).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)constantLine2).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)xyDiagramPane1).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)secondaryAxisy1).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)secondaryAxisy2).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)series1).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)splineSeriesView1).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)series2).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)splineSeriesView2).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)series3).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)splineSeriesView3).BeginInit();
+            SuspendLayout();
+            // 
+            // chartControl1
+            // 
+            chartControl1.BorderOptions.Visibility = DevExpress.Utils.DefaultBoolean.False;
+            constantLine1.AxisValueSerializable = "1";
+            constantLine1.ConstantLineID = 0;
+            constantLine1.LineStyle.LineJoin = System.Drawing.Drawing2D.LineJoin.Miter;
+            constantLine1.Name = "ConstantLineX";
+            constantLine1.ShowInLegend = false;
+            constantLine1.Title.Alignment = DevExpress.XtraCharts.ConstantLineTitleAlignment.Far;
+            constantLine1.Title.DXFont = new DevExpress.Drawing.DXFont("Tahoma", 8F);
+            constantLine1.Title.Text = "ConstantLineZ";
+            xyDiagram1.AxisX.ConstantLines.AddRange(new DevExpress.XtraCharts.ConstantLine[] { constantLine1 });
+            xyDiagram1.AxisX.Title.Text = "娴侀噺 锛坢鲁/h锛�";
+            xyDiagram1.AxisX.Title.Visibility = DevExpress.Utils.DefaultBoolean.Default;
+            xyDiagram1.AxisX.VisibleInPanesSerializable = "-1";
+            xyDiagram1.AxisY.Color = Color.DodgerBlue;
+            constantLine2.AxisValueSerializable = "1";
+            constantLine2.ConstantLineID = 0;
+            constantLine2.Name = "ConstantLineY";
+            constantLine2.ShowInLegend = false;
+            xyDiagram1.AxisY.ConstantLines.AddRange(new DevExpress.XtraCharts.ConstantLine[] { constantLine2 });
+            xyDiagram1.AxisY.Label.TextColor = Color.DodgerBlue;
+            xyDiagram1.AxisY.Title.Alignment = StringAlignment.Far;
+            xyDiagram1.AxisY.Title.EnableAntialiasing = DevExpress.Utils.DefaultBoolean.False;
+            xyDiagram1.AxisY.Title.Text = "鎵▼/m";
+            xyDiagram1.AxisY.Title.TextColor = Color.DodgerBlue;
+            xyDiagram1.AxisY.Title.Visibility = DevExpress.Utils.DefaultBoolean.True;
+            xyDiagram1.AxisY.VisibleInPanesSerializable = "-1";
+            xyDiagram1.DefaultPane.BorderVisible = false;
+            xyDiagram1.DefaultPane.Title.Text = "鏃犳暟鎹�";
+            xyDiagram1.PaneLayout.AutoLayoutMode = DevExpress.XtraCharts.PaneAutoLayoutMode.Grid;
+            xyDiagram1.PaneLayout.RowDefinitions.AddRange(new DevExpress.XtraCharts.LayoutDefinition[] { layoutDefinition1, layoutDefinition2, layoutDefinition3 });
+            xyDiagramPane1.BorderVisible = false;
+            xyDiagramPane1.LayoutOptions.Column = 0;
+            xyDiagramPane1.LayoutOptions.Row = 2;
+            xyDiagramPane1.Name = "BottomPanel";
+            xyDiagramPane1.PaneID = 1;
+            xyDiagramPane1.RuntimeCollapse = DevExpress.Utils.DefaultBoolean.False;
+            xyDiagramPane1.SelectionRectangle.BorderVisible = false;
+            xyDiagram1.Panes.AddRange(new DevExpress.XtraCharts.XYDiagramPane[] { xyDiagramPane1 });
+            secondaryAxisy1.AxisID = 0;
+            secondaryAxisy1.Color = Color.Green;
+            secondaryAxisy1.Label.Border.Visibility = DevExpress.Utils.DefaultBoolean.False;
+            secondaryAxisy1.Label.TextColor = Color.Green;
+            secondaryAxisy1.Name = "AxisYEff";
+            secondaryAxisy1.Title.Text = "鏁堢巼/%";
+            secondaryAxisy1.Title.TextColor = Color.Green;
+            secondaryAxisy1.Title.Visibility = DevExpress.Utils.DefaultBoolean.Default;
+            secondaryAxisy1.VisibleInPanesSerializable = "-1";
+            secondaryAxisy2.Alignment = DevExpress.XtraCharts.AxisAlignment.Near;
+            secondaryAxisy2.AxisID = 1;
+            secondaryAxisy2.Label.Border.Visibility = DevExpress.Utils.DefaultBoolean.False;
+            secondaryAxisy2.Label.TextColor = Color.Crimson;
+            secondaryAxisy2.Name = "AxisYPower";
+            secondaryAxisy2.NumericScaleOptions.AutoGrid = false;
+            secondaryAxisy2.NumericScaleOptions.GridSpacing = 2D;
+            secondaryAxisy2.Title.Alignment = StringAlignment.Near;
+            secondaryAxisy2.Title.Text = "鍔熺巼/kW";
+            secondaryAxisy2.Title.TextColor = Color.Crimson;
+            secondaryAxisy2.Title.Visibility = DevExpress.Utils.DefaultBoolean.Default;
+            secondaryAxisy2.Visibility = DevExpress.Utils.DefaultBoolean.True;
+            secondaryAxisy2.VisibleInPanesSerializable = "1";
+            xyDiagram1.SecondaryAxesY.AddRange(new DevExpress.XtraCharts.SecondaryAxisY[] { secondaryAxisy1, secondaryAxisy2 });
+            chartControl1.Diagram = xyDiagram1;
+            chartControl1.Dock = DockStyle.Fill;
+            chartControl1.Legend.AlignmentHorizontal = DevExpress.XtraCharts.LegendAlignmentHorizontal.Right;
+            chartControl1.Legend.Border.Visibility = DevExpress.Utils.DefaultBoolean.False;
+            chartControl1.Legend.Direction = DevExpress.XtraCharts.LegendDirection.LeftToRight;
+            chartControl1.Legend.LegendID = -1;
+            chartControl1.Legend.MarkerMode = DevExpress.XtraCharts.LegendMarkerMode.CheckBoxAndMarker;
+            chartControl1.Legend.Visibility = DevExpress.Utils.DefaultBoolean.False;
+            chartControl1.Location = new Point(0, 0);
+            chartControl1.Name = "chartControl1";
+            series1.Name = "SeriesQH";
+            series1.SeriesID = 0;
+            splineSeriesView1.Color = Color.FromArgb(84, 141, 212);
+            series1.View = splineSeriesView1;
+            series2.Name = "SeriesQE";
+            series2.SeriesID = 1;
+            splineSeriesView2.AxisYName = "AxisYEff";
+            splineSeriesView2.Color = Color.FromArgb(155, 187, 89);
+            series2.View = splineSeriesView2;
+            series3.Name = "SeriesQP";
+            series3.SeriesID = 2;
+            splineSeriesView3.AxisYName = "AxisYPower";
+            splineSeriesView3.Color = Color.FromArgb(192, 0, 0);
+            splineSeriesView3.PaneName = "BottomPanel";
+            series3.View = splineSeriesView3;
+            chartControl1.SeriesSerializable = new DevExpress.XtraCharts.Series[]
+    {
+    series1,
+    series2,
+    series3
+    };
+            chartControl1.Size = new Size(1023, 857);
+            chartControl1.TabIndex = 0;
+            // 
+            // bar1
+            // 
+            bar1.BarName = "Custom 2";
+            bar1.DockCol = 0;
+            bar1.DockRow = 0;
+            bar1.DockStyle = DevExpress.XtraBars.BarDockStyle.Top;
+            bar1.OptionsBar.MultiLine = true;
+            bar1.OptionsBar.UseWholeRow = true;
+            bar1.Text = "Custom 2";
+            // 
+            // PumpViewChart
+            // 
+            AutoScaleDimensions = new SizeF(10F, 22F);
+            AutoScaleMode = AutoScaleMode.Font;
+            Controls.Add(chartControl1);
+            Name = "PumpViewChart";
+            Size = new Size(1023, 857);
+            ((System.ComponentModel.ISupportInitialize)constantLine1).EndInit();
+            ((System.ComponentModel.ISupportInitialize)constantLine2).EndInit();
+            ((System.ComponentModel.ISupportInitialize)xyDiagramPane1).EndInit();
+            ((System.ComponentModel.ISupportInitialize)secondaryAxisy1).EndInit();
+            ((System.ComponentModel.ISupportInitialize)secondaryAxisy2).EndInit();
+            ((System.ComponentModel.ISupportInitialize)xyDiagram1).EndInit();
+            ((System.ComponentModel.ISupportInitialize)splineSeriesView1).EndInit();
+            ((System.ComponentModel.ISupportInitialize)series1).EndInit();
+            ((System.ComponentModel.ISupportInitialize)splineSeriesView2).EndInit();
+            ((System.ComponentModel.ISupportInitialize)series2).EndInit();
+            ((System.ComponentModel.ISupportInitialize)splineSeriesView3).EndInit();
+            ((System.ComponentModel.ISupportInitialize)series3).EndInit();
+            ((System.ComponentModel.ISupportInitialize)chartControl1).EndInit();
+            ResumeLayout(false);
+        }
+
+        #endregion
+
+        private DevExpress.XtraCharts.ChartControl chartControl1;
+        private DevExpress.XtraBars.Bar bar1;
+    }
+}
diff --git "a/WinFrmUI/Yw.WinFrmUI.Phart.Core/01-pump/01-view/PumpViewChart - \345\244\215\345\210\266.cs" "b/WinFrmUI/Yw.WinFrmUI.Phart.Core/01-pump/01-view/PumpViewChart - \345\244\215\345\210\266.cs"
new file mode 100644
index 0000000..54b3d3b
--- /dev/null
+++ "b/WinFrmUI/Yw.WinFrmUI.Phart.Core/01-pump/01-view/PumpViewChart - \345\244\215\345\210\266.cs"
@@ -0,0 +1,1064 @@
+锘縰sing DevExpress.Utils;
+using DevExpress.XtraCharts;
+
+namespace Yw.WinFrmUI.Phart
+{
+    /// <summary>
+    ///  娉靛浘琛�
+    /// </summary>
+    public partial class PumpViewChart : DevExpress.XtraEditors.XtraUserControl
+    {
+        public PumpViewChart()
+        {
+            InitializeComponent();
+            InitialChart();
+        }
+
+        #region Private Variable
+
+        private XYDiagram _diagram;
+        private XYDiagramDefaultPane _default_pane;
+        private XYDiagramPane _bottom_pane;
+
+        private AxisX _axis_x_flow;
+        private AxisY _axis_y_head;
+        private SecondaryAxisY _axis_y_eff, _axis_y_power;
+
+        private ConstantLine _const_line_x;
+        private ConstantLine _const_line_y;
+        private TextAnnotation _anno_txt_query_info;
+
+        private PumpCoordinate _coordinate = null;
+        private PumpCurveViewModel _vm = null;
+
+        private bool _default_visible = false;
+        private bool _power_visible = false;
+        private bool _eff_visible = false;
+        private bool _equal_eff_visible = false;
+        private bool _split_panel = false;
+
+        private bool _line_visible = false;
+        private bool _initial_data = false;
+
+
+        #endregion
+
+        #region Public Variable  
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public bool LineVisible
+        {
+            get
+            {
+                return _line_visible;
+            }
+            set
+            {
+                _line_visible = value;
+                _const_line_x.Visible = value;
+                _const_line_y.Visible = value;
+                SetAxisXValue();
+            }
+        }
+
+        /// <summary>
+        /// 
+        /// </summary>
+
+        public bool SplitPanel
+        {
+            get
+            {
+                return _split_panel;
+            }
+            set
+            {
+                _split_panel = value; 
+            }
+        }
+
+        #endregion
+
+        #region Private Initial
+
+        /// <summary>
+        /// 鍒濆鍖栧浘琛�
+        /// </summary>
+        private void InitialChart()
+        {
+            this.chartControl1.SetChartDisplay();
+            this.chartControl1.RuntimeHitTesting = true;
+            this.chartControl1.AnimationStartMode = ChartAnimationMode.OnLoad;
+            this.chartControl1.ObjectHotTracked += new DevExpress.XtraCharts.HotTrackEventHandler(this.chartControl1_ObjectHotTracked);
+            this.chartControl1.MouseMove += new System.Windows.Forms.MouseEventHandler(this.chartControl1_MouseMove);
+            this.chartControl1.MouseUp += new System.Windows.Forms.MouseEventHandler(this.chartControl1_MouseUp);
+            this.chartControl1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.chartControl1_MouseDown);
+            this.chartControl1.Resize += new System.EventHandler(this.chartControl1_Resize);
+            this.chartControl1.CustomPaint += ChartControl1_CustomPaint;
+
+
+            _diagram = (XYDiagram)this.chartControl1.Diagram;
+            _default_pane = _diagram.DefaultPane;
+            _bottom_pane = (XYDiagramPane)_diagram.FindPaneByName("BottomPanel");
+
+            _axis_x_flow = _diagram.AxisX;
+            _axis_x_flow.SetAxisXQDisplay();
+            _axis_y_head = _diagram.AxisY;
+            _axis_y_head.SetAxisYQHDisplay();
+            _axis_y_eff = _diagram.SecondaryAxesY.GetAxisByName("AxisYEff");
+            _axis_y_eff.SetSecondaryAxisYQEDisplay();
+            _axis_y_eff.Alignment = AxisAlignment.Far;
+            _axis_y_power = _diagram.SecondaryAxesY.GetAxisByName("AxisYPower");
+            _axis_y_power.SetSecondaryAxisYQPDisplay();
+
+            _const_line_x = (ConstantLine)_diagram.AxisX.ConstantLines.GetElementByName("ConstantLineX");
+            _const_line_x.SetWorkPointLineDisplay();
+
+            _const_line_y = (ConstantLine)_diagram.AxisY.ConstantLines.GetElementByName("ConstantLineY");
+            _const_line_y.SetWorkPointLineDisplay();
+
+            _axis_x_flow.Visibility = DefaultBoolean.False;
+            _axis_x_flow.GridLines.Visible = false;
+            _axis_y_head.Visibility = DefaultBoolean.False;
+            _axis_y_head.GridLines.Visible = false;
+            _axis_y_eff.Visibility = DefaultBoolean.False;
+            _axis_y_eff.GridLines.Visible = false;
+            _axis_y_power.Visibility = DefaultBoolean.False;
+            _axis_y_power.GridLines.Visible = false;
+
+            _const_line_x.Visible = false;
+            _const_line_y.Visible = false;
+        }
+
+        /// <summary>
+        /// 鍒濆鍖栧潗鏍囪酱
+        /// </summary>
+        private void InitialCoordinate()
+        {
+            //璁剧疆鎴愮櫧鏉垮潗鏍�
+            _coordinate = new PumpCoordinate();
+            _coordinate.GridNumberX = 30;
+            _coordinate.GridNumberY = 16;
+            //鏄剧ず鐨勫潗鏍囩嚎鍙�
+            _coordinate.StartLineNoH = 10;
+            _coordinate.EndLineNoH = 15;
+            _coordinate.StartLineNoE = 0;
+            _coordinate.EndLineNoE = 10;
+            _coordinate.StartLineNoP = 2;
+            _coordinate.EndLineNoP = 9;
+            //鍧愭爣鏈�灏忓�煎拰闂撮殧
+            _coordinate.CoordMinQ = 0; _coordinate.CoordSpaceQ = 1000;
+            _coordinate.CoordMinH = 10; _coordinate.CoordSpaceH = 100;
+            _coordinate.CoordMinE = 0; _coordinate.CoordSpaceE = 100;
+            _coordinate.CoordMinP = 10; _coordinate.CoordSpaceP = 100;
+        }
+
+        #endregion
+
+        #region Private Chart Event      
+
+        ToolTipController _tool_tip = new();
+        private void chartControl1_ObjectHotTracked(object sender, HotTrackEventArgs e)
+        {
+            //if (!_initial_data)
+            //    return;
+            //if (e.AdditionalObject is SeriesPoint series_pt)
+            //{
+            //    var tip = string.Format("X:{0:N1} Y:{1:N1}", series_pt.Argument, series_pt.Values[0]);
+            //    _tool_tip.ShowHint(tip);
+            //}
+            //else
+            //{
+            //    _tool_tip.HideHint();
+            //}
+        }
+
+        private bool _on_move_x_line = false;
+        private bool _on_move_y_line = false;
+        private void chartControl1_MouseDown(object sender, MouseEventArgs e)
+        {
+            if (!_initial_data)
+                return;
+            var hitInfo = chartControl1.CalcHitInfo(e.Location);
+            if (e.Button == MouseButtons.Left)
+            {
+                if (hitInfo.InConstantLine)
+                {
+                    if (hitInfo.ConstantLine == _const_line_x)
+                    {
+                        _on_move_x_line = true;
+                    }
+                    else if (hitInfo.ConstantLine == _const_line_y)
+                    {
+                        _on_move_y_line = true;
+                    }
+                }
+            }
+        }
+
+        private void chartControl1_MouseMove(object sender, MouseEventArgs e)
+        {
+            if (!_initial_data)
+                return;
+
+            if (_on_move_x_line)
+            {
+                var diagram_coordinates = _diagram.PointToDiagram(e.Location);
+                var axis_value = diagram_coordinates.GetAxisValue(_axis_x_flow);
+                if (axis_value == null)
+                    return;
+                double chartQ = axis_value.NumericalValue;
+                SetAxisXValue(chartQ);
+
+            }
+            else if (_on_move_y_line)
+            {
+                var diagram_coordinates = _diagram.PointToDiagram(e.Location);
+                var axis_value = diagram_coordinates.GetAxisValue(_axis_y_head);
+                if (axis_value == null)
+                    return;
+                double chartH = axis_value.NumericalValue;
+                SetAxisYValue(chartH);
+            }
+            else
+            {
+                var hitInfo = chartControl1.CalcHitInfo(e.Location);
+                if (hitInfo.InConstantLine)
+                {
+                    this.chartControl1.Cursor = Cursors.Hand;
+                }
+                else if (hitInfo.InAnnotation)
+                {
+                    this.chartControl1.Cursor = Cursors.SizeAll;
+
+                }
+                else
+                {
+                    this.chartControl1.Cursor = Cursors.Default;
+                }
+            }
+        }
+
+        private void chartControl1_MouseUp(object sender, MouseEventArgs e)
+        {
+            if (!_initial_data)
+                return;
+            _on_move_x_line = false;
+            _on_move_y_line = false;
+        }
+
+        private void chartControl1_Resize(object sender, EventArgs e)
+        {
+
+        }
+
+        private void ChartControl1_CustomPaint(object sender, CustomPaintEventArgs e)
+        {
+            if (!_initial_data)
+                return;
+            if (_vm == null)
+                return;
+            if (_axis_x_flow.Visibility == DefaultBoolean.False)
+                return;
+            if (e is not DXCustomPaintEventArgs dx_args)
+                return;
+            var cache = dx_args.Cache;
+            cache.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
+            if (_equal_eff_visible && _vm.EqualEffList != null && _vm.EqualEffList.Any())
+            {
+                using Pen pen = new(Color.Green, 2);
+                foreach (var eq_eff in _vm.EqualEffList)
+                {
+                    if (!eq_eff.IsValid())
+                        continue;
+                    var eq_eff_pt_list = eq_eff.CurveEqualEff;
+                    var pic_eq_eff_pt_list = new List<Point>();
+                    foreach (var eq_eff_pt in eq_eff_pt_list)
+                    {
+                        var x = eq_eff_pt.X;
+                        var y = eq_eff_pt.Y;
+                        var coordinates = _diagram.DiagramToPoint(x, y, _diagram.AxisX, _diagram.AxisY);
+                        if (coordinates == null)
+                            continue;
+                        var pt = new Point(coordinates.Point.X, coordinates.Point.Y);
+                        pic_eq_eff_pt_list.Add(pt);
+                    }
+
+                    var pt_count = pic_eq_eff_pt_list.Count;
+                    if (pt_count > 2)
+                    {
+                        if (eq_eff.IsClosed)
+                        {
+                            var path = cache.CreatePath();
+                            path.AddClosedCurve(pic_eq_eff_pt_list.ToArray(), (float)eq_eff.Tension);
+                            cache.DrawPath(pen, path);
+                        }
+                        else
+                        {
+                            var path = cache.CreatePath();
+                            path.AddCurve(pic_eq_eff_pt_list.ToArray(), (float)eq_eff.Tension);
+                            cache.DrawPath(pen, path);
+                        }
+                    }
+                    else if (pt_count == 2)
+                    {
+                        cache.DrawLine(pen, pic_eq_eff_pt_list[0], pic_eq_eff_pt_list[1]);
+                    }
+                    else if (pt_count == 1)
+                    {
+                        Rectangle rc = new Rectangle(pic_eq_eff_pt_list[0].X - 2, pic_eq_eff_pt_list[0].Y - 2, 4, 4);
+                        using (Brush b = new SolidBrush(pen.Color))
+                            cache.FillEllipse(b, rc);
+                    }
+
+                }
+            }
+
+            if (_vm.Equip != null && _vm.Equip.IsValid())
+            {
+                using Pen pen = new(Color.Black, 2);
+                pen.DashStyle = System.Drawing.Drawing2D.DashStyle.DashDotDot;
+
+                var offset_size = 10;
+                var qh_pt = _diagram.DiagramToPoint(_vm.Equip.SectQ, _vm.Equip.SectH, _axis_x_flow, _axis_y_head);
+                var qh_pt_x = qh_pt.Point.X;
+                var qh_pt_y = qh_pt.Point.Y;
+                cache.DrawLine(pen, new Point(qh_pt_x, qh_pt_y - offset_size), new Point(qh_pt_x, qh_pt_y + offset_size));
+
+                if (_eff_visible && _vm.Equip.SectE != null)
+                {
+                    var qe_pt = _diagram.DiagramToPoint(_vm.Equip.SectQ, _vm.Equip.SectE.Value, _axis_x_flow, _axis_y_eff);
+                    var qe_pt_x = qe_pt.Point.X;
+                    var qe_pt_y = qe_pt.Point.Y;
+                    cache.DrawLine(pen, new Point(qe_pt_x, qe_pt_y - offset_size), new Point(qe_pt_x, qe_pt_y + offset_size));
+                }
+                if (_power_visible && _vm.Equip.SectP != null)
+                {
+                    var qp_pt = _diagram.DiagramToPoint(_vm.Equip.SectQ, _vm.Equip.SectP.Value, _axis_x_flow, _axis_y_power);
+                    var qp_pt_x = qp_pt.Point.X;
+                    var qp_pt_y = qp_pt.Point.Y;
+                    cache.DrawLine(pen, new Point(qp_pt_x, qp_pt_y - offset_size), new Point(qp_pt_x, qp_pt_y + offset_size));
+                }
+            }
+
+        }
+
+
+
+
+        #endregion
+
+        #region  Set  
+
+        /// <summary>
+        /// 娓呯┖鍥捐〃
+        /// </summary>
+        public void Clear()
+        {
+            _vm = null;
+            _default_visible = false;
+            _split_panel = false;
+            _eff_visible = false;
+            _power_visible = false;
+            _initial_data = false;
+            this.chartControl1.BeginInit();
+            this.chartControl1.Series.Clear();
+            this.chartControl1.AnnotationRepository.Clear();
+            this.chartControl1.Legend.CustomItems.Clear();
+            this.chartControl1.EndInit();
+        }
+
+        /// <summary>
+        /// 璁剧疆鍥捐〃
+        /// </summary>
+        public void SetBindingData(PumpCurveViewModel vm, bool split_panel = false, bool eff_visible = false, bool power_visible = true, bool equal_eff_visible = false)
+        {
+            _vm = vm;
+            _split_panel = split_panel;
+            _eff_visible = eff_visible;
+            _power_visible = power_visible;
+            _equal_eff_visible = equal_eff_visible;
+            this.chartControl1.BeginInit();
+            this.chartControl1.Series.Clear();
+            this.chartControl1.AnnotationRepository.Clear();
+            this.chartControl1.Legend.CustomItems.Clear();
+            if (vm == null)
+            {
+                _initial_data = false;
+                this.chartControl1.EndInit();
+                return;
+            }
+
+
+
+            AddDefault(vm);
+
+            AddEquip(vm.Equip);
+            AddVariableSpeedList(vm.VariableSpeedList);
+            if (_equal_eff_visible)
+                AddEqualEffList(vm.EqualEffList);
+            AddEqualPowerList(vm.EqualPowerList);
+
+            if (vm.Coordinate == null)
+            {
+                SetCoordinate();
+            }
+            else
+            {
+                _coordinate = vm.Coordinate;
+            }
+
+            SetChartAxis();
+            this.chartControl1.EndInit();
+            _initial_data = true;
+        }
+
+        //鏄惁鏄棤鏁堟暟鎹�
+        private bool IsInvalidData()
+        {
+            if (_vm == null)
+            {
+                return true;
+            }
+            return false;
+        }
+
+        #region Add Data
+        private void AddDefault(PumpCurveViewModel vm)
+        {
+            var id = vm.Id;
+            var caption_qh = vm.CurveQHName;
+            var caption_qp = vm.CurveQPName;
+            var color_qh = vm.ColorQH ?? PumpChartDisplay.CurveColorQH;
+            var color_qe = vm.ColorQE ?? PumpChartDisplay.CurveColorQE;
+            var color_qp = vm.ColorQP ?? PumpChartDisplay.CurveColorQP;
+
+            var qh = vm.CurveQH;
+            var qe = vm.CurveQE;
+            var qp = vm.CurveQP;
+
+            XYDiagramPaneBase bottom_pane = _split_panel ? _bottom_pane : _default_pane;
+
+            AddLineSeries(id, color_qh, _axis_x_flow, _axis_y_head, _default_pane, qh, DevExpress.XtraCharts.DashStyle.Dash);
+            if (!string.IsNullOrEmpty(caption_qh))
+                AddAnnotation(id, caption_qh, color_qh, _axis_y_head, _default_pane, qh.Last());
+
+            if (qe != null && qe.Any() && _eff_visible)
+            {
+                AddLineSeries(id, color_qe, _axis_x_flow, _axis_y_eff, _default_pane, qe, DevExpress.XtraCharts.DashStyle.Dash);
+            }
+
+            if (qp != null && qp.Any() && _power_visible)
+            {
+                AddLineSeries(id, color_qp, _axis_x_flow, _axis_y_power, bottom_pane, qp, DevExpress.XtraCharts.DashStyle.Dash);
+                if (!string.IsNullOrEmpty(caption_qp))
+                {
+                    AddAnnotation(id, caption_qp, color_qp, _axis_y_power, bottom_pane, qp.Last());
+                }
+            }
+        }
+
+        private void AddEquip(PumpCurveEquipViewModel vm)
+        {
+            if (vm == null)
+                return;
+            var id = vm.Id;
+            var caption = vm.CurveName;
+            var color = vm.Color ?? Color.Black;
+
+            var equip = vm.CurveEquip;
+            var equip_pt = new Yw.Geometry.Point2d(vm.PipeQ, vm.PipeH);
+
+            AddLineSeries(id, color, _axis_x_flow, _axis_y_head, _default_pane, equip, DevExpress.XtraCharts.DashStyle.DashDotDot);
+            // AddPointSeries(id, color, _axis_x_flow, _axis_y_head, _default_pane, new List<Geometry.Point2d>() { equip_pt }, MarkerKind.ThinCross);
+            if (!string.IsNullOrEmpty(caption))
+                AddAnnotation(id, caption, color, _axis_y_head, _default_pane, equip.Last());
+        }
+
+        private void AddVariableSpeedList(List<PumpCurveVariableSpeedViewModel> vm_list)
+        {
+            if (vm_list == null || !vm_list.Any())
+                return;
+            XYDiagramPaneBase bottom_pane = _split_panel ? _bottom_pane : _default_pane;
+            foreach (var vm in vm_list)
+            {
+                if (!vm.IsValid())
+                    continue;
+
+                var id = vm.Id;
+                var caption_qh = vm.CurveQHName;
+                var caption_qp = vm.CurveQPName;
+                var color_qh = vm.ColorQH ?? PumpChartDisplay.CurveColorQH;
+                var color_qe = vm.ColorQE ?? PumpChartDisplay.CurveColorQE;
+                var color_qp = vm.ColorQP ?? PumpChartDisplay.CurveColorQP;
+
+                var qh = vm.CurveQH;
+                var qe = vm.CurveQE;
+                var qp = vm.CurveQP;
+
+                AddLineSeries(id, color_qh, _axis_x_flow, _axis_y_head, _default_pane, qh);
+                if (!string.IsNullOrEmpty(caption_qh))
+                    AddAnnotation(id, caption_qh, color_qh, _axis_y_head, _default_pane, qh.Last());
+
+                if (qe != null && qe.Any() && _eff_visible)
+                {
+                    AddLineSeries(id, color_qe, _axis_x_flow, _axis_y_eff, _default_pane, qe);
+                }
+
+                if (qp != null && qp.Any() && _power_visible)
+                {
+                    AddLineSeries(id, color_qp, _axis_x_flow, _axis_y_power, bottom_pane, qp);
+                    if (!string.IsNullOrEmpty(caption_qp))
+                    {
+                        AddAnnotation(id, caption_qp, color_qp, _axis_y_power, bottom_pane, qp.Last());
+                    }
+                }
+            }
+        }
+
+        private void AddEqualEffList(List<PumpCurveEqualEffViewModel> vm_list)
+        {
+            if (vm_list == null || !vm_list.Any())
+                return;
+            foreach (var vm in vm_list)
+            {
+                if (!vm.IsValid())
+                    continue;
+
+                var id = vm.Id;
+                var caption = vm.CurveName;
+                var color = vm.Color ?? Color.Green;
+
+                var equif_eff = vm.CurveEqualEff;
+                if (!string.IsNullOrEmpty(caption))
+                {
+                    if (equif_eff.Count > 2)
+                    {
+                        AddAnnotation(id, caption, color, _axis_y_head, _default_pane, equif_eff.First(), 60);
+                    }
+                    AddAnnotation(id, caption, color, _axis_y_head, _default_pane, equif_eff.Last(), 60);
+                }
+            }
+
+
+        }
+
+        private void AddEqualPowerList(List<PumpCurveEqualPowerViewModel> vm_list)
+        {
+            if (vm_list == null || !vm_list.Any())
+                return;
+
+            foreach (var vm in vm_list)
+            {
+                if (!vm.IsValid())
+                    continue;
+
+                var id = vm.Id;
+                var caption = vm.CurveName;
+                var color = vm.Color ?? Color.Green;
+                var equif_power = vm.CurveEqualPower;
+                if (equif_power.Count < 2)
+                {
+                    AddPointSeries(id, color, _axis_x_flow, _axis_y_head, _default_pane, equif_power);
+                }
+                else
+                {
+                    AddLineSeries(id, color, _axis_x_flow, _axis_y_head, _default_pane, equif_power, DashStyle.Dash);
+                }
+                if (!string.IsNullOrEmpty(caption))
+                    AddAnnotation(id, caption, color, _axis_y_head, _default_pane, equif_power.Last());
+            }
+        }
+
+        #endregion
+
+        #region Add Chart Data 
+
+        private void AddPointSeries(string id, Color color, AxisXBase axis_x, AxisYBase axis_y, XYDiagramPaneBase pane, List<Yw.Geometry.Point2d> pt_list, MarkerKind marker = MarkerKind.Circle)
+        {
+            if (pt_list == null || !pt_list.Any())
+                return;
+
+            var view = new DevExpress.XtraCharts.PointSeriesView();
+            view.PointMarkerOptions.Size = 8;
+            view.PointMarkerOptions.Kind = marker;
+            view.PointMarkerOptions.BorderColor = color;
+            view.Color = color;
+            view.AxisX = axis_x;
+            view.AxisY = axis_y;
+            view.EmptyPointOptions.Color = Color.Transparent;
+            view.Pane = pane;
+
+            var series_pt_list = pt_list.Select(x => x.ToSeriesPoint()).ToArray();
+            var series = new DevExpress.XtraCharts.Series();
+            series.Tag = id;
+            series.ShowInLegend = false;
+            series.ArgumentScaleType = DevExpress.XtraCharts.ScaleType.Numerical;
+            series.LabelsVisibility = DevExpress.Utils.DefaultBoolean.False;
+            series.CrosshairEnabled = DefaultBoolean.False;
+            series.CrosshairLabelVisibility = DefaultBoolean.False;
+            series.ToolTipEnabled = DefaultBoolean.False;
+            series.SeriesPointsSorting = SortingMode.None;
+            series.Visible = true;
+            series.View = view;
+            series.CrosshairLabelPattern = "{A}";
+            series.Points.AddRange(series_pt_list);
+            this.chartControl1.Series.Add(series);
+        }
+
+        private void AddLineSeries(string id, Color color, AxisXBase axis_x, AxisYBase axis_y, XYDiagramPaneBase pane, List<Yw.Geometry.Point2d> pt_list, DevExpress.XtraCharts.DashStyle dash = DevExpress.XtraCharts.DashStyle.Solid)
+        {
+            if (pt_list == null || !pt_list.Any())
+                return;
+
+            var view = new DevExpress.XtraCharts.LineSeriesView();
+            view.LineStyle.DashStyle = dash;
+            view.LineStyle.LineJoin = System.Drawing.Drawing2D.LineJoin.Round;
+            view.LineStyle.Thickness = 2;
+            view.Color = color;
+            view.EnableAntialiasing = DefaultBoolean.True;
+            view.MarkerVisibility = DefaultBoolean.False;
+            view.AxisX = axis_x;
+            view.AxisY = axis_y;
+            view.EmptyPointOptions.Color = Color.Transparent;
+            view.Pane = pane;
+
+            var series_pt_list = pt_list.Select(x => x.ToSeriesPoint()).ToArray();
+            var series = new DevExpress.XtraCharts.Series();
+            series.Tag = id;
+            series.ShowInLegend = false;
+            series.ArgumentScaleType = DevExpress.XtraCharts.ScaleType.Numerical;
+            series.LabelsVisibility = DevExpress.Utils.DefaultBoolean.False;
+            series.CrosshairEnabled = DefaultBoolean.False;
+            series.ToolTipEnabled = DefaultBoolean.False;
+            series.SeriesPointsSorting = SortingMode.None;
+            series.Visible = true;
+            series.View = view;
+            series.Points.AddRange(series_pt_list);
+
+            this.chartControl1.Series.Add(series);
+        }
+
+        private void AddAnnotation(string id, string caption, Color color, AxisYBase axis_y, XYDiagramPaneBase pane, Yw.Geometry.Point2d pt, double angle = -10)
+        {
+            if (pt == null)
+                return;
+            var anchor_pt = pt;
+            var pane_anchor_pt = new DevExpress.XtraCharts.PaneAnchorPoint();
+            pane_anchor_pt.Pane = pane;
+            pane_anchor_pt.AxisYCoordinate.Axis = axis_y;
+            pane_anchor_pt.AxisXCoordinate.AxisValue = anchor_pt.X;
+            pane_anchor_pt.AxisYCoordinate.AxisValue = anchor_pt.Y;
+
+            var relative_position = new DevExpress.XtraCharts.RelativePosition();
+            relative_position.Angle = angle;
+            relative_position.ConnectorLength = 20;
+
+            var text_annotation = new TextAnnotation();
+            text_annotation.AnchorPoint = pane_anchor_pt;
+            text_annotation.AutoHeight = true;
+            text_annotation.AutoWidth = true;
+            text_annotation.BackColor = System.Drawing.Color.Transparent;
+            text_annotation.Border.Color = System.Drawing.Color.Transparent;
+            text_annotation.Border.Visibility = DefaultBoolean.False;
+            text_annotation.ConnectorStyle = DevExpress.XtraCharts.AnnotationConnectorStyle.None;
+            text_annotation.Tag = id;
+            text_annotation.Padding.Bottom = 1;
+            text_annotation.Padding.Left = 1;
+            text_annotation.Padding.Right = 1;
+            text_annotation.Padding.Top = 1;
+            text_annotation.RuntimeMoving = true;
+            text_annotation.RuntimeAnchoring = false;
+            text_annotation.RuntimeResizing = false;
+            text_annotation.RuntimeRotation = false;
+            text_annotation.Text = caption;
+            text_annotation.TextColor = color;
+            text_annotation.ShapePosition = relative_position;
+            text_annotation.Visible = true;
+            text_annotation.DXFont = new DevExpress.Drawing.DXFont(this.Font.Name, 10F);
+
+            this.chartControl1.AnnotationRepository.Add(text_annotation);
+        }
+
+        #endregion
+        #endregion
+
+        #region Set Axis
+
+        private double _minQ, _maxQ;
+        private double _maxH = 0, _minH = 10000;
+        private double _maxE = 0, _minE = 0;
+        private double _maxP = 0, _minP = 1000;
+
+        /// <summary>
+        /// 璁剧疆鍧愭爣
+        /// </summary>
+        private void SetCoordinate()
+        {
+            if (_vm == null)
+            {
+                InitialCoordinate();
+                return;
+            }
+            if (_vm.CurveQH == null || !_vm.CurveQH.Any())
+            {
+                InitialCoordinate();
+                return;
+            }
+
+            _maxQ = 0; _minQ = 100000;
+            _maxH = 0; _minH = 10000;
+            _maxE = 0; _minE = 0;
+            _maxP = 0; _minP = 1000;
+
+            var q_list_list = new List<List<double>>();
+            var h_list_list = new List<List<double>>();
+            var e_list_list = new List<List<double>>();
+            var p_list_list = new List<List<double>>();
+
+            if (_default_visible)
+            {
+                q_list_list.Add(_vm.CurveQH.Select(x => x.X).ToList());
+                h_list_list.Add(_vm.CurveQH.Select(x => x.Y).ToList());
+                if (_vm.CurveQE != null)
+                {
+                    e_list_list.Add(_vm.CurveQE.Select(x => x.Y).ToList());
+                }
+                if (_vm.CurveQP != null)
+                {
+                    p_list_list.Add(_vm.CurveQP.Select(x => x.Y).ToList());
+                }
+            }
+
+            if (_vm.Equip != null)
+            {
+                var item = _vm.Equip;
+                q_list_list.Add(item.CurveEquip.Select(x => x.X).ToList());
+                h_list_list.Add(item.CurveEquip.Select(x => x.Y).ToList());
+            }
+
+            if (_vm.VariableSpeedList != null && _vm.VariableSpeedList.Any())
+            {
+                foreach (var item in _vm.VariableSpeedList)
+                {
+                    q_list_list.Add(item.CurveQH.Select(x => x.X).ToList());
+                    h_list_list.Add(item.CurveQH.Select(x => x.Y).ToList());
+                    if (item.CurveQE != null)
+                    {
+                        e_list_list.Add(item.CurveQE.Select(x => x.Y).ToList());
+                    }
+                    if (item.CurveQP != null)
+                    {
+                        p_list_list.Add(item.CurveQP.Select(x => x.Y).ToList());
+                    }
+                }
+            }
+
+            if (_vm.EqualEffList != null && _vm.EqualEffList.Any())
+            {
+                foreach (var item in _vm.EqualEffList)
+                {
+                    q_list_list.Add(item.CurveEqualEff.Select(x => x.X).ToList());
+                    h_list_list.Add(item.CurveEqualEff.Select(x => x.Y).ToList());
+                }
+            }
+
+            if (_vm.EqualPowerList != null && _vm.EqualPowerList.Any())
+            {
+                foreach (var item in _vm.EqualPowerList)
+                {
+                    q_list_list.Add(item.CurveEqualPower.Select(x => x.X).ToList());
+                    h_list_list.Add(item.CurveEqualPower.Select(x => x.Y).ToList());
+                }
+            }
+
+
+            foreach (var list in q_list_list)
+            {
+                _minQ = Math.Min(_minQ, list.Min());
+                _maxQ = Math.Max(_maxQ, list.Max());
+            }
+
+            foreach (var list in h_list_list)
+            {
+                _minH = Math.Min(_minH, list.Min());
+                _maxH = Math.Max(_maxH, list.Max());
+            }
+
+
+            foreach (var list in e_list_list)
+            {
+                _minE = Math.Max(_minE, list.Min());
+                _maxE = Math.Max(_maxE, list.Max());
+            }
+
+
+            foreach (var list in p_list_list)
+            {
+                _minP = Math.Min(_minP, list.Min());
+                _maxP = Math.Max(_maxP, list.Max());
+            }
+
+            _coordinate = PumpCoordinate.CalcCoordinate(_minQ, _maxQ, _minH, _maxH, _minE, _maxE, _minP, _maxP);
+            if (_coordinate == null)
+                return;
+            if (_coordinate.CoordMinQ + _coordinate.CoordSpaceQ * this._coordinate.GridNumberX < _maxQ * 1.05)
+            {
+                _coordinate.GridNumberX++;
+            }
+
+        }
+
+        /// <summary>
+        /// 璁剧疆鍥捐〃杞�
+        /// </summary>
+        private void SetChartAxis()
+        {
+            _axis_x_flow.Visibility = DefaultBoolean.False;
+            _axis_x_flow.GridLines.Visible = false;
+            _axis_y_head.Visibility = DefaultBoolean.False;
+            _axis_y_head.GridLines.Visible = false;
+            _axis_y_eff.Visibility = DefaultBoolean.False;
+            _axis_y_eff.GridLines.Visible = false;
+            _axis_y_power.Visibility = DefaultBoolean.False;
+            _axis_y_power.GridLines.Visible = false;
+            if (_coordinate == null)
+            {
+                _const_line_x.Visible = false;
+                _const_line_y.Visible = false;
+                _bottom_pane.Visibility = ChartElementVisibility.Hidden;
+                return;
+            }
+
+
+            //璁$畻鍒诲害 Q
+            var axisQLabels = new List<CustomAxisLabel>();
+            var disQ = _coordinate.CoordMinQ;
+            for (int i = 0; i < _coordinate.GridNumberX + 1; i++)
+            {
+                axisQLabels.Add(new CustomAxisLabel(disQ.ToString("N0"), disQ));
+                disQ = disQ + _coordinate.CoordSpaceQ;
+            }
+
+            _axis_x_flow.CustomLabels.Clear();
+            _axis_x_flow.CustomLabels.AddRange(axisQLabels.ToArray());
+            _axis_x_flow.Visibility = DefaultBoolean.True;
+            _axis_x_flow.GridLines.Visible = true;
+
+
+            //璁$畻鍒诲害
+            var axis_head_labels = new List<CustomAxisLabel>();
+            var display_head = _coordinate.CoordMinH + _coordinate.CoordSpaceH * _coordinate.StartLineNoH;
+            for (int i = _coordinate.StartLineNoH; i < _coordinate.EndLineNoH + 1; i++)
+            {
+                axis_head_labels.Add(new CustomAxisLabel(display_head.ToString(), display_head));
+                display_head = display_head + _coordinate.CoordSpaceH;
+            }
+
+            _axis_y_head.CustomLabels.Clear();
+            _axis_y_head.CustomLabels.AddRange(axis_head_labels.ToArray());
+            _axis_y_head.Visibility = DefaultBoolean.True;
+            _axis_y_head.GridLines.Visible = true;
+
+            //鏁堢巼
+            if (_maxE > _minE && _eff_visible)
+            {
+                //璁$畻鍒诲害
+                var label_list = new List<CustomAxisLabel>();
+                var display_eff = _coordinate.CoordMinE + _coordinate.CoordSpaceE * _coordinate.StartLineNoE;
+                for (int i = _coordinate.StartLineNoE; i < _coordinate.EndLineNoE + 1; i++)
+                {
+                    label_list.Add(new CustomAxisLabel(display_eff.ToString(), display_eff));
+                    display_eff = display_eff + _coordinate.CoordSpaceE;
+                }
+
+                _axis_y_eff.CustomLabels.Clear();
+                _axis_y_eff.CustomLabels.AddRange(label_list.ToArray());
+                _axis_y_eff.Visibility = DefaultBoolean.True;
+                _axis_y_eff.GridLines.Visible = true;
+            }
+
+            //鍔熺巼
+            if (_maxP > _minP && _power_visible)
+            {
+                //璁$畻鍒诲害
+                var label_list = new List<CustomAxisLabel>();
+                double display_power = _coordinate.CoordMinP + _coordinate.CoordSpaceP * _coordinate.StartLineNoP;
+                for (int i = _coordinate.StartLineNoP; i < _coordinate.EndLineNoP + 1; i++)
+                {
+                    label_list.Add(new CustomAxisLabel(display_power.ToString(), display_power));
+                    display_power = display_power + _coordinate.CoordSpaceP;
+                }
+
+                _axis_y_power.CustomLabels.Clear();
+                _axis_y_power.CustomLabels.AddRange(label_list.ToArray());
+                _axis_y_power.Visibility = DefaultBoolean.True;
+                _axis_y_power.GridLines.Visible = true;
+            }
+
+
+            _axis_x_flow.SetAxisRange(_coordinate.CoordMinQ, _coordinate.CoordMinQ + _coordinate.GridNumberX * _coordinate.CoordSpaceQ);
+
+
+
+            //鏄惁鍒嗗壊闈㈡澘:娴侀噺鏁堢巼鍦ㄤ笂,鍔熺巼鍦ㄤ笅
+            if (_split_panel)
+            {
+                if (_power_visible)
+                {
+                    var grid_count_head = _coordinate.EndLineNoH - _coordinate.StartLineNoH;
+                    var grid_count_eff = _coordinate.EndLineNoE - _coordinate.StartLineNoE;
+                    int grid_count_add = Math.Max(grid_count_head, grid_count_eff);
+                    if (_eff_visible)
+                        grid_count_add += +5;//澶氫袱鏉�
+
+                    var max_axis_head = _coordinate.CoordMinH + _coordinate.EndLineNoH * _coordinate.CoordSpaceH;
+                    var min_axis_head = max_axis_head - grid_count_add * _coordinate.CoordSpaceH;
+                    _axis_y_head.SetAxisRange(min_axis_head, max_axis_head);
+
+                    var min_axis_eff = _coordinate.CoordMinE + _coordinate.StartLineNoE * _coordinate.CoordSpaceE;
+                    var max_axis_eff = min_axis_eff + grid_count_add * _coordinate.CoordSpaceE;
+
+                    _axis_y_eff.SetAxisRange(min_axis_eff, max_axis_eff);
+                    _bottom_pane.Visibility = ChartElementVisibility.Visible;
+                }
+                else
+                {
+                    var grid_count_power = _coordinate.EndLineNoP - _coordinate.StartLineNoP;
+                    var grid_delete_head = grid_count_power * _coordinate.CoordSpaceH;
+                    grid_delete_head = _coordinate.CoordMinH < 0 ? -grid_delete_head : grid_delete_head;
+
+                    var grid_delete_eff = grid_count_power * _coordinate.CoordSpaceE;
+                    grid_delete_eff = _coordinate.CoordMinE < 0 ? -grid_delete_eff : grid_delete_eff;
+
+                    _axis_y_head.SetAxisRange(_coordinate.CoordMinH - grid_delete_head, _coordinate.CoordMinH + _coordinate.GridNumberY * _coordinate.CoordSpaceH);
+                    _axis_y_eff.SetAxisRange(_coordinate.CoordMinE - grid_delete_eff, _coordinate.CoordMinE + _coordinate.GridNumberY * _coordinate.CoordSpaceE);
+
+                    _bottom_pane.Visibility = ChartElementVisibility.Hidden;
+                }
+
+                if ((!_eff_visible) && (!_power_visible))
+                {
+                    _axis_y_head.SetAxisRange(_coordinate.DispMinH(), _coordinate.DispMaxH());
+                }
+                _axis_y_power.SetAxisRange(_coordinate.DispMinP(), _coordinate.DispMaxP());
+            }
+            else
+            {
+                if ((!_eff_visible) && (!_power_visible))
+                {
+                    _axis_y_head.SetAxisRange(_coordinate.DispMinH(), _coordinate.DispMaxH());
+                }
+                else if ((!_eff_visible) && _power_visible)
+                {
+                    var grid_count_eff = _coordinate.EndLineNoE - _coordinate.StartLineNoE;
+                    if (_coordinate.EndLineNoH - _coordinate.StartLineNoH < 6)
+                        grid_count_eff++;
+                    var grid_delete_head = grid_count_eff * _coordinate.CoordSpaceH;
+                    grid_delete_head = _coordinate.CoordMinH < 0 ? -grid_delete_head : grid_delete_head;
+                    var grid_delete_power = grid_count_eff * _coordinate.CoordSpaceP;
+
+                    _axis_y_head.SetAxisRange(_coordinate.CoordMinH - grid_delete_head, _coordinate.CoordMinH + _coordinate.GridNumberY * _coordinate.CoordSpaceH);
+                    _axis_y_power.SetAxisRange(_coordinate.CoordMinP, _coordinate.CoordMinP + _coordinate.GridNumberY * _coordinate.CoordSpaceP - grid_delete_power);
+                }
+                else if (_eff_visible && (!_power_visible))
+                {
+                    var grid_count_power = _coordinate.EndLineNoP - _coordinate.StartLineNoP;
+                    var grid_delete_head = grid_count_power * _coordinate.CoordSpaceH;
+                    grid_delete_head = _coordinate.CoordMinH < 0 ? -grid_delete_head : grid_delete_head;
+
+                    var grid_delete_eff = grid_count_power * _coordinate.CoordSpaceE;
+                    grid_delete_eff = _coordinate.CoordMinE < 0 ? -grid_delete_eff : grid_delete_eff;
+
+                    _axis_y_head.SetAxisRange(_coordinate.CoordMinH - grid_delete_head, _coordinate.CoordMinH + _coordinate.GridNumberY * _coordinate.CoordSpaceH);
+                    _axis_y_eff.SetAxisRange(_coordinate.CoordMinE - grid_delete_eff, _coordinate.CoordMinE + _coordinate.GridNumberY * _coordinate.CoordSpaceE);
+                }
+                else
+                {
+                    _axis_y_head.SetAxisRange(_coordinate.CoordMinH, _coordinate.CoordMinH + _coordinate.GridNumberY * _coordinate.CoordSpaceH);
+                    _axis_y_eff.SetAxisRange(_coordinate.CoordMinE, _coordinate.CoordMinE + _coordinate.GridNumberY * _coordinate.CoordSpaceE);
+                    _axis_y_power.SetAxisRange(_coordinate.CoordMinP, _coordinate.CoordMinP + _coordinate.GridNumberY * _coordinate.CoordSpaceP);
+                }
+
+                _bottom_pane.Visibility = ChartElementVisibility.Hidden;
+            }
+
+
+        }
+
+        #endregion
+
+        #region Set Axis Value
+
+        /// <summary>
+        /// 璁剧疆X杞村��
+        /// </summary> 
+        public void SetAxisXValue(double? x = null)
+        {
+            if (!_line_visible)
+            {
+                _const_line_x.Visible = false;
+                _const_line_x.Title.Visible = false;
+                _const_line_y.Visible = false;
+                _const_line_y.Title.Visible = false;
+                return;
+            }
+            else
+            {
+                _const_line_x.Visible = true;
+                _const_line_x.Title.Visible = true;
+                _const_line_y.Visible = true;
+                _const_line_y.Title.Visible = true;
+            }
+            if (this.IsInvalidData())
+                return;
+
+            var min_x = _fit_pt_list.Min(x => x.X);
+            var max_x = _fit_pt_list.Max(x => x.X);
+
+            if (x == null)
+            {
+                x = (min_x + max_x) / 2;
+            }
+            else
+            {
+                if (x < min_x || x > max_x)
+                    return;
+            }
+
+            var x_value = x.Value;
+            var y_value = _fit_pt_list.GetInterPointsY(x_value)?.FirstOrDefault();
+
+            _const_line_x.AxisValue = x_value;
+            _const_line_x.Title.Text = $"{x_value:N1}";
+
+            _const_line_y.AxisValue = y_value;
+            _const_line_y.Title.Text = $"{y_value:N1}";
+
+        }
+
+        /// <summary>
+        /// 璁剧疆Y杞村��
+        /// </summary> 
+        public void SetAxisYValue(double y)
+        {
+            if (!_line_visible)
+                return;
+            if (IsInvalidData())
+                return;
+
+            var min_y = _fit_pt_list.Min(x => x.Y);
+            var max_y = _fit_pt_list.Max(x => x.Y);
+            if (y < min_y || y > max_y)
+                return;
+
+            var x_value = _fit_pt_list.GetInterPointsX(y)?.LastOrDefault();
+            SetAxisXValue(x_value);
+
+        }
+
+        #endregion
+    }
+}
diff --git "a/WinFrmUI/Yw.WinFrmUI.Phart.Core/01-pump/01-view/PumpViewChart - \345\244\215\345\210\266.resx" "b/WinFrmUI/Yw.WinFrmUI.Phart.Core/01-pump/01-view/PumpViewChart - \345\244\215\345\210\266.resx"
new file mode 100644
index 0000000..8b2ff64
--- /dev/null
+++ "b/WinFrmUI/Yw.WinFrmUI.Phart.Core/01-pump/01-view/PumpViewChart - \345\244\215\345\210\266.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.Phart.Core/01-pump/01-view/PumpViewChart.cs b/WinFrmUI/Yw.WinFrmUI.Phart.Core/01-pump/01-view/PumpViewChart.cs
index 8b6520c..804df39 100644
--- a/WinFrmUI/Yw.WinFrmUI.Phart.Core/01-pump/01-view/PumpViewChart.cs
+++ b/WinFrmUI/Yw.WinFrmUI.Phart.Core/01-pump/01-view/PumpViewChart.cs
@@ -1,5 +1,8 @@
 锘縰sing DevExpress.Utils;
+using DevExpress.Utils.Drawing;
 using DevExpress.XtraCharts;
+using Yw.Ahart;
+using Yw.Geometry;
 
 namespace Yw.WinFrmUI.Phart
 {
@@ -26,19 +29,63 @@
 
         private ConstantLine _const_line_x;
         private ConstantLine _const_line_y;
-        private TextAnnotation _const_txt_annotation;
+        private TextAnnotation _anno_txt_query_info;
 
         private PumpCoordinate _coordinate = null;
-        private PumpCurveViewModel _vm = null;
+        private List<PumpViewChartViewModel> _vm_list = null;
+        private List<(List<Yw.Geometry.Point2d> FitPointList, bool IsClosed, double Tension)> _equal_eff_list = null;
+        private (List<Yw.Geometry.Point2d> FitPointList, PumpSectPointViewModel SectPoint)? _equip = null;
 
-        private bool _default_visible = false;
         private bool _power_visible = false;
         private bool _eff_visible = false;
         private bool _equal_eff_visible = false;
         private bool _split_panel = false;
 
+        private bool _line_visible = false;
         private bool _initial_data = false;
 
+
+        #endregion
+
+        #region Public Variable  
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public bool LineVisible
+        {
+            get
+            {
+                return _line_visible;
+            }
+            set
+            {
+                _line_visible = value;
+                _const_line_x.Visible = value;
+                _const_line_y.Visible = value;
+                SetAxisXValue();
+            }
+        }
+
+        /// <summary>
+        /// 
+        /// </summary>
+
+        public bool SplitPanel
+        {
+            get
+            {
+                return _split_panel;
+            }
+            set
+            {
+                _split_panel = value;
+            }
+        }
+
+        #endregion
+
+        #region Private Initial
 
         /// <summary>
         /// 鍒濆鍖栧浘琛�
@@ -114,9 +161,9 @@
 
         #endregion
 
-        #region Chart Event   
+        #region Private Chart Event      
 
-        ToolTipController toolTip = new ToolTipController();
+        ToolTipController _tool_tip = new();
         private void chartControl1_ObjectHotTracked(object sender, HotTrackEventArgs e)
         {
             //if (!_initial_data)
@@ -124,53 +171,34 @@
             //if (e.AdditionalObject is SeriesPoint series_pt)
             //{
             //    var tip = string.Format("X:{0:N1} Y:{1:N1}", series_pt.Argument, series_pt.Values[0]);
-            //    toolTip.ShowHint(tip);
+            //    _tool_tip.ShowHint(tip);
             //}
             //else
             //{
-            //    toolTip.HideHint();
+            //    _tool_tip.HideHint();
             //}
         }
 
-
-        // 鍙抽敭瀵硅薄 
-        private object _rightClickObj = null;
-        private bool _onMoveWorkPointLine = false;
-        private bool _onMoveWorkHLine = false;
+        private bool _on_move_x_line = false;
+        private bool _on_move_y_line = false;
         private void chartControl1_MouseDown(object sender, MouseEventArgs e)
         {
             if (!_initial_data)
                 return;
             var hitInfo = chartControl1.CalcHitInfo(e.Location);
+
             if (e.Button == MouseButtons.Left)
             {
-                if (hitInfo.InSeries)
-                {
-                    _rightClickObj = hitInfo.Series;
-
-                }
-                else if (hitInfo.InAxis)
-                {
-                    _rightClickObj = hitInfo.Axis;
-                }
-                else if (hitInfo.InConstantLine)
+                if (hitInfo.InConstantLine)
                 {
                     if (hitInfo.ConstantLine == _const_line_x)
                     {
-                        _onMoveWorkPointLine = true;
+                        _on_move_x_line = true;
                     }
                     else if (hitInfo.ConstantLine == _const_line_y)
                     {
-                        _onMoveWorkHLine = true;
+                        _on_move_y_line = true;
                     }
-                }
-                else if (hitInfo.InAnnotation)
-                {
-                    _rightClickObj = hitInfo.Annotation;
-                }
-                else
-                {
-                    _rightClickObj = null;
                 }
             }
 
@@ -178,53 +206,53 @@
 
         private void chartControl1_MouseMove(object sender, MouseEventArgs e)
         {
-            //if (!_initial_data)
-            //    return;
+            if (!_initial_data)
+                return;
 
-            //if (_onMoveWorkPointLine)
-            //{
-            //    var diagram_coordinates = _diagram.PointToDiagram(e.Location);
-            //    var axisValue = diagram_coordinates.GetAxisValue(_axis_x_flow);
-            //    if (axisValue == null)
-            //        return;
-            //    double chartQ = axisValue.NumericalValue;
-            //    CalcWorkPointByQ(chartQ);
+            if (_on_move_x_line)
+            {
+                var diagram_coordinates = _diagram.PointToDiagram(e.Location);
+                var axis_value = diagram_coordinates.GetAxisValue(_axis_x_flow);
+                if (axis_value == null)
+                    return;
+                double chartQ = axis_value.NumericalValue;
+                SetAxisXValue(chartQ);
 
-            //}
-            //else if (_onMoveWorkHLine)
-            //{
-            //    var diagram_coordinates = _diagram.PointToDiagram(e.Location);
-            //    var axisValue = diagram_coordinates.GetAxisValue(_axis_y_head);
-            //    if (axisValue == null)
-            //        return;
-            //    double chartH = axisValue.NumericalValue;
-            //    CalcWorkPointByH(chartH);
-            //}
-            //else
-            //{
-            //    var hitInfo = chartControl1.CalcHitInfo(e.Location);
-            //    if (hitInfo.InConstantLine)
-            //    {
-            //        this.chartControl1.Cursor = Cursors.Hand;
-            //    }
-            //    else if (hitInfo.InAnnotation)
-            //    {
-            //        this.chartControl1.Cursor = Cursors.SizeAll;
+            }
+            else if (_on_move_y_line)
+            {
+                var diagram_coordinates = _diagram.PointToDiagram(e.Location);
+                var axis_value = diagram_coordinates.GetAxisValue(_axis_y_head);
+                if (axis_value == null)
+                    return;
+                double chartH = axis_value.NumericalValue;
+                SetAxisYValue(chartH);
+            }
+            else
+            {
+                var hitInfo = chartControl1.CalcHitInfo(e.Location);
+                if (hitInfo.InConstantLine)
+                {
+                    this.chartControl1.Cursor = Cursors.Hand;
+                }
+                else if (hitInfo.InAnnotation)
+                {
+                    this.chartControl1.Cursor = Cursors.SizeAll;
 
-            //    }
-            //    else
-            //    {
-            //        this.chartControl1.Cursor = Cursors.Default;
-            //    }
-            //}
+                }
+                else
+                {
+                    this.chartControl1.Cursor = Cursors.Default;
+                }
+            }
         }
 
         private void chartControl1_MouseUp(object sender, MouseEventArgs e)
         {
             if (!_initial_data)
                 return;
-            _onMoveWorkPointLine = false;
-            _onMoveWorkHLine = false;
+            _on_move_x_line = false;
+            _on_move_y_line = false;
         }
 
         private void chartControl1_Resize(object sender, EventArgs e)
@@ -236,7 +264,7 @@
         {
             if (!_initial_data)
                 return;
-            if (_vm == null)
+            if (_vm_list == null)
                 return;
             if (_axis_x_flow.Visibility == DefaultBoolean.False)
                 return;
@@ -244,16 +272,15 @@
                 return;
             var cache = dx_args.Cache;
             cache.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
-            if (_equal_eff_visible && _vm.EqualEffList != null && _vm.EqualEffList.Any())
+
+            if (_equal_eff_list != null && _equal_eff_list.Any())
             {
                 using Pen pen = new(Color.Green, 2);
-                foreach (var eq_eff in _vm.EqualEffList)
+                foreach (var vm in _equal_eff_list)
                 {
-                    if (!eq_eff.IsValid())
-                        continue;
-                    var eq_eff_pt_list = eq_eff.CurveEqualEff;
+                    var fit_pt_list = vm.FitPointList;
                     var pic_eq_eff_pt_list = new List<Point>();
-                    foreach (var eq_eff_pt in eq_eff_pt_list)
+                    foreach (var eq_eff_pt in fit_pt_list)
                     {
                         var x = eq_eff_pt.X;
                         var y = eq_eff_pt.Y;
@@ -267,16 +294,16 @@
                     var pt_count = pic_eq_eff_pt_list.Count;
                     if (pt_count > 2)
                     {
-                        if (eq_eff.IsClosed)
+                        if (vm.IsClosed)
                         {
                             var path = cache.CreatePath();
-                            path.AddClosedCurve(pic_eq_eff_pt_list.ToArray(), (float)eq_eff.Tension);
+                            path.AddClosedCurve(pic_eq_eff_pt_list.ToArray(), (float)vm.Tension);
                             cache.DrawPath(pen, path);
                         }
                         else
                         {
                             var path = cache.CreatePath();
-                            path.AddCurve(pic_eq_eff_pt_list.ToArray(), (float)eq_eff.Tension);
+                            path.AddCurve(pic_eq_eff_pt_list.ToArray(), (float)vm.Tension);
                             cache.DrawPath(pen, path);
                         }
                     }
@@ -287,45 +314,74 @@
                     else if (pt_count == 1)
                     {
                         Rectangle rc = new Rectangle(pic_eq_eff_pt_list[0].X - 2, pic_eq_eff_pt_list[0].Y - 2, 4, 4);
-                        using (Brush b = new SolidBrush(pen.Color))
-                            cache.FillEllipse(b, rc);
+                        using Brush b = new SolidBrush(pen.Color);
+                        cache.FillEllipse(b, rc);
                     }
-
                 }
+
             }
 
-            if (_vm.Equip != null && _vm.Equip.IsValid())
+            if (_equip.HasValue)
             {
                 using Pen pen = new(Color.Black, 2);
                 pen.DashStyle = System.Drawing.Drawing2D.DashStyle.DashDotDot;
+                DrawEquipLine(dx_args.Cache, pen, _equip.Value.FitPointList);
+                DrawEquipPoint(dx_args.Cache, pen, _equip.Value.SectPoint);
+            }
+        }
 
-                var offset_size = 10;
-                var qh_pt = _diagram.DiagramToPoint(_vm.Equip.SectQ, _vm.Equip.SectH, _axis_x_flow, _axis_y_head);
-                var qh_pt_x = qh_pt.Point.X;
-                var qh_pt_y = qh_pt.Point.Y;
-                cache.DrawLine(pen, new Point(qh_pt_x, qh_pt_y - offset_size), new Point(qh_pt_x, qh_pt_y + offset_size));
+        private void DrawEquipPoint(GraphicsCache cache, Pen pen, PumpSectPointViewModel sect_pt)
+        {
+            if (sect_pt == null)
+                return;
 
-                if (_eff_visible && _vm.Equip.SectE != null)
-                {
-                    var qe_pt = _diagram.DiagramToPoint(_vm.Equip.SectQ, _vm.Equip.SectE.Value, _axis_x_flow, _axis_y_eff);
-                    var qe_pt_x = qe_pt.Point.X;
-                    var qe_pt_y = qe_pt.Point.Y;
-                    cache.DrawLine(pen, new Point(qe_pt_x, qe_pt_y - offset_size), new Point(qe_pt_x, qe_pt_y + offset_size));
-                }
-                if (_power_visible && _vm.Equip.SectP != null)
-                {
-                    var qp_pt = _diagram.DiagramToPoint(_vm.Equip.SectQ, _vm.Equip.SectP.Value, _axis_x_flow, _axis_y_power);
-                    var qp_pt_x = qp_pt.Point.X;
-                    var qp_pt_y = qp_pt.Point.Y;
-                    cache.DrawLine(pen, new Point(qp_pt_x, qp_pt_y - offset_size), new Point(qp_pt_x, qp_pt_y + offset_size));
-                }
+            double Q = sect_pt.Q;
+            double H = sect_pt.H;
+            double? E = sect_pt.E;
+            double? P = sect_pt.P;
+
+            var offset_size = 10;
+            var qh_pt = _diagram.DiagramToPoint(Q, H, _axis_x_flow, _axis_y_head);
+
+            var qh_pt_x = qh_pt.Point.X;
+            var qh_pt_y = qh_pt.Point.Y;
+            cache.DrawLine(pen, new Point(qh_pt_x, qh_pt_y - offset_size), new Point(qh_pt_x, qh_pt_y + offset_size));
+
+            if (E.HasValue && _eff_visible)
+            {
+                var qe_pt = _diagram.DiagramToPoint(Q, E.Value, _axis_x_flow, _axis_y_eff);
+                var qe_pt_x = qe_pt.Point.X;
+                var qe_pt_y = qe_pt.Point.Y;
+                cache.DrawLine(pen, new Point(qe_pt_x, qe_pt_y - offset_size), new Point(qe_pt_x, qe_pt_y + offset_size));
+            }
+
+            if (P.HasValue && _power_visible)
+            {
+                var qp_pt = _diagram.DiagramToPoint(Q, P.Value, _axis_x_flow, _axis_y_power);
+                var qp_pt_x = qp_pt.Point.X;
+                var qp_pt_y = qp_pt.Point.Y;
+                cache.DrawLine(pen, new Point(qp_pt_x, qp_pt_y - offset_size), new Point(qp_pt_x, qp_pt_y + offset_size));
             }
 
         }
 
+        private void DrawEquipLine(GraphicsCache cache, Pen pen, List<Yw.Geometry.Point2d> pt_list)
+        {
+            if (pt_list == null || !pt_list.Any())
+                return;
+            var pt_f_list = new List<PointF>();
+            foreach (var pt in pt_list)
+            {
+                var x = pt.X;
+                var y = pt.Y;
+                var c_pt = _diagram.DiagramToPoint(x, y, _axis_x_flow, _axis_y_head);
+                pt_f_list.Add(new PointF(c_pt.Point.X, c_pt.Point.Y));
+            }
 
-
-
+            using var path = new System.Drawing.Drawing2D.GraphicsPath();
+            path.AddCurve(pt_f_list.ToArray());
+            cache.DrawPath(pen, path);
+        }
         #endregion
 
         #region  Set  
@@ -333,10 +389,12 @@
         /// <summary>
         /// 娓呯┖鍥捐〃
         /// </summary>
-        public void ClearBindingData()
+        public void Clear()
         {
-            _vm = null;
-            _default_visible = false;
+            _vm_list = null;
+            _equal_eff_list = null;
+            _equip = null;
+            _coordinate = null;
             _split_panel = false;
             _eff_visible = false;
             _power_visible = false;
@@ -351,197 +409,125 @@
         /// <summary>
         /// 璁剧疆鍥捐〃
         /// </summary>
-        public void SetBindingData(PumpCurveViewModel vm, bool default_visible = true, bool split_panel = false, bool eff_visible = false, bool power_visible = true, bool equal_eff_visible = false)
+        public void SetBindingData(List<PumpViewChartViewModel> vm_list, string coordinate = null, bool split_panel = false, bool eff_visible = false, bool power_visible = true, bool equal_eff_visible = false)
         {
-            _vm = vm;
-            _default_visible = default_visible;
+            _vm_list = vm_list;
+            _equal_eff_list = null;
+            _equip = null;
+            _coordinate = PumpCoordinate.ToModel(coordinate);
             _split_panel = split_panel;
             _eff_visible = eff_visible;
             _power_visible = power_visible;
             _equal_eff_visible = equal_eff_visible;
+
             this.chartControl1.BeginInit();
             this.chartControl1.Series.Clear();
             this.chartControl1.AnnotationRepository.Clear();
             this.chartControl1.Legend.CustomItems.Clear();
-            if (vm == null)
+            if (IsInvalidData())
             {
                 _initial_data = false;
                 this.chartControl1.EndInit();
                 return;
             }
 
+            AxisXBase axis_x = null;
+            AxisYBase axis_y = null;
+            XYDiagramPaneBase pane = null;
 
-            if (default_visible)
-                AddDefault(vm);
-
-            AddEquip(vm.Equip);
-            AddVariableSpeedList(vm.VariableSpeedList);
-            if (_equal_eff_visible)
-                AddEqualEffList(vm.EqualEffList);
-            AddEqualPowerList(vm.EqualPowerList);
-
-            if (vm.Coordinate == null)
+            _equal_eff_list = new List<(List<Point2d> FitPointList, bool IsClosed, double Tension)>();
+            foreach (var vm in _vm_list)
             {
+                if (vm.CurveType == Ahart.eCurveType.EqualE)
+                { 
+                    axis_x = _axis_x_flow;
+                    axis_y = _axis_y_head;
+                    pane = _default_pane;
+                    var paras = PhartGraphHelper.GetGraphParas<EqualEGraphParasViewModel>(vm.CurveType, vm.GraphParas);
+                    if (paras.Tension<=0)
+                    {
+                        paras.Tension = 0.7;
+                    }
+                    _equal_eff_list.Add((vm.FitPointList, paras.IsClosed, paras.Tension));
+                }
+                else if (vm.CurveType == Ahart.eCurveType.QH)
+                {
+                    axis_x = _axis_x_flow;
+                    axis_y = _axis_y_head;
+                    pane = _default_pane;
+
+                }
+                else if (vm.CurveType == Ahart.eCurveType.QE)
+                { 
+                    axis_x = _axis_x_flow;
+                    axis_y = _axis_y_eff;
+                    pane = _default_pane;
+                  
+                }
+                else if (vm.CurveType == Ahart.eCurveType.QP)
+                { 
+                    axis_x = _axis_x_flow;
+                    axis_y = _axis_y_power;
+                    pane = _split_panel? _bottom_pane: _default_pane; 
+                } 
+
+                if (vm.AnnotationList != null && vm.AnnotationList.Any())
+                {
+                    foreach (var name in vm.AnnotationList)
+                    {
+                        AddAnnotation(vm.Id, name.Text, vm.Color, axis_y, pane, new Geometry.Point2d(name.X, name.Y), -40);
+                    }
+                }
+
+
+                if (vm.CurveType == Ahart.eCurveType.EqualE)
+                    continue;
+
+                var dash_style = DashStyle.Solid;
+                if (vm.Hz == 50)
+                    dash_style = DashStyle.Dot;
+
+                AddLineSeries(vm.Id, vm.Color, axis_x, axis_y, pane, vm.FitPointList, dash_style);
+            }
+
+            if (_coordinate == null)
                 SetCoordinate();
-            }
-            else
-            {
-                _coordinate = vm.Coordinate;
-            }
 
             SetChartAxis();
             this.chartControl1.EndInit();
             _initial_data = true;
+
         }
 
-        #region Add Data
-        private void AddDefault(PumpCurveViewModel vm)
+        /// <summary>
+        /// 璁剧疆鍥捐〃
+        /// </summary>
+        public void SetEquip(List<Yw.Geometry.Point2d> fit_pt_list, PumpSectPointViewModel sect_pt)
         {
-            var id = vm.Id;
-            var caption_qh = vm.CurveQHName;
-            var caption_qp = vm.CurveQPName;
-            var color_qh = vm.ColorQH ?? PumpChartDisplay.CurveColorQH;
-            var color_qe = vm.ColorQE ?? PumpChartDisplay.CurveColorQE;
-            var color_qp = vm.ColorQP ?? PumpChartDisplay.CurveColorQP;
-
-            var qh = vm.CurveQH;
-            var qe = vm.CurveQE;
-            var qp = vm.CurveQP;
-
-            XYDiagramPaneBase bottom_pane = _split_panel ? _bottom_pane : _default_pane;
-
-            AddLineSeries(id, color_qh, _axis_x_flow, _axis_y_head, _default_pane, qh, DevExpress.XtraCharts.DashStyle.Dash);
-            if (!string.IsNullOrEmpty(caption_qh))
-                AddAnnotation(id, caption_qh, color_qh, _axis_y_head, _default_pane, qh.Last());
-
-            if (qe != null && qe.Any() && _eff_visible)
+            _equip = null;
+            if (fit_pt_list != null && fit_pt_list.Any() && sect_pt != null)
             {
-                AddLineSeries(id, color_qe, _axis_x_flow, _axis_y_eff, _default_pane, qe, DevExpress.XtraCharts.DashStyle.Dash);
+                _equip = (fit_pt_list, sect_pt);
             }
 
-            if (qp != null && qp.Any() && _power_visible)
-            {
-                AddLineSeries(id, color_qp, _axis_x_flow, _axis_y_power, bottom_pane, qp, DevExpress.XtraCharts.DashStyle.Dash);
-                if (!string.IsNullOrEmpty(caption_qp))
-                {
-                    AddAnnotation(id, caption_qp, color_qp, _axis_y_power, bottom_pane, qp.Last());
-                }
-            }
+            SetCoordinate();
+            SetChartAxis();
         }
 
-        private void AddEquip(PumpCurveEquipViewModel vm)
+        //鏄惁鏄棤鏁堟暟鎹�
+        private bool IsInvalidData()
         {
-            if (vm == null)
-                return;
-            var id = vm.Id;
-            var caption = vm.CurveName;
-            var color = vm.Color ?? Color.Black;
-
-            var equip = vm.CurveEquip;
-            var equip_pt = new Yw.Geometry.Point2d(vm.PipeQ, vm.PipeH);
-
-            AddLineSeries(id, color, _axis_x_flow, _axis_y_head, _default_pane, equip, DevExpress.XtraCharts.DashStyle.DashDotDot);
-            // AddPointSeries(id, color, _axis_x_flow, _axis_y_head, _default_pane, new List<Geometry.Point2d>() { equip_pt }, MarkerKind.ThinCross);
-            if (!string.IsNullOrEmpty(caption))
-                AddAnnotation(id, caption, color, _axis_y_head, _default_pane, equip.Last());
-        }
-
-        private void AddVariableSpeedList(List<PumpCurveVariableSpeedViewModel> vm_list)
-        {
-            if (vm_list == null || !vm_list.Any())
-                return;
-            XYDiagramPaneBase bottom_pane = _split_panel ? _bottom_pane : _default_pane;
-            foreach (var vm in vm_list)
+            if (_vm_list == null || !_vm_list.Any())
             {
-                if (!vm.IsValid())
-                    continue;
-
-                var id = vm.Id;
-                var caption_qh = vm.CurveQHName;
-                var caption_qp = vm.CurveQPName;
-                var color_qh = vm.ColorQH ?? PumpChartDisplay.CurveColorQH;
-                var color_qe = vm.ColorQE ?? PumpChartDisplay.CurveColorQE;
-                var color_qp = vm.ColorQP ?? PumpChartDisplay.CurveColorQP;
-
-                var qh = vm.CurveQH;
-                var qe = vm.CurveQE;
-                var qp = vm.CurveQP;
-
-                AddLineSeries(id, color_qh, _axis_x_flow, _axis_y_head, _default_pane, qh);
-                if (!string.IsNullOrEmpty(caption_qh))
-                    AddAnnotation(id, caption_qh, color_qh, _axis_y_head, _default_pane, qh.Last());
-
-                if (qe != null && qe.Any() && _eff_visible)
-                {
-                    AddLineSeries(id, color_qe, _axis_x_flow, _axis_y_eff, _default_pane, qe);
-                }
-
-                if (qp != null && qp.Any() && _power_visible)
-                {
-                    AddLineSeries(id, color_qp, _axis_x_flow, _axis_y_power, bottom_pane, qp);
-                    if (!string.IsNullOrEmpty(caption_qp))
-                    {
-                        AddAnnotation(id, caption_qp, color_qp, _axis_y_power, bottom_pane, qp.Last());
-                    }
-                }
+                return true;
             }
-        }
-
-        private void AddEqualEffList(List<PumpCurveEqualEffViewModel> vm_list)
-        {
-            if (vm_list == null || !vm_list.Any())
-                return;
-            foreach (var vm in vm_list)
+            if (!_vm_list.Exists(x => x.CurveType == Ahart.eCurveType.QH))
             {
-                if (!vm.IsValid())
-                    continue;
-
-                var id = vm.Id;
-                var caption = vm.CurveName;
-                var color = vm.Color ?? Color.Green;
-
-                var equif_eff = vm.CurveEqualEff;
-                if (!string.IsNullOrEmpty(caption))
-                {
-                    if (equif_eff.Count > 2)
-                    {
-                        AddAnnotation(id, caption, color, _axis_y_head, _default_pane, equif_eff.First(), 60);
-                    }
-                    AddAnnotation(id, caption, color, _axis_y_head, _default_pane, equif_eff.Last(), 60);
-                }
+                return true;
             }
-
-
+            return false;
         }
 
-        private void AddEqualPowerList(List<PumpCurveEqualPowerViewModel> vm_list)
-        {
-            if (vm_list == null || !vm_list.Any())
-                return;
-
-            foreach (var vm in vm_list)
-            {
-                if (!vm.IsValid())
-                    continue;
-
-                var id = vm.Id;
-                var caption = vm.CurveName;
-                var color = vm.Color ?? Color.Green;
-                var equif_power = vm.CurveEqualPower;
-                if (equif_power.Count < 2)
-                {
-                    AddPointSeries(id, color, _axis_x_flow, _axis_y_head, _default_pane, equif_power);
-                }
-                else
-                {
-                    AddLineSeries(id, color, _axis_x_flow, _axis_y_head, _default_pane, equif_power, DashStyle.Dash);
-                }
-                if (!string.IsNullOrEmpty(caption))
-                    AddAnnotation(id, caption, color, _axis_y_head, _default_pane, equif_power.Last());
-            }
-        }
-
-        #endregion
 
         #region Add Chart Data 
 
@@ -586,6 +572,10 @@
             view.LineStyle.DashStyle = dash;
             view.LineStyle.LineJoin = System.Drawing.Drawing2D.LineJoin.Round;
             view.LineStyle.Thickness = 2;
+            if (dash!= DashStyle.Solid)
+            {
+                view.LineStyle.Thickness =3;
+            }
             view.Color = color;
             view.EnableAntialiasing = DefaultBoolean.True;
             view.MarkerVisibility = DefaultBoolean.False;
@@ -652,6 +642,7 @@
         }
 
         #endregion
+
         #endregion
 
         #region Set Axis
@@ -666,12 +657,7 @@
         /// </summary>
         private void SetCoordinate()
         {
-            if (_vm == null)
-            {
-                InitialCoordinate();
-                return;
-            }
-            if (_vm.CurveQH == null || !_vm.CurveQH.Any())
+            if (IsInvalidData())
             {
                 InitialCoordinate();
                 return;
@@ -687,60 +673,28 @@
             var e_list_list = new List<List<double>>();
             var p_list_list = new List<List<double>>();
 
-            if (_default_visible)
+            foreach (var vm in _vm_list)
             {
-                q_list_list.Add(_vm.CurveQH.Select(x => x.X).ToList());
-                h_list_list.Add(_vm.CurveQH.Select(x => x.Y).ToList());
-                if (_vm.CurveQE != null)
+                if (vm.CurveType == Ahart.eCurveType.QH || vm.CurveType == Ahart.eCurveType.EqualE)
                 {
-                    e_list_list.Add(_vm.CurveQE.Select(x => x.Y).ToList());
+                    q_list_list.Add(vm.FitPointList.Select(x => x.X).ToList());
+                    h_list_list.Add(vm.FitPointList.Select(x => x.Y).ToList());
                 }
-                if (_vm.CurveQP != null)
+                else if (vm.CurveType == Ahart.eCurveType.QE)
                 {
-                    p_list_list.Add(_vm.CurveQP.Select(x => x.Y).ToList());
+                    e_list_list.Add(vm.FitPointList.Select(x => x.Y).ToList());
+                }
+                else if (vm.CurveType == Ahart.eCurveType.QP)
+                {
+                    p_list_list.Add(vm.FitPointList.Select(x => x.Y).ToList());
                 }
             }
 
-            if (_vm.Equip != null)
+            if (_equip.HasValue)
             {
-                var item = _vm.Equip;
-                q_list_list.Add(item.CurveEquip.Select(x => x.X).ToList());
-                h_list_list.Add(item.CurveEquip.Select(x => x.Y).ToList());
-            }
-
-            if (_vm.VariableSpeedList != null && _vm.VariableSpeedList.Any())
-            {
-                foreach (var item in _vm.VariableSpeedList)
-                {
-                    q_list_list.Add(item.CurveQH.Select(x => x.X).ToList());
-                    h_list_list.Add(item.CurveQH.Select(x => x.Y).ToList());
-                    if (item.CurveQE != null)
-                    {
-                        e_list_list.Add(item.CurveQE.Select(x => x.Y).ToList());
-                    }
-                    if (item.CurveQP != null)
-                    {
-                        p_list_list.Add(item.CurveQP.Select(x => x.Y).ToList());
-                    }
-                }
-            }
-
-            if (_vm.EqualEffList != null && _vm.EqualEffList.Any())
-            {
-                foreach (var item in _vm.EqualEffList)
-                {
-                    q_list_list.Add(item.CurveEqualEff.Select(x => x.X).ToList());
-                    h_list_list.Add(item.CurveEqualEff.Select(x => x.Y).ToList());
-                }
-            }
-
-            if (_vm.EqualPowerList != null && _vm.EqualPowerList.Any())
-            {
-                foreach (var item in _vm.EqualPowerList)
-                {
-                    q_list_list.Add(item.CurveEqualPower.Select(x => x.X).ToList());
-                    h_list_list.Add(item.CurveEqualPower.Select(x => x.Y).ToList());
-                }
+                var fit_pt_list = _equip.Value.FitPointList;
+                q_list_list.Add(fit_pt_list.Select(x => x.X).ToList());
+                h_list_list.Add(fit_pt_list.Select(x => x.Y).ToList());
             }
 
 
@@ -869,99 +823,316 @@
 
 
             _axis_x_flow.SetAxisRange(_coordinate.CoordMinQ, _coordinate.CoordMinQ + _coordinate.GridNumberX * _coordinate.CoordSpaceQ);
-
-
-
-            //鏄惁鍒嗗壊闈㈡澘:娴侀噺鏁堢巼鍦ㄤ笂,鍔熺巼鍦ㄤ笅
             if (_split_panel)
             {
-                if (_power_visible)
+
+                var grid_count_head = _coordinate.EndLineNoH - _coordinate.StartLineNoH;
+                var grid_count_eff = _coordinate.EndLineNoE - _coordinate.StartLineNoE;
+                int grid_count_up = Math.Max(grid_count_head, grid_count_eff);
+                if (_eff_visible)
                 {
-                    var grid_count_head = _coordinate.EndLineNoH - _coordinate.StartLineNoH;
-                    var grid_count_eff = _coordinate.EndLineNoE - _coordinate.StartLineNoE;
-                    int grid_count_add = Math.Max(grid_count_head, grid_count_eff);
-                    if (_eff_visible)
-                        grid_count_add += +5;//澶氫袱鏉�
-
-                    var max_axis_head = _coordinate.CoordMinH + _coordinate.EndLineNoH * _coordinate.CoordSpaceH;
-                    var min_axis_head = max_axis_head - grid_count_add * _coordinate.CoordSpaceH;
-                    _axis_y_head.SetAxisRange(min_axis_head, max_axis_head);
-
-                    var min_axis_eff = _coordinate.CoordMinE + _coordinate.StartLineNoE * _coordinate.CoordSpaceE;
-                    var max_axis_eff = min_axis_eff + grid_count_add * _coordinate.CoordSpaceE;
-
-                    _axis_y_eff.SetAxisRange(min_axis_eff, max_axis_eff);
-                    _bottom_pane.Visibility = ChartElementVisibility.Visible;
+                    grid_count_up += 4;//澶氫袱鏉�
                 }
-                else
-                {
-                    var grid_count_power = _coordinate.EndLineNoP - _coordinate.StartLineNoP;
-                    var grid_delete_head = grid_count_power * _coordinate.CoordSpaceH;
-                    grid_delete_head = _coordinate.CoordMinH < 0 ? -grid_delete_head : grid_delete_head;
 
-                    var grid_delete_eff = grid_count_power * _coordinate.CoordSpaceE;
-                    grid_delete_eff = _coordinate.CoordMinE < 0 ? -grid_delete_eff : grid_delete_eff;
+                var max_axis_head = _coordinate.CoordMinH + _coordinate.EndLineNoH * _coordinate.CoordSpaceH;
+                var min_axis_head = max_axis_head - grid_count_up * _coordinate.CoordSpaceH;
+                _axis_y_head.SetAxisRange(min_axis_head, max_axis_head);
 
-                    _axis_y_head.SetAxisRange(_coordinate.CoordMinH - grid_delete_head, _coordinate.CoordMinH + _coordinate.GridNumberY * _coordinate.CoordSpaceH);
-                    _axis_y_eff.SetAxisRange(_coordinate.CoordMinE - grid_delete_eff, _coordinate.CoordMinE + _coordinate.GridNumberY * _coordinate.CoordSpaceE);
-
-                    _bottom_pane.Visibility = ChartElementVisibility.Hidden;
-                }
+                var min_axis_eff = _coordinate.CoordMinE + _coordinate.StartLineNoE * _coordinate.CoordSpaceE;
+                var max_axis_eff = min_axis_eff + grid_count_up * _coordinate.CoordSpaceE;
+                _axis_y_eff.SetAxisRange(min_axis_eff, max_axis_eff); 
 
                 if ((!_eff_visible) && (!_power_visible))
                 {
                     _axis_y_head.SetAxisRange(_coordinate.DispMinH(), _coordinate.DispMaxH());
                 }
-                _axis_y_power.SetAxisRange(_coordinate.DispMinP(), _coordinate.DispMaxP());
+
+                _axis_y_power.SetAxisRange(_coordinate.DispMinP(), _coordinate.DispMaxP()); 
+                _bottom_pane.Visibility = ChartElementVisibility.Visible;
             }
             else
             {
-                if ((!_eff_visible) && (!_power_visible))
-                {
-                    _axis_y_head.SetAxisRange(_coordinate.DispMinH(), _coordinate.DispMaxH());
-                }
-                else if ((!_eff_visible) && _power_visible)
-                {
-                    var grid_count_eff = _coordinate.EndLineNoE - _coordinate.StartLineNoE;
-                    if (_coordinate.EndLineNoH - _coordinate.StartLineNoH < 6)
-                        grid_count_eff++;
-                    var grid_delete_head = grid_count_eff * _coordinate.CoordSpaceH;
-                    grid_delete_head = _coordinate.CoordMinH < 0 ? -grid_delete_head : grid_delete_head;
-                    var grid_delete_power = grid_count_eff * _coordinate.CoordSpaceP;
-
-                    _axis_y_head.SetAxisRange(_coordinate.CoordMinH - grid_delete_head, _coordinate.CoordMinH + _coordinate.GridNumberY * _coordinate.CoordSpaceH);
-                    _axis_y_power.SetAxisRange(_coordinate.CoordMinP, _coordinate.CoordMinP + _coordinate.GridNumberY * _coordinate.CoordSpaceP - grid_delete_power);
-                }
-                else if (_eff_visible && (!_power_visible))
-                {
-                    var grid_count_power = _coordinate.EndLineNoP - _coordinate.StartLineNoP;
-                    var grid_delete_head = grid_count_power * _coordinate.CoordSpaceH;
-                    grid_delete_head = _coordinate.CoordMinH < 0 ? -grid_delete_head : grid_delete_head;
-
-                    var grid_delete_eff = grid_count_power * _coordinate.CoordSpaceE;
-                    grid_delete_eff = _coordinate.CoordMinE < 0 ? -grid_delete_eff : grid_delete_eff;
-
-                    _axis_y_head.SetAxisRange(_coordinate.CoordMinH - grid_delete_head, _coordinate.CoordMinH + _coordinate.GridNumberY * _coordinate.CoordSpaceH);
-                    _axis_y_eff.SetAxisRange(_coordinate.CoordMinE - grid_delete_eff, _coordinate.CoordMinE + _coordinate.GridNumberY * _coordinate.CoordSpaceE);
-                }
-                else
+                if (_eff_visible)
                 {
                     _axis_y_head.SetAxisRange(_coordinate.CoordMinH, _coordinate.CoordMinH + _coordinate.GridNumberY * _coordinate.CoordSpaceH);
                     _axis_y_eff.SetAxisRange(_coordinate.CoordMinE, _coordinate.CoordMinE + _coordinate.GridNumberY * _coordinate.CoordSpaceE);
                     _axis_y_power.SetAxisRange(_coordinate.CoordMinP, _coordinate.CoordMinP + _coordinate.GridNumberY * _coordinate.CoordSpaceP);
                 }
+                else
+                {
+
+                    var grid_count_eff = _coordinate.GridNumberY - (_coordinate.EndLineNoH - _coordinate.StartLineNoH+ _coordinate.EndLineNoP - _coordinate.StartLineNoP); 
+                    var grid_delete_head = grid_count_eff * _coordinate.CoordSpaceH;
+                    double min_head = _coordinate.CoordMinH;
+                    if (true)
+                    {
+                        if (_coordinate.CoordMinH<0)
+                        {
+                            min_head=_coordinate.CoordMinH - -grid_delete_head;
+                        }
+                        else
+                        {
+                            min_head = _coordinate.CoordMinH+grid_delete_head;
+                        } 
+                    } 
+                    var grid_delete_power = grid_count_eff * _coordinate.CoordSpaceP; 
+                    _axis_y_head.SetAxisRange(min_head, _coordinate.CoordMinH + _coordinate.GridNumberY * _coordinate.CoordSpaceH); 
+                    _axis_y_power.SetAxisRange(_coordinate.CoordMinP, _coordinate.CoordMinP + _coordinate.GridNumberY * _coordinate.CoordSpaceP - grid_delete_power);
+                }
+                 
 
                 _bottom_pane.Visibility = ChartElementVisibility.Hidden;
             }
 
-
         }
-
-
-
-
 
         #endregion
 
+        #region Set Axis Value
+
+        /// <summary>
+        /// 璁剧疆X杞村��
+        /// </summary> 
+        public void SetAxisXValue(double? x = null)
+        {
+            if (!_line_visible)
+            {
+                _const_line_x.Visible = false;
+                _const_line_x.Title.Visible = false;
+                _const_line_y.Visible = false;
+                _const_line_y.Title.Visible = false;
+                return;
+            }
+            else
+            {
+                _const_line_x.Visible = true;
+                _const_line_x.Title.Visible = true;
+                _const_line_y.Visible = true;
+                _const_line_y.Title.Visible = true;
+            }
+            if (this.IsInvalidData())
+                return;
+            var vm_sel = _vm_list.Find(x => x.IsSelect);
+            if (vm_sel == null)
+                return;
+
+            var min_x = vm_sel.FitPointList.Min(x => x.X);
+            var max_x = vm_sel.FitPointList.Max(x => x.X);
+
+            if (x == null)
+            {
+                x = (min_x + max_x) / 2;
+            }
+            else
+            {
+                if (x < min_x || x > max_x)
+                    return;
+            }
+
+            var x_value = x.Value;
+            var y_value = vm_sel.FitPointList.GetInterPointsY(x_value)?.FirstOrDefault();
+
+            _const_line_x.AxisValue = x_value;
+            _const_line_x.Title.Text = $"{x_value:N1}";
+
+            _const_line_y.AxisValue = y_value;
+            _const_line_y.Title.Text = $"{y_value:N1}";
+        }
+
+        /// <summary>
+        /// 璁剧疆Y杞村��
+        /// </summary> 
+        public void SetAxisYValue(double y)
+        {
+            if (!_line_visible)
+                return;
+            if (IsInvalidData())
+                return;
+            var vm_sel = _vm_list.Find(x => x.IsSelect);
+            if (vm_sel == null)
+                return;
+
+            var min_y = vm_sel.FitPointList.Min(x => x.Y);
+            var max_y = vm_sel.FitPointList.Max(x => x.Y);
+            if (y < min_y || y > max_y)
+                return;
+
+            var x_value = vm_sel.FitPointList.GetInterPointsX(y)?.LastOrDefault();
+            SetAxisXValue(x_value);
+        }
+
+        #endregion
     }
 }
+
+///// <summary>
+///// 璁剧疆鍥捐〃杞�
+///// </summary>
+//private void SetChartAxis()
+//{
+//    _axis_x_flow.Visibility = DefaultBoolean.False;
+//    _axis_x_flow.GridLines.Visible = false;
+//    _axis_y_head.Visibility = DefaultBoolean.False;
+//    _axis_y_head.GridLines.Visible = false;
+//    _axis_y_eff.Visibility = DefaultBoolean.False;
+//    _axis_y_eff.GridLines.Visible = false;
+//    _axis_y_power.Visibility = DefaultBoolean.False;
+//    _axis_y_power.GridLines.Visible = false;
+//    if (_coordinate == null)
+//    {
+//        _const_line_x.Visible = false;
+//        _const_line_y.Visible = false;
+//        _bottom_pane.Visibility = ChartElementVisibility.Hidden;
+//        return;
+//    }
+
+
+//    //璁$畻鍒诲害 Q
+//    var axisQLabels = new List<CustomAxisLabel>();
+//    var disQ = _coordinate.CoordMinQ;
+//    for (int i = 0; i < _coordinate.GridNumberX + 1; i++)
+//    {
+//        axisQLabels.Add(new CustomAxisLabel(disQ.ToString("N0"), disQ));
+//        disQ = disQ + _coordinate.CoordSpaceQ;
+//    }
+
+//    _axis_x_flow.CustomLabels.Clear();
+//    _axis_x_flow.CustomLabels.AddRange(axisQLabels.ToArray());
+//    _axis_x_flow.Visibility = DefaultBoolean.True;
+//    _axis_x_flow.GridLines.Visible = true;
+
+
+//    //璁$畻鍒诲害
+//    var axis_head_labels = new List<CustomAxisLabel>();
+//    var display_head = _coordinate.CoordMinH + _coordinate.CoordSpaceH * _coordinate.StartLineNoH;
+//    for (int i = _coordinate.StartLineNoH; i < _coordinate.EndLineNoH + 1; i++)
+//    {
+//        axis_head_labels.Add(new CustomAxisLabel(display_head.ToString(), display_head));
+//        display_head = display_head + _coordinate.CoordSpaceH;
+//    }
+
+//    _axis_y_head.CustomLabels.Clear();
+//    _axis_y_head.CustomLabels.AddRange(axis_head_labels.ToArray());
+//    _axis_y_head.Visibility = DefaultBoolean.True;
+//    _axis_y_head.GridLines.Visible = true;
+
+//    //鏁堢巼
+//    if (_maxE > _minE && _eff_visible)
+//    {
+//        //璁$畻鍒诲害
+//        var label_list = new List<CustomAxisLabel>();
+//        var display_eff = _coordinate.CoordMinE + _coordinate.CoordSpaceE * _coordinate.StartLineNoE;
+//        for (int i = _coordinate.StartLineNoE; i < _coordinate.EndLineNoE + 1; i++)
+//        {
+//            label_list.Add(new CustomAxisLabel(display_eff.ToString(), display_eff));
+//            display_eff = display_eff + _coordinate.CoordSpaceE;
+//        }
+
+//        _axis_y_eff.CustomLabels.Clear();
+//        _axis_y_eff.CustomLabels.AddRange(label_list.ToArray());
+//        _axis_y_eff.Visibility = DefaultBoolean.True;
+//        _axis_y_eff.GridLines.Visible = true;
+//    }
+
+//    //鍔熺巼
+//    if (_maxP > _minP && _power_visible)
+//    {
+//        //璁$畻鍒诲害
+//        var label_list = new List<CustomAxisLabel>();
+//        double display_power = _coordinate.CoordMinP + _coordinate.CoordSpaceP * _coordinate.StartLineNoP;
+//        for (int i = _coordinate.StartLineNoP; i < _coordinate.EndLineNoP + 1; i++)
+//        {
+//            label_list.Add(new CustomAxisLabel(display_power.ToString(), display_power));
+//            display_power = display_power + _coordinate.CoordSpaceP;
+//        }
+
+//        _axis_y_power.CustomLabels.Clear();
+//        _axis_y_power.CustomLabels.AddRange(label_list.ToArray());
+//        _axis_y_power.Visibility = DefaultBoolean.True;
+//        _axis_y_power.GridLines.Visible = true;
+//    }
+
+
+//    _axis_x_flow.SetAxisRange(_coordinate.CoordMinQ, _coordinate.CoordMinQ + _coordinate.GridNumberX * _coordinate.CoordSpaceQ);
+//    if (_split_panel)
+//    {
+//        if (_power_visible)
+//        {
+//            var grid_count_head = _coordinate.EndLineNoH - _coordinate.StartLineNoH;
+//            var grid_count_eff = _coordinate.EndLineNoE - _coordinate.StartLineNoE;
+//            int grid_count_add = Math.Max(grid_count_head, grid_count_eff);
+//            if (_eff_visible)
+//                grid_count_add += +5;//澶氫袱鏉�
+
+//            var max_axis_head = _coordinate.CoordMinH + _coordinate.EndLineNoH * _coordinate.CoordSpaceH;
+//            var min_axis_head = max_axis_head - grid_count_add * _coordinate.CoordSpaceH;
+//            _axis_y_head.SetAxisRange(min_axis_head, max_axis_head);
+
+//            var min_axis_eff = _coordinate.CoordMinE + _coordinate.StartLineNoE * _coordinate.CoordSpaceE;
+//            var max_axis_eff = min_axis_eff + grid_count_add * _coordinate.CoordSpaceE;
+
+//            _axis_y_eff.SetAxisRange(min_axis_eff, max_axis_eff);
+//            _bottom_pane.Visibility = ChartElementVisibility.Visible;
+//        }
+//        else
+//        {
+//            var grid_count_power = _coordinate.EndLineNoP - _coordinate.StartLineNoP;
+//            var grid_delete_head = grid_count_power * _coordinate.CoordSpaceH;
+//            grid_delete_head = _coordinate.CoordMinH < 0 ? -grid_delete_head : grid_delete_head;
+
+//            var grid_delete_eff = grid_count_power * _coordinate.CoordSpaceE;
+//            grid_delete_eff = _coordinate.CoordMinE < 0 ? -grid_delete_eff : grid_delete_eff;
+
+//            _axis_y_head.SetAxisRange(_coordinate.CoordMinH - grid_delete_head, _coordinate.CoordMinH + _coordinate.GridNumberY * _coordinate.CoordSpaceH);
+//            _axis_y_eff.SetAxisRange(_coordinate.CoordMinE - grid_delete_eff, _coordinate.CoordMinE + _coordinate.GridNumberY * _coordinate.CoordSpaceE);
+
+//            _bottom_pane.Visibility = ChartElementVisibility.Hidden;
+//        }
+
+//        if ((!_eff_visible) && (!_power_visible))
+//        {
+//            _axis_y_head.SetAxisRange(_coordinate.DispMinH(), _coordinate.DispMaxH());
+//        }
+//        _axis_y_power.SetAxisRange(_coordinate.DispMinP(), _coordinate.DispMaxP());
+//    }
+//    else
+//    {
+//        if ((!_eff_visible) && (!_power_visible))
+//        {
+//            _axis_y_head.SetAxisRange(_coordinate.DispMinH(), _coordinate.DispMaxH());
+//        }
+//        else if ((!_eff_visible) && _power_visible)
+//        {
+//            var grid_count_eff = _coordinate.EndLineNoE - _coordinate.StartLineNoE;
+//            if (_coordinate.EndLineNoH - _coordinate.StartLineNoH < 6)
+//                grid_count_eff++;
+//            var grid_delete_head = grid_count_eff * _coordinate.CoordSpaceH;
+//            grid_delete_head = _coordinate.CoordMinH < 0 ? -grid_delete_head : grid_delete_head;
+//            var grid_delete_power = grid_count_eff * _coordinate.CoordSpaceP;
+
+//            _axis_y_head.SetAxisRange(_coordinate.CoordMinH - grid_delete_head, _coordinate.CoordMinH + _coordinate.GridNumberY * _coordinate.CoordSpaceH);
+//            _axis_y_power.SetAxisRange(_coordinate.CoordMinP, _coordinate.CoordMinP + _coordinate.GridNumberY * _coordinate.CoordSpaceP - grid_delete_power);
+//        }
+//        else if (_eff_visible && (!_power_visible))
+//        {
+//            var grid_count_power = _coordinate.EndLineNoP - _coordinate.StartLineNoP;
+//            var grid_delete_head = grid_count_power * _coordinate.CoordSpaceH;
+//            grid_delete_head = _coordinate.CoordMinH < 0 ? -grid_delete_head : grid_delete_head;
+
+//            var grid_delete_eff = grid_count_power * _coordinate.CoordSpaceE;
+//            grid_delete_eff = _coordinate.CoordMinE < 0 ? -grid_delete_eff : grid_delete_eff;
+
+//            _axis_y_head.SetAxisRange(_coordinate.CoordMinH - grid_delete_head, _coordinate.CoordMinH + _coordinate.GridNumberY * _coordinate.CoordSpaceH);
+//            _axis_y_eff.SetAxisRange(_coordinate.CoordMinE - grid_delete_eff, _coordinate.CoordMinE + _coordinate.GridNumberY * _coordinate.CoordSpaceE);
+//        }
+//        else
+//        {
+//            _axis_y_head.SetAxisRange(_coordinate.CoordMinH, _coordinate.CoordMinH + _coordinate.GridNumberY * _coordinate.CoordSpaceH);
+//            _axis_y_eff.SetAxisRange(_coordinate.CoordMinE, _coordinate.CoordMinE + _coordinate.GridNumberY * _coordinate.CoordSpaceE);
+//            _axis_y_power.SetAxisRange(_coordinate.CoordMinP, _coordinate.CoordMinP + _coordinate.GridNumberY * _coordinate.CoordSpaceP);
+//        }
+
+//        _bottom_pane.Visibility = ChartElementVisibility.Hidden;
+//    }
+
+//}
\ No newline at end of file
diff --git a/WinFrmUI/Yw.WinFrmUI.Phart.Core/01-pump/01-view/PumpViewChartViewModel.cs b/WinFrmUI/Yw.WinFrmUI.Phart.Core/01-pump/01-view/PumpViewChartViewModel.cs
new file mode 100644
index 0000000..045a74b
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Phart.Core/01-pump/01-view/PumpViewChartViewModel.cs
@@ -0,0 +1,61 @@
+锘縩amespace Yw.WinFrmUI.Phart
+{
+    public class PumpViewChartViewModel
+    {
+        /// <summary>
+        /// 
+        /// </summary>
+        public string Id { get; set; }
+        
+        /// <summary>
+        /// 
+        /// </summary>
+        public double Hz { get; set; }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public double N { get; set; }
+
+        /// <summary>
+        /// 
+        /// </summary> 
+        public Color Color { get; set; }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public List<AnnotationParasViewModel> AnnotationList { get; set; } 
+         
+        /// <summary>
+        /// 
+        /// </summary>
+        public Yw.Ahart.eCurveType CurveType { get; set; }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public Yw.Ahart.eFeatType FeatType { get; set; }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public List<Yw.Geometry.Point2d> DefPointList { get; set; }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public List<Yw.Geometry.Point2d> FitPointList { get; set; }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public string GraphParas { get; set; }
+           
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public bool IsSelect { get; set; }
+    }
+}
diff --git a/WinFrmUI/Yw.WinFrmUI.Phart.Core/01-pump/03-import/03-point/PumpChartPointImportCtrl.cs b/WinFrmUI/Yw.WinFrmUI.Phart.Core/01-pump/03-import/03-point/PumpChartPointImportCtrl.cs
index 068ce69..ad122da 100644
--- a/WinFrmUI/Yw.WinFrmUI.Phart.Core/01-pump/03-import/03-point/PumpChartPointImportCtrl.cs
+++ b/WinFrmUI/Yw.WinFrmUI.Phart.Core/01-pump/03-import/03-point/PumpChartPointImportCtrl.cs
@@ -1,4 +1,5 @@
 锘縰sing DevExpress.XtraEditors;
+using Yw.Ahart;
 
 namespace Yw.WinFrmUI.Phart
 {
@@ -341,18 +342,35 @@
 
             if (!bol)
             {
-                this.pumpViewChart1.ClearBindingData();
+                this.pumpViewChart1.Clear();
             }
             else
             {
-                var vm = new PumpCurveViewModel();
-                vm.CurveQH = _def_qh_pt_list;
-                vm.CurveQE = _def_qe_pt_list;
-                vm.CurveQP = _def_qp_pt_list;
-                this.pumpViewChart1.SetBindingData(vm);
+                var list = new List<Yw.WinFrmUI.Phart.PumpViewChartViewModel>();
+                list.Add(GetViewModel(_def_qh_pt_list, Yw.Ahart.eCurveType.QH));
+                if (_def_qe_pt_list != null && _def_qe_pt_list.Any())
+                    list.Add(GetViewModel(_def_qe_pt_list, Yw.Ahart.eCurveType.QE));
+                if (_def_qp_pt_list != null && _def_qp_pt_list.Any())
+                    list.Add(GetViewModel(_def_qp_pt_list, Yw.Ahart.eCurveType.QP));
+                this.pumpViewChart1.SetBindingData(list);
             }
         }
 
+        private Yw.WinFrmUI.Phart.PumpViewChartViewModel GetViewModel(List<Yw.Geometry.Point2d> pt_list,Yw.Ahart.eCurveType curve_type)
+        {
+            var last_pt = pt_list.Last(); 
+            var vm = new Yw.WinFrmUI.Phart.PumpViewChartViewModel();
+            vm.Id = Guid.NewGuid().ToString();
+            vm.Hz = 50;
+            vm.N =  Convert.ToDouble(this.barTxtN.EditValue);    
+            vm.CurveType = curve_type;
+            vm.FeatType =  eFeatType.Cubic;
+            vm.DefPointList = pt_list;
+            vm.FitPointList = pt_list;
+            vm.GraphParas = "";
+            return vm;
+        }
+
 
         //鐢熸垚
         private void barBtnCreate_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
diff --git a/WinFrmUI/Yw.WinFrmUI.Phart.Core/01-pump/04-special/01-operation/PumpOperationChart.cs b/WinFrmUI/Yw.WinFrmUI.Phart.Core/01-pump/04-special/01-operation/PumpOperationChart.cs
index d3b5e8f..96d6e2f 100644
--- a/WinFrmUI/Yw.WinFrmUI.Phart.Core/01-pump/04-special/01-operation/PumpOperationChart.cs
+++ b/WinFrmUI/Yw.WinFrmUI.Phart.Core/01-pump/04-special/01-operation/PumpOperationChart.cs
@@ -31,8 +31,8 @@
         private TextAnnotation _anno_txt_query_info;
         private PumpCoordinate _coordinate;
 
-        private bool _qe_visible = true;
-        private bool _qp_visible = true;
+        private bool _eff_visible = true;
+        private bool _power_visible = true;
 
         private bool _equip_visible = true;
         private List<Yw.Geometry.Point2d> _equip_pt_list = null;
@@ -125,11 +125,11 @@
         /// </summary>
         public bool QEVisible
         {
-            get => _qe_visible;
+            get => _eff_visible;
             set
             {
-                _qe_visible = value;
-                this.barCekCurveQEVisible.Checked = _qe_visible;
+                _eff_visible = value;
+                this.barCekCurveQEVisible.Checked = _eff_visible;
             }
         }
 
@@ -138,11 +138,11 @@
         /// </summary>
         public bool QPVisible
         {
-            get => _qp_visible;
+            get => _power_visible;
             set
             {
-                _qp_visible = value;
-                this.barCekCurveQPVisible.Checked = _qp_visible;
+                _power_visible = value;
+                this.barCekCurveQPVisible.Checked = _power_visible;
             }
         }
 
@@ -289,7 +289,7 @@
             var qh_pt_y = qh_pt.Point.Y;
             cache.DrawLine(pen, new Point(qh_pt_x, qh_pt_y - offset_size), new Point(qh_pt_x, qh_pt_y + offset_size));
 
-            if (E.HasValue && _qe_visible)
+            if (E.HasValue && _eff_visible)
             {
                 var qe_pt = _diagram.DiagramToPoint(Q, E.Value, _axis_x_flow, _axis_y_eff);
                 var qe_pt_x = qe_pt.Point.X;
@@ -297,7 +297,7 @@
                 cache.DrawLine(pen, new Point(qe_pt_x, qe_pt_y - offset_size), new Point(qe_pt_x, qe_pt_y + offset_size));
             }
 
-            if (P.HasValue && _qp_visible)
+            if (P.HasValue && _power_visible)
             {
                 var qp_pt = _diagram.DiagramToPoint(Q, P.Value, _axis_x_flow, _axis_y_power);
                 var qp_pt_x = qp_pt.Point.X;
@@ -609,7 +609,7 @@
 
             _query_flow_line.Visible = false;
             _bottom_pane.Visibility = ChartElementVisibility.Hidden;
-            _bottom_pane.Visibility = _qp_visible ? ChartElementVisibility.Visible : ChartElementVisibility.Hidden;
+            _bottom_pane.Visibility = _power_visible ? ChartElementVisibility.Visible : ChartElementVisibility.Hidden;
 
             //璁$畻鍒诲害 Q
             var axisQLabels = new List<CustomAxisLabel>();
@@ -641,7 +641,7 @@
             _axis_y_head.GridLines.Visible = true;
 
             //鏁堢巼
-            if (_max_eff > _min_eff && _qe_visible)
+            if (_max_eff > _min_eff && _eff_visible)
             {
                 //璁$畻鍒诲害
                 var labels = new List<CustomAxisLabel>();
@@ -659,7 +659,7 @@
             }
 
             //鍔熺巼
-            if (_max_power > _min_power && _qp_visible)
+            if (_max_power > _min_power && _power_visible)
             {
                 //璁$畻鍒诲害
                 var labels = new List<CustomAxisLabel>();
@@ -683,7 +683,7 @@
             var grid_count_head = _coordinate.EndLineNoH - _coordinate.StartLineNoH;
             var grid_count_eff = _coordinate.EndLineNoE - _coordinate.StartLineNoE;
             int grid_count_up = Math.Max(grid_count_head, grid_count_eff);
-            if (_qe_visible)
+            if (_eff_visible)
             {
                 grid_count_up += 2;//澶氫袱鏉�
             }
@@ -944,7 +944,7 @@
                 series_qe.SeriesPointsSorting = SortingMode.None;
                 series_qe.SeriesPointsSortingKey = SeriesPointKey.Value_1;
                 series_qe.View = series_qe_view;
-                series_qe.Visible = _qe_visible;
+                series_qe.Visible = _eff_visible;
 
 
                 var pt_qe_list = vm.CurveQE.GetPointList(_feat_type_qe, 100);
@@ -978,7 +978,7 @@
                 series_qp.SeriesPointsSorting = SortingMode.None;
                 series_qp.SeriesPointsSortingKey = SeriesPointKey.Value_1;
                 series_qp.View = series_qp_view;
-                series_qp.Visible = _qp_visible;
+                series_qp.Visible = _power_visible;
 
                 var pt_qp_list = vm.CurveQP.GetPointList(_feat_type_qp, 100);
                 for (int i = 0; i < pt_qp_list.Count; i++)
@@ -1078,7 +1078,7 @@
                 series_qe.SeriesPointsSorting = SortingMode.None;
                 series_qe.SeriesPointsSortingKey = SeriesPointKey.Value_1;
                 series_qe.View = series_qe_view;
-                series_qe.Visible = _qe_visible;
+                series_qe.Visible = _eff_visible;
 
                 var pt_qe_list = vm.CurrentCurveQE.GetPointList(_feat_type_qe, 100);
                 for (int i = 0; i < pt_qe_list.Count; i++)
@@ -1110,7 +1110,7 @@
                 series_qp.SeriesPointsSorting = SortingMode.None;
                 series_qp.SeriesPointsSortingKey = SeriesPointKey.Value_1;
                 series_qp.View = series_qp_view;
-                series_qp.Visible = _qp_visible;
+                series_qp.Visible = _power_visible;
 
                 var pt_qp_list = vm.CurrentCurveQP.GetPointList(_feat_type_qp, 100);
                 for (int i = 0; i < pt_qp_list.Count; i++)
@@ -1175,10 +1175,10 @@
             if (_onMoveWorkPointLine)
             {
                 var diagram_coordinates = _diagram.PointToDiagram(e.Location);
-                var axisValue = diagram_coordinates.GetAxisValue(_axis_x_flow);
-                if (axisValue == null)
+                var axis_value = diagram_coordinates.GetAxisValue(_axis_x_flow);
+                if (axis_value == null)
                     return;
-                double chartQ = axisValue.NumericalValue;
+                double chartQ = axis_value.NumericalValue;
                 CalcWorkPointByQ(chartQ);
             }
             else
@@ -1271,14 +1271,14 @@
 
         private void barCekCurveQEVisible_CheckedChanged(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
         {
-            _qe_visible = this.barCekCurveQEVisible.Checked;
+            _eff_visible = this.barCekCurveQEVisible.Checked;
             UpdateChart();
         }
 
         private void barCekCurveQPVisible_CheckedChanged(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
         {
-            _qp_visible = this.barCekCurveQPVisible.Checked;
-            _bottom_pane.Visibility = _qp_visible ? ChartElementVisibility.Visible : ChartElementVisibility.Hidden;
+            _power_visible = this.barCekCurveQPVisible.Checked;
+            _bottom_pane.Visibility = _power_visible ? ChartElementVisibility.Visible : ChartElementVisibility.Hidden;
             UpdateChart();
         }
 
@@ -1311,7 +1311,7 @@
         /// </summary> 
         public bool GetQEVisible()
         {
-            return _qe_visible;
+            return _eff_visible;
         }
 
         /// <summary>
@@ -1319,7 +1319,7 @@
         /// </summary> 
         public bool GetQPVisible()
         {
-            return _qp_visible;
+            return _power_visible;
         }
 
 
diff --git a/WinFrmUI/Yw.WinFrmUI.Phart.Core/01-pump/04-special/02-working-view/PumpWorkingViewChart.cs b/WinFrmUI/Yw.WinFrmUI.Phart.Core/01-pump/04-special/02-working-view/PumpWorkingViewChart.cs
index ecf4fc2..34fefaf 100644
--- a/WinFrmUI/Yw.WinFrmUI.Phart.Core/01-pump/04-special/02-working-view/PumpWorkingViewChart.cs
+++ b/WinFrmUI/Yw.WinFrmUI.Phart.Core/01-pump/04-special/02-working-view/PumpWorkingViewChart.cs
@@ -29,8 +29,8 @@
 
         private PumpCoordinate _coordinate;
 
-        private bool _qe_visible = true;
-        private bool _qp_visible = true;
+        private bool _eff_visible = true;
+        private bool _power_visible = true;
 
         private bool _run_point_visible = true;
         private bool _equip_visible = true;
@@ -91,11 +91,11 @@
         /// </summary>
         public bool QEVisible
         {
-            get => _qe_visible;
+            get => _eff_visible;
             set
             {
-                _qe_visible = value;
-                SetQEVisible(_qe_visible);
+                _eff_visible = value;
+                SetQEVisible(_eff_visible);
             }
         }
 
@@ -104,11 +104,11 @@
         /// </summary>
         public bool QPVisble
         {
-            get => _qp_visible;
+            get => _power_visible;
             set
             {
-                _qp_visible = value;
-                SetQPVisible(_qp_visible);
+                _power_visible = value;
+                SetQPVisible(_power_visible);
             }
         }
 
@@ -242,7 +242,7 @@
                         dx_args.Cache.FillEllipse(dg_x, dg_y, 10, 10, color);
                         _rect_list.Add(new(new Rectangle(dg_x, dg_y, 10, 10), color, vm));
                     }
-                    if (eff.HasValue && _qe_visible)
+                    if (eff.HasValue && _eff_visible)
                     {
                         var dg_pt = _diagram.DiagramToPoint(flow, eff.Value, _axis_x_flow, _axis_y_eff);
                         var dg_x = dg_pt.Point.X - 5;
@@ -251,7 +251,7 @@
                         _rect_list.Add(new(new Rectangle(dg_x, dg_y, 10, 10), color, vm));
                     }
 
-                    if (power.HasValue && _qp_visible)
+                    if (power.HasValue && _power_visible)
                     {
                         var dg_pt = _diagram.DiagramToPoint(flow, power.Value, _axis_x_flow, _axis_y_power);
                         var dg_x = dg_pt.Point.X - 5;
@@ -515,7 +515,7 @@
 
 
             _bottom_pane.Visibility = ChartElementVisibility.Hidden;
-            _bottom_pane.Visibility = _qp_visible ? ChartElementVisibility.Visible : ChartElementVisibility.Hidden;
+            _bottom_pane.Visibility = _power_visible ? ChartElementVisibility.Visible : ChartElementVisibility.Hidden;
 
             //璁$畻鍒诲害 Q
             var axisQLabels = new List<CustomAxisLabel>();
@@ -547,7 +547,7 @@
             _axis_y_head.GridLines.Visible = true;
 
             //鏁堢巼
-            if (_max_eff > _min_eff && _qe_visible)
+            if (_max_eff > _min_eff && _eff_visible)
             {
                 //璁$畻鍒诲害
                 var labels = new List<CustomAxisLabel>();
@@ -565,7 +565,7 @@
             }
 
             //鍔熺巼
-            if (_max_power > _min_power && _qp_visible)
+            if (_max_power > _min_power && _power_visible)
             {
                 //璁$畻鍒诲害
                 var labels = new List<CustomAxisLabel>();
@@ -589,7 +589,7 @@
             var grid_count_head = _coordinate.EndLineNoH - _coordinate.StartLineNoH;
             var grid_count_eff = _coordinate.EndLineNoE - _coordinate.StartLineNoE;
             int grid_count_up = Math.Max(grid_count_head, grid_count_eff);
-            if (_qe_visible)
+            if (_eff_visible)
             {
                 grid_count_up += 2;//澶氫袱鏉�
             }
@@ -639,7 +639,7 @@
                             qh_pt_ex_list.Add(max_pt);
                             CreateLineSeries(vm.Id + "qh", vm.Color, qh_pt_ex_list, _default_pane, _axis_y_head, DashStyle.Dot);
 
-                            if (vm.CurveQE != null && vm.CurveQE.Any() && _qe_visible)
+                            if (vm.CurveQE != null && vm.CurveQE.Any() && _eff_visible)
                             {
                                 var qe = vm.CurveQE.GetFeatCurve(_feat_type_qe);
                                 var qe_pt_ex_list = vm.CurveQE.GetExpandPointList(_feat_type_qe, 1, max_ratio, 100);
@@ -647,7 +647,7 @@
                                 CreateLineSeries(vm.Id + "qe", vm.Color, qe_pt_ex_list, _default_pane, _axis_y_eff, DashStyle.Dot);
                             }
 
-                            if (vm.CurveQP != null && vm.CurveQP.Any() && _qp_visible)
+                            if (vm.CurveQP != null && vm.CurveQP.Any() && _power_visible)
                             {
                                 var qp = vm.CurveQP.GetFeatCurve(_feat_type_qp);
                                 var qp_pt_ex_list = vm.CurveQP.GetExpandPointList(_feat_type_qp, 1, max_ratio, 100);
@@ -721,7 +721,7 @@
                 series_qe.SeriesPointsSorting = SortingMode.None;
                 series_qe.SeriesPointsSortingKey = SeriesPointKey.Value_1;
                 series_qe.View = series_qe_view;
-                series_qe.Visible = _qe_visible;
+                series_qe.Visible = _eff_visible;
 
                 var pt_qe_list = qe.GetPointList(_feat_type_qe, 100);
                 for (int i = 0; i < pt_qe_list.Count; i++)
@@ -753,7 +753,7 @@
                 series_qp.SeriesPointsSorting = SortingMode.None;
                 series_qp.SeriesPointsSortingKey = SeriesPointKey.Value_1;
                 series_qp.View = series_qp_view;
-                series_qp.Visible = _qp_visible;
+                series_qp.Visible = _power_visible;
 
                 var pt_qp_list = qp.GetPointList(_feat_type_qp, 100);
                 for (int i = 0; i < pt_qp_list.Count; i++)
@@ -875,7 +875,7 @@
         /// </summary> 
         public void SetQEVisible(bool visible)
         {
-            _qe_visible = visible;
+            _eff_visible = visible;
             UpdateChart();
         }
 
@@ -885,8 +885,8 @@
         /// </summary> 
         public void SetQPVisible(bool visible)
         {
-            _qp_visible = visible;
-            _bottom_pane.Visibility = _qp_visible ? ChartElementVisibility.Visible : ChartElementVisibility.Hidden;
+            _power_visible = visible;
+            _bottom_pane.Visibility = _power_visible ? ChartElementVisibility.Visible : ChartElementVisibility.Hidden;
             UpdateChart();
         }
 
diff --git a/WinFrmUI/Yw.WinFrmUI.Phart.Core/01-pump/04-special/03-run-view/PumpRunViewChart.cs b/WinFrmUI/Yw.WinFrmUI.Phart.Core/01-pump/04-special/03-run-view/PumpRunViewChart.cs
index dfe6c2e..ea90c4e 100644
--- a/WinFrmUI/Yw.WinFrmUI.Phart.Core/01-pump/04-special/03-run-view/PumpRunViewChart.cs
+++ b/WinFrmUI/Yw.WinFrmUI.Phart.Core/01-pump/04-special/03-run-view/PumpRunViewChart.cs
@@ -30,8 +30,8 @@
 
         private PumpCoordinate _coordinate;
 
-        private bool _qe_visible = true;
-        private bool _qp_visible = true;
+        private bool _eff_visible = true;
+        private bool _power_visible = true;
 
         private bool _run_point_visible = true;
         private bool _initial_data = false;
@@ -90,11 +90,11 @@
         /// </summary>
         public bool QEVisible
         {
-            get => _qe_visible;
+            get => _eff_visible;
             set
             {
-                _qe_visible = value;
-                SetQEVisible(_qe_visible);
+                _eff_visible = value;
+                SetQEVisible(_eff_visible);
             }
         }
 
@@ -103,11 +103,11 @@
         /// </summary>
         public bool QPVisble
         {
-            get => _qp_visible;
+            get => _power_visible;
             set
             {
-                _qp_visible = value;
-                SetQPVisible(_qp_visible);
+                _power_visible = value;
+                SetQPVisible(_power_visible);
             }
         }
 
@@ -227,7 +227,7 @@
                         dx_args.Cache.FillEllipse(dg_x, dg_y, 10, 10, color);
                         _rect_list.Add(new(new Rectangle(dg_x, dg_y, 10, 10), color, vm));
                     }
-                    if (eff.HasValue && _qe_visible)
+                    if (eff.HasValue && _eff_visible)
                     {
                         var dg_pt = _diagram.DiagramToPoint(flow, eff.Value, _axis_x_flow, _axis_y_eff);
                         var dg_x = dg_pt.Point.X - 5;
@@ -236,7 +236,7 @@
                         _rect_list.Add(new(new Rectangle(dg_x, dg_y, 10, 10), color, vm));
                     }
 
-                    if (power.HasValue && _qp_visible)
+                    if (power.HasValue && _power_visible)
                     {
                         var dg_pt = _diagram.DiagramToPoint(flow, power.Value, _axis_x_flow, _axis_y_power);
                         var dg_x = dg_pt.Point.X - 5;
@@ -450,7 +450,7 @@
 
 
             _bottom_pane.Visibility = ChartElementVisibility.Hidden;
-            _bottom_pane.Visibility = _qp_visible ? ChartElementVisibility.Visible : ChartElementVisibility.Hidden;
+            _bottom_pane.Visibility = _power_visible ? ChartElementVisibility.Visible : ChartElementVisibility.Hidden;
 
             //璁$畻鍒诲害 Q
             var axisQLabels = new List<CustomAxisLabel>();
@@ -482,7 +482,7 @@
             _axis_y_head.GridLines.Visible = true;
 
             //鏁堢巼
-            if (_max_eff > _min_eff && _qe_visible)
+            if (_max_eff > _min_eff && _eff_visible)
             {
                 //璁$畻鍒诲害
                 var labels = new List<CustomAxisLabel>();
@@ -500,7 +500,7 @@
             }
 
             //鍔熺巼
-            if (_max_power > _min_power && _qp_visible)
+            if (_max_power > _min_power && _power_visible)
             {
                 //璁$畻鍒诲害
                 var labels = new List<CustomAxisLabel>();
@@ -524,7 +524,7 @@
             var grid_count_head = _coordinate.EndLineNoH - _coordinate.StartLineNoH;
             var grid_count_eff = _coordinate.EndLineNoE - _coordinate.StartLineNoE;
             int grid_count_up = Math.Max(grid_count_head, grid_count_eff);
-            if (_qe_visible)
+            if (_eff_visible)
             {
                 grid_count_up += 2;//澶氫袱鏉�
             }
@@ -585,7 +585,7 @@
                                 qh_pt_ex_list.Add(max_pt);
                                 CreateLineSeries(vm.Id + "qh", vm.Color, qh_pt_ex_list, _default_pane, _axis_y_head, DashStyle.Dot);
 
-                                if (vm.CurveQE != null && vm.CurveQE.Any() && _qe_visible)
+                                if (vm.CurveQE != null && vm.CurveQE.Any() && _eff_visible)
                                 {
                                     var qe = vm.CurveQE.GetFeatCurve(_feat_type_qe);
                                     var qe_pt_ex_list = vm.CurveQE.GetExpandPointList(_feat_type_qe, 1, max_ratio, 100);
@@ -593,7 +593,7 @@
                                     CreateLineSeries(vm.Id + "qe", vm.Color, qe_pt_ex_list, _default_pane, _axis_y_eff, DashStyle.Dot);
                                 }
 
-                                if (vm.CurveQP != null && vm.CurveQP.Any() && _qp_visible)
+                                if (vm.CurveQP != null && vm.CurveQP.Any() && _power_visible)
                                 {
                                     var qp = vm.CurveQP.GetFeatCurve(_feat_type_qp);
                                     var qp_pt_ex_list = vm.CurveQP.GetExpandPointList(_feat_type_qp, 1, max_ratio, 100);
@@ -707,7 +707,7 @@
                 series_qe.SeriesPointsSorting = SortingMode.None;
                 series_qe.SeriesPointsSortingKey = SeriesPointKey.Value_1;
                 series_qe.View = series_qe_view;
-                series_qe.Visible = _qe_visible;
+                series_qe.Visible = _eff_visible;
 
                 var pt_qe_list = qe.GetPointList(_feat_type_qe, 100);
                 for (int i = 0; i < pt_qe_list.Count; i++)
@@ -740,7 +740,7 @@
                 series_qp.SeriesPointsSorting = SortingMode.None;
                 series_qp.SeriesPointsSortingKey = SeriesPointKey.Value_1;
                 series_qp.View = series_qp_view;
-                series_qp.Visible = _qp_visible;
+                series_qp.Visible = _power_visible;
 
                 var pt_qp_list = qp.GetPointList(_feat_type_qp, 100);
                 for (int i = 0; i < pt_qp_list.Count; i++)
@@ -849,7 +849,7 @@
                 series_qe.SeriesPointsSorting = SortingMode.None;
                 series_qe.SeriesPointsSortingKey = SeriesPointKey.Value_1;
                 series_qe.View = series_qe_view;
-                series_qe.Visible = _qe_visible;
+                series_qe.Visible = _eff_visible;
 
                 var pt_qe_list = qe.GetPointList(_feat_type_qe, 100);
                 for (int i = 0; i < pt_qe_list.Count; i++)
@@ -881,7 +881,7 @@
                 series_qp.SeriesPointsSorting = SortingMode.None;
                 series_qp.SeriesPointsSortingKey = SeriesPointKey.Value_1;
                 series_qp.View = series_qp_view;
-                series_qp.Visible = _qp_visible;
+                series_qp.Visible = _power_visible;
 
                 var pt_qp_list = qp.GetPointList(_feat_type_qp, 100);
                 for (int i = 0; i < pt_qp_list.Count; i++)
@@ -962,7 +962,7 @@
         /// </summary> 
         public void SetQEVisible(bool visible)
         {
-            _qe_visible = visible;
+            _eff_visible = visible;
             UpdateChart();
         }
 
@@ -972,8 +972,8 @@
         /// </summary> 
         public void SetQPVisible(bool visible)
         {
-            _qp_visible = visible;
-            _bottom_pane.Visibility = _qp_visible ? ChartElementVisibility.Visible : ChartElementVisibility.Hidden;
+            _power_visible = visible;
+            _bottom_pane.Visibility = _power_visible ? ChartElementVisibility.Visible : ChartElementVisibility.Hidden;
             UpdateChart();
         }
 
diff --git a/WinFrmUI/Yw.WinFrmUI.Phart.Core/01-pump/04-special/04-parallel/PumpParallelChart.cs b/WinFrmUI/Yw.WinFrmUI.Phart.Core/01-pump/04-special/04-parallel/PumpParallelChart.cs
index 56bc30d..fefe722 100644
--- a/WinFrmUI/Yw.WinFrmUI.Phart.Core/01-pump/04-special/04-parallel/PumpParallelChart.cs
+++ b/WinFrmUI/Yw.WinFrmUI.Phart.Core/01-pump/04-special/04-parallel/PumpParallelChart.cs
@@ -33,8 +33,8 @@
         private TextAnnotation _anno_txt_query_info;
         private PumpCoordinate _coordinate;
 
-        private bool _qe_visible = true;
-        private bool _qp_visible = true;
+        private bool _eff_visible = true;
+        private bool _power_visible = true;
 
         private bool _equip_visible = true;
         private List<Yw.Geometry.Point2d> _equip_pt_list = null;
@@ -227,12 +227,12 @@
 
                 var max_flow = vm.CurrentExtendFlow.Value;
                 DrawExpandLine(dx_args.Cache, pen, _axis_y_head, vm.CurrentCurveQH, max_flow);
-                if (_qe_visible)
+                if (_eff_visible)
                 {
 
                     DrawExpandLine(dx_args.Cache, pen, _axis_y_eff, vm.CurrentCurveQE, max_flow);
                 }
-                if (_qp_visible)
+                if (_power_visible)
                 {
                     DrawExpandLine(dx_args.Cache, pen, _axis_y_power, vm.CurrentCurveQP, max_flow);
                 }
@@ -300,7 +300,7 @@
             var qh_pt_y = qh_pt.Point.Y;
             cache.DrawLine(pen, new Point(qh_pt_x, qh_pt_y - offset_size), new Point(qh_pt_x, qh_pt_y + offset_size));
 
-            if (E.HasValue && _qe_visible)
+            if (E.HasValue && _eff_visible)
             {
                 var qe_pt = _diagram.DiagramToPoint(Q, E.Value, _axis_x_flow, _axis_y_eff);
                 var qe_pt_x = qe_pt.Point.X;
@@ -308,7 +308,7 @@
                 cache.DrawLine(pen, new Point(qe_pt_x, qe_pt_y - offset_size), new Point(qe_pt_x, qe_pt_y + offset_size));
             }
 
-            if (P.HasValue && _qp_visible)
+            if (P.HasValue && _power_visible)
             {
                 var qp_pt = _diagram.DiagramToPoint(Q, P.Value, _axis_x_flow, _axis_y_power);
                 var qp_pt_x = qp_pt.Point.X;
@@ -449,7 +449,7 @@
 
         #endregion
 
-        #region Calc 
+        #region Set Axis  
 
         private double _min_flow, _max_flow;
         private double _max_head = 0, _min_head = 10000;
@@ -609,7 +609,7 @@
             _bottom_pane.Visibility = ChartElementVisibility.Hidden;
 
 
-            _bottom_pane.Visibility = _qp_visible ? ChartElementVisibility.Visible : ChartElementVisibility.Hidden;
+            _bottom_pane.Visibility = _power_visible ? ChartElementVisibility.Visible : ChartElementVisibility.Hidden;
 
             //璁$畻鍒诲害 Q
             var axisQLabels = new List<CustomAxisLabel>();
@@ -641,7 +641,7 @@
             _axis_y_head.GridLines.Visible = true;
 
             //鏁堢巼
-            if (_max_eff > _min_eff && _qe_visible)
+            if (_max_eff > _min_eff && _eff_visible)
             {
                 //璁$畻鍒诲害
                 var labels = new List<CustomAxisLabel>();
@@ -659,7 +659,7 @@
             }
 
             //鍔熺巼
-            if (_max_power > _min_power && _qp_visible)
+            if (_max_power > _min_power && _power_visible)
             {
                 //璁$畻鍒诲害
                 var labels = new List<CustomAxisLabel>();
@@ -683,7 +683,7 @@
             var grid_count_head = _coordinate.EndLineNoH - _coordinate.StartLineNoH;
             var grid_count_eff = _coordinate.EndLineNoE - _coordinate.StartLineNoE;
             int grid_count_up = Math.Max(grid_count_head, grid_count_eff);
-            if (_qe_visible)
+            if (_eff_visible)
             {
                 grid_count_up += 2;//澶氫袱鏉�
             }
@@ -992,7 +992,7 @@
                 series_qe.SeriesPointsSorting = SortingMode.None;
                 series_qe.SeriesPointsSortingKey = SeriesPointKey.Value_1;
                 series_qe.View = series_qe_view;
-                series_qe.Visible = _qe_visible;
+                series_qe.Visible = _eff_visible;
 
                 var pt_qe_list = vm.CurrentCurveQE.GetPointList(_feat_type_qe, 100);
                 for (int i = 0; i < pt_qe_list.Count; i++)
@@ -1024,7 +1024,7 @@
                 series_qp.SeriesPointsSorting = SortingMode.None;
                 series_qp.SeriesPointsSortingKey = SeriesPointKey.Value_1;
                 series_qp.View = series_qp_view;
-                series_qp.Visible = _qp_visible;
+                series_qp.Visible = _power_visible;
 
                 var pt_qp_list = vm.CurrentCurveQP.GetPointList(_feat_type_qp, 100);
                 for (int i = 0; i < pt_qp_list.Count; i++)
@@ -1088,10 +1088,10 @@
             if (_onMoveWorkPointLine)
             {
                 var diagram_coordinates = _diagram.PointToDiagram(e.Location);
-                var axisValue = diagram_coordinates.GetAxisValue(_axis_x_flow);
-                if (axisValue == null)
+                var axis_value = diagram_coordinates.GetAxisValue(_axis_x_flow);
+                if (axis_value == null)
                     return;
-                double chartQ = axisValue.NumericalValue;
+                double chartQ = axis_value.NumericalValue;
                 CalcWorkPointByQ(chartQ);
             }
             else
@@ -1184,14 +1184,14 @@
 
         private void barCekCurveQEVisible_CheckedChanged(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
         {
-            _qe_visible = this.barCekCurveQEVisible.Checked;
+            _eff_visible = this.barCekCurveQEVisible.Checked;
             UpdateChart();
         }
 
         private void barCekCurveQPVisible_CheckedChanged(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
         {
-            _qp_visible = this.barCekCurveQPVisible.Checked;
-            _bottom_pane.Visibility = _qp_visible ? ChartElementVisibility.Visible : ChartElementVisibility.Hidden;
+            _power_visible = this.barCekCurveQPVisible.Checked;
+            _bottom_pane.Visibility = _power_visible ? ChartElementVisibility.Visible : ChartElementVisibility.Hidden;
             UpdateChart();
         }
 
diff --git a/WinFrmUI/Yw.WinFrmUI.Phart.Core/01-pump/04-special/04-variable-speed/SetValueDlg.cs b/WinFrmUI/Yw.WinFrmUI.Phart.Core/01-pump/04-special/04-variable-speed/SetValueDlg.cs
index 95e3304..cb085b1 100644
--- a/WinFrmUI/Yw.WinFrmUI.Phart.Core/01-pump/04-special/04-variable-speed/SetValueDlg.cs
+++ b/WinFrmUI/Yw.WinFrmUI.Phart.Core/01-pump/04-special/04-variable-speed/SetValueDlg.cs
@@ -38,7 +38,6 @@
             var bol = this.VerifyValueChanged(value);
             if (!bol)
             {
-                XtraMessageBox.Show("鏁板�间笉鍚堢悊!");
                 return;
             }
             this.DialogResult = DialogResult.OK;
diff --git a/WinFrmUI/Yw.WinFrmUI.Phart.Core/02-universal/00-core/01-coordinate/UniversalCoordinate_Disp.cs b/WinFrmUI/Yw.WinFrmUI.Phart.Core/02-universal/00-core/01-coordinate/UniversalCoordinate_Disp.cs
index dca8bb5..3204296 100644
--- a/WinFrmUI/Yw.WinFrmUI.Phart.Core/02-universal/00-core/01-coordinate/UniversalCoordinate_Disp.cs
+++ b/WinFrmUI/Yw.WinFrmUI.Phart.Core/02-universal/00-core/01-coordinate/UniversalCoordinate_Disp.cs
@@ -113,12 +113,12 @@
             if (min_y > max_y - 0.01)
                 return null;
 
-            var validGridNumH = 6;
+            var valid_grid_num_h = 6;
             var coordinate_paras = new UniversalCoordinate();
             coordinate_paras.GridNumberX = 10;//10
             coordinate_paras.GridNumberY = 18;//18
             CalcCoordinateX(min_x, max_x, ref coordinate_paras, coordinate_paras.GridNumberX);
-            CalcCoordinateH(min_y, max_y, validGridNumH, ref coordinate_paras, out double disMinH, out double disMaxH);
+            CalcCoordinateH(min_y, max_y, valid_grid_num_h, ref coordinate_paras, out double disMinH, out double disMaxH);
 
             return coordinate_paras;
         }
@@ -169,11 +169,11 @@
         /// </summary>
         /// <param name="min_y">鏈�灏廦</param>
         /// <param name="max_y">鏈�澶</param>
-        /// <param name="validGridNumH">鏈夋晥Y鍒诲害鏁�</param>
+        /// <param name="valid_grid_num_h">鏈夋晥Y鍒诲害鏁�</param>
         /// <param name="coordinate_paras">鍧愭爣Model</param>
         /// <param name="disMinH">鏈�灏忔樉绀篩</param>
         /// <param name="disMaxH">鏈�澶ф樉绀篩</param>
-        public static void CalcCoordinateH_Filter(double min_y, double max_y, int validGridNumH, ref UniversalCoordinate coordinate_paras, out double disMinH, out double disMaxH)
+        public static void CalcCoordinateH_Filter(double min_y, double max_y, int valid_grid_num_h, ref UniversalCoordinate coordinate_paras, out double disMinH, out double disMaxH)
         {
             if (max_y < 1.0)
             {
@@ -222,7 +222,7 @@
             }
             else
             {
-                CalcCoordinateH(min_y, max_y, validGridNumH, ref coordinate_paras, out disMinH, out disMaxH);
+                CalcCoordinateH(min_y, max_y, valid_grid_num_h, ref coordinate_paras, out disMinH, out disMaxH);
             }
         }
 
@@ -231,13 +231,13 @@
         /// </summary>
         /// <param name="min_y">鏈�灏廦</param>
         /// <param name="max_y">鏈�澶</param>
-        /// <param name="validGridNumH">鏈夋晥Y鍒诲害鏁�</param>
+        /// <param name="valid_grid_num_h">鏈夋晥Y鍒诲害鏁�</param>
         /// <param name="coordinate_paras">鍧愭爣Model</param>
         /// <param name="disMinH">鏈�灏忔樉绀篩</param>
         /// <param name="disMaxH">鏈�澶ф樉绀篩</param>
-        public static void CalcCoordinateH(double min_y, double max_y, int validGridNumH, ref UniversalCoordinate coordinate_paras, out double disMinH, out double disMaxH)
+        public static void CalcCoordinateH(double min_y, double max_y, int valid_grid_num_h, ref UniversalCoordinate coordinate_paras, out double disMinH, out double disMaxH)
         {
-            var coordSpaceH = PhartCoordinateHelper.GetOptimalSpaceMax(min_y, max_y, validGridNumH, out disMinH, out disMaxH);
+            var coordSpaceH = PhartCoordinateHelper.GetOptimalSpaceMax(min_y, max_y, valid_grid_num_h, out disMinH, out disMaxH);
             int endLineNoH = coordinate_paras.GridNumberY;
             int stratLineNoH = endLineNoH;
 
diff --git a/WinFrmUI/Yw.WinFrmUI.Phart.Core/03-valve/01-view/ValveViewChart.cs b/WinFrmUI/Yw.WinFrmUI.Phart.Core/03-valve/01-view/ValveViewChart.cs
index a3d0bce..314fe81 100644
--- a/WinFrmUI/Yw.WinFrmUI.Phart.Core/03-valve/01-view/ValveViewChart.cs
+++ b/WinFrmUI/Yw.WinFrmUI.Phart.Core/03-valve/01-view/ValveViewChart.cs
@@ -1,6 +1,5 @@
 锘縰sing DevExpress.Utils;
 using DevExpress.XtraCharts;
-using DevExpress.XtraSpreadsheet.Model;
 using Yw.Geometry;
 
 namespace Yw.WinFrmUI.Phart
@@ -80,9 +79,9 @@
         /// 閫変腑鐐�
         /// </summary>
         public event Action<int> SelectedPointIndexChangedEvent;
-        #endregion 
+        #endregion
 
-        #region Initial
+        #region Private Initial
 
         /// <summary>
         /// 鍒濆鍖栧浘琛�
@@ -191,8 +190,106 @@
         }
 
         #endregion Initial
+         
+        #region Private Chart Event  
 
-        #region SetBindingData
+
+        private bool _on_move_x_flow_line = false;
+        private bool _on_move_x_opening_line = false;
+        private bool _on_move_y_k = false;
+        private void chartControl1_MouseDown(object sender, MouseEventArgs e)
+        {
+            if (!_initial_data)
+                return;
+            var hitInfo = chartControl1.CalcHitInfo(e.Location);
+            if (e.Button == MouseButtons.Left)
+            {
+                if (hitInfo.InConstantLine)
+                {
+                    if (hitInfo.ConstantLine == _const_line_x_flow)
+                    {
+                        _on_move_x_flow_line = true;
+                    }
+                    else if (hitInfo.ConstantLine == _const_line_x_opening)
+                    {
+                        _on_move_x_opening_line = true;
+                    }
+                    else if (hitInfo.ConstantLine == _const_line_y_k)
+                    {
+                        _on_move_y_k = true;
+                    }
+                }
+            }
+
+        }
+
+        private void chartControl1_MouseMove(object sender, MouseEventArgs e)
+        {
+            if (!_initial_data)
+                return;
+
+            if (_on_move_x_flow_line)
+            {
+                var diagram_coordinates = _diagram.PointToDiagram(e.Location);
+                var axis_value = diagram_coordinates.GetAxisValue(_axis_x_flow);
+                if (axis_value == null)
+                    return;
+                double x = axis_value.NumericalValue;
+                SetAxisXFlowValue(x);
+
+            }
+            else if (_on_move_x_opening_line)
+            {
+                var diagram_coordinates = _diagram.PointToDiagram(e.Location);
+                var axis_value = diagram_coordinates.GetAxisValue(_axis_x_opening);
+                if (axis_value == null)
+                    return;
+                double x = axis_value.NumericalValue;
+                SetAxisXOpeningValue(x);
+            }
+            else if (_on_move_y_k)
+            {
+                var diagram_coordinates = _diagram.PointToDiagram(e.Location);
+                var axis_value = diagram_coordinates.GetAxisValue(_axis_y_k);
+                if (axis_value == null)
+                    return;
+                double y = axis_value.NumericalValue;
+                SetAxisYKValue(y);
+            }
+            else
+            {
+                var hitInfo = chartControl1.CalcHitInfo(e.Location);
+                if (hitInfo.InConstantLine)
+                {
+                    this.chartControl1.Cursor = Cursors.Hand;
+                }
+                else if (hitInfo.InAnnotation)
+                {
+                    this.chartControl1.Cursor = Cursors.SizeAll;
+                }
+                else
+                {
+                    this.chartControl1.Cursor = Cursors.Default;
+                }
+            }
+        }
+
+        private void chartControl1_MouseUp(object sender, MouseEventArgs e)
+        {
+            if (!_initial_data)
+                return;
+            _on_move_x_flow_line = false;
+            _on_move_x_opening_line = false;
+            _on_move_y_k = false;
+        }
+
+        private void chartControl1_Resize(object sender, EventArgs e)
+        {
+            SetTextAnchorPoint();
+        }
+        #endregion
+
+        #region Set 
 
         /// <summary>
         /// 缁戝畾鏁版嵁
@@ -203,8 +300,7 @@
             _coordinate = null;
             _vm_list = null;
             _exist_ql = false;
-            _exist_ol = false;
-
+            _exist_ol = false; 
             this.chartControl1.BeginInit();
             this.chartControl1.Series.Clear();
             for (int i = this.chartControl1.AnnotationRepository.Count - 1; i > 0; i--)
@@ -625,105 +721,7 @@
 
 
         #endregion Calc
-
-        #region Chart Event
-
-
-        private bool _on_move_x_flow_line = false;
-        private bool _on_move_x_opening_line = false;
-        private bool _on_move_y_k = false;
-        private void chartControl1_MouseDown(object sender, MouseEventArgs e)
-        {
-            if (!_initial_data)
-                return;
-            var hitInfo = chartControl1.CalcHitInfo(e.Location);
-            if (e.Button == MouseButtons.Left)
-            {
-                if (hitInfo.InConstantLine)
-                {
-                    if (hitInfo.ConstantLine == _const_line_x_flow)
-                    {
-                        _on_move_x_flow_line = true;
-                    }
-                    else if (hitInfo.ConstantLine == _const_line_x_opening)
-                    {
-                        _on_move_x_opening_line = true;
-                    }
-                    else if (hitInfo.ConstantLine == _const_line_y_k)
-                    {
-                        _on_move_y_k = true;
-                    }
-                }
-            }
-
-        }
-
-        private void chartControl1_MouseMove(object sender, MouseEventArgs e)
-        {
-            if (!_initial_data)
-                return;
-
-            if (_on_move_x_flow_line)
-            {
-                var diagram_coordinates = _diagram.PointToDiagram(e.Location);
-                var axis_value = diagram_coordinates.GetAxisValue(_axis_x_flow);
-                if (axis_value == null)
-                    return;
-                double x = axis_value.NumericalValue;
-                SetAxisXFlowValue(x);
-
-            }
-            else if (_on_move_x_opening_line)
-            {
-                var diagram_coordinates = _diagram.PointToDiagram(e.Location);
-                var axis_value = diagram_coordinates.GetAxisValue(_axis_x_opening);
-                if (axis_value == null)
-                    return;
-                double x = axis_value.NumericalValue;
-                SetAxisXOpeningValue(x);
-            }
-            else if (_on_move_y_k)
-            {
-                var diagram_coordinates = _diagram.PointToDiagram(e.Location);
-                var axis_value = diagram_coordinates.GetAxisValue(_axis_y_k);
-                if (axis_value == null)
-                    return;
-                double y = axis_value.NumericalValue;
-                SetAxisYKValue(y);
-            }
-            else
-            {
-                var hitInfo = chartControl1.CalcHitInfo(e.Location);
-                if (hitInfo.InConstantLine)
-                {
-                    this.chartControl1.Cursor = Cursors.Hand;
-                }
-                else if (hitInfo.InAnnotation)
-                {
-                    this.chartControl1.Cursor = Cursors.SizeAll;
-                }
-                else
-                {
-                    this.chartControl1.Cursor = Cursors.Default;
-                }
-            }
-        }
-
-        private void chartControl1_MouseUp(object sender, MouseEventArgs e)
-        {
-            if (!_initial_data)
-                return;
-            _on_move_x_flow_line = false;
-            _on_move_x_opening_line = false;
-            _on_move_y_k = false;
-        }
-
-        private void chartControl1_Resize(object sender, EventArgs e)
-        {
-            SetTextAnchorPoint();
-        }
-        #endregion
-
+         
         #region Set Axis Value
 
         /// <summary>
diff --git a/WinFrmUI/Yw.WinFrmUI.Phart.Core/Yw.WinFrmUI.Phart.Core.csproj b/WinFrmUI/Yw.WinFrmUI.Phart.Core/Yw.WinFrmUI.Phart.Core.csproj
index c6b9ba4..f5b2e27 100644
--- a/WinFrmUI/Yw.WinFrmUI.Phart.Core/Yw.WinFrmUI.Phart.Core.csproj
+++ b/WinFrmUI/Yw.WinFrmUI.Phart.Core/Yw.WinFrmUI.Phart.Core.csproj
@@ -42,6 +42,9 @@
     <Compile Remove="00-core\Point2dComparer.cs" />
     <Compile Remove="00-core\Point2dListExtensions.cs" />
     <Compile Remove="00-core\LineHelper.cs" />
+    <Compile Remove="01-pump\01-view\01-viewmodel\PumpCurveEqualPowerViewModel.cs" />
+    <Compile Remove="01-pump\01-view\PumpViewChart - 澶嶅埗.cs" />
+    <Compile Remove="01-pump\01-view\PumpViewChart - 澶嶅埗.Designer.cs" />
     <Compile Remove="01-pump\03-import\02-image\PumpCharImageImportCtrl - 澶嶅埗%282%29.cs" />
     <Compile Remove="01-pump\03-import\02-image\PumpCharImageImportCtrl - 澶嶅埗%282%29.Designer.cs" />
     <Compile Remove="01-pump\03-import\02-image\PumpCharImageImportCtrl - 澶嶅埗.cs" />
@@ -58,6 +61,7 @@
   </ItemGroup>
 
   <ItemGroup>
+    <EmbeddedResource Remove="01-pump\01-view\PumpViewChart - 澶嶅埗.resx" />
     <EmbeddedResource Remove="01-pump\03-import\02-image\PumpCharImageImportCtrl - 澶嶅埗%282%29.resx" />
     <EmbeddedResource Remove="01-pump\03-import\02-image\PumpCharImageImportCtrl - 澶嶅埗.resx" />
     <EmbeddedResource Remove="01-pump\03-import\03-point\PumpChartPointImportCtrl - 澶嶅埗%282%29.resx" />

--
Gitblit v1.9.3