From 84820e6296602b263633ff9a960bfd15cf0618de Mon Sep 17 00:00:00 2001
From: lixiaojun <1287241240@qq.com>
Date: 星期四, 05 十二月 2024 12:47:02 +0800
Subject: [PATCH] Merge branch 'master' of http://47.103.154.90:83/r/HStation/XHS.V1.0

---
 WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/04-chart-edit/TankPerform2dEditChart.cs                                                                |  513 +++++
 WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/05-import/01-excel/ImportTankPerform2dByExcelCtrl.designer.cs                                          |  279 +++
 WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/05-import/01-excel/ImportTankPerform2dByExcelDlg.cs                                                    |   43 
 WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/TankViewModel.cs                                                                                       |   16 
 WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/04-chart-edit/TankPerform2dEditChart.resx                                                              |  244 ++
 WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/04-chart-edit/TankMainPhartMinorLossPanel.cs                                                           |  218 ++
 WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/05-import/01-excel/ImportTankPerform2dByExcelCtrl.en-US.resx                                           |   71 
 WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/01-matching/02-pump/01-pumpsinglematching/SimulationPumpSingleMatchingDlg.cs          |  184 +
 WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/05-import/01-excel/ImportTankPerform2dByExcelCtrl.resx                                                 |   26 
 WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/01-matching/17-compressor/CompressorSingleMatchingCtrl.cs                             |    7 
 WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/01-matching/09-Tank/TankChartShowDlg.cs                                               |    2 
 WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/01-matching/09-Tank/TankSingleMatchingCtrl.cs                                         |   24 
 WinFrmUI/HStation.WinFrmUI.Assets.Core/03-valve/ValveManageMainPage.resx                                                                              |    2 
 WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/05-import/01-excel/ImportTankPerform2dByExcelDlg.resx                                                  |   73 
 WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/01-matching/09-Tank/TankSingleMatchingCtrl.Designer.cs                                |  105 
 WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/01-matching/09-tank/SimulationTankSingleMatchingDlg.cs                                |    2 
 WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/04-chart-edit/TankMainPhartMinorLossPanel.resx                                                         |  286 +++
 WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/04-chart-edit/TankPerform2dEditDlg.cs                                                                  |   66 
 WinFrmUI/HStation.WinFrmUI.Assets.Core/HStation.WinFrmUI.Assets.Core.csproj                                                                           |   15 
 WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/01-matching/02-pump/01-pumpsinglematching/SimulationPumpSingleMatchingDlg.resx        |   20 
 WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/04-chart-edit/TankPerform2dEditCtrl.Designer.cs                                                        |  307 +++
 WinFrmUI/HStation.WinFrmUI.Xhs.Core/HStation.WinFrmUI.Xhs.Core.csproj                                                                                 |    1 
 WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/01-matching/09-Tank/TankSingleMatchingCtrl.resx                                       |    2 
 WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/01-matching/02-pump/01-pumpsinglematching/SimulationPumpSingleMatchingDlg.Designer.cs |  573 +++++-
 WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/05-import/01-excel/ImportTankPerform2dByExcelDlg.Designer.cs                                           |  207 ++
 WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/04-chart-edit/TankPerform2dEditCtrl.cs                                                                 |  202 ++
 WinFrmUI/HStation.WinFrmUI.Assets.Core/HStation.WinFrmUI.Assets.Core.csproj.user                                                                      |    3 
 WinFrmUI/HStation.WinFrmUI.Xhs.Core/HStation.WinFrmUI.Xhs.Core.csproj.user                                                                            |    5 
 WinFrmUI/HStation.WinFrmUI.Assets.Core/03-valve/04-chart-edit/XhsValveMainPhartMinorLossPanel.cs                                                      |  138 
 WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/04-chart-edit/TankMainPhartMinorLossPanel.Designer.cs                                                  |  247 ++
 WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/04-chart-edit/TankPerform2dEditCtrl.resx                                                               |  204 ++
 WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/05-import/01-excel/ImportTankPerform2dByExcelCtrl.cs                                                   |  258 ++
 WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/01-matching/18-exchanger/ExchangerSingleMatchingCtrl.cs                               |    7 
 WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/TankManageMainPage.resx                                                                                |   29 
 /dev/null                                                                                                                                             |  205 --
 WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/04-chart-edit/TankPerform2dEditDlg.resx                                                                |   70 
 WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/04-chart-edit/TankPerform2dEditChart.Designer.cs                                                       |  249 ++
 WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/04-chart-edit/TankPerform2dEditDlg.Designer.cs                                                         |  200 ++
 WinFrmUI/HStation.WinFrmUI.Assets.Core/03-valve/ValveManageMainPage.Designer.cs                                                                       |    4 
 WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/TankManageMainPage.Designer.cs                                                                         |  112 
 WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/TankManageMainPage.cs                                                                                  |    8 
 WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/04-scheme/01-add/01-set/01-pump/SetSchemePumpListCtrl.cs                                            |  143 
 WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/01-matching/09-Tank/TankSingleMatchingViewModel.cs                                    |   33 
 WinFrmUI/HStation.WinFrmUI.Assets.Core/03-valve/04-chart-edit/XhsValveMainPhartMinorLossPanel.Designer.cs                                             |    3 
 44 files changed, 4,680 insertions(+), 726 deletions(-)

diff --git a/WinFrmUI/HStation.WinFrmUI.Assets.Core/03-valve/04-chart-edit/XhsValveMainPhartMinorLossPanel.Designer.cs b/WinFrmUI/HStation.WinFrmUI.Assets.Core/03-valve/04-chart-edit/XhsValveMainPhartMinorLossPanel.Designer.cs
index 8854fde..fc85de2 100644
--- a/WinFrmUI/HStation.WinFrmUI.Assets.Core/03-valve/04-chart-edit/XhsValveMainPhartMinorLossPanel.Designer.cs
+++ b/WinFrmUI/HStation.WinFrmUI.Assets.Core/03-valve/04-chart-edit/XhsValveMainPhartMinorLossPanel.Designer.cs
@@ -132,6 +132,7 @@
             barBtnUpdateimportance.Id = 29;
             barBtnUpdateimportance.ImageOptions.SvgImage = (DevExpress.Utils.Svg.SvgImage)resources.GetObject("barBtnUpdateimportance.ImageOptions.SvgImage");
             barBtnUpdateimportance.Name = "barBtnUpdateimportance";
+            barBtnUpdateimportance.Visibility = DevExpress.XtraBars.BarItemVisibility.Never;
             barBtnUpdateimportance.ItemClick += barBtnUpdateimportance_ItemClick;
             // 
             // barBtnOtherName
@@ -140,6 +141,7 @@
             barBtnOtherName.Id = 30;
             barBtnOtherName.ImageOptions.SvgImage = (DevExpress.Utils.Svg.SvgImage)resources.GetObject("barBtnOtherName.ImageOptions.SvgImage");
             barBtnOtherName.Name = "barBtnOtherName";
+            barBtnOtherName.Visibility = DevExpress.XtraBars.BarItemVisibility.Never;
             barBtnOtherName.ItemClick += barBtnOtherName_ItemClick;
             // 
             // barBtnEditChart
@@ -148,6 +150,7 @@
             barBtnEditChart.Id = 31;
             barBtnEditChart.ImageOptions.SvgImage = (DevExpress.Utils.Svg.SvgImage)resources.GetObject("barBtnEditChart.ImageOptions.SvgImage");
             barBtnEditChart.Name = "barBtnEditChart";
+            barBtnEditChart.Visibility = DevExpress.XtraBars.BarItemVisibility.Never;
             barBtnEditChart.ItemClick += barBtnEditChart_ItemClick;
             // 
             // ribbonPage1
diff --git a/WinFrmUI/HStation.WinFrmUI.Assets.Core/03-valve/04-chart-edit/XhsValveMainPhartMinorLossPanel.cs b/WinFrmUI/HStation.WinFrmUI.Assets.Core/03-valve/04-chart-edit/XhsValveMainPhartMinorLossPanel.cs
index b44e69e..86a1987 100644
--- a/WinFrmUI/HStation.WinFrmUI.Assets.Core/03-valve/04-chart-edit/XhsValveMainPhartMinorLossPanel.cs
+++ b/WinFrmUI/HStation.WinFrmUI.Assets.Core/03-valve/04-chart-edit/XhsValveMainPhartMinorLossPanel.cs
@@ -15,7 +15,7 @@
 
         private long _valve_main_id;
         private Vmo.AssetsValveCoefficientVmo _xhs_phart_diagram_ex_std_dto = null;
-        private readonly BLL.XhsValveMainPhartMappingExtensions _bll_ex = new();
+        private readonly BLL.AssetsValveCoefficient _bll = new();
 
         /// <summary>
         /// 鍒濆鍖栨暟鎹�
@@ -34,7 +34,7 @@
             {
                 _xhs_phart_diagram_ex_std_dto = chart.First();
                 this.xtrPerform2dChart1.SetBindingData(_xhs_phart_diagram_ex_std_dto.MinorLossCurve);
-             }
+            }
             this.xtrPerform2dChart1.SetAxisTitle("闃�闂ㄥ紑搴�", "鎹熷け绯绘暟");
         }
 
@@ -43,7 +43,6 @@
         {
             _xhs_phart_diagram_ex_std_dto = obj;
             this.xtrPerform2dChart1.SetBindingData(obj.MinorLossCurve);
-
             //  InitChart(_xhs_phart_diagram_ex_std_dto);
         }
 
@@ -107,18 +106,19 @@
         }
 
         // 瀵煎叆
-        private async Task<bool> Import( string pt_list_json)
+        private async Task<bool> Import(string pt_list_json)
         {
             if (_valve_main_id < 1)
             {
                 XtraMessageBox.Show("ValveMain is null!");
                 return false;
             }
-            var bll = new BLL.AssetsValveCoefficient();
             var model = new Vmo.AssetsValveCoefficientVmo();
             model.MainID = _valve_main_id;
             model.MinorLossCurve = pt_list_json;
-            return await bll.Insert(model) > 0;
+            this.xtrPerform2dChart1.SetBindingData(pt_list_json);
+            _xhs_phart_diagram_ex_std_dto = model;
+            return await _bll.Insert(model) > 0;
         }
 
         #endregion 瀵煎叆
@@ -128,50 +128,50 @@
         //缂栬緫
         private void barBtnEditChart_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
         {
-            /*  if (_xhs_phart_diagram_ex_std_dto == null)
-              {
-                  return;
-              }
-              var diagram = _xhs_phart_diagram_ex_std_dto.Diagram;
-              if (diagram == null)
-              {
-                  return;
-              }
-              var graph_list = diagram.GraphList;
-              if (graph_list == null || !graph_list.Any())
-              {
-                  return;
-              }
+            /*   if (_xhs_phart_diagram_ex_std_dto == null)
+               {
+                   return;
+               }
+               var diagram = _xhs_phart_diagram_ex_std_dto.Diagram;
+               if (diagram == null)
+               {
+                   return;
+               }
+               var graph_list = diagram.GraphList;
+               if (graph_list == null || !graph_list.Any())
+               {
+                   return;
+               }
 
-              var graph_ql = graph_list.Find(x => x.GraphType == HStation.PhartRelation.eGraphType.ValveOL);
+               var graph_ql = graph_list.Find(x => x.GraphType == HStation.PhartRelation.eGraphType.ValveOL);
 
-              if (graph_ql == null)
-              {
-                  return;
-              }
-              Yw.Geometry.CubicSpline2d ql = null;
-              List<Yw.Geometry.Point2d> points_ql = null;
-              points_ql = PhartPerformCurveHelper.GetFeatPointList(graph_ql.GraphType, graph_ql.GeometryInfo, 12, null);
-              ql = new Yw.Geometry.CubicSpline2d(points_ql);
+               if (graph_ql == null)
+               {
+                   return;
+               }
+               Yw.Geometry.CubicSpline2d ql = null;
+               List<Yw.Geometry.Point2d> points_ql = null;
+               points_ql = PhartPerformCurveHelper.GetFeatPointList(graph_ql.GraphType, graph_ql.GeometryInfo, 12, null);
+               ql = new Yw.Geometry.CubicSpline2d(points_ql);
 
-              var dlg = new ValvePerform2dEditDlg();
-              dlg.SetBindingData(ql);
-              dlg.SetAxisTile("闃�闂ㄥ紑搴�", "鍘嬪姏鎹熷け绯绘暟");
-              dlg.ReloadDataEvent += async (new_ql) =>
-              {
-                  graph_ql.GeometryInfo = new_ql.ToDbString();
-                  _xhs_phart_diagram_ex_std_dto.Diagram.GraphList = new List<Vmo.PhartGraph>()
-                  {
-                      graph_ql
-                  };
-                  var bol = await _bll_ex.Update(_xhs_phart_diagram_ex_std_dto);
-                  if (bol)
-                  {
-                      InitChart(_xhs_phart_diagram_ex_std_dto);
-                  }
-                  return bol;
-              };
-              dlg.ShowDialog();*/
+               var dlg = new ValvePerform2dEditDlg();
+               dlg.SetBindingData(ql);
+               dlg.SetAxisTile("闃�闂ㄥ紑搴�", "鍘嬪姏鎹熷け绯绘暟");
+               dlg.ReloadDataEvent += async (new_ql) =>
+               {
+                   graph_ql.GeometryInfo = new_ql.ToDbString();
+                   _xhs_phart_diagram_ex_std_dto.Diagram.GraphList = new List<Vmo.PhartGraph>()
+                   {
+                         graph_ql
+                   };
+                   var bol = await _bll.Update(_xhs_phart_diagram_ex_std_dto);
+                   if (bol)
+                   {
+                       InitChart(_xhs_phart_diagram_ex_std_dto);
+                   }
+                   return bol;
+               };
+               dlg.ShowDialog();*/
         }
 
         //鍒悕
@@ -186,7 +186,7 @@
                dlg.VerifyValueChanged += async (value) =>
                {
                    _xhs_phart_diagram_ex_std_dto.OtherName = value;
-                   var bol = await _bll_ex.Update(_xhs_phart_diagram_ex_std_dto);
+                   var bol = await _bll.Update(_xhs_phart_diagram_ex_std_dto);
                    if (!bol)
                    {
                        XtraMessageBox.Show("鏇存柊澶辫触!");
@@ -208,7 +208,7 @@
                dlg.VerifyValueChanged += async (value) =>
                {
                    _xhs_phart_diagram_ex_std_dto.Importance = value;
-                   var bol = await _bll_ex.Update(_xhs_phart_diagram_ex_std_dto);
+                   var bol = await _bll.Update(_xhs_phart_diagram_ex_std_dto);
                    if (!bol)
                    {
                        XtraMessageBox.Show("鏇存柊澶辫触!");
@@ -227,29 +227,27 @@
         //鍒犻櫎
         private async void barBtnDelete_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
         {
-            //    await Delete();
+            await Delete();
         }
 
-        /*       //鍒犻櫎
-               private async Task<bool> Delete()
-               {
-              *//*     if (_xhs_phart_diagram_ex_std_dto == null)
-                   {
-                       return false;
-                   }
-                   var diagramId = _xhs_phart_diagram_ex_std_dto.Diagram.ID;
-                   var bol = await _bll_ex.DeleteByDiagramID(diagramId);
-                   if (!bol)
-                   {
-                       XtraMessageBox.Show("鍒犻櫎澶辫触!");
-                       return false;
-                   }
-                   XtraMessageBox.Show("鍒犻櫎鎴愬姛!");
-                   ClearChart();
-                   this.xhsValveMainPhartListCtrl1.Delete(_xhs_phart_diagram_ex_std_dto.ID);
-
-                   return true;*//*
-               }*/
+        //鍒犻櫎
+        private async Task<bool> Delete()
+        {
+            if (_xhs_phart_diagram_ex_std_dto == null)
+            {
+                return false;
+            }
+            var bol = await _bll.DeleteByID(_xhs_phart_diagram_ex_std_dto.ID);
+            if (!bol)
+            {
+                XtraMessageBox.Show("鍒犻櫎澶辫触!");
+                return false;
+            }
+            XtraMessageBox.Show("鍒犻櫎鎴愬姛!");
+            ClearChart();
+            //   this.xhsValveMainPhartListCtrl1.Delete(_xhs_phart_diagram_ex_std_dto.ID);
+            return true;
+        }
 
         #endregion 鍒犻櫎
 
diff --git a/WinFrmUI/HStation.WinFrmUI.Assets.Core/03-valve/ValveManageMainPage.Designer.cs b/WinFrmUI/HStation.WinFrmUI.Assets.Core/03-valve/ValveManageMainPage.Designer.cs
index ff0d23b..aff8aed 100644
--- a/WinFrmUI/HStation.WinFrmUI.Assets.Core/03-valve/ValveManageMainPage.Designer.cs
+++ b/WinFrmUI/HStation.WinFrmUI.Assets.Core/03-valve/ValveManageMainPage.Designer.cs
@@ -140,8 +140,9 @@
             // 
             barBtnSetCoefficient.Caption = "灞�闃荤郴鏁�";
             barBtnSetCoefficient.Id = 24;
-            barBtnSetCoefficient.ImageOptions.SvgImage = (DevExpress.Utils.Svg.SvgImage)resources.GetObject("barBtnSetcoefficient.ImageOptions.SvgImage");
+            barBtnSetCoefficient.ImageOptions.SvgImage = (DevExpress.Utils.Svg.SvgImage)resources.GetObject("barBtnSetCoefficient.ImageOptions.SvgImage");
             barBtnSetCoefficient.Name = "barBtnSetCoefficient";
+            barBtnSetCoefficient.Visibility = DevExpress.XtraBars.BarItemVisibility.Never;
             barBtnSetCoefficient.ItemClick += barBtnSetcoefficient_ItemClick;
             // 
             // ribbonPage1
@@ -256,6 +257,7 @@
             colDescription.AppearanceCell.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center;
             colDescription.FieldName = "Description";
             colDescription.Name = "colDescription";
+            colDescription.OptionsFilter.AllowFilter = false;
             colDescription.Visible = true;
             colDescription.VisibleIndex = 7;
             colDescription.Width = 266;
diff --git a/WinFrmUI/HStation.WinFrmUI.Assets.Core/03-valve/ValveManageMainPage.resx b/WinFrmUI/HStation.WinFrmUI.Assets.Core/03-valve/ValveManageMainPage.resx
index 66da317..8e28f78 100644
--- a/WinFrmUI/HStation.WinFrmUI.Assets.Core/03-valve/ValveManageMainPage.resx
+++ b/WinFrmUI/HStation.WinFrmUI.Assets.Core/03-valve/ValveManageMainPage.resx
@@ -238,7 +238,7 @@
         NCAiIGNsYXNzPSJZZWxsb3ciIC8+DQo8L3N2Zz4L
 </value>
   </data>
-  <data name="barBtnSetcoefficient.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
+  <data name="barBtnSetCoefficient.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
     <value>
         AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIzLjIsIFZlcnNpb249MjMuMi40
         LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
diff --git a/WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/04-chart-edit/TankMainPhartMinorLossPanel.Designer.cs b/WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/04-chart-edit/TankMainPhartMinorLossPanel.Designer.cs
new file mode 100644
index 0000000..edcf228
--- /dev/null
+++ b/WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/04-chart-edit/TankMainPhartMinorLossPanel.Designer.cs
@@ -0,0 +1,247 @@
+锘縰sing DevExpress.XtraEditors;
+
+namespace HStation.WinFrmUI.PhartRelation
+{
+    partial class TankMainPhartMinorLossPanel
+    {
+        /// <summary> 
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary> 
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Component Designer generated code
+
+        /// <summary> 
+        /// Required method for Designer support - do not modify 
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            components = new System.ComponentModel.Container();
+            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(XhsValveMainPhartMinorLossPanel));
+            xtrPerform2dChart1 = new Yw.WinFrmUI.Phart.ValveViewChart();
+            sidePanel2 = new SidePanel();
+            xhsValveMainPhartListCtrl1 = new XhsValveMainPhartListCtrl();
+            ribbonControl1 = new DevExpress.XtraBars.Ribbon.RibbonControl();
+            BtnAdd = new DevExpress.XtraBars.BarButtonItem();
+            barBtnImportByExcel = new DevExpress.XtraBars.BarButtonItem();
+            barBtnDelete = new DevExpress.XtraBars.BarButtonItem();
+            barBtnUpdateimportance = new DevExpress.XtraBars.BarButtonItem();
+            barBtnOtherName = new DevExpress.XtraBars.BarButtonItem();
+            barBtnEditChart = new DevExpress.XtraBars.BarButtonItem();
+            ribbonPage1 = new DevExpress.XtraBars.Ribbon.RibbonPage();
+            ribbonPageGroup1 = new DevExpress.XtraBars.Ribbon.RibbonPageGroup();
+            ribbonPageGroup2 = new DevExpress.XtraBars.Ribbon.RibbonPageGroup();
+            dockManager1 = new DevExpress.XtraBars.Docking.DockManager(components);
+            dockPanel1 = new DevExpress.XtraBars.Docking.DockPanel();
+            dockPanel1_Container = new DevExpress.XtraBars.Docking.ControlContainer();
+            sidePanel2.SuspendLayout();
+            ((System.ComponentModel.ISupportInitialize)ribbonControl1).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)dockManager1).BeginInit();
+            dockPanel1.SuspendLayout();
+            dockPanel1_Container.SuspendLayout();
+            SuspendLayout();
+            // 
+            // xtrPerform2dChart1
+            // 
+            xtrPerform2dChart1.DefinePointVisible = false;
+            xtrPerform2dChart1.Dock = DockStyle.Fill;
+            xtrPerform2dChart1.LineVisible = false;
+            xtrPerform2dChart1.Location = new Point(0, 101);
+            xtrPerform2dChart1.Margin = new Padding(1);
+            xtrPerform2dChart1.Name = "xtrPerform2dChart1";
+            xtrPerform2dChart1.Size = new Size(742, 411);
+            xtrPerform2dChart1.TabIndex = 1;
+            // 
+            // sidePanel2
+            // 
+            sidePanel2.Controls.Add(xhsValveMainPhartListCtrl1);
+            sidePanel2.Dock = DockStyle.Fill;
+            sidePanel2.Location = new Point(0, 0);
+            sidePanel2.Margin = new Padding(2);
+            sidePanel2.Name = "sidePanel2";
+            sidePanel2.Size = new Size(234, 388);
+            sidePanel2.TabIndex = 4;
+            sidePanel2.Text = "sidePanel2";
+            // 
+            // xhsValveMainPhartListCtrl1
+            // 
+            xhsValveMainPhartListCtrl1.Appearance.BackColor = SystemColors.Control;
+            xhsValveMainPhartListCtrl1.Appearance.Options.UseBackColor = true;
+            xhsValveMainPhartListCtrl1.Dock = DockStyle.Fill;
+            xhsValveMainPhartListCtrl1.Location = new Point(0, 0);
+            xhsValveMainPhartListCtrl1.Name = "xhsValveMainPhartListCtrl1";
+            xhsValveMainPhartListCtrl1.Size = new Size(234, 388);
+            xhsValveMainPhartListCtrl1.TabIndex = 0;
+            // 
+            // ribbonControl1
+            // 
+            ribbonControl1.ExpandCollapseItem.Id = 0;
+            ribbonControl1.ItemPanelStyle = DevExpress.XtraBars.Ribbon.RibbonItemPanelStyle.Classic;
+            ribbonControl1.Items.AddRange(new DevExpress.XtraBars.BarItem[] { ribbonControl1.ExpandCollapseItem, BtnAdd, barBtnImportByExcel, barBtnDelete, barBtnUpdateimportance, barBtnOtherName, barBtnEditChart });
+            ribbonControl1.Location = new Point(0, 0);
+            ribbonControl1.MaxItemId = 33;
+            ribbonControl1.Name = "ribbonControl1";
+            ribbonControl1.Pages.AddRange(new DevExpress.XtraBars.Ribbon.RibbonPage[] { ribbonPage1 });
+            ribbonControl1.ShowApplicationButton = DevExpress.Utils.DefaultBoolean.False;
+            ribbonControl1.ShowExpandCollapseButton = DevExpress.Utils.DefaultBoolean.False;
+            ribbonControl1.ShowPageHeadersInFormCaption = DevExpress.Utils.DefaultBoolean.False;
+            ribbonControl1.ShowPageHeadersMode = DevExpress.XtraBars.Ribbon.ShowPageHeadersMode.Hide;
+            ribbonControl1.Size = new Size(742, 101);
+            ribbonControl1.ToolbarLocation = DevExpress.XtraBars.Ribbon.RibbonQuickAccessToolbarLocation.Hidden;
+            // 
+            // BtnAdd
+            // 
+            BtnAdd.Caption = "娣诲姞鍨嬪彿";
+            BtnAdd.Id = 1;
+            BtnAdd.ImageOptions.SvgImage = (DevExpress.Utils.Svg.SvgImage)resources.GetObject("BtnAdd.ImageOptions.SvgImage");
+            BtnAdd.Name = "BtnAdd";
+            // 
+            // barBtnImportByExcel
+            // 
+            barBtnImportByExcel.Caption = "琛ㄦ牸";
+            barBtnImportByExcel.Id = 23;
+            barBtnImportByExcel.ImageOptions.SvgImage = (DevExpress.Utils.Svg.SvgImage)resources.GetObject("barBtnImportByExcel.ImageOptions.SvgImage");
+            barBtnImportByExcel.Name = "barBtnImportByExcel";
+            barBtnImportByExcel.ItemClick += barBtnImportByExcel_ItemClick;
+            // 
+            // barBtnDelete
+            // 
+            barBtnDelete.Caption = "鍒犻櫎";
+            barBtnDelete.Id = 27;
+            barBtnDelete.ImageOptions.SvgImage = (DevExpress.Utils.Svg.SvgImage)resources.GetObject("barBtnDelete.ImageOptions.SvgImage");
+            barBtnDelete.Name = "barBtnDelete";
+            barBtnDelete.ItemClick += barBtnDelete_ItemClick;
+            // 
+            // barBtnUpdateimportance
+            // 
+            barBtnUpdateimportance.Caption = "閲嶈搴�";
+            barBtnUpdateimportance.Id = 29;
+            barBtnUpdateimportance.ImageOptions.SvgImage = (DevExpress.Utils.Svg.SvgImage)resources.GetObject("barBtnUpdateimportance.ImageOptions.SvgImage");
+            barBtnUpdateimportance.Name = "barBtnUpdateimportance";
+            barBtnUpdateimportance.Visibility = DevExpress.XtraBars.BarItemVisibility.Never;
+            barBtnUpdateimportance.ItemClick += barBtnUpdateimportance_ItemClick;
+            // 
+            // barBtnOtherName
+            // 
+            barBtnOtherName.Caption = "鍒悕";
+            barBtnOtherName.Id = 30;
+            barBtnOtherName.ImageOptions.SvgImage = (DevExpress.Utils.Svg.SvgImage)resources.GetObject("barBtnOtherName.ImageOptions.SvgImage");
+            barBtnOtherName.Name = "barBtnOtherName";
+            barBtnOtherName.Visibility = DevExpress.XtraBars.BarItemVisibility.Never;
+            barBtnOtherName.ItemClick += barBtnOtherName_ItemClick;
+            // 
+            // barBtnEditChart
+            // 
+            barBtnEditChart.Caption = "缂栬緫";
+            barBtnEditChart.Id = 31;
+            barBtnEditChart.ImageOptions.SvgImage = (DevExpress.Utils.Svg.SvgImage)resources.GetObject("barBtnEditChart.ImageOptions.SvgImage");
+            barBtnEditChart.Name = "barBtnEditChart";
+            barBtnEditChart.Visibility = DevExpress.XtraBars.BarItemVisibility.Never;
+            barBtnEditChart.ItemClick += barBtnEditChart_ItemClick;
+            // 
+            // ribbonPage1
+            // 
+            ribbonPage1.Groups.AddRange(new DevExpress.XtraBars.Ribbon.RibbonPageGroup[] { ribbonPageGroup1, ribbonPageGroup2 });
+            ribbonPage1.Name = "ribbonPage1";
+            ribbonPage1.Text = "ribbonPage1";
+            // 
+            // ribbonPageGroup1
+            // 
+            ribbonPageGroup1.ItemLinks.Add(barBtnImportByExcel, true);
+            ribbonPageGroup1.Name = "ribbonPageGroup1";
+            ribbonPageGroup1.Text = "瀵煎叆";
+            // 
+            // ribbonPageGroup2
+            // 
+            ribbonPageGroup2.ItemLinks.Add(barBtnEditChart);
+            ribbonPageGroup2.ItemLinks.Add(barBtnOtherName);
+            ribbonPageGroup2.ItemLinks.Add(barBtnUpdateimportance);
+            ribbonPageGroup2.ItemLinks.Add(barBtnDelete, true);
+            ribbonPageGroup2.Name = "ribbonPageGroup2";
+            ribbonPageGroup2.Text = "鎿嶄綔";
+            // 
+            // dockManager1
+            // 
+            dockManager1.DockingOptions.ShowCloseButton = false;
+            dockManager1.Form = this;
+            dockManager1.HiddenPanels.AddRange(new DevExpress.XtraBars.Docking.DockPanel[] { dockPanel1 });
+            dockManager1.Style = DevExpress.XtraBars.Docking2010.Views.DockingViewStyle.Light;
+            dockManager1.TopZIndexControls.AddRange(new string[] { "DevExpress.XtraBars.BarDockControl", "DevExpress.XtraBars.StandaloneBarDockControl", "System.Windows.Forms.MenuStrip", "System.Windows.Forms.StatusStrip", "System.Windows.Forms.StatusBar", "DevExpress.XtraBars.Ribbon.RibbonStatusBar", "DevExpress.XtraBars.Ribbon.RibbonControl", "DevExpress.XtraBars.Navigation.OfficeNavigationBar", "DevExpress.XtraBars.Navigation.TileNavPane", "DevExpress.XtraBars.TabFormControl", "DevExpress.XtraBars.FluentDesignSystem.FluentDesignFormControl", "DevExpress.XtraBars.ToolbarForm.ToolbarFormControl" });
+            // 
+            // dockPanel1
+            // 
+            dockPanel1.Controls.Add(dockPanel1_Container);
+            dockPanel1.Dock = DevExpress.XtraBars.Docking.DockingStyle.Left;
+            dockPanel1.ID = new Guid("202c2203-fb3a-4b47-a9cb-083c698bd2ac");
+            dockPanel1.Location = new Point(0, 0);
+            dockPanel1.Margin = new Padding(2);
+            dockPanel1.Name = "dockPanel1";
+            dockPanel1.OriginalSize = new Size(235, 200);
+            dockPanel1.SavedDock = DevExpress.XtraBars.Docking.DockingStyle.Left;
+            dockPanel1.SavedIndex = 0;
+            dockPanel1.Size = new Size(235, 411);
+            dockPanel1.Text = "鏇茬嚎鍒楄〃";
+            dockPanel1.Visibility = DevExpress.XtraBars.Docking.DockVisibility.Hidden;
+            // 
+            // dockPanel1_Container
+            // 
+            dockPanel1_Container.Controls.Add(sidePanel2);
+            dockPanel1_Container.Location = new Point(0, 23);
+            dockPanel1_Container.Margin = new Padding(2);
+            dockPanel1_Container.Name = "dockPanel1_Container";
+            dockPanel1_Container.Size = new Size(234, 388);
+            dockPanel1_Container.TabIndex = 0;
+            // 
+            // XhsValveMainPhartMinorLossPanel
+            // 
+            Appearance.BackColor = SystemColors.Control;
+            Appearance.Options.UseBackColor = true;
+            AutoScaleDimensions = new SizeF(7F, 14F);
+            AutoScaleMode = AutoScaleMode.Font;
+            Controls.Add(xtrPerform2dChart1);
+            Controls.Add(ribbonControl1);
+            Margin = new Padding(4, 5, 4, 5);
+            Name = "XhsValveMainPhartMinorLossPanel";
+            Size = new Size(742, 512);
+            sidePanel2.ResumeLayout(false);
+            ((System.ComponentModel.ISupportInitialize)ribbonControl1).EndInit();
+            ((System.ComponentModel.ISupportInitialize)dockManager1).EndInit();
+            dockPanel1.ResumeLayout(false);
+            dockPanel1_Container.ResumeLayout(false);
+            ResumeLayout(false);
+            PerformLayout();
+        }
+
+        #endregion
+        private Yw.WinFrmUI.Phart.ValveViewChart xtrPerform2dChart1;
+        private DevExpress.XtraEditors.SidePanel sidePanel2; 
+        private DevExpress.XtraBars.Ribbon.RibbonControl ribbonControl1;
+        private DevExpress.XtraBars.BarButtonItem BtnAdd;
+        private DevExpress.XtraBars.BarButtonItem barBtnImportByExcel;
+        private DevExpress.XtraBars.BarButtonItem barBtnDelete;
+        private DevExpress.XtraBars.Ribbon.RibbonPage ribbonPage1;
+        private DevExpress.XtraBars.Ribbon.RibbonPageGroup ribbonPageGroup1;
+        private DevExpress.XtraBars.Ribbon.RibbonPageGroup ribbonPageGroup2;
+        private DevExpress.XtraBars.Docking.DockManager dockManager1;
+        private DevExpress.XtraBars.Docking.DockPanel dockPanel1;
+        private DevExpress.XtraBars.Docking.ControlContainer dockPanel1_Container;
+        private DevExpress.XtraBars.BarButtonItem barBtnUpdateimportance;
+        private DevExpress.XtraBars.BarButtonItem barBtnOtherName;
+        private DevExpress.XtraBars.BarButtonItem barBtnEditChart;
+        private XhsValveMainPhartListCtrl xhsValveMainPhartListCtrl1;
+    }
+}
diff --git a/WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/04-chart-edit/TankMainPhartMinorLossPanel.cs b/WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/04-chart-edit/TankMainPhartMinorLossPanel.cs
new file mode 100644
index 0000000..7983d6a
--- /dev/null
+++ b/WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/04-chart-edit/TankMainPhartMinorLossPanel.cs
@@ -0,0 +1,218 @@
+锘縰sing DevExpress.XtraEditors;
+using NetTaste;
+
+namespace HStation.WinFrmUI.PhartRelation
+{
+    public partial class TankMainPhartMinorLossPanel : DocumentPage
+    {
+        public TankMainPhartMinorLossPanel()
+        {
+            InitializeComponent();
+            this.PageTitle.Caption = "姘存睜瀹圭Н鏇茬嚎";
+
+            //    this.TankMainPhartListCtrl1.FocusedChangedEvent += TankMainPhartListCtrl1_FocusedChangedEvent;
+        }
+
+        private long _valve_main_id;
+        private Vmo.AssetsTankCoefficientVmo _xhs_phart_diagram_ex_std_dto = null;
+        private readonly BLL.AssetsTankCoefficient _bll = new();
+
+        /// <summary>
+        /// 鍒濆鍖栨暟鎹�
+        /// </summary>
+        public async void InitialDataSource(long valve_main_id)
+        {
+            _valve_main_id = valve_main_id;
+            if (_valve_main_id < 1)
+            {
+                return;
+            }
+            var chart = await new BLL.AssetsTankCoefficient().GetByMainID(valve_main_id);
+            if (chart != null && chart.Count > 0)
+            {
+                _xhs_phart_diagram_ex_std_dto = chart.First();
+                this.xtrPerform2dChart1.SetBindingData(_xhs_phart_diagram_ex_std_dto.VolCurve);
+            }
+            this.xtrPerform2dChart1.SetAxisTitle("娴侀噺 m鲁/h", "瀹圭Н m鲁");
+        }
+
+        #region 鍥捐〃
+
+        //娓呯┖鍥捐〃鏁版嵁
+        private void ClearChart()
+        {
+            this.xtrPerform2dChart1.InitialChartData();
+        }
+
+        #endregion 鍥捐〃
+
+        #region 瀵煎叆
+
+        //Excel 瀵煎叆
+        private void barBtnImportByExcel_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
+        {
+            var dlg = new ImportTankPerform2dByExcelDlg();
+            dlg.SetBindingData("娴侀噺 m鲁/h ", "瀹圭Н m鲁");
+            dlg.ReloadDataEvent += async (pt_list_json) =>
+            {
+                var bol = await Import(pt_list_json);
+                return bol;
+            };
+            dlg.ShowDialog();
+        }
+
+        // 瀵煎叆
+        private async Task<bool> Import(string pt_list_json)
+        {
+            if (_valve_main_id < 1)
+            {
+                XtraMessageBox.Show("ValveMain is null!");
+                return false;
+            }
+            var model = new Vmo.AssetsTankCoefficientVmo();
+            model.MainID = _valve_main_id;
+            model.VolCurve = pt_list_json;
+            this.xtrPerform2dChart1.SetBindingData(pt_list_json);
+            var id = await _bll.Insert(model);
+            if (id > 0)
+            {
+                model.ID = id;
+                _xhs_phart_diagram_ex_std_dto = model;
+                return true;
+            }
+            return false;
+        }
+
+        #endregion 瀵煎叆
+
+        #region 鎿嶄綔
+
+        //缂栬緫
+        private void barBtnEditChart_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
+        {
+            /*   if (_xhs_phart_diagram_ex_std_dto == null)
+               {
+                   return;
+               }
+               var diagram = _xhs_phart_diagram_ex_std_dto.Diagram;
+               if (diagram == null)
+               {
+                   return;
+               }
+               var graph_list = diagram.GraphList;
+               if (graph_list == null || !graph_list.Any())
+               {
+                   return;
+               }
+
+               var graph_ql = graph_list.Find(x => x.GraphType == HStation.PhartRelation.eGraphType.ValveOL);
+
+               if (graph_ql == null)
+               {
+                   return;
+               }
+               Yw.Geometry.CubicSpline2d ql = null;
+               List<Yw.Geometry.Point2d> points_ql = null;
+               points_ql = PhartPerformCurveHelper.GetFeatPointList(graph_ql.GraphType, graph_ql.GeometryInfo, 12, null);
+               ql = new Yw.Geometry.CubicSpline2d(points_ql);
+
+               var dlg = new ValvePerform2dEditDlg();
+               dlg.SetBindingData(ql);
+               dlg.SetAxisTile("闃�闂ㄥ紑搴�", "鍘嬪姏鎹熷け绯绘暟");
+               dlg.ReloadDataEvent += async (new_ql) =>
+               {
+                   graph_ql.GeometryInfo = new_ql.ToDbString();
+                   _xhs_phart_diagram_ex_std_dto.Diagram.GraphList = new List<Vmo.PhartGraph>()
+                   {
+                         graph_ql
+                   };
+                   var bol = await _bll.Update(_xhs_phart_diagram_ex_std_dto);
+                   if (bol)
+                   {
+                       InitChart(_xhs_phart_diagram_ex_std_dto);
+                   }
+                   return bol;
+               };
+               dlg.ShowDialog();*/
+        }
+
+        //鍒悕
+        private void barBtnOtherName_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
+        {
+            /*   if (_xhs_phart_diagram_ex_std_dto == null)
+               {
+                   return;
+               }
+               var dlg = new SetOtherNameDlg();
+               dlg.SetBindingData(_xhs_phart_diagram_ex_std_dto.OtherName);
+               dlg.VerifyValueChanged += async (value) =>
+               {
+                   _xhs_phart_diagram_ex_std_dto.OtherName = value;
+                   var bol = await _bll.Update(_xhs_phart_diagram_ex_std_dto);
+                   if (!bol)
+                   {
+                       XtraMessageBox.Show("鏇存柊澶辫触!");
+                       return false;
+                   }
+                   this.TankMainPhartListCtrl1.UpdateOtherName(_xhs_phart_diagram_ex_std_dto.ID, value);
+                   XtraMessageBox.Show("鏇存柊鎴愬姛!");
+                   return true;
+               };
+
+               dlg.ShowDialog();*/
+        }
+
+        //閲嶈搴�
+        private void barBtnUpdateimportance_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
+        {
+            /*   var dlg = new SetImportanceDlg();
+               dlg.SetBindingData(_xhs_phart_diagram_ex_std_dto.Importance);
+               dlg.VerifyValueChanged += async (value) =>
+               {
+                   _xhs_phart_diagram_ex_std_dto.Importance = value;
+                   var bol = await _bll.Update(_xhs_phart_diagram_ex_std_dto);
+                   if (!bol)
+                   {
+                       XtraMessageBox.Show("鏇存柊澶辫触!");
+                       return false;
+                   }
+                   this.TankMainPhartListCtrl1.UpdateImportance(_xhs_phart_diagram_ex_std_dto.ID, value);
+                   XtraMessageBox.Show("鏇存柊鎴愬姛!");
+                   return true;
+               };
+
+               dlg.ShowDialog();*/
+        }
+
+        #region 鍒犻櫎
+
+        //鍒犻櫎
+        private async void barBtnDelete_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
+        {
+            await Delete();
+        }
+
+        //鍒犻櫎
+        private async Task<bool> Delete()
+        {
+            if (_xhs_phart_diagram_ex_std_dto == null)
+            {
+                return false;
+            }
+            var bol = await _bll.DeleteByID(_xhs_phart_diagram_ex_std_dto.ID);
+            if (!bol)
+            {
+                XtraMessageBox.Show("鍒犻櫎澶辫触!");
+                return false;
+            }
+            XtraMessageBox.Show("鍒犻櫎鎴愬姛!");
+            ClearChart();
+            //   this.TankMainPhartListCtrl1.Delete(_xhs_phart_diagram_ex_std_dto.ID);
+            return true;
+        }
+
+        #endregion 鍒犻櫎
+
+        #endregion 鎿嶄綔
+    }
+}
\ No newline at end of file
diff --git a/WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/04-chart-edit/TankMainPhartMinorLossPanel.resx b/WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/04-chart-edit/TankMainPhartMinorLossPanel.resx
new file mode 100644
index 0000000..773814f
--- /dev/null
+++ b/WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/04-chart-edit/TankMainPhartMinorLossPanel.resx
@@ -0,0 +1,286 @@
+锘�<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!--
+    Microsoft ResX Schema 
+
+    Version 2.0
+
+    The primary goals of this format is to allow a simple XML format
+    that is mostly human readable. The generation and parsing of the
+    various data types are done through the TypeConverter classes
+    associated with the data types.
+
+    Example:
+
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+
+    There are any number of "resheader" rows that contain simple
+    name/value pairs.
+
+    Each data row contains a name, and value. The row also contains a
+    type or mimetype. Type corresponds to a .NET class that support
+    text/value conversion through the TypeConverter architecture.
+    Classes that don't support this are serialized and stored with the
+    mimetype set.
+
+    The mimetype is used for serialized objects, and tells the
+    ResXResourceReader how to depersist the object. This is currently not
+    extensible. For a given mimetype the value must be set accordingly:
+
+    Note - application/x-microsoft.net.object.binary.base64 is the format
+    that the ResXResourceWriter will generate, however the reader can
+    read any of the formats listed below.
+
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <assembly alias="DevExpress.Data.v23.2" name="DevExpress.Data.v23.2, Culture=neutral, PublicKeyToken=b88d1754d700e49a" />
+  <data name="BtnAdd.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIzLjIsIFZlcnNpb249MjMuMi40
+        LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
+        dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAAKcCAAAC77u/
+        PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi
+        IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv
+        MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh
+        Y2U9InByZXNlcnZlIiBpZD0iTGF5ZXJfMSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAg
+        MzIgMzIiPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLkJsdWV7ZmlsbDojMTE3N0Q3O30KCS5Z
+        ZWxsb3d7ZmlsbDojRkZCMTE1O30KCS5CbGFja3tmaWxsOiM3MjcyNzI7fQoJLkdyZWVue2ZpbGw6IzAz
+        OUMyMzt9CgkuUmVke2ZpbGw6I0QxMUMxQzt9Cgkuc3Qwe29wYWNpdHk6MC43NTt9Cgkuc3Qxe29wYWNp
+        dHk6MC41O30KPC9zdHlsZT4NCiAgPGcgaWQ9IkFkZCI+DQogICAgPHBhdGggZD0iTTI3LDE0aC05VjVj
+        MC0wLjUtMC41LTEtMS0xaC0yYy0wLjUsMC0xLDAuNS0xLDF2OUg1Yy0wLjUsMC0xLDAuNS0xLDF2MmMw
+        LDAuNSwwLjUsMSwxLDFoOXY5ICAgYzAsMC41LDAuNSwxLDEsMWgyYzAuNSwwLDEtMC41LDEtMXYtOWg5
+        YzAuNSwwLDEtMC41LDEtMXYtMkMyOCwxNC41LDI3LjUsMTQsMjcsMTR6IiBjbGFzcz0iR3JlZW4iIC8+
+        DQogIDwvZz4NCjwvc3ZnPgs=
+</value>
+  </data>
+  <data name="barBtnImportByExcel.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIzLjIsIFZlcnNpb249MjMuMi40
+        LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
+        dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAAEYMAAAC77u/
+        PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi
+        IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv
+        MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh
+        Y2U9InByZXNlcnZlIiBpZD0iTGF5ZXJfMSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAg
+        MzIgMzIiPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLkdyZWVue2ZpbGw6IzAzOUMyMzt9Cgku
+        QmxhY2t7ZmlsbDojNzI3MjcyO30KPC9zdHlsZT4NCiAgPHBhdGggZD0iTTgsNGgxOHY2aDJWM2MwLTAu
+        NS0wLjUtMS0xLTFIN0M2LjUsMiw2LDIuNSw2LDN2N2gyVjR6IiBjbGFzcz0iQmxhY2siIC8+DQogIDxw
+        YXRoIGQ9Ik0yNiwyNkg4di03LjJINlYyN2MwLDAuNSwwLjUsMSwxLDFoMjBjMC41LDAsMS0wLjUsMS0x
+        di04LjJoLTJWMjZ6IiBjbGFzcz0iQmxhY2siIC8+DQogIDxnPg0KICAgIDxnPg0KICAgICAgPHBhdGgg
+        ZD0iTTI5LDhINUM0LjQsOCw0LDguNCw0LDl2MTBjMCwwLjYsMC40LDEsMSwxaDI0YzAuNiwwLDEtMC40
+        LDEtMVY5QzMwLDguNCwyOS42LDgsMjksOHogTTExLjYsMThsLTEuMi0yLjYgICAgYzAtMC4xLTAuMS0w
+        LjMtMC4xLTAuNWgwYzAsMC4xLTAuMSwwLjMtMC4yLDAuNkw4LjgsMThINi45bDIuMy00bC0yLjEtNGgy
+        bDEsMi40YzAuMSwwLjIsMC4yLDAuNCwwLjIsMC43aDAgICAgYzAtMC4yLDAuMS0wLjQsMC4yLTAuN2wx
+        LjEtMi40aDEuOGwtMi4yLDRsMi4yLDRIMTEuNnogTTE5LjgsMThoLTQuM3YtOGgxLjZ2Ni41aDIuN1Yx
+        OHogTTI1LjgsMTYuOGMtMC4yLDAuMy0wLjQsMC41LTAuNiwwLjcgICAgcy0wLjYsMC4zLTAuOSwwLjRD
+        MjMuOSwxOCwyMy41LDE4LDIzLjEsMThjLTAuNCwwLTAuOCwwLTEuMS0wLjFjLTAuNC0wLjEtMC43LTAu
+        Mi0wLjktMC4zdi0xLjdjMC4zLDAuMywwLjYsMC41LDEsMC42ICAgIGMwLjMsMC4xLDAuNywwLjIsMSww
+        LjJjMC4yLDAsMC40LDAsMC41LTAuMWMwLjIsMCwwLjMtMC4xLDAuNC0wLjJjMC4xLTAuMSwwLjItMC4y
+        LDAuMi0wLjJjMC0wLjEsMC4xLTAuMiwwLjEtMC4zICAgIGMwLTAuMiwwLTAuMy0wLjEtMC40Yy0wLjEt
+        MC4xLTAuMi0wLjItMC4zLTAuM3MtMC4zLTAuMi0wLjUtMC4zYy0wLjItMC4xLTAuNC0wLjItMC42LTAu
+        M2MtMC42LTAuMy0xLTAuNi0xLjMtMC45ICAgIGMtMC4zLTAuNC0wLjQtMC44LTAuNC0xLjNjMC0wLjQs
+        MC4xLTAuNywwLjItMWMwLjItMC4zLDAuNC0wLjUsMC42LTAuN2MwLjMtMC4yLDAuNi0wLjMsMC45LTAu
+        NHMwLjctMC4xLDEuMS0wLjEgICAgYzAuNCwwLDAuNywwLDEsMC4xYzAuMywwLDAuNiwwLjEsMC44LDAu
+        MnYxLjZjLTAuMS0wLjEtMC4zLTAuMi0wLjQtMC4ycy0wLjMtMC4xLTAuNC0wLjJjLTAuMiwwLTAuMy0w
+        LjEtMC41LTAuMSAgICBjLTAuMSwwLTAuMywwLTAuNCwwYy0wLjIsMC0wLjQsMC0wLjUsMC4xYy0wLjIs
+        MC0wLjMsMC4xLTAuNCwwLjJjLTAuMSwwLjEtMC4yLDAuMi0wLjIsMC4yYy0wLjEsMC4xLTAuMSwwLjIt
+        MC4xLDAuMyAgICBjMCwwLjEsMCwwLjIsMC4xLDAuM2MwLjEsMC4xLDAuMiwwLjIsMC4zLDAuM2MwLjEs
+        MC4xLDAuMywwLjIsMC40LDAuM2MwLjIsMC4xLDAuNCwwLjIsMC42LDAuM2MwLjMsMC4xLDAuNSwwLjMs
+        MC44LDAuNCAgICBjMC4yLDAuMSwwLjQsMC4zLDAuNiwwLjVjMC4yLDAuMiwwLjMsMC40LDAuNCwwLjZj
+        MC4xLDAuMiwwLjEsMC41LDAuMSwwLjhDMjYsMTYuMSwyNS45LDE2LjUsMjUuOCwxNi44eiIgY2xhc3M9
+        IkdyZWVuIiAvPg0KICAgIDwvZz4NCiAgICA8Zz4NCiAgICAgIDxwYXRoIGQ9Ik0yOSw4SDVDNC40LDgs
+        NCw4LjQsNCw5djEwYzAsMC42LDAuNCwxLDEsMWgyNGMwLjYsMCwxLTAuNCwxLTFWOUMzMCw4LjQsMjku
+        Niw4LDI5LDh6IE0xMS42LDE4bC0xLjItMi42ICAgIGMwLTAuMS0wLjEtMC4zLTAuMS0wLjVoMGMwLDAu
+        MS0wLjEsMC4zLTAuMiwwLjZMOC44LDE4SDYuOWwyLjMtNGwtMi4xLTRoMmwxLDIuNGMwLjEsMC4yLDAu
+        MiwwLjQsMC4yLDAuN2gwICAgIGMwLTAuMiwwLjEtMC40LDAuMi0wLjdsMS4xLTIuNGgxLjhsLTIuMiw0
+        bDIuMiw0SDExLjZ6IE0xOS44LDE4aC00LjN2LThoMS42djYuNWgyLjdWMTh6IE0yNS44LDE2LjhjLTAu
+        MiwwLjMtMC40LDAuNS0wLjYsMC43ICAgIHMtMC42LDAuMy0wLjksMC40QzIzLjksMTgsMjMuNSwxOCwy
+        My4xLDE4Yy0wLjQsMC0wLjgsMC0xLjEtMC4xYy0wLjQtMC4xLTAuNy0wLjItMC45LTAuM3YtMS43YzAu
+        MywwLjMsMC42LDAuNSwxLDAuNiAgICBjMC4zLDAuMSwwLjcsMC4yLDEsMC4yYzAuMiwwLDAuNCwwLDAu
+        NS0wLjFjMC4yLDAsMC4zLTAuMSwwLjQtMC4yYzAuMS0wLjEsMC4yLTAuMiwwLjItMC4yYzAtMC4xLDAu
+        MS0wLjIsMC4xLTAuMyAgICBjMC0wLjIsMC0wLjMtMC4xLTAuNGMtMC4xLTAuMS0wLjItMC4yLTAuMy0w
+        LjNzLTAuMy0wLjItMC41LTAuM2MtMC4yLTAuMS0wLjQtMC4yLTAuNi0wLjNjLTAuNi0wLjMtMS0wLjYt
+        MS4zLTAuOSAgICBjLTAuMy0wLjQtMC40LTAuOC0wLjQtMS4zYzAtMC40LDAuMS0wLjcsMC4yLTFjMC4y
+        LTAuMywwLjQtMC41LDAuNi0wLjdjMC4zLTAuMiwwLjYtMC4zLDAuOS0wLjRzMC43LTAuMSwxLjEtMC4x
+        ICAgIGMwLjQsMCwwLjcsMCwxLDAuMWMwLjMsMCwwLjYsMC4xLDAuOCwwLjJ2MS42Yy0wLjEtMC4xLTAu
+        My0wLjItMC40LTAuMnMtMC4zLTAuMS0wLjQtMC4yYy0wLjIsMC0wLjMtMC4xLTAuNS0wLjEgICAgYy0w
+        LjEsMC0wLjMsMC0wLjQsMGMtMC4yLDAtMC40LDAtMC41LDAuMWMtMC4yLDAtMC4zLDAuMS0wLjQsMC4y
+        Yy0wLjEsMC4xLTAuMiwwLjItMC4yLDAuMmMtMC4xLDAuMS0wLjEsMC4yLTAuMSwwLjMgICAgYzAsMC4x
+        LDAsMC4yLDAuMSwwLjNjMC4xLDAuMSwwLjIsMC4yLDAuMywwLjNjMC4xLDAuMSwwLjMsMC4yLDAuNCww
+        LjNjMC4yLDAuMSwwLjQsMC4yLDAuNiwwLjNjMC4zLDAuMSwwLjUsMC4zLDAuOCwwLjQgICAgYzAuMiww
+        LjEsMC40LDAuMywwLjYsMC41YzAuMiwwLjIsMC4zLDAuNCwwLjQsMC42YzAuMSwwLjIsMC4xLDAuNSww
+        LjEsMC44QzI2LDE2LjEsMjUuOSwxNi41LDI1LjgsMTYuOHoiIGNsYXNzPSJHcmVlbiIgLz4NCiAgICA8
+        L2c+DQogIDwvZz4NCjwvc3ZnPgs=
+</value>
+  </data>
+  <data name="barBtnDelete.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIzLjIsIFZlcnNpb249MjMuMi40
+        LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
+        dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAAD0DAAAC77u/
+        PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi
+        IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv
+        MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh
+        Y2U9InByZXNlcnZlIiBpZD0iTGF5ZXJfMSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAg
+        MzIgMzIiPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLlJlZHtmaWxsOiNEMTFDMUM7fQoJLkJs
+        YWNre2ZpbGw6IzcyNzI3Mjt9CgkuQmx1ZXtmaWxsOiMxMTc3RDc7fQoJLkdyZWVue2ZpbGw6IzAzOUMy
+        Mzt9CgkuWWVsbG93e2ZpbGw6I0ZGQjExNTt9CgkuV2hpdGV7ZmlsbDojRkZGRkZGO30KCS5zdDB7b3Bh
+        Y2l0eTowLjU7fQoJLnN0MXtvcGFjaXR5OjAuNzU7fQo8L3N0eWxlPg0KICA8ZyBpZD0iRGVsZXRlIj4N
+        CiAgICA8Zz4NCiAgICAgIDxwYXRoIGQ9Ik0xOC44LDE2bDYuOS02LjljMC40LTAuNCwwLjQtMSwwLTEu
+        NGwtMS40LTEuNGMtMC40LTAuNC0xLTAuNC0xLjQsMEwxNiwxMy4yTDkuMSw2LjNjLTAuNC0wLjQtMS0w
+        LjQtMS40LDAgICAgTDYuMyw3LjdjLTAuNCwwLjQtMC40LDEsMCwxLjRsNi45LDYuOWwtNi45LDYuOWMt
+        MC40LDAuNC0wLjQsMSwwLDEuNGwxLjQsMS40YzAuNCwwLjQsMSwwLjQsMS40LDBsNi45LTYuOWw2Ljks
+        Ni45ICAgIGMwLjQsMC40LDEsMC40LDEuNCwwbDEuNC0xLjRjMC40LTAuNCwwLjQtMSwwLTEuNEwxOC44
+        LDE2eiIgY2xhc3M9IlJlZCIgLz4NCiAgICA8L2c+DQogIDwvZz4NCjwvc3ZnPgs=
+</value>
+  </data>
+  <data name="barBtnUpdateimportance.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIzLjIsIFZlcnNpb249MjMuMi40
+        LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
+        dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAAMACAAAC77u/
+        PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi
+        IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv
+        MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh
+        Y2U9InByZXNlcnZlIiBpZD0iTGF5ZXJfMSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAg
+        MzIgMzIiPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLlJlZHtmaWxsOiNEMTFDMUM7fQoJLkJs
+        YWNre2ZpbGw6IzcyNzI3Mjt9CgkuQmx1ZXtmaWxsOiMxMTc3RDc7fQoJLkdyZWVue2ZpbGw6IzAzOUMy
+        Mzt9CgkuWWVsbG93e2ZpbGw6I0ZGQjExNTt9CgkuV2hpdGV7ZmlsbDojRkZGRkZGO30KCS5zdDB7b3Bh
+        Y2l0eTowLjU7fQoJLnN0MXtvcGFjaXR5OjAuNzU7fQoJLnN0MntvcGFjaXR5OjAuMjU7fQo8L3N0eWxl
+        Pg0KICA8ZyBpZD0iSGlnaEltcG9ydGFuY2UiPg0KICAgIDxwYXRoIGQ9Ik0xNSwyOGMtMS43LDAtMy0x
+        LjMtMy0zczEuMy0zLDMtM3MzLDEuMywzLDNTMTYuNywyOCwxNSwyOHogTTE3LDRoLTRjLTAuNiwwLTEs
+        MC40LTEsMXYxNGMwLDAuNSwwLjQsMSwxLDFoNCAgIGMwLjUsMCwxLTAuNSwxLTFWNUMxOCw0LjQsMTcu
+        NSw0LDE3LDR6IiBjbGFzcz0iUmVkIiAvPg0KICA8L2c+DQo8L3N2Zz4L
+</value>
+  </data>
+  <data name="barBtnOtherName.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIzLjIsIFZlcnNpb249MjMuMi40
+        LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
+        dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAALUDAAAC77u/
+        PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi
+        IHZpZXdCb3g9IjAgMCAxNiAxNiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv
+        MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh
+        Y2U9InByZXNlcnZlIiBpZD0iTGF5ZXJfMSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAg
+        MTYgMTYiPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLkdyZWVue2ZpbGw6IzExOUI0OTt9Cgku
+        Qmx1ZXtmaWxsOiMzNDc1QkE7fQoJLkJsYWNre2ZpbGw6IzczNzM3Mzt9Cjwvc3R5bGU+DQogIDxyZWN0
+        IHg9IjAiIHk9IjEiIHdpZHRoPSIxNiIgaGVpZ2h0PSIzIiBjbGFzcz0iR3JlZW4iIC8+DQogIDxwb2x5
+        Z29uIHBvaW50cz0iMTUsNCAxNSwxNCAxLDE0IDEsNCAwLDQgMCwxNSAxNiwxNSAxNiw0ICIgY2xhc3M9
+        IkJsYWNrIiAvPg0KICA8cGF0aCBkPSJNOSw2SDhWNWgydjIuMkMxMC4zLDcuMSwxMC42LDcsMTEuMSw3
+        QzEyLjYsNywxMyw3LjksMTMsOXYxYzAsMC45LTAuMiwyLTIsMmMtMC40LDAtMS4yLDAtMi0wLjFWNnog
+        TTEwLDExICBjMC4zLDAsMC44LDAuMSwxLDAuMWMwLjgsMCwwLjktMC4zLDAuOS0xLjFWOWMwLTAuOC0w
+        LjMtMS4xLTAuOS0xLjFjLTAuMywwLTAuOCwwLjEtMSwwLjFWMTF6IiBjbGFzcz0iQmx1ZSIgLz4NCiAg
+        PHBhdGggZD0iTTcsMTFWNy4zQzYuNCw3LjEsNS44LDcsNS4xLDdDMy4xLDcsMyw4LjMsMyw5djFjMCww
+        LjksMC4yLDIsMS45LDJjMC4yLDAsMC43LDAsMS4zLTAuM1YxMkg3aDF2LTFIN3ogTTYsMTEgIGMtMC4z
+        LDAuMS0wLjcsMC4xLTAuOSwwLjFjLTAuOCwwLTEtMC4zLTEtMVY5YzAtMC43LDAuMi0xLjEsMS0xLjFD
+        NS4zLDcuOSw1LjcsOCw2LDhWMTF6IiBjbGFzcz0iQmx1ZSIgLz4NCjwvc3ZnPgs=
+</value>
+  </data>
+  <data name="barBtnEditChart.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIzLjIsIFZlcnNpb249MjMuMi40
+        LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
+        dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAAAQDAAAC77u/
+        PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi
+        IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv
+        MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh
+        Y2U9InByZXNlcnZlIiBpZD0iTGF5ZXJfMSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAg
+        MzIgMzIiPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLkJsYWNre2ZpbGw6IzcyNzI3Mjt9Cgku
+        Qmx1ZXtmaWxsOiMxMTc3RDc7fQoJLkdyZWVue2ZpbGw6IzAzOUMyMzt9CgkuWWVsbG93e2ZpbGw6I0ZG
+        QjExNTt9CgkuUmVke2ZpbGw6I0QxMUMxQzt9CgkuV2hpdGV7ZmlsbDojRkZGRkZGO30KCS5zdDB7b3Bh
+        Y2l0eTowLjU7fQoJLnN0MXtvcGFjaXR5OjAuNzU7fQo8L3N0eWxlPg0KICA8cGF0aCBkPSJNMjQsMjQu
+        OFYyOEg0VjRoMjB2Ny4ybDItMlYzYzAtMC41LTAuNS0xLTEtMUgzQzIuNSwyLDIsMi41LDIsM3YyNmMw
+        LDAuNSwwLjUsMSwxLDFoMjJjMC41LDAsMS0wLjUsMS0xdi02LjIgIEwyNCwyNC44eiIgY2xhc3M9IkJs
+        YWNrIiAvPg0KICA8cGF0aCBkPSJNMjksMTdsLTgsOGwtNC00bDgtOEwyOSwxN3ogTTMwLDE2bDEuNy0x
+        LjdjMC40LTAuNCwwLjQtMSwwLTEuM0wyOSwxMC4zYy0wLjQtMC40LTEtMC40LTEuMywwTDI2LDEyTDMw
+        LDE2eiAgIE0xNiwyMnY0aDRMMTYsMjJ6IiBjbGFzcz0iQmx1ZSIgLz4NCjwvc3ZnPgs=
+</value>
+  </data>
+  <metadata name="dockManager1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+</root>
\ No newline at end of file
diff --git a/WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/04-chart-edit/TankPerform2dEditChart.Designer.cs b/WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/04-chart-edit/TankPerform2dEditChart.Designer.cs
new file mode 100644
index 0000000..27418e1
--- /dev/null
+++ b/WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/04-chart-edit/TankPerform2dEditChart.Designer.cs
@@ -0,0 +1,249 @@
+锘縩amespace HStation.WinFrmUI
+{
+    partial class TankPerform2dEditChart
+    {
+        /// <summary> 
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary> 
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Component Designer generated code
+
+        /// <summary> 
+        /// Required method for Designer support - do not modify 
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            components = new System.ComponentModel.Container();
+            DevExpress.XtraCharts.TextAnnotation textAnnotation1 = new DevExpress.XtraCharts.TextAnnotation();
+            DevExpress.XtraCharts.PaneAnchorPoint paneAnchorPoint1 = new DevExpress.XtraCharts.PaneAnchorPoint();
+            DevExpress.XtraCharts.FreePosition freePosition1 = new DevExpress.XtraCharts.FreePosition();
+            DevExpress.XtraCharts.XYDiagram xyDiagram1 = new DevExpress.XtraCharts.XYDiagram();
+            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.PointSeriesView pointSeriesView1 = new DevExpress.XtraCharts.PointSeriesView();
+            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ValvePerform2dEditChart));
+            chartControl1 = new DevExpress.XtraCharts.ChartControl();
+            popMenuChart = new DevExpress.XtraBars.PopupMenu(components);
+            barCekChartEditMode = new DevExpress.XtraBars.BarCheckItem();
+            barBtnSetChartAxis = new DevExpress.XtraBars.BarButtonItem();
+            barBtnCalcCoordinate = new DevExpress.XtraBars.BarButtonItem();
+            barCekSetAxisNameVisible = new DevExpress.XtraBars.BarCheckItem();
+            barCekLegendVisible = new DevExpress.XtraBars.BarCheckItem();
+            barManager1 = new DevExpress.XtraBars.BarManager(components);
+            barDockControlTop = new DevExpress.XtraBars.BarDockControl();
+            barDockControlBottom = new DevExpress.XtraBars.BarDockControl();
+            barDockControlLeft = new DevExpress.XtraBars.BarDockControl();
+            barDockControlRight = new DevExpress.XtraBars.BarDockControl();
+            ((System.ComponentModel.ISupportInitialize)chartControl1).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)textAnnotation1).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)xyDiagram1).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)series1).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)splineSeriesView1).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)series2).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)pointSeriesView1).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)popMenuChart).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)barManager1).BeginInit();
+            SuspendLayout();
+            // 
+            // chartControl1
+            // 
+            paneAnchorPoint1.AxisXCoordinate.AxisValueSerializable = "9.5";
+            paneAnchorPoint1.AxisYCoordinate.AxisValueSerializable = "0";
+            textAnnotation1.AnchorPoint = paneAnchorPoint1;
+            textAnnotation1.AnnotationID = 0;
+            textAnnotation1.AutoHeight = true;
+            textAnnotation1.AutoWidth = true;
+            textAnnotation1.Name = "TextAnnoCurveInfo";
+            freePosition1.DockCorner = DevExpress.XtraCharts.DockCorner.RightBottom;
+            freePosition1.DockTargetName = "Default Pane";
+            textAnnotation1.ShapePosition = freePosition1;
+            textAnnotation1.Text = "淇℃伅";
+            textAnnotation1.Visible = false;
+            chartControl1.AnnotationRepository.AddRange(new DevExpress.XtraCharts.Annotation[] { textAnnotation1 });
+            chartControl1.BorderOptions.Visibility = DevExpress.Utils.DefaultBoolean.False;
+            xyDiagram1.AxisX.Title.Text = "娴侀噺 锛坢鲁/h锛�";
+            xyDiagram1.AxisX.Title.Visibility = DevExpress.Utils.DefaultBoolean.Default;
+            xyDiagram1.AxisX.VisibleInPanesSerializable = "-1";
+            xyDiagram1.AxisY.Color = Color.DodgerBlue;
+            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.DefaultPane.Title.Visibility = DevExpress.Utils.DefaultBoolean.True;
+            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.True;
+            chartControl1.Location = new Point(0, 0);
+            chartControl1.Name = "chartControl1";
+            series1.Name = "SeriesCurveQL";
+            series1.SeriesID = 0;
+            splineSeriesView1.Color = Color.DodgerBlue;
+            series1.View = splineSeriesView1;
+            series2.Name = "SeriesPointQL";
+            series2.SeriesID = 3;
+            pointSeriesView1.Color = Color.DodgerBlue;
+            series2.View = pointSeriesView1;
+            chartControl1.SeriesSerializable = new DevExpress.XtraCharts.Series[]
+    {
+    series1,
+    series2
+    };
+            chartControl1.Size = new Size(1023, 856);
+            chartControl1.TabIndex = 0;
+            // 
+            // popMenuChart
+            // 
+            popMenuChart.LinksPersistInfo.AddRange(new DevExpress.XtraBars.LinkPersistInfo[] { new DevExpress.XtraBars.LinkPersistInfo(barCekChartEditMode), new DevExpress.XtraBars.LinkPersistInfo(barBtnSetChartAxis, true), new DevExpress.XtraBars.LinkPersistInfo(barBtnCalcCoordinate), new DevExpress.XtraBars.LinkPersistInfo(barCekSetAxisNameVisible, true), new DevExpress.XtraBars.LinkPersistInfo(barCekLegendVisible) });
+            popMenuChart.Manager = barManager1;
+            popMenuChart.Name = "popMenuChart";
+            // 
+            // barCekChartEditMode
+            // 
+            barCekChartEditMode.Caption = "鍒囨崲妯″紡";
+            barCekChartEditMode.Id = 20;
+            barCekChartEditMode.ImageOptions.SvgImage = (DevExpress.Utils.Svg.SvgImage)resources.GetObject("barCekChartEditMode.ImageOptions.SvgImage");
+            barCekChartEditMode.Name = "barCekChartEditMode";
+            barCekChartEditMode.CheckedChanged += barCekChartEditMode_CheckedChanged;
+            // 
+            // barBtnSetChartAxis
+            // 
+            barBtnSetChartAxis.Caption = "淇敼鍧愭爣";
+            barBtnSetChartAxis.Id = 0;
+            barBtnSetChartAxis.ImageOptions.SvgImage = (DevExpress.Utils.Svg.SvgImage)resources.GetObject("barBtnSetChartAxis.ImageOptions.SvgImage");
+            barBtnSetChartAxis.Name = "barBtnSetChartAxis";
+            barBtnSetChartAxis.ItemClick += barBtnSetChartAxis_ItemClick;
+            // 
+            // barBtnCalcCoordinate
+            // 
+            barBtnCalcCoordinate.Caption = "璁$畻鍧愭爣";
+            barBtnCalcCoordinate.Id = 19;
+            barBtnCalcCoordinate.ImageOptions.SvgImage = (DevExpress.Utils.Svg.SvgImage)resources.GetObject("barBtnCalcCoordinate.ImageOptions.SvgImage");
+            barBtnCalcCoordinate.Name = "barBtnCalcCoordinate";
+            barBtnCalcCoordinate.ItemClick += BarBtnCalcCoordinate_ItemClick;
+            // 
+            // barCekSetAxisNameVisible
+            // 
+            barCekSetAxisNameVisible.BindableChecked = true;
+            barCekSetAxisNameVisible.Caption = "杞村悕绉�";
+            barCekSetAxisNameVisible.Checked = true;
+            barCekSetAxisNameVisible.Id = 15;
+            barCekSetAxisNameVisible.ImageOptions.SvgImage = (DevExpress.Utils.Svg.SvgImage)resources.GetObject("barCekSetAxisNameVisible.ImageOptions.SvgImage");
+            barCekSetAxisNameVisible.Name = "barCekSetAxisNameVisible";
+            barCekSetAxisNameVisible.CheckedChanged += barCekSetAxisNameVisible_CheckedChanged;
+            // 
+            // barCekLegendVisible
+            // 
+            barCekLegendVisible.Caption = "鍥句緥";
+            barCekLegendVisible.Id = 10;
+            barCekLegendVisible.ImageOptions.SvgImage = (DevExpress.Utils.Svg.SvgImage)resources.GetObject("barCekLegendVisible.ImageOptions.SvgImage");
+            barCekLegendVisible.Name = "barCekLegendVisible";
+            barCekLegendVisible.CheckedChanged += barCekLegendVisible_CheckedChanged;
+            // 
+            // barManager1
+            // 
+            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[] { barBtnSetChartAxis, barCekLegendVisible, barCekSetAxisNameVisible, barBtnCalcCoordinate, barCekChartEditMode });
+            barManager1.MaxItemId = 21;
+            // 
+            // barDockControlTop
+            // 
+            barDockControlTop.CausesValidation = false;
+            barDockControlTop.Dock = DockStyle.Top;
+            barDockControlTop.Location = new Point(0, 0);
+            barDockControlTop.Manager = barManager1;
+            barDockControlTop.Size = new Size(1023, 0);
+            // 
+            // barDockControlBottom
+            // 
+            barDockControlBottom.CausesValidation = false;
+            barDockControlBottom.Dock = DockStyle.Bottom;
+            barDockControlBottom.Location = new Point(0, 856);
+            barDockControlBottom.Manager = barManager1;
+            barDockControlBottom.Size = new Size(1023, 0);
+            // 
+            // barDockControlLeft
+            // 
+            barDockControlLeft.CausesValidation = false;
+            barDockControlLeft.Dock = DockStyle.Left;
+            barDockControlLeft.Location = new Point(0, 0);
+            barDockControlLeft.Manager = barManager1;
+            barDockControlLeft.Size = new Size(0, 856);
+            // 
+            // barDockControlRight
+            // 
+            barDockControlRight.CausesValidation = false;
+            barDockControlRight.Dock = DockStyle.Right;
+            barDockControlRight.Location = new Point(1023, 0);
+            barDockControlRight.Manager = barManager1;
+            barDockControlRight.Size = new Size(0, 856);
+            // 
+            // ValvePerform2dEditChart
+            // 
+            AutoScaleDimensions = new SizeF(10F, 22F);
+            AutoScaleMode = AutoScaleMode.Font;
+            Controls.Add(chartControl1);
+            Controls.Add(barDockControlLeft);
+            Controls.Add(barDockControlRight);
+            Controls.Add(barDockControlBottom);
+            Controls.Add(barDockControlTop);
+            Name = "ValvePerform2dEditChart";
+            Size = new Size(1023, 856);
+            ((System.ComponentModel.ISupportInitialize)textAnnotation1).EndInit();
+            ((System.ComponentModel.ISupportInitialize)xyDiagram1).EndInit();
+            ((System.ComponentModel.ISupportInitialize)splineSeriesView1).EndInit();
+            ((System.ComponentModel.ISupportInitialize)series1).EndInit();
+            ((System.ComponentModel.ISupportInitialize)pointSeriesView1).EndInit();
+            ((System.ComponentModel.ISupportInitialize)series2).EndInit();
+            ((System.ComponentModel.ISupportInitialize)chartControl1).EndInit();
+            ((System.ComponentModel.ISupportInitialize)popMenuChart).EndInit();
+            ((System.ComponentModel.ISupportInitialize)barManager1).EndInit();
+            ResumeLayout(false);
+            PerformLayout();
+        }
+
+        #endregion
+
+        private DevExpress.XtraCharts.ChartControl chartControl1;
+        private DevExpress.XtraBars.PopupMenu popMenuChart;
+        private DevExpress.XtraBars.BarManager barManager1;
+        private DevExpress.XtraBars.BarDockControl barDockControlTop;
+        private DevExpress.XtraBars.BarDockControl barDockControlBottom;
+        private DevExpress.XtraBars.BarDockControl barDockControlLeft;
+        private DevExpress.XtraBars.BarDockControl barDockControlRight;
+        private DevExpress.XtraBars.BarButtonItem barBtnSetChartAxis;
+        private DevExpress.XtraBars.BarCheckItem barCekLegendVisible;
+        private DevExpress.XtraBars.BarCheckItem barCekSetAxisNameVisible;
+        private DevExpress.XtraBars.BarButtonItem barBtnCalcCoordinate;
+        private DevExpress.XtraBars.BarCheckItem barCekChartEditMode;
+    }
+}
diff --git a/WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/04-chart-edit/TankPerform2dEditChart.cs b/WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/04-chart-edit/TankPerform2dEditChart.cs
new file mode 100644
index 0000000..ec247f6
--- /dev/null
+++ b/WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/04-chart-edit/TankPerform2dEditChart.cs
@@ -0,0 +1,513 @@
+锘縰sing DevExpress.Utils;
+using DevExpress.XtraCharts;
+using Yw.WinFrmUI.Phart;
+
+namespace HStation.WinFrmUI
+{
+    /// <summary>
+    ///
+    /// </summary>
+    public partial class TankPerform2dEditChart : DevExpress.XtraEditors.XtraUserControl
+    {
+        public TankPerform2dEditChart()
+        {
+            InitializeComponent();
+            InitialChart();
+            this.chartControl1.RuntimeHitTesting = true;
+        }
+
+        #region Private Variable
+
+        private XYDiagram _mainChartDiagram;
+        private AxisX _axisXQ;
+        private AxisY _axisYQL;
+
+        private Series _seriesCurveQL;
+        private Series _seriesPointQL;
+
+        private List<Yw.Geometry.Point2d> _def_pt_ql_list;
+
+        private List<Yw.Geometry.Point2d> _pt_ql_list;
+
+        private ValveCoordinate _coordinate_paras;
+        private bool _initial_data = false;
+
+        #endregion Private Variable
+
+        #region Public Evnet
+
+        public event Action<ValveCoordinate> OnCurveCoordinateChanged;
+
+        public event Action<List<Yw.Geometry.Point2d>> OnDefinePointChanged;
+
+        #endregion Public Evnet
+
+        #region Initial
+
+        /// <summary>
+        /// 鍒濆鍖栧浘琛�
+        /// </summary>
+        private void InitialChart()
+        {
+            this.chartControl1.SetChartDisplay();
+            this.chartControl1.Legend.Visibility = DevExpress.Utils.DefaultBoolean.False;
+            this.chartControl1.SeriesSelectionMode = SeriesSelectionMode.Point;
+            this.chartControl1.SelectionMode = ElementSelectionMode.Single;
+
+            _mainChartDiagram = (XYDiagram)chartControl1.Diagram;
+
+            _axisXQ = _mainChartDiagram.AxisX;
+            _axisXQ.SetAxisXQDisplay();
+            _axisYQL = _mainChartDiagram.AxisY;
+            _axisYQL.SetAxisYQLDisplay();
+
+            _seriesCurveQL = this.chartControl1.GetSeriesByName("SeriesCurveQL");
+            _seriesCurveQL.SetCurveQLDisplay();
+
+            _seriesPointQL = this.chartControl1.GetSeriesByName("SeriesPointQL");
+            _seriesPointQL.SetPointQLDisplay();
+
+            _axisXQ.Visibility = DefaultBoolean.False;
+            _axisXQ.GridLines.Visible = false;
+            _axisYQL.Visibility = DefaultBoolean.False;
+            _axisYQL.GridLines.Visible = false;
+
+            _seriesPointQL.Visible = false;
+
+            this.chartControl1.SetChartMonoColorDisplay();
+
+            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.KeyUp += new System.Windows.Forms.KeyEventHandler(this.chartControl1_KeyUp);
+        }
+
+        /// <summary>
+        /// 鍒濆鍖栧浘琛ㄦ暟鎹�
+        /// </summary>
+        public void InitialChartData()
+        {
+            _initial_data = false;
+
+            _pt_ql_list = null;
+
+            _def_pt_ql_list = null;
+
+            _coordinate_paras = null;
+
+            UpdateChart(false);
+        }
+
+        public void SetAxisTitle(string x, string y)
+        {
+            _axisXQ.Title.Text = x;
+            _axisYQL.Title.Text = y;
+        }
+
+        #endregion Initial
+
+        #region SetBindingData
+
+        /// <summary>
+        /// 缁戝畾鏁版嵁(鐩墠娌℃湁瀹氫箟鐐�)
+        /// </summary>
+        /// <param name="cubic_spline_ql"></param>
+        /// <param name="coordinate_paras"></param>
+        /// <param name="calc_coordinate"></param>
+        public void SetBindingData(Yw.Geometry.CubicSpline2d cubic_spline_ql,
+                                   string coordinate_paras = null,
+                                   bool calc_coordinate = false)
+        {
+            if (cubic_spline_ql == null)
+            {
+                InitialChartData();
+                return;
+            }
+
+            List<Yw.Geometry.Point2d> pt_ql_list;
+
+            pt_ql_list = cubic_spline_ql.GetPointList(12);
+
+            SetBindingData(pt_ql_list, pt_ql_list, coordinate_paras, calc_coordinate);
+        }
+
+        /// <summary>
+        /// 缁戝畾鏁版嵁
+        /// </summary>
+        /// <param name="pt_ql_list"></param>
+        /// <param name="def_pt_ql_list"></param>
+        /// <param name="coordinate_paras"></param>
+        /// <param name="calc_coordinate"></param>
+        public void SetBindingData(
+                    List<Yw.Geometry.Point2d> pt_ql_list,
+                    List<Yw.Geometry.Point2d> def_pt_ql_list,
+                    string coordinate_paras = null,
+                    bool calc_coordinate = false)
+        {
+            if (pt_ql_list == null || !pt_ql_list.Any())
+            {
+                InitialChartData();
+                return;
+            }
+            _initial_data = true;
+
+            _pt_ql_list = pt_ql_list;
+
+            _def_pt_ql_list = def_pt_ql_list;
+
+            _coordinate_paras = ValveCoordinate.ToModel(coordinate_paras);
+
+            UpdateChart(calc_coordinate);
+        }
+
+        #endregion SetBindingData
+
+        #region Update
+
+        /// <summary>
+        /// 鏇存柊鏇茬嚎
+        /// </summary>
+        /// <param name="curve_type"></param>
+        /// <param name="fit_point_list"></param>
+        public void UpdateCurve(List<Yw.Geometry.Point2d> fit_point_list)
+        {
+            if (fit_point_list == null || !fit_point_list.Any())
+                return;
+
+            _def_pt_ql_list = fit_point_list;
+            _pt_ql_list = fit_point_list.GetFitPointList();
+            _axisYQL.SetAxisYQLColorDisplay(_seriesCurveQL, _seriesPointQL, true);
+
+            UpdateChart(true);
+        }
+
+        /// <summary>
+        /// 鏇存柊鍥捐〃
+        /// </summary>
+        /// <param name="calc_coordinate">璁$畻鍧愭爣</param>
+        public void UpdateChart(bool calc_coordinate = false)
+        {
+            if (calc_coordinate || _coordinate_paras == null)
+            {
+                //涓嶅己杩绠�,灏辩敤涓婃鏇存柊鐨勫潗鏍囩郴
+                CalcCoordinate();
+            }
+
+            CalcChartAxis();
+
+            CalcSeries();
+        }
+
+        #endregion Update
+
+        #region Calc
+
+        /// <summary>
+        /// 璁$畻鍧愭爣
+        /// </summary>
+        public void CalcCoordinate()
+        {
+            if (_pt_ql_list == null || _pt_ql_list.Count < 4)
+            {
+                //璁剧疆鎴愮櫧鏉垮潗鏍�
+                _coordinate_paras = new ValveCoordinate();
+                _coordinate_paras.GridNumberX = 30;
+                _coordinate_paras.GridNumberY = 16;
+                //鏄剧ず鐨勫潗鏍囩嚎鍙�
+                _coordinate_paras.StartLineNoL = 10;
+                _coordinate_paras.EndLineNoL = 15;
+                //鍧愭爣鏈�灏忓�煎拰闂撮殧
+                _coordinate_paras.CoordMinQ = 0; _coordinate_paras.CoordSpaceQ = 1000;
+                _coordinate_paras.CoordMinL = 10; _coordinate_paras.CoordSpaceL = 100;
+                return;
+            }
+
+            _coordinate_paras = ValveCoordinate.CalcCoordinate(_pt_ql_list);
+        }
+
+        /// <summary>
+        /// 璁$畻鍥捐〃杞�
+        /// </summary>
+        public void CalcChartAxis()
+        {
+            if (_coordinate_paras == null)
+            {
+                _axisXQ.Visibility = DefaultBoolean.False;
+                _axisXQ.GridLines.Visible = false;
+                _axisYQL.Visibility = DefaultBoolean.False;
+                _axisYQL.GridLines.Visible = false;
+                return;
+            }
+
+            //娴侀噺
+            if (_pt_ql_list != null)
+            {
+                //璁$畻鍒诲害
+                var labels = new List<CustomAxisLabel>();
+                var disQ = _coordinate_paras.CoordMinQ;
+                for (int i = 0; i < _coordinate_paras.GridNumberX + 1; i++)
+                {
+                    labels.Add(new CustomAxisLabel(disQ.ToString("N0"), disQ));
+                    disQ = disQ + _coordinate_paras.CoordSpaceQ;
+                }
+
+                //鍧愭爣鍒诲害
+                _axisXQ.CustomLabels.Clear();
+                _axisXQ.CustomLabels.AddRange(labels.ToArray());
+                _axisXQ.Visibility = DefaultBoolean.True;
+                _axisXQ.GridLines.Visible = true;
+                _axisXQ.SetAxisRange(_coordinate_paras.CoordMinQ, _coordinate_paras.CoordMinQ + _coordinate_paras.GridNumberX * _coordinate_paras.CoordSpaceQ);
+            }
+
+            //姘存崯
+            if (_pt_ql_list != null)
+            {
+                //璁$畻鍒诲害
+                var labels = new List<CustomAxisLabel>();
+                var disH = _coordinate_paras.CoordMinL + _coordinate_paras.CoordSpaceL * _coordinate_paras.StartLineNoL;
+                for (int i = _coordinate_paras.StartLineNoL; i < _coordinate_paras.EndLineNoL + 1; i++)
+                {
+                    labels.Add(new CustomAxisLabel(disH.ToString(), disH));
+                    disH = disH + _coordinate_paras.CoordSpaceL;
+                }
+
+                _axisYQL.CustomLabels.Clear();
+                _axisYQL.CustomLabels.AddRange(labels.ToArray());
+                _axisYQL.Visibility = DefaultBoolean.True;
+                _axisYQL.GridLines.Visible = true;
+            }
+
+            _axisXQ.SetAxisRange(_coordinate_paras.CoordMinQ, _coordinate_paras.CoordMinQ + _coordinate_paras.GridNumberX * _coordinate_paras.CoordSpaceQ);
+            _axisYQL.SetAxisRange(_coordinate_paras.DispMinL(), _coordinate_paras.DispMaxL());
+        }
+
+        /// <summary>
+        /// 璁$畻绯诲垪
+        /// </summary>
+        public void CalcSeries()
+        {
+            if (_pt_ql_list != null && _pt_ql_list.Count > 3)
+            {
+                _seriesCurveQL.Visible = true;
+                _seriesCurveQL.Points.Clear();
+                foreach (var curvePoint in _pt_ql_list)
+                {
+                    var seriesPoint = new SeriesPoint(curvePoint.X, curvePoint.Y);
+                    _seriesCurveQL.Points.Add(seriesPoint);
+                }
+            }
+            else
+            {
+                _seriesCurveQL.Points.Clear();
+                _seriesCurveQL.Visible = false;
+            }
+
+            if (_def_pt_ql_list != null && _def_pt_ql_list.Any())
+            {
+                _seriesPointQL.Points.Clear();
+                for (int i = 0; i < _def_pt_ql_list.Count; i++)
+                {
+                    var definePoint = _def_pt_ql_list[i];
+                    var seriesPoint = new SeriesPoint(definePoint.X, definePoint.Y);
+                    seriesPoint.Tag = i;
+                    _seriesPointQL.Points.Add(seriesPoint);
+                }
+                _seriesPointQL.Visible = true;
+            }
+            else
+            {
+                _seriesPointQL.Visible = false;
+            }
+        }
+
+        #endregion Calc
+
+        #region ChartEvent
+
+        private bool _mouseMode = false;//榧犳爣妯″紡
+        private SeriesPoint _pickPoint = null;// 閫変腑鐐�
+
+        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.InSeriesPoint)
+                {
+                    //if ((int)hitInfo.Series.Tag != (int)_edit_curve_type)
+                    //{
+                    //    _pickPoint = null;
+                    //    return;
+                    //}
+                    _pickPoint = hitInfo.SeriesPoint;
+                }
+                else
+                {
+                    _pickPoint = null;
+                }
+            }
+            else if (e.Button == MouseButtons.Right)
+            {
+                _pickPoint = null;
+                this.popMenuChart.ShowPopup(MousePosition);
+            }
+        }
+
+        private void chartControl1_MouseMove(object sender, MouseEventArgs e)
+        {
+            if (!_initial_data)
+                return;
+            if (!_mouseMode)
+                return;
+            if (_pickPoint == null)
+                return;
+            var diagramCoordinates = _mainChartDiagram.PointToDiagram(e.Location);
+            var axisValue = diagramCoordinates.GetAxisValue(_axisYQL);
+            if (axisValue == null)
+                return;
+            _pickPoint.Values[0] = axisValue.NumericalValue;
+            _pickPoint.NumericalArgument = diagramCoordinates.NumericalArgument;
+        }
+
+        private void chartControl1_MouseUp(object sender, MouseEventArgs e)
+        {
+            if (!_initial_data)
+                return;
+            if (_mouseMode)
+            {
+                _pickPoint = null;
+                ChartUpdateCurve();
+            }
+        }
+
+        private void chartControl1_KeyUp(object sender, KeyEventArgs e)
+        {
+            if (!_initial_data)
+                return;
+            if (_pickPoint == null)
+                return;
+            double spaceX = _coordinate_paras.CoordSpaceQ / 50;
+            double spaceY = 0;
+
+            spaceY = _coordinate_paras.CoordSpaceL / 50;
+
+            double x = _pickPoint.NumericalArgument;
+            double y = _pickPoint.Values[0];
+            if (e.KeyCode == Keys.Up)
+            {
+                y += spaceY;
+            }
+            else if (e.KeyCode == Keys.Down)
+            {
+                y -= spaceY;
+            }
+            else if (e.KeyCode == Keys.Left)
+            {
+                x -= spaceX;
+            }
+            else if (e.KeyCode == Keys.Right)
+            {
+                x += spaceX;
+            }
+            _pickPoint.Values[0] = y;
+            _pickPoint.NumericalArgument = x;
+            ChartUpdateCurve();
+        }
+
+        /// <summary>
+        /// 鏇存柊鏇茬嚎
+        /// </summary>
+        private void ChartUpdateCurve()
+        {
+            _def_pt_ql_list = _seriesPointQL.Points.Select(x => new Yw.Geometry.Point2d(x.ArgumentX.NumericalArgument, x.NumericalValue)).ToList();
+            _pt_ql_list = _def_pt_ql_list.GetFitPointList();
+
+            _seriesCurveQL.Points.Clear();
+            foreach (var curvePoint in _pt_ql_list)
+            {
+                var seriesPoint = new SeriesPoint(curvePoint.X, curvePoint.Y);
+                _seriesCurveQL.Points.Add(seriesPoint);
+            }
+            OnDefinePointChanged?.Invoke(_def_pt_ql_list);
+
+            CalcChartAxis();
+        }
+
+        #endregion ChartEvent
+
+        #region Right Click Menu
+
+        #region Event
+
+        private void barCekChartEditMode_CheckedChanged(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
+        {
+            _mouseMode = this.barCekChartEditMode.Checked;
+            var text = "淇敼妯″紡:榧犳爣 / 閿洏鈽�";
+            if (_mouseMode)
+            {
+                text = "淇敼妯″紡:榧犳爣鈽� / 閿洏";
+            }
+            _mainChartDiagram.DefaultPane.Title.Text = text;
+        }
+
+        private void BarBtnCalcCoordinate_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
+        {
+            CalcCoordinate();
+            CalcChartAxis();
+        }
+
+        private void barCekLegendVisible_CheckedChanged(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
+        {
+            SetLegendVisible(this.barCekLegendVisible.Checked);
+        }
+
+        private void barCekSetAxisNameVisible_CheckedChanged(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
+        {
+            SetAxisNameVisible(this.barCekSetAxisNameVisible.Checked);
+        }
+
+        private void barBtnSetChartAxis_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
+        {
+            SetChartAxis();
+        }
+
+        #endregion Event
+
+        /// <summary>
+        /// 璁剧疆鍥句緥鏄剧ず
+        /// </summary>
+        public void SetLegendVisible(bool visible)
+        {
+            this.chartControl1.Legend.Visibility = visible ? DefaultBoolean.True : DefaultBoolean.False;
+        }
+
+        /// <summary>
+        /// 璁剧疆杞村悕绉版樉绀�
+        /// </summary>
+        public void SetAxisNameVisible(bool visible)
+        {
+            _axisXQ.Title.Visibility = visible ? DefaultBoolean.True : DefaultBoolean.False;
+            _axisYQL.Title.Visibility = visible ? DefaultBoolean.True : DefaultBoolean.False;
+        }
+
+        /// <summary>
+        /// 璁剧疆鍧愭爣杞�
+        /// </summary>
+        public void SetChartAxis()
+        {
+            var dlg = new ValveChartCoordinateDlg();
+            dlg.SetBindingData(_coordinate_paras);
+            dlg.OnChangedCoord += (rhs) =>
+            {
+                _coordinate_paras = rhs;
+                CalcChartAxis();
+                this.OnCurveCoordinateChanged?.Invoke(_coordinate_paras);
+            };
+            dlg.ShowDialog();
+        }
+
+        #endregion Right Click Menu
+    }
+}
\ No newline at end of file
diff --git a/WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/04-chart-edit/TankPerform2dEditChart.resx b/WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/04-chart-edit/TankPerform2dEditChart.resx
new file mode 100644
index 0000000..1713cde
--- /dev/null
+++ b/WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/04-chart-edit/TankPerform2dEditChart.resx
@@ -0,0 +1,244 @@
+锘�<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!--
+    Microsoft ResX Schema
+
+    Version 2.0
+
+    The primary goals of this format is to allow a simple XML format
+    that is mostly human readable. The generation and parsing of the
+    various data types are done through the TypeConverter classes
+    associated with the data types.
+
+    Example:
+
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+
+    There are any number of "resheader" rows that contain simple
+    name/value pairs.
+
+    Each data row contains a name, and value. The row also contains a
+    type or mimetype. Type corresponds to a .NET class that support
+    text/value conversion through the TypeConverter architecture.
+    Classes that don't support this are serialized and stored with the
+    mimetype set.
+
+    The mimetype is used for serialized objects, and tells the
+    ResXResourceReader how to depersist the object. This is currently not
+    extensible. For a given mimetype the value must be set accordingly:
+
+    Note - application/x-microsoft.net.object.binary.base64 is the format
+    that the ResXResourceWriter will generate, however the reader can
+    read any of the formats listed below.
+
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="popMenuChart.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>200, 17</value>
+  </metadata>
+  <assembly alias="DevExpress.Data.v23.2" name="DevExpress.Data.v23.2, Culture=neutral, PublicKeyToken=b88d1754d700e49a" />
+  <data name="barCekChartEditMode.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIzLjIsIFZlcnNpb249MjMuMi40
+        LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
+        dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAAJECAAAC77u/
+        PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi
+        IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv
+        MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh
+        Y2U9InByZXNlcnZlIiBpZD0iTGF5ZXJfMSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAg
+        MzIgMzIiPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLkJsYWNre2ZpbGw6IzczNzM3NDt9Cgku
+        WWVsbG93e2ZpbGw6I0ZDQjAxQjt9CgkuR3JlZW57ZmlsbDojMTI5QzQ5O30KCS5CbHVle2ZpbGw6IzM4
+        N0NCNzt9CgkuUmVke2ZpbGw6I0QwMjEyNzt9CgkuV2hpdGV7ZmlsbDojRkZGRkZGO30KCS5zdDB7b3Bh
+        Y2l0eTowLjU7fQoJLnN0MXtvcGFjaXR5OjAuNzU7fQoJLnN0MntvcGFjaXR5OjAuMjU7fQoJLnN0M3tk
+        aXNwbGF5Om5vbmU7ZmlsbDojNzM3Mzc0O30KPC9zdHlsZT4NCiAgPHBhdGggZD0iTTE4LjIsMjBIMjZM
+        MTAsNHYyMmw1LjMtNS4zbDIuNyw2LjdjMC4yLDAuNSwwLjgsMC44LDEuMywwLjVsMC45LTAuNGMwLjUt
+        MC4yLDAuOC0wLjgsMC41LTEuM0wxOC4yLDIweiIgY2xhc3M9IkJsYWNrIiAvPg0KPC9zdmc+Cw==
+</value>
+  </data>
+  <data name="barBtnSetChartAxis.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIzLjIsIFZlcnNpb249MjMuMi40
+        LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
+        dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAAKcEAAAC77u/
+        PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi
+        IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv
+        MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh
+        Y2U9InByZXNlcnZlIiBpZD0iTGF5ZXJfMSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAg
+        MzIgMzIiPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLlllbGxvd3tmaWxsOiNGRkIxMTU7fQoJ
+        LlJlZHtmaWxsOiNEMTFDMUM7fQoJLkJsYWNre2ZpbGw6IzcyNzI3Mjt9CgkuQmx1ZXtmaWxsOiMxMTc3
+        RDc7fQoJLldoaXRle2ZpbGw6I0ZGRkZGRjt9CgkuR3JlZW57ZmlsbDojMDM5QzIzO30KCS5zdDB7b3Bh
+        Y2l0eTowLjc1O30KCS5zdDF7b3BhY2l0eTowLjU7fQoJLnN0MntvcGFjaXR5OjAuMjU7fQoJLnN0M3tm
+        aWxsOiNGRkIxMTU7fQo8L3N0eWxlPg0KICA8ZyAvPg0KICA8ZyBpZD0iWC1BeGlzX1NldHRpbmdzIj4N
+        CiAgICA8cG9seWdvbiBwb2ludHM9IjQsMjYgNCwyIDIsMiAyLDI4IDYsMjggNiwzMCA4LDMwIDgsMjgg
+        MTIsMjggMTIsMzAgMTQsMzAgMTQsMjggMTgsMjggMTgsMzAgMjAsMzAgMjAsMjggMjQsMjggICAgMjQs
+        MzAgMjYsMzAgMjYsMjggMzAsMjggMzAsMjYgICIgY2xhc3M9IkJsYWNrIiAvPg0KICAgIDxwYXRoIGQ9
+        Ik0yOCwxNC40di0yLjhsLTMtMC42Yy0wLjMtMC44LTAuNS0xLjgtMS4xLTIuNWwxLjgtMi41bC0xLjkt
+        MS45TDIxLjMsNmMtMC43LTAuNC0xLjYtMC44LTIuNS0xbC0wLjQtM2gtMi44ICAgbC0wLjUsM2MtMC44
+        LDAuMy0xLjgsMC41LTIuNSwxbC0yLjUtMS44TDguMiw2LjFMMTAsOC42Yy0wLjQsMC43LTAuOCwxLjct
+        MS4xLDIuNUw2LDExLjZ2Mi44bDMsMC41YzAuMywwLjgsMC41LDEuOCwxLjEsMi41ICAgbC0xLjgsMi41
+        bDEuOSwxLjlsMi41LTEuOGMwLjcsMC40LDEuNiwwLjgsMi41LDFsMC40LDNoMi44bDAuNi0zYzAuOC0w
+        LjMsMS44LTAuNiwyLjUtMWwyLjUsMS44bDEuOS0xLjlMMjQsMTcuNCAgIGMwLjQtMC43LDAuOC0xLjYs
+        MS4xLTIuNUwyOCwxNC40eiBNMTcsMTZjLTEuNywwLTMtMS4zLTMtM3MxLjMtMywzLTNzMywxLjMsMywz
+        UzE4LjcsMTYsMTcsMTZ6IiBjbGFzcz0iQmx1ZSIgLz4NCiAgPC9nPg0KPC9zdmc+Cw==
+</value>
+  </data>
+  <data name="barBtnCalcCoordinate.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIzLjIsIFZlcnNpb249MjMuMi40
+        LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
+        dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAALMDAAAC77u/
+        PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi
+        IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv
+        MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh
+        Y2U9InByZXNlcnZlIiBpZD0iTGF5ZXJfMSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAg
+        MzIgMzIiPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLkJsdWV7ZmlsbDojMTE3N0Q3O30KCS5H
+        cmVlbntmaWxsOiMwMzlDMjM7fQoJLlllbGxvd3tmaWxsOiNGRkIxMTU7fQoJLkJsYWNre2ZpbGw6Izcy
+        NzI3Mjt9CgkuV2hpdGV7ZmlsbDojRkZGRkZGO30KCS5SZWR7ZmlsbDojRDExQzFDO30KCS5zdDB7b3Bh
+        Y2l0eTowLjc1O30KPC9zdHlsZT4NCiAgPGcgaWQ9IkNhbGN1bGF0b3IiPg0KICAgIDxwYXRoIGQ9Ik0y
+        OSwwSDE2djE0aDE0VjFDMzAsMC41LDI5LjUsMCwyOSwweiBNMjgsOEgxOFY2aDEwVjh6IiBjbGFzcz0i
+        QmxhY2siIC8+DQogICAgPHBhdGggZD0iTTAsMjljMCwwLjUsMC41LDEsMSwxaDEzVjE2SDBWMjl6IE0y
+        LjgsMjAuMmwxLjQtMS40TDcsMjEuNmwyLjgtMi44bDEuNCwxLjRMOC40LDIzbDIuOCwyLjhsLTEuNCwx
+        LjQgICBMNywyNC40bC0yLjgsMi44bC0xLjQtMS40TDUuNiwyM0wyLjgsMjAuMnoiIGNsYXNzPSJCbGFj
+        ayIgLz4NCiAgICA8cGF0aCBkPSJNMCwxdjEzaDE0VjBIMUMwLjUsMCwwLDAuNSwwLDF6IE0yLDZoNFYy
+        aDJ2NGg0djJIOHY0SDZWOEgyVjZ6IiBjbGFzcz0iQmxhY2siIC8+DQogICAgPHBhdGggZD0iTTE2LDE2
+        djE0aDEzYzAuNSwwLDEtMC41LDEtMVYxNkgxNnogTTI4LDI2SDE4di0yaDEwVjI2eiBNMjgsMjJIMTh2
+        LTJoMTBWMjJ6IiBjbGFzcz0iWWVsbG93IiAvPg0KICA8L2c+DQo8L3N2Zz4L
+</value>
+  </data>
+  <data name="barCekSetAxisNameVisible.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIzLjIsIFZlcnNpb249MjMuMi40
+        LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
+        dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAAEMEAAAC77u/
+        PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi
+        IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv
+        MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh
+        Y2U9InByZXNlcnZlIiBpZD0iVmVydGljYWxfVGl0bGUiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpu
+        ZXcgMCAwIDMyIDMyIj4NCiAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KCS5CbGFja3tmaWxsOiM3Mjcy
+        NzI7fQoJLlllbGxvd3tmaWxsOiNGRkIxMTU7fQoJLnN0MHtvcGFjaXR5OjAuNTt9Cjwvc3R5bGU+DQog
+        IDxwb2x5Z29uIHBvaW50cz0iMTQsMjggMTQsMiAxMiwyIDEyLDMwIDMyLDMwIDMyLDI4ICIgY2xhc3M9
+        IkJsYWNrIiAvPg0KICA8ZyBjbGFzcz0ic3QwIj4NCiAgICA8cG9seWdvbiBwb2ludHM9IjMwLDIgMTQs
+        MiAxNCw0IDMwLDQgMzAsMjggMzIsMjggMzIsNCAzMiwyICAiIGNsYXNzPSJCbGFjayIgLz4NCiAgPC9n
+        Pg0KICA8cGF0aCBkPSJNMTAsMTRINy41bC0wLjctMi4ySDMuMkwyLjUsMTRIMEwzLjcsNGgyLjdMMTAs
+        MTR6IE02LjMsMTBMNS4yLDYuN0M1LjEsNi40LDUsNi4xLDUsNS44SDUgIGMwLDAuMy0wLjEsMC42LTAu
+        MiwwLjlMMy43LDEwSDYuM3ogTTIsMjZWMTZoMy42YzEuMSwwLDIsMC4yLDIuNiwwLjZjMC42LDAuNCww
+        LjksMSwwLjksMS43YzAsMC41LTAuMiwxLTAuNSwxLjRzLTAuOCwwLjctMS40LDAuOCAgdjBjMC43LDAu
+        MSwxLjMsMC40LDEuNywwLjhzMC42LDEsMC42LDEuNmMwLDAuOS0wLjMsMS42LTEsMi4yQzcuOSwyNS43
+        LDcsMjYsNS44LDI2SDJ6IE00LjMsMTcuN1YyMGgxYzAuNSwwLDAuOC0wLjEsMS4xLTAuMyAgYzAuMy0w
+        LjIsMC40LTAuNSwwLjQtMC45YzAtMC43LTAuNS0xLjEtMS42LTEuMUg0LjN6IE00LjMsMjEuN3YyLjZo
+        MS4yYzAuNSwwLDAuOS0wLjEsMS4yLTAuNGMwLjMtMC4yLDAuNC0wLjYsMC40LTEgIGMwLTAuNC0wLjEt
+        MC43LTAuNC0wLjljLTAuMy0wLjItMC43LTAuMy0xLjItMC4zSDQuM3oiIGNsYXNzPSJZZWxsb3ciIC8+
+        DQo8L3N2Zz4L
+</value>
+  </data>
+  <data name="barCekLegendVisible.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIzLjIsIFZlcnNpb249MjMuMi40
+        LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
+        dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAALgDAAAC77u/
+        PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi
+        IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv
+        MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh
+        Y2U9InByZXNlcnZlIiBpZD0iTGF5ZXJfMSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAg
+        MzIgMzIiPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLlllbGxvd3tmaWxsOiNGRkIxMTU7fQoJ
+        LlJlZHtmaWxsOiNEMTFDMUM7fQoJLkJsYWNre2ZpbGw6IzcyNzI3Mjt9CgkuQmx1ZXtmaWxsOiMxMTc3
+        RDc7fQoJLldoaXRle2ZpbGw6I0ZGRkZGRjt9CgkuR3JlZW57ZmlsbDojMDM5QzIzO30KCS5zdDB7b3Bh
+        Y2l0eTowLjc1O30KCS5zdDF7b3BhY2l0eTowLjU7fQoJLnN0MntvcGFjaXR5OjAuMjU7fQoJLnN0M3tm
+        aWxsOiNGRkIxMTU7fQo8L3N0eWxlPg0KICA8ZyBpZD0iU2hvd0xlZ2VuZCI+DQogICAgPGcgY2xhc3M9
+        InN0MSI+DQogICAgICA8cG9seWdvbiBwb2ludHM9IjMwLDAgNCwwIDQsMiAzMCwyIDMwLDI4IDMyLDI4
+        IDMyLDIgMzIsMCAgICIgY2xhc3M9IkJsYWNrIiAvPg0KICAgIDwvZz4NCiAgICA8cmVjdCB4PSI2IiB5
+        PSI0IiB3aWR0aD0iNiIgaGVpZ2h0PSI2IiBjbGFzcz0iUmVkIiAvPg0KICAgIDxyZWN0IHg9IjYiIHk9
+        IjEyIiB3aWR0aD0iNiIgaGVpZ2h0PSI2IiBjbGFzcz0iQmx1ZSIgLz4NCiAgICA8cmVjdCB4PSI2IiB5
+        PSIyMCIgd2lkdGg9IjYiIGhlaWdodD0iNiIgY2xhc3M9IlllbGxvdyIgLz4NCiAgICA8cGF0aCBkPSJN
+        NCwyOFYwSDJ2MzBoMzB2LTJINHogTTI2LDhIMTZWNmgxMFY4eiBNMjYsMTRIMTZ2MmgxMFYxNHogTTI2
+        LDIySDE2djJoMTBWMjJ6IiBjbGFzcz0iQmxhY2siIC8+DQogIDwvZz4NCjwvc3ZnPgs=
+</value>
+  </data>
+  <metadata name="barManager1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+</root>
\ No newline at end of file
diff --git a/WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/04-chart-edit/TankPerform2dEditCtrl.Designer.cs b/WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/04-chart-edit/TankPerform2dEditCtrl.Designer.cs
new file mode 100644
index 0000000..1ed5d46
--- /dev/null
+++ b/WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/04-chart-edit/TankPerform2dEditCtrl.Designer.cs
@@ -0,0 +1,307 @@
+锘縩amespace HStation.WinFrmUI
+{
+    partial class TankPerform2dEditCtrl
+    {
+        /// <summary> 
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary> 
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Component Designer generated code
+
+        /// <summary> 
+        /// Required method for Designer support - do not modify 
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.components = new System.ComponentModel.Container();
+            DevExpress.XtraEditors.Controls.EditorButtonImageOptions editorButtonImageOptions1 = new DevExpress.XtraEditors.Controls.EditorButtonImageOptions();
+            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ValvePerform2dEditCtrl));
+            DevExpress.Utils.SerializableAppearanceObject serializableAppearanceObject1 = new DevExpress.Utils.SerializableAppearanceObject();
+            DevExpress.Utils.SerializableAppearanceObject serializableAppearanceObject2 = new DevExpress.Utils.SerializableAppearanceObject();
+            DevExpress.Utils.SerializableAppearanceObject serializableAppearanceObject3 = new DevExpress.Utils.SerializableAppearanceObject();
+            DevExpress.Utils.SerializableAppearanceObject serializableAppearanceObject4 = new DevExpress.Utils.SerializableAppearanceObject();
+            DevExpress.XtraEditors.Controls.EditorButtonImageOptions editorButtonImageOptions2 = new DevExpress.XtraEditors.Controls.EditorButtonImageOptions();
+            DevExpress.Utils.SerializableAppearanceObject serializableAppearanceObject5 = new DevExpress.Utils.SerializableAppearanceObject();
+            DevExpress.Utils.SerializableAppearanceObject serializableAppearanceObject6 = new DevExpress.Utils.SerializableAppearanceObject();
+            DevExpress.Utils.SerializableAppearanceObject serializableAppearanceObject7 = new DevExpress.Utils.SerializableAppearanceObject();
+            DevExpress.Utils.SerializableAppearanceObject serializableAppearanceObject8 = new DevExpress.Utils.SerializableAppearanceObject();
+            DevExpress.XtraEditors.Controls.EditorButtonImageOptions editorButtonImageOptions3 = new DevExpress.XtraEditors.Controls.EditorButtonImageOptions();
+            DevExpress.Utils.SerializableAppearanceObject serializableAppearanceObject9 = new DevExpress.Utils.SerializableAppearanceObject();
+            DevExpress.Utils.SerializableAppearanceObject serializableAppearanceObject10 = new DevExpress.Utils.SerializableAppearanceObject();
+            DevExpress.Utils.SerializableAppearanceObject serializableAppearanceObject11 = new DevExpress.Utils.SerializableAppearanceObject();
+            DevExpress.Utils.SerializableAppearanceObject serializableAppearanceObject12 = new DevExpress.Utils.SerializableAppearanceObject();
+            DevExpress.XtraEditors.Controls.EditorButtonImageOptions editorButtonImageOptions4 = new DevExpress.XtraEditors.Controls.EditorButtonImageOptions();
+            DevExpress.Utils.SerializableAppearanceObject serializableAppearanceObject13 = new DevExpress.Utils.SerializableAppearanceObject();
+            DevExpress.Utils.SerializableAppearanceObject serializableAppearanceObject14 = new DevExpress.Utils.SerializableAppearanceObject();
+            DevExpress.Utils.SerializableAppearanceObject serializableAppearanceObject15 = new DevExpress.Utils.SerializableAppearanceObject();
+            DevExpress.Utils.SerializableAppearanceObject serializableAppearanceObject16 = new DevExpress.Utils.SerializableAppearanceObject();
+            this.layoutControl1 = new DevExpress.XtraLayout.LayoutControl();
+            this.gridControl1 = new DevExpress.XtraGrid.GridControl();
+            this.bindingSource1 = new System.Windows.Forms.BindingSource(this.components);
+            this.gridView1 = new DevExpress.XtraGrid.Views.Grid.GridView();
+            this.colX = new DevExpress.XtraGrid.Columns.GridColumn();
+            this.colY = new DevExpress.XtraGrid.Columns.GridColumn();
+            this.cmbCurveType = new DevExpress.XtraEditors.ComboBoxEdit();
+            this.buttonEdit = new DevExpress.XtraEditors.ButtonEdit();
+            this.Root = new DevExpress.XtraLayout.LayoutControlGroup();
+            this.layoutControlGroup1 = new DevExpress.XtraLayout.LayoutControlGroup();
+            this.layoutControlItem2 = new DevExpress.XtraLayout.LayoutControlItem();
+            this.layoutControlGroup2 = new DevExpress.XtraLayout.LayoutControlGroup();
+            this.layoutControlItem3 = new DevExpress.XtraLayout.LayoutControlItem();
+            this.layoutControlItem1 = new DevExpress.XtraLayout.LayoutControlItem();
+            this.curveExpressEditChart = new  ValvePerform2dEditChart();
+            this.sidePanel1 = new DevExpress.XtraEditors.SidePanel();
+            ((System.ComponentModel.ISupportInitialize)(this.layoutControl1)).BeginInit();
+            this.layoutControl1.SuspendLayout();
+            ((System.ComponentModel.ISupportInitialize)(this.gridControl1)).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)(this.bindingSource1)).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)(this.gridView1)).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)(this.cmbCurveType.Properties)).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)(this.buttonEdit.Properties)).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)(this.Root)).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)(this.layoutControlGroup1)).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)(this.layoutControlItem2)).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)(this.layoutControlGroup2)).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)(this.layoutControlItem3)).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)(this.layoutControlItem1)).BeginInit();
+            this.sidePanel1.SuspendLayout();
+            this.SuspendLayout();
+            // 
+            // layoutControl1
+            // 
+            this.layoutControl1.Controls.Add(this.gridControl1);
+            this.layoutControl1.Controls.Add(this.cmbCurveType);
+            this.layoutControl1.Controls.Add(this.buttonEdit);
+            this.layoutControl1.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.layoutControl1.Location = new System.Drawing.Point(0, 0);
+            this.layoutControl1.Name = "layoutControl1";
+            this.layoutControl1.OptionsCustomizationForm.DesignTimeCustomizationFormPositionAndSize = new System.Drawing.Rectangle(1002, 504, 975, 600);
+            this.layoutControl1.Root = this.Root;
+            this.layoutControl1.Size = new System.Drawing.Size(285, 657);
+            this.layoutControl1.TabIndex = 0;
+            this.layoutControl1.Text = "layoutControl1";
+            // 
+            // gridControl1
+            // 
+            this.gridControl1.DataSource = this.bindingSource1;
+            this.gridControl1.Location = new System.Drawing.Point(0, 157);
+            this.gridControl1.MainView = this.gridView1;
+            this.gridControl1.Name = "gridControl1";
+            this.gridControl1.Size = new System.Drawing.Size(285, 500);
+            this.gridControl1.TabIndex = 6;
+            this.gridControl1.ViewCollection.AddRange(new DevExpress.XtraGrid.Views.Base.BaseView[] {
+            this.gridView1});
+            // 
+            // gridView1
+            // 
+            this.gridView1.BorderStyle = DevExpress.XtraEditors.Controls.BorderStyles.NoBorder;
+            this.gridView1.Columns.AddRange(new DevExpress.XtraGrid.Columns.GridColumn[] {
+            this.colX,
+            this.colY});
+            this.gridView1.GridControl = this.gridControl1;
+            this.gridView1.Name = "gridView1";
+            this.gridView1.CellValueChanged += new DevExpress.XtraGrid.Views.Base.CellValueChangedEventHandler(this.gridView1_CellValueChanged);
+            // 
+            // colX
+            // 
+            this.colX.Caption = "X";
+            this.colX.FieldName = "X";
+            this.colX.Name = "colX";
+            this.colX.OptionsColumn.AllowSort = DevExpress.Utils.DefaultBoolean.False;
+            this.colX.OptionsFilter.AllowAutoFilter = false;
+            this.colX.OptionsFilter.AllowFilter = false;
+            this.colX.Visible = true;
+            this.colX.VisibleIndex = 0;
+            // 
+            // colY
+            // 
+            this.colY.Caption = "Y";
+            this.colY.FieldName = "Y";
+            this.colY.Name = "colY";
+            this.colY.OptionsColumn.AllowSort = DevExpress.Utils.DefaultBoolean.False;
+            this.colY.OptionsFilter.AllowAutoFilter = false;
+            this.colY.OptionsFilter.AllowFilter = false;
+            this.colY.Visible = true;
+            this.colY.VisibleIndex = 1;
+            // 
+            // cmbCurveType
+            // 
+            this.cmbCurveType.Location = new System.Drawing.Point(12, 45);
+            this.cmbCurveType.Name = "cmbCurveType";
+            this.cmbCurveType.Properties.Appearance.Options.UseTextOptions = true;
+            this.cmbCurveType.Properties.Appearance.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center;
+            this.cmbCurveType.Properties.Buttons.AddRange(new DevExpress.XtraEditors.Controls.EditorButton[] {
+            new DevExpress.XtraEditors.Controls.EditorButton(DevExpress.XtraEditors.Controls.ButtonPredefines.Combo)});
+            this.cmbCurveType.Properties.TextEditStyle = DevExpress.XtraEditors.Controls.TextEditStyles.DisableTextEditor;
+            this.cmbCurveType.Size = new System.Drawing.Size(261, 28);
+            this.cmbCurveType.StyleController = this.layoutControl1;
+            this.cmbCurveType.TabIndex = 4; 
+            // 
+            // buttonEdit
+            // 
+            this.buttonEdit.Location = new System.Drawing.Point(0, 119);
+            this.buttonEdit.Name = "buttonEdit";
+            editorButtonImageOptions1.SvgImage = ((DevExpress.Utils.Svg.SvgImage)(resources.GetObject("editorButtonImageOptions1.SvgImage")));
+            editorButtonImageOptions1.SvgImageSize = new System.Drawing.Size(18, 18);
+            editorButtonImageOptions2.SvgImage = ((DevExpress.Utils.Svg.SvgImage)(resources.GetObject("editorButtonImageOptions2.SvgImage")));
+            editorButtonImageOptions2.SvgImageSize = new System.Drawing.Size(18, 18);
+            editorButtonImageOptions3.SvgImage = ((DevExpress.Utils.Svg.SvgImage)(resources.GetObject("editorButtonImageOptions3.SvgImage")));
+            editorButtonImageOptions3.SvgImageSize = new System.Drawing.Size(18, 18);
+            editorButtonImageOptions4.SvgImage = ((DevExpress.Utils.Svg.SvgImage)(resources.GetObject("editorButtonImageOptions4.SvgImage")));
+            editorButtonImageOptions4.SvgImageSize = new System.Drawing.Size(18, 18);
+            this.buttonEdit.Properties.Buttons.AddRange(new DevExpress.XtraEditors.Controls.EditorButton[] {
+            new DevExpress.XtraEditors.Controls.EditorButton(DevExpress.XtraEditors.Controls.ButtonPredefines.Glyph, "閲嶆柊璁$畻 ", -1, true, true, false, editorButtonImageOptions1, new DevExpress.Utils.KeyShortcut(System.Windows.Forms.Keys.None), serializableAppearanceObject1, serializableAppearanceObject2, serializableAppearanceObject3, serializableAppearanceObject4, "閲嶆柊璁$畻 ", "ReloadCalcu", null, DevExpress.Utils.ToolTipAnchor.Default),
+            new DevExpress.XtraEditors.Controls.EditorButton(DevExpress.XtraEditors.Controls.ButtonPredefines.Glyph, "鏂板鐐�", -1, true, true, false, editorButtonImageOptions2, new DevExpress.Utils.KeyShortcut(System.Windows.Forms.Keys.None), serializableAppearanceObject5, serializableAppearanceObject6, serializableAppearanceObject7, serializableAppearanceObject8, "鏂板鐐�", "InsertPoint", null, DevExpress.Utils.ToolTipAnchor.Default),
+            new DevExpress.XtraEditors.Controls.EditorButton(DevExpress.XtraEditors.Controls.ButtonPredefines.Glyph, "鍒犻櫎鐐�", -1, true, true, false, editorButtonImageOptions3, new DevExpress.Utils.KeyShortcut(System.Windows.Forms.Keys.None), serializableAppearanceObject9, serializableAppearanceObject10, serializableAppearanceObject11, serializableAppearanceObject12, "鍒犻櫎鐐�", "Delete", null, DevExpress.Utils.ToolTipAnchor.Default),
+            new DevExpress.XtraEditors.Controls.EditorButton(DevExpress.XtraEditors.Controls.ButtonPredefines.Glyph, "寤堕暱鏇茬嚎", -1, true, false, false, editorButtonImageOptions4, new DevExpress.Utils.KeyShortcut(System.Windows.Forms.Keys.None), serializableAppearanceObject13, serializableAppearanceObject14, serializableAppearanceObject15, serializableAppearanceObject16, "寤堕暱鏇茬嚎", "Extend", null, DevExpress.Utils.ToolTipAnchor.Default)});
+            this.buttonEdit.Properties.TextEditStyle = DevExpress.XtraEditors.Controls.TextEditStyles.HideTextEditor;
+            this.buttonEdit.Size = new System.Drawing.Size(285, 37);
+            this.buttonEdit.StyleController = this.layoutControl1;
+            this.buttonEdit.TabIndex = 5;
+            this.buttonEdit.ButtonClick += new DevExpress.XtraEditors.Controls.ButtonPressedEventHandler(this.buttonEdit_ButtonClick);
+            // 
+            // Root
+            // 
+            this.Root.EnableIndentsWithoutBorders = DevExpress.Utils.DefaultBoolean.True;
+            this.Root.GroupBordersVisible = false;
+            this.Root.Items.AddRange(new DevExpress.XtraLayout.BaseLayoutItem[] {
+            this.layoutControlGroup1,
+            this.layoutControlGroup2});
+            this.Root.Name = "Root";
+            this.Root.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
+            this.Root.Size = new System.Drawing.Size(285, 657);
+            this.Root.TextVisible = false;
+            // 
+            // layoutControlGroup1
+            // 
+            this.layoutControlGroup1.GroupStyle = DevExpress.Utils.GroupStyle.Title;
+            this.layoutControlGroup1.Items.AddRange(new DevExpress.XtraLayout.BaseLayoutItem[] {
+            this.layoutControlItem2});
+            this.layoutControlGroup1.Location = new System.Drawing.Point(0, 0);
+            this.layoutControlGroup1.Name = "layoutControlGroup1";
+            this.layoutControlGroup1.Size = new System.Drawing.Size(285, 85);
+            this.layoutControlGroup1.Spacing = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
+            this.layoutControlGroup1.Text = "鏇茬嚎淇℃伅";
+            // 
+            // layoutControlItem2
+            // 
+            this.layoutControlItem2.Control = this.cmbCurveType;
+            this.layoutControlItem2.Location = new System.Drawing.Point(0, 0);
+            this.layoutControlItem2.Name = "layoutControlItem2";
+            this.layoutControlItem2.Size = new System.Drawing.Size(265, 32);
+            this.layoutControlItem2.TextSize = new System.Drawing.Size(0, 0);
+            this.layoutControlItem2.TextVisible = false;
+            // 
+            // layoutControlGroup2
+            // 
+            this.layoutControlGroup2.GroupStyle = DevExpress.Utils.GroupStyle.Title;
+            this.layoutControlGroup2.Items.AddRange(new DevExpress.XtraLayout.BaseLayoutItem[] {
+            this.layoutControlItem3,
+            this.layoutControlItem1});
+            this.layoutControlGroup2.Location = new System.Drawing.Point(0, 85);
+            this.layoutControlGroup2.Name = "layoutControlGroup2";
+            this.layoutControlGroup2.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
+            this.layoutControlGroup2.Size = new System.Drawing.Size(285, 572);
+            this.layoutControlGroup2.Spacing = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
+            this.layoutControlGroup2.Text = "鏇茬嚎瀹氫箟鐐�";
+            // 
+            // layoutControlItem3
+            // 
+            this.layoutControlItem3.Control = this.gridControl1;
+            this.layoutControlItem3.Location = new System.Drawing.Point(0, 39);
+            this.layoutControlItem3.Name = "layoutControlItem3";
+            this.layoutControlItem3.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
+            this.layoutControlItem3.Size = new System.Drawing.Size(285, 500);
+            this.layoutControlItem3.TextSize = new System.Drawing.Size(0, 0);
+            this.layoutControlItem3.TextVisible = false;
+            // 
+            // layoutControlItem1
+            // 
+            this.layoutControlItem1.Control = this.buttonEdit;
+            this.layoutControlItem1.Location = new System.Drawing.Point(0, 0);
+            this.layoutControlItem1.Name = "layoutControlItem1";
+            this.layoutControlItem1.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 1, 1);
+            this.layoutControlItem1.Size = new System.Drawing.Size(285, 39);
+            this.layoutControlItem1.TextSize = new System.Drawing.Size(0, 0);
+            this.layoutControlItem1.TextVisible = false;
+            // 
+            // curveExpressEditChart
+            // 
+            this.curveExpressEditChart.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.curveExpressEditChart.Location = new System.Drawing.Point(286, 0);
+            this.curveExpressEditChart.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
+            this.curveExpressEditChart.Name = "curveExpressEditChart";
+            this.curveExpressEditChart.Size = new System.Drawing.Size(754, 657);
+            this.curveExpressEditChart.TabIndex = 0;
+            // 
+            // sidePanel1
+            // 
+            this.sidePanel1.Controls.Add(this.layoutControl1);
+            this.sidePanel1.Dock = System.Windows.Forms.DockStyle.Left;
+            this.sidePanel1.Location = new System.Drawing.Point(0, 0);
+            this.sidePanel1.Name = "sidePanel1";
+            this.sidePanel1.Size = new System.Drawing.Size(286, 657);
+            this.sidePanel1.TabIndex = 2;
+            this.sidePanel1.Text = "sidePanel1";
+            // 
+            // CurveExpressEditCtrl
+            // 
+            this.Appearance.BackColor = System.Drawing.SystemColors.Control;
+            this.Appearance.Options.UseBackColor = true;
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None;
+            this.Controls.Add(this.curveExpressEditChart);
+            this.Controls.Add(this.sidePanel1);
+            this.Name = "CurveExpressEditCtrl";
+            this.Size = new System.Drawing.Size(1040, 657);
+            ((System.ComponentModel.ISupportInitialize)(this.layoutControl1)).EndInit();
+            this.layoutControl1.ResumeLayout(false);
+            ((System.ComponentModel.ISupportInitialize)(this.gridControl1)).EndInit();
+            ((System.ComponentModel.ISupportInitialize)(this.bindingSource1)).EndInit();
+            ((System.ComponentModel.ISupportInitialize)(this.gridView1)).EndInit();
+            ((System.ComponentModel.ISupportInitialize)(this.cmbCurveType.Properties)).EndInit();
+            ((System.ComponentModel.ISupportInitialize)(this.buttonEdit.Properties)).EndInit();
+            ((System.ComponentModel.ISupportInitialize)(this.Root)).EndInit();
+            ((System.ComponentModel.ISupportInitialize)(this.layoutControlGroup1)).EndInit();
+            ((System.ComponentModel.ISupportInitialize)(this.layoutControlItem2)).EndInit();
+            ((System.ComponentModel.ISupportInitialize)(this.layoutControlGroup2)).EndInit();
+            ((System.ComponentModel.ISupportInitialize)(this.layoutControlItem3)).EndInit();
+            ((System.ComponentModel.ISupportInitialize)(this.layoutControlItem1)).EndInit();
+            this.sidePanel1.ResumeLayout(false);
+            this.ResumeLayout(false);
+
+        }
+
+        #endregion
+        private ValvePerform2dEditChart curveExpressEditChart;
+        private DevExpress.XtraLayout.LayoutControl layoutControl1;
+        private DevExpress.XtraLayout.LayoutControlGroup Root;
+        private DevExpress.XtraEditors.ComboBoxEdit cmbCurveType;
+        private DevExpress.XtraEditors.ButtonEdit buttonEdit;
+        private DevExpress.XtraLayout.LayoutControlItem layoutControlItem1;
+        private DevExpress.XtraGrid.GridControl gridControl1;
+        private DevExpress.XtraGrid.Views.Grid.GridView gridView1;
+        private DevExpress.XtraLayout.LayoutControlItem layoutControlItem3;
+        private DevExpress.XtraGrid.Columns.GridColumn colX;
+        private DevExpress.XtraGrid.Columns.GridColumn colY;
+        private System.Windows.Forms.BindingSource bindingSource1;
+        private DevExpress.XtraLayout.LayoutControlGroup layoutControlGroup1;
+        private DevExpress.XtraLayout.LayoutControlItem layoutControlItem2;
+        private DevExpress.XtraLayout.LayoutControlGroup layoutControlGroup2;
+        private DevExpress.XtraEditors.SidePanel sidePanel1;
+    }
+}
diff --git a/WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/04-chart-edit/TankPerform2dEditCtrl.cs b/WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/04-chart-edit/TankPerform2dEditCtrl.cs
new file mode 100644
index 0000000..09ad792
--- /dev/null
+++ b/WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/04-chart-edit/TankPerform2dEditCtrl.cs
@@ -0,0 +1,202 @@
+锘縰sing DevExpress.XtraEditors;
+using System.Data;
+using Yw.WinFrmUI.Phart;
+
+//缂栬緫鍘熷鐨勬�ц兘鏇茬嚎
+namespace HStation.WinFrmUI
+{
+    public partial class TankPerform2dEditCtrl : DevExpress.XtraEditors.XtraUserControl
+    {
+        public TankPerform2dEditCtrl()
+        {
+            InitializeComponent();
+
+            this.gridView1.SetNormalEditView();
+            this.gridView1.BorderStyle = DevExpress.XtraEditors.Controls.BorderStyles.NoBorder;
+
+            this.curveExpressEditChart.OnDefinePointChanged += FeatCurvesDispCtrl1_OnDefinePointChanged;
+        }
+
+        private List<Yw.Geometry.Point2d> _pt_ql_list = null;
+        private List<Yw.Geometry.Point2d> _fitCurvePoints = null;
+
+        public void SetAxisTile(string x, string y)
+        {
+            this.curveExpressEditChart.SetAxisTitle(x, y);
+        }
+
+        /// <summary>
+        /// 鍒濆鍖栨暟鎹�
+        /// </summary>
+        public void SetBindingData()
+        {
+            _pt_ql_list = null;
+
+            _fitCurvePoints = new List<Yw.Geometry.Point2d>();
+            this.bindingSource1.DataSource = _fitCurvePoints;
+        }
+
+        /// <summary>
+        /// 鍒濆鍖栨暟鎹�(鐩墠娌℃湁瀹氫箟鐐�)
+        /// </summary>
+        public void SetBindingData(Yw.Geometry.CubicSpline2d cubic_spline_ql)
+        {
+            if (cubic_spline_ql == null)
+                return;
+            List<Yw.Geometry.Point2d> pt_ql_list;
+
+            pt_ql_list = cubic_spline_ql.GetPointList(12);
+
+            SetBindingData(pt_ql_list, pt_ql_list);
+        }
+
+        /// <summary>
+        /// 鍒濆鍖栨暟鎹�
+        /// </summary>
+        public void SetBindingData(List<Yw.Geometry.Point2d> pt_ql_list,
+                    List<Yw.Geometry.Point2d> def_pt_ql_list)
+        {
+            _fitCurvePoints = new List<Yw.Geometry.Point2d>();
+            this.bindingSource1.DataSource = _fitCurvePoints;
+
+            _pt_ql_list = null;
+
+            if (pt_ql_list == null || pt_ql_list.Count < 4)
+            {
+                this.curveExpressEditChart.InitialChartData();
+                return;
+            }
+
+            _pt_ql_list = pt_ql_list;
+
+            this.cmbCurveType.Properties.Items.Clear();
+            this.cmbCurveType.Properties.Items.Add("寮�搴︽崯澶辨洸绾�");
+            this.cmbCurveType.SelectedIndex = 0;
+
+            this.curveExpressEditChart.SetBindingData(_pt_ql_list, def_pt_ql_list);
+
+            ReloadCurvePoints();
+        }
+
+        //鎬ц兘鏇茬嚎鐐逛慨鏀逛簨浠�
+        private void FeatCurvesDispCtrl1_OnDefinePointChanged(List<Yw.Geometry.Point2d> points)
+        {
+            _fitCurvePoints.Clear();
+            _pt_ql_list = points;
+            foreach (Yw.Geometry.Point2d pt in _pt_ql_list)
+            {
+                var x = Math.Round(pt.X, 2);
+                var y = Math.Round(pt.Y, 2);
+                _fitCurvePoints.Add(new Yw.Geometry.Point2d(x, y));
+            }
+            this.bindingSource1.ResetBindings(false);
+        }
+
+        //鍗曞厓鏍间慨鏀瑰悗瑙﹀彂
+        private void gridView1_CellValueChanged(object sender, DevExpress.XtraGrid.Views.Base.CellValueChangedEventArgs e)
+        {
+            _pt_ql_list = _fitCurvePoints.Select(x => new Yw.Geometry.Point2d(x)).ToList();
+            ReloadCurvePoints();
+        }
+
+        //鎸夐挳鐐瑰嚮浜嬩欢
+        private void buttonEdit_ButtonClick(object sender, DevExpress.XtraEditors.Controls.ButtonPressedEventArgs e)
+        {
+            if (e.Button.Tag == null)
+                return;
+            var tag = e.Button.Tag.ToString();
+            switch (tag)
+            {
+                case "Delete": DeletePoint(); break;
+                case "InsertPoint": InsertPoint(); break;
+                case "ReloadCalcu": ReloadCalcu(); break;
+            }
+        }
+
+        /// <summary>
+        /// 鍒锋柊鏁版嵁
+        /// </summary>
+        private void ReloadCurvePoints()
+        {
+            _fitCurvePoints.Clear();
+            foreach (Yw.Geometry.Point2d pt in _pt_ql_list)
+                _fitCurvePoints.Add(new Yw.Geometry.Point2d(pt.X, pt.Y));
+
+            var list = _fitCurvePoints?.Select(x => new Yw.Geometry.Point2d(x.X, x.Y)).ToList();
+            this.curveExpressEditChart.UpdateCurve(list);
+            this.bindingSource1.ResetBindings(false);
+        }
+
+        //鍒犻櫎鐐�
+        private void DeletePoint()
+        {
+            var row = this.gridView1.GetFocusedRow() as Yw.Geometry.Point2d;
+            if (row == null)
+                return;
+            if (XtraMessageBox.Show("鏄惁鍒犻櫎姝ょ偣锛�", "鎻愮ず淇℃伅", MessageBoxButtons.YesNo, MessageBoxIcon.Information) != DialogResult.Yes)
+                return;
+            _fitCurvePoints.Remove(row);
+            this.bindingSource1.ResetBindings(false);
+
+            var points = new List<Yw.Geometry.Point2d>();
+            foreach (var curvePoint in _fitCurvePoints)
+            {
+                var x = curvePoint.X;
+                var y = curvePoint.Y;
+                points.Add(new Yw.Geometry.Point2d(x, y));
+            }
+            _pt_ql_list = points;
+            this.curveExpressEditChart.UpdateCurve(points);
+        }
+
+        //鎻掑叆鐐�
+        private void InsertPoint()
+        {
+            var dlg = new InputXYDlg();
+            List<Yw.Geometry.Point2d> points = null;
+
+            dlg.SetLabelX("Q");
+            dlg.SetLabelY("L");
+            points = _pt_ql_list;
+
+            if (dlg.ShowDialog() != DialogResult.OK)
+                return;
+
+            points.Add(new Yw.Geometry.Point2d(dlg.X, dlg.Y));
+            ReloadCurvePoints();
+        }
+
+        //閲嶆柊璁$畻
+        private void ReloadCalcu()
+        {
+            if (_fitCurvePoints == null)
+                return;
+            ReloadCurvePoints();
+        }
+
+        /// <summary>
+        /// 璁剧疆鏇茬嚎鍧愭爣
+        /// </summary>
+        public void SetCoordinateByDialog()
+        {
+            this.curveExpressEditChart.SetChartAxis();
+        }
+
+        /// <summary>
+        /// 鑾峰彇鐐逛俊鎭�
+        /// </summary>
+        /// <param name="pt_ql_list"></param>
+        /// <returns></returns>
+        public bool GetPoints(out List<Yw.Geometry.Point2d> pt_ql_list)
+        {
+            pt_ql_list = _pt_ql_list?.ToList();
+            if (pt_ql_list == null || pt_ql_list.Count < 4)
+            {
+                XtraMessageBox.Show("鐐规暟杩囧皯!");
+                return false;
+            }
+
+            return true;
+        }
+    }
+}
\ No newline at end of file
diff --git a/WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/04-chart-edit/TankPerform2dEditCtrl.resx b/WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/04-chart-edit/TankPerform2dEditCtrl.resx
new file mode 100644
index 0000000..8e9a6de
--- /dev/null
+++ b/WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/04-chart-edit/TankPerform2dEditCtrl.resx
@@ -0,0 +1,204 @@
+锘�<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="bindingSource1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+  <assembly alias="DevExpress.Data.v22.2" name="DevExpress.Data.v22.2, Version=22.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" />
+  <data name="editorButtonImageOptions1.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v22.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIyLjIsIFZlcnNpb249MjIuMi40
+        LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
+        dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAALMDAAAC77u/
+        PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi
+        IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv
+        MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh
+        Y2U9InByZXNlcnZlIiBpZD0iTGF5ZXJfMSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAg
+        MzIgMzIiPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLkJsdWV7ZmlsbDojMTE3N0Q3O30KCS5H
+        cmVlbntmaWxsOiMwMzlDMjM7fQoJLlllbGxvd3tmaWxsOiNGRkIxMTU7fQoJLkJsYWNre2ZpbGw6Izcy
+        NzI3Mjt9CgkuV2hpdGV7ZmlsbDojRkZGRkZGO30KCS5SZWR7ZmlsbDojRDExQzFDO30KCS5zdDB7b3Bh
+        Y2l0eTowLjc1O30KPC9zdHlsZT4NCiAgPGcgaWQ9IkNhbGN1bGF0b3IiPg0KICAgIDxwYXRoIGQ9Ik0y
+        OSwwSDE2djE0aDE0VjFDMzAsMC41LDI5LjUsMCwyOSwweiBNMjgsOEgxOFY2aDEwVjh6IiBjbGFzcz0i
+        QmxhY2siIC8+DQogICAgPHBhdGggZD0iTTAsMjljMCwwLjUsMC41LDEsMSwxaDEzVjE2SDBWMjl6IE0y
+        LjgsMjAuMmwxLjQtMS40TDcsMjEuNmwyLjgtMi44bDEuNCwxLjRMOC40LDIzbDIuOCwyLjhsLTEuNCwx
+        LjQgICBMNywyNC40bC0yLjgsMi44bC0xLjQtMS40TDUuNiwyM0wyLjgsMjAuMnoiIGNsYXNzPSJCbGFj
+        ayIgLz4NCiAgICA8cGF0aCBkPSJNMCwxdjEzaDE0VjBIMUMwLjUsMCwwLDAuNSwwLDF6IE0yLDZoNFYy
+        aDJ2NGg0djJIOHY0SDZWOEgyVjZ6IiBjbGFzcz0iQmxhY2siIC8+DQogICAgPHBhdGggZD0iTTE2LDE2
+        djE0aDEzYzAuNSwwLDEtMC41LDEtMVYxNkgxNnogTTI4LDI2SDE4di0yaDEwVjI2eiBNMjgsMjJIMTh2
+        LTJoMTBWMjJ6IiBjbGFzcz0iWWVsbG93IiAvPg0KICA8L2c+DQo8L3N2Zz4L
+</value>
+  </data>
+  <data name="editorButtonImageOptions2.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v22.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIyLjIsIFZlcnNpb249MjIuMi40
+        LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
+        dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAAKcCAAAC77u/
+        PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi
+        IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv
+        MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh
+        Y2U9InByZXNlcnZlIiBpZD0iTGF5ZXJfMSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAg
+        MzIgMzIiPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLkJsdWV7ZmlsbDojMTE3N0Q3O30KCS5Z
+        ZWxsb3d7ZmlsbDojRkZCMTE1O30KCS5CbGFja3tmaWxsOiM3MjcyNzI7fQoJLkdyZWVue2ZpbGw6IzAz
+        OUMyMzt9CgkuUmVke2ZpbGw6I0QxMUMxQzt9Cgkuc3Qwe29wYWNpdHk6MC43NTt9Cgkuc3Qxe29wYWNp
+        dHk6MC41O30KPC9zdHlsZT4NCiAgPGcgaWQ9IkFkZCI+DQogICAgPHBhdGggZD0iTTI3LDE0aC05VjVj
+        MC0wLjUtMC41LTEtMS0xaC0yYy0wLjUsMC0xLDAuNS0xLDF2OUg1Yy0wLjUsMC0xLDAuNS0xLDF2MmMw
+        LDAuNSwwLjUsMSwxLDFoOXY5ICAgYzAsMC41LDAuNSwxLDEsMWgyYzAuNSwwLDEtMC41LDEtMXYtOWg5
+        YzAuNSwwLDEtMC41LDEtMXYtMkMyOCwxNC41LDI3LjUsMTQsMjcsMTR6IiBjbGFzcz0iR3JlZW4iIC8+
+        DQogIDwvZz4NCjwvc3ZnPgs=
+</value>
+  </data>
+  <data name="editorButtonImageOptions3.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v22.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIyLjIsIFZlcnNpb249MjIuMi40
+        LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
+        dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAAD0DAAAC77u/
+        PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi
+        IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv
+        MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh
+        Y2U9InByZXNlcnZlIiBpZD0iTGF5ZXJfMSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAg
+        MzIgMzIiPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLlJlZHtmaWxsOiNEMTFDMUM7fQoJLkJs
+        YWNre2ZpbGw6IzcyNzI3Mjt9CgkuQmx1ZXtmaWxsOiMxMTc3RDc7fQoJLkdyZWVue2ZpbGw6IzAzOUMy
+        Mzt9CgkuWWVsbG93e2ZpbGw6I0ZGQjExNTt9CgkuV2hpdGV7ZmlsbDojRkZGRkZGO30KCS5zdDB7b3Bh
+        Y2l0eTowLjU7fQoJLnN0MXtvcGFjaXR5OjAuNzU7fQo8L3N0eWxlPg0KICA8ZyBpZD0iRGVsZXRlIj4N
+        CiAgICA8Zz4NCiAgICAgIDxwYXRoIGQ9Ik0xOC44LDE2bDYuOS02LjljMC40LTAuNCwwLjQtMSwwLTEu
+        NGwtMS40LTEuNGMtMC40LTAuNC0xLTAuNC0xLjQsMEwxNiwxMy4yTDkuMSw2LjNjLTAuNC0wLjQtMS0w
+        LjQtMS40LDAgICAgTDYuMyw3LjdjLTAuNCwwLjQtMC40LDEsMCwxLjRsNi45LDYuOWwtNi45LDYuOWMt
+        MC40LDAuNC0wLjQsMSwwLDEuNGwxLjQsMS40YzAuNCwwLjQsMSwwLjQsMS40LDBsNi45LTYuOWw2Ljks
+        Ni45ICAgIGMwLjQsMC40LDEsMC40LDEuNCwwbDEuNC0xLjRjMC40LTAuNCwwLjQtMSwwLTEuNEwxOC44
+        LDE2eiIgY2xhc3M9IlJlZCIgLz4NCiAgICA8L2c+DQogIDwvZz4NCjwvc3ZnPgs=
+</value>
+  </data>
+  <data name="editorButtonImageOptions4.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v22.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIyLjIsIFZlcnNpb249MjIuMi40
+        LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
+        dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAACgCAAAC77u/
+        PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi
+        IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv
+        MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh
+        Y2U9InByZXNlcnZlIiBpZD0iRGF0YV9MYWJlbHNfTGluZV9DZW50ZXIiIHN0eWxlPSJlbmFibGUtYmFj
+        a2dyb3VuZDpuZXcgMCAwIDMyIDMyIj4NCiAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KCS5HcmVlbntm
+        aWxsOiMwMzlDMjM7fQoJLlllbGxvd3tmaWxsOiNGRkIxMTU7fQo8L3N0eWxlPg0KICA8cmVjdCB4PSI4
+        LjkiIHk9IjE1IiB3aWR0aD0iMTQuMSIgaGVpZ2h0PSIyIiBjbGFzcz0iWWVsbG93IiB0cmFuc2Zvcm09
+        Im1hdHJpeCgwLjcwNzEsIC0wLjcwNzEsIDAuNzA3MSwgMC43MDcxLCAtNi42Mjc0LCAxNikiIC8+DQog
+        IDxwYXRoIGQ9Ik0xMCwyNkg0di00aDZWMjZ6IE0yOCw2aC02djRoNlY2eiIgY2xhc3M9IkdyZWVuIiAv
+        Pg0KPC9zdmc+Cw==
+</value>
+  </data>
+</root>
\ No newline at end of file
diff --git a/WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/04-chart-edit/TankPerform2dEditDlg.Designer.cs b/WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/04-chart-edit/TankPerform2dEditDlg.Designer.cs
new file mode 100644
index 0000000..81c6e2f
--- /dev/null
+++ b/WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/04-chart-edit/TankPerform2dEditDlg.Designer.cs
@@ -0,0 +1,200 @@
+锘�
+namespace HStation.WinFrmUI
+{
+    partial class TankPerform2dEditDlg
+    {
+        /// <summary>
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary>
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Windows Form Designer generated code
+
+        /// <summary>
+        /// Required method for Designer support - do not modify
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.dataLayoutControl1 = new DevExpress.XtraDataLayout.DataLayoutControl();
+            this.curveExpressEditCtrl1 = new ValvePerform2dEditCtrl();
+            this.btnOk = new DevExpress.XtraEditors.SimpleButton();
+            this.btnCancel = new DevExpress.XtraEditors.SimpleButton();
+            this.Root = new DevExpress.XtraLayout.LayoutControlGroup();
+            this.layoutControlGroup1 = new DevExpress.XtraLayout.LayoutControlGroup();
+            this.layoutControlItem1 = new DevExpress.XtraLayout.LayoutControlItem();
+            this.layoutControlItem2 = new DevExpress.XtraLayout.LayoutControlItem();
+            this.emptySpaceItem1 = new DevExpress.XtraLayout.EmptySpaceItem();
+            this.layoutControlItem3 = new DevExpress.XtraLayout.LayoutControlItem();
+            ((System.ComponentModel.ISupportInitialize)(this.dataLayoutControl1)).BeginInit();
+            this.dataLayoutControl1.SuspendLayout();
+            ((System.ComponentModel.ISupportInitialize)(this.Root)).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)(this.layoutControlGroup1)).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)(this.layoutControlItem1)).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)(this.layoutControlItem2)).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)(this.emptySpaceItem1)).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)(this.layoutControlItem3)).BeginInit();
+            this.SuspendLayout();
+            // 
+            // dataLayoutControl1
+            // 
+            this.dataLayoutControl1.Controls.Add(this.curveExpressEditCtrl1);
+            this.dataLayoutControl1.Controls.Add(this.btnOk);
+            this.dataLayoutControl1.Controls.Add(this.btnCancel);
+            this.dataLayoutControl1.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.dataLayoutControl1.Location = new System.Drawing.Point(0, 0);
+            this.dataLayoutControl1.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
+            this.dataLayoutControl1.Name = "dataLayoutControl1";
+            this.dataLayoutControl1.OptionsCustomizationForm.DesignTimeCustomizationFormPositionAndSize = new System.Drawing.Rectangle(859, 142, 650, 400);
+            this.dataLayoutControl1.Root = this.Root;
+            this.dataLayoutControl1.Size = new System.Drawing.Size(1154, 885);
+            this.dataLayoutControl1.TabIndex = 0;
+            this.dataLayoutControl1.Text = "dataLayoutControl1";
+            // 
+            // curveExpressEditCtrl1
+            // 
+            this.curveExpressEditCtrl1.Appearance.BackColor = System.Drawing.SystemColors.Control;
+            this.curveExpressEditCtrl1.Appearance.Options.UseBackColor = true;
+            this.curveExpressEditCtrl1.Location = new System.Drawing.Point(2, 2);
+            this.curveExpressEditCtrl1.Name = "curveExpressEditCtrl1";
+            this.curveExpressEditCtrl1.Size = new System.Drawing.Size(1150, 845);
+            this.curveExpressEditCtrl1.TabIndex = 9;
+            // 
+            // btnOk
+            // 
+            this.btnOk.Appearance.BackColor = DevExpress.LookAndFeel.DXSkinColors.FillColors.Primary;
+            this.btnOk.Appearance.Options.UseBackColor = true;
+            this.btnOk.Location = new System.Drawing.Point(891, 851);
+            this.btnOk.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
+            this.btnOk.Name = "btnOk";
+            this.btnOk.Size = new System.Drawing.Size(128, 32);
+            this.btnOk.StyleController = this.dataLayoutControl1;
+            this.btnOk.TabIndex = 8;
+            this.btnOk.Text = "纭畾";
+            this.btnOk.Click += new System.EventHandler(this.btnOk_Click);
+            // 
+            // btnCancel
+            // 
+            this.btnCancel.Appearance.BackColor = DevExpress.LookAndFeel.DXSkinColors.FillColors.Warning;
+            this.btnCancel.Appearance.Options.UseBackColor = true;
+            this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+            this.btnCancel.Location = new System.Drawing.Point(1023, 851);
+            this.btnCancel.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
+            this.btnCancel.Name = "btnCancel";
+            this.btnCancel.Size = new System.Drawing.Size(129, 32);
+            this.btnCancel.StyleController = this.dataLayoutControl1;
+            this.btnCancel.TabIndex = 7;
+            this.btnCancel.Text = "鍙栨秷";
+            // 
+            // Root
+            // 
+            this.Root.AppearanceItemCaption.Options.UseTextOptions = true;
+            this.Root.AppearanceItemCaption.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Far;
+            this.Root.EnableIndentsWithoutBorders = DevExpress.Utils.DefaultBoolean.True;
+            this.Root.GroupBordersVisible = false;
+            this.Root.Items.AddRange(new DevExpress.XtraLayout.BaseLayoutItem[] {
+            this.layoutControlGroup1});
+            this.Root.Name = "Root";
+            this.Root.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
+            this.Root.Size = new System.Drawing.Size(1154, 885);
+            this.Root.TextVisible = false;
+            // 
+            // layoutControlGroup1
+            // 
+            this.layoutControlGroup1.AllowDrawBackground = false;
+            this.layoutControlGroup1.GroupBordersVisible = false;
+            this.layoutControlGroup1.Items.AddRange(new DevExpress.XtraLayout.BaseLayoutItem[] {
+            this.layoutControlItem1,
+            this.layoutControlItem2,
+            this.emptySpaceItem1,
+            this.layoutControlItem3});
+            this.layoutControlGroup1.Location = new System.Drawing.Point(0, 0);
+            this.layoutControlGroup1.Name = "autoGeneratedGroup0";
+            this.layoutControlGroup1.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
+            this.layoutControlGroup1.Size = new System.Drawing.Size(1154, 885);
+            this.layoutControlGroup1.Spacing = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
+            // 
+            // layoutControlItem1
+            // 
+            this.layoutControlItem1.Control = this.btnCancel;
+            this.layoutControlItem1.Location = new System.Drawing.Point(1021, 849);
+            this.layoutControlItem1.Name = "layoutControlItem1";
+            this.layoutControlItem1.Size = new System.Drawing.Size(133, 36);
+            this.layoutControlItem1.TextSize = new System.Drawing.Size(0, 0);
+            this.layoutControlItem1.TextVisible = false;
+            // 
+            // layoutControlItem2
+            // 
+            this.layoutControlItem2.Control = this.btnOk;
+            this.layoutControlItem2.Location = new System.Drawing.Point(889, 849);
+            this.layoutControlItem2.Name = "layoutControlItem2";
+            this.layoutControlItem2.Size = new System.Drawing.Size(132, 36);
+            this.layoutControlItem2.TextSize = new System.Drawing.Size(0, 0);
+            this.layoutControlItem2.TextVisible = false;
+            // 
+            // emptySpaceItem1
+            // 
+            this.emptySpaceItem1.AllowHotTrack = false;
+            this.emptySpaceItem1.Location = new System.Drawing.Point(0, 849);
+            this.emptySpaceItem1.Name = "emptySpaceItem1";
+            this.emptySpaceItem1.Size = new System.Drawing.Size(889, 36);
+            this.emptySpaceItem1.TextSize = new System.Drawing.Size(0, 0);
+            // 
+            // layoutControlItem3
+            // 
+            this.layoutControlItem3.Control = this.curveExpressEditCtrl1;
+            this.layoutControlItem3.Location = new System.Drawing.Point(0, 0);
+            this.layoutControlItem3.Name = "layoutControlItem3";
+            this.layoutControlItem3.Size = new System.Drawing.Size(1154, 849);
+            this.layoutControlItem3.TextSize = new System.Drawing.Size(0, 0);
+            this.layoutControlItem3.TextVisible = false;
+            // 
+            // EditCurveExpressDlg
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(10F, 22F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.ClientSize = new System.Drawing.Size(1154, 885);
+            this.Controls.Add(this.dataLayoutControl1);
+            this.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
+            this.Name = "EditCurveExpressDlg";
+            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+            this.Text = "鏇茬嚎缂栬緫";
+            ((System.ComponentModel.ISupportInitialize)(this.dataLayoutControl1)).EndInit();
+            this.dataLayoutControl1.ResumeLayout(false);
+            ((System.ComponentModel.ISupportInitialize)(this.Root)).EndInit();
+            ((System.ComponentModel.ISupportInitialize)(this.layoutControlGroup1)).EndInit();
+            ((System.ComponentModel.ISupportInitialize)(this.layoutControlItem1)).EndInit();
+            ((System.ComponentModel.ISupportInitialize)(this.layoutControlItem2)).EndInit();
+            ((System.ComponentModel.ISupportInitialize)(this.emptySpaceItem1)).EndInit();
+            ((System.ComponentModel.ISupportInitialize)(this.layoutControlItem3)).EndInit();
+            this.ResumeLayout(false);
+
+        }
+
+        #endregion
+
+        private DevExpress.XtraDataLayout.DataLayoutControl dataLayoutControl1;
+        private DevExpress.XtraLayout.LayoutControlGroup Root;
+        private DevExpress.XtraEditors.SimpleButton btnOk;
+        private DevExpress.XtraEditors.SimpleButton btnCancel;
+        private DevExpress.XtraLayout.LayoutControlGroup layoutControlGroup1;
+        private DevExpress.XtraLayout.LayoutControlItem layoutControlItem1;
+        private DevExpress.XtraLayout.LayoutControlItem layoutControlItem2;
+        private DevExpress.XtraLayout.EmptySpaceItem emptySpaceItem1;
+        private ValvePerform2dEditCtrl curveExpressEditCtrl1;
+        private DevExpress.XtraLayout.LayoutControlItem layoutControlItem3;
+    }
+}
\ No newline at end of file
diff --git a/WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/04-chart-edit/TankPerform2dEditDlg.cs b/WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/04-chart-edit/TankPerform2dEditDlg.cs
new file mode 100644
index 0000000..b6f2f7b
--- /dev/null
+++ b/WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/04-chart-edit/TankPerform2dEditDlg.cs
@@ -0,0 +1,66 @@
+锘縰sing DevExpress.XtraEditors;
+
+namespace HStation.WinFrmUI
+{
+    public partial class TankPerform2dEditDlg : XtraForm
+    {
+        public TankPerform2dEditDlg()
+        {
+            InitializeComponent();
+        }
+
+        /// <summary>
+        /// 鍥炶皟浜嬩欢
+        /// </summary>
+        public event Func<Yw.Geometry.CubicSpline2d, Task<bool>> ReloadDataEvent;
+
+        /// <summary>
+        /// 鍒濆鍖栨暟鎹�
+        /// </summary>
+        public void SetBindingData(Yw.Geometry.CubicSpline2d ql)
+        {
+            if (ql == null)
+            {
+                return;
+            }
+
+            this.curveExpressEditCtrl1.SetBindingData(ql);
+        }
+
+        public void SetAxisTile(string x, string y)
+        {
+            this.curveExpressEditCtrl1.SetAxisTile(x, y);
+        }
+
+        /// <summary>
+        /// 缁戝畾鏁版嵁
+        /// </summary>
+        public void SetBindingData(List<Yw.Geometry.Point2d> pt_ql_list,
+                    List<Yw.Geometry.Point2d> def_pt_ql_list)
+        {
+            this.curveExpressEditCtrl1.SetBindingData(pt_ql_list, def_pt_ql_list);
+        }
+
+        //纭畾
+        private async void btnOk_Click(object sender, EventArgs e)
+        {
+            var bol = this.curveExpressEditCtrl1.GetPoints(
+                out List<Yw.Geometry.Point2d> pt_ql_list);
+            if (!bol)
+            {
+                return;
+            }
+
+            var cubic_spline_ql = new Yw.Geometry.CubicSpline2d(pt_ql_list);
+            var result = await this.ReloadDataEvent?.Invoke(cubic_spline_ql);
+            if (!result)
+            {
+                XtraMessageBox.Show("鏇存柊澶辫触锛�");
+                return;
+            }
+            XtraMessageBox.Show("鏇存柊鎴愬姛锛�");
+            this.DialogResult = DialogResult.OK;
+            this.Close();
+        }
+    }
+}
\ No newline at end of file
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/01-matching/02-pump/01-pumpsinglematching/PumpMatchingDlg.resx b/WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/04-chart-edit/TankPerform2dEditDlg.resx
similarity index 72%
copy from WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/01-matching/02-pump/01-pumpsinglematching/PumpMatchingDlg.resx
copy to WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/04-chart-edit/TankPerform2dEditDlg.resx
index 59f029d..1af7de1 100644
--- a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/01-matching/02-pump/01-pumpsinglematching/PumpMatchingDlg.resx
+++ b/WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/04-chart-edit/TankPerform2dEditDlg.resx
@@ -1,17 +1,17 @@
 锘�<?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
+    
+    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>
@@ -26,36 +26,36 @@
         <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
+                
+    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
+    
+    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
+    
+    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
+    
+    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
+    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
+    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
+    value   : The object must be serialized into a byte array 
             : using a System.ComponentModel.TypeConverter
             : and then encoded with base64 encoding.
     -->
@@ -117,24 +117,4 @@
   <resheader name="writer">
     <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </resheader>
-  <assembly alias="DevExpress.Data.v23.2" name="DevExpress.Data.v23.2, Culture=neutral, PublicKeyToken=b88d1754d700e49a" />
-  <data name="barBtnOK.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
-    <value>
-        AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIzLjIsIFZlcnNpb249MjMuMi40
-        LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
-        dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAAMICAAAC77u/
-        PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi
-        IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv
-        MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh
-        Y2U9InByZXNlcnZlIiBpZD0iTGF5ZXJfMSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAg
-        MzIgMzIiPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLkJsYWNre2ZpbGw6IzczNzM3NDt9Cgku
-        WWVsbG93e2ZpbGw6I0ZDQjAxQjt9CgkuR3JlZW57ZmlsbDojMTI5QzQ5O30KCS5CbHVle2ZpbGw6IzM4
-        N0NCNzt9CgkuUmVke2ZpbGw6I0QwMjEyNzt9CgkuV2hpdGV7ZmlsbDojRkZGRkZGO30KCS5zdDB7b3Bh
-        Y2l0eTowLjU7fQoJLnN0MXtvcGFjaXR5OjAuNzU7fQoJLnN0MntvcGFjaXR5OjAuMjU7fQoJLnN0M3tk
-        aXNwbGF5Om5vbmU7ZmlsbDojNzM3Mzc0O30KPC9zdHlsZT4NCiAgPHBhdGggZD0iTTI3LDRoLTN2MTBI
-        OFY0SDVDNC40LDQsNCw0LjQsNCw1djIyYzAsMC42LDAuNCwxLDEsMWgyMmMwLjYsMCwxLTAuNCwxLTFW
-        NUMyOCw0LjQsMjcuNiw0LDI3LDR6IE0yNCwyNEg4di02ICBoMTZWMjR6IE0xMCw0djhoMTBWNEgxMHog
-        TTE0LDEwaC0yVjZoMlYxMHoiIGNsYXNzPSJCbGFjayIgLz4NCjwvc3ZnPgs=
-</value>
-  </data>
 </root>
\ No newline at end of file
diff --git a/WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/05-import/01-excel/ImportTankPerform2dByExcelCtrl.cs b/WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/05-import/01-excel/ImportTankPerform2dByExcelCtrl.cs
new file mode 100644
index 0000000..b845b19
--- /dev/null
+++ b/WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/05-import/01-excel/ImportTankPerform2dByExcelCtrl.cs
@@ -0,0 +1,258 @@
+锘縰sing DevExpress.XtraEditors;
+using NPOI.HSSF.UserModel;
+using System.IO;
+
+//缂栬緫鍘熷鐨勬�ц兘鏇茬嚎
+namespace HStation.WinFrmUI
+{
+    public partial class ImportTankPerform2dByExcelCtrl : DevExpress.XtraEditors.XtraUserControl
+    {
+        public ImportTankPerform2dByExcelCtrl()
+        {
+            InitializeComponent();
+
+            this.gridView1.SetDefaultEditView();
+            this.gridView1.BorderStyle = DevExpress.XtraEditors.Controls.BorderStyles.NoBorder;
+
+            _allBindList = new List<CurrentViewModel>();
+            this.bindingSource1.DataSource = _allBindList;
+        }
+
+        #region CurrentViewModel
+
+        public class CurrentViewModel
+        {
+            public enum eSortType
+            {
+                ID,
+                Q,
+                L
+            }
+
+            public CurrentViewModel()
+            { }
+
+            public CurrentViewModel(int id, double q, double l)
+            {
+                ID = id;
+                Q = q;
+                L = l;
+            }
+
+            public CurrentViewModel(CurrentViewModel rhs) : this(rhs.ID, rhs.Q, rhs.L)
+            {
+            }
+
+            public int ID { get; set; }
+            public double Q { get; set; }
+            public double L { get; set; }
+
+            public CurrentViewModel RoundAll(int decimals)
+            {
+                Q = Math.Round(Q, decimals);
+                L = Math.Round(L, decimals);
+                return this;
+            }
+
+            public CurrentViewModel RoundAll_Small(int decimal_places, double small = 2.0)
+            {
+                Q = Round_Small(Q, decimal_places, small);
+                L = Round_Small(L, decimal_places, small);
+                return this;
+            }
+
+            private double Round_Small(double value, int num, double small = 2.0)
+            {
+                if (value < small)
+                    value = Math.Round(value, 3);
+                else
+                    value = Math.Round(value, num);
+                return value;
+            }
+        }
+
+        #endregion CurrentViewModel
+
+        public void SetBindingData(string x, string y)
+        {
+            xtrPerform2dChart1.SetAxisTitle(x, y);
+        }
+
+        private List<CurrentViewModel> _allBindList;
+
+        private Yw.Geometry.CubicSpline2d
+            _cubic_spline_ql = null;
+
+        private List<Yw.Geometry.Point2d>
+            _pt_ql_list = null;
+
+        //閫夋嫨Excel鏂囦欢
+        private void btnExcelFilePath_ButtonClick(object sender, DevExpress.XtraEditors.Controls.ButtonPressedEventArgs e)
+        {
+            var dlg = new System.Windows.Forms.OpenFileDialog();
+            dlg.Filter = "EXCEL 鏂囦欢(*.xls)|*.xls";
+            dlg.CheckFileExists = true;
+            if (dlg.ShowDialog() != System.Windows.Forms.DialogResult.OK)
+                return;
+            this.btnExcelFilePath.Text = dlg.FileName;
+            LoadExcel(dlg.FileName);
+        }
+
+        //鍒嗘瀽鏂囦欢
+        private void LoadExcel(string fileName)
+        {
+            if (string.IsNullOrEmpty(fileName))
+            {
+                XtraMessageBox.Show("璺緞鏃犳晥!");
+                return;
+            }
+            int line = 0;
+            //try
+            //{
+            //鍒濆鍖栨枃浠�
+            HSSFWorkbook theBook = null;
+            using (FileStream file = new FileStream(fileName, FileMode.Open, FileAccess.Read))
+            {
+                theBook = new HSSFWorkbook(file);
+            }
+
+            //妫�鏌ヨ〃鏍兼槸鍚︾鍚�
+            NPOI.SS.UserModel.ISheet sheet1 = theBook.GetSheet("Sheet1");
+            if (sheet1 == null)
+            {
+                sheet1 = theBook.GetSheetAt(0);
+                if (sheet1 == null)
+                {
+                    XtraMessageBox.Show("璇峰皢鏁版嵁鏀惧湪Sheet1涓�");
+                    return;
+                }
+            }
+
+            //鏍囬琛�
+            int title_line_index = 0;
+            //娴侀噺鍒�
+            int col_index_q = 1;
+            //姘存崯鍒�
+            int col_index_l = 2;
+
+            var row_title = sheet1.GetRow(title_line_index);
+            if (row_title == null)
+            {
+                XtraMessageBox.Show("绗竴琛岀涓�鍒椾笉鑳界┖,");
+                return;
+            }
+
+            //寮�濮嬭鍙栫殑琛�
+            int start_line = title_line_index + 1;
+            var cell_0 = row_title.GetCell(0);
+            if (cell_0 == null)
+            {
+                XtraMessageBox.Show("鏃犳硶璇诲彇琛ㄥご鏂囦欢");
+                return;
+            }
+            else if (cell_0.StringCellValue.Contains("搴忓彿"))
+            {
+                col_index_q = 1;
+                col_index_l = 2;
+            }
+            else if (cell_0.StringCellValue.Contains("娴侀噺"))
+            {
+                col_index_q = 0;
+                col_index_l = 1;
+            }
+
+            _allBindList.Clear();
+
+            double q, l;
+            NPOI.SS.UserModel.IRow rowtemp = null;
+            NPOI.SS.UserModel.ICell cell;
+
+            var index = 1;
+            for (line = start_line; line < 1000; line++)
+            {
+                q = l = -1;
+                rowtemp = sheet1.GetRow(line);
+                if (rowtemp == null)
+                    break;
+
+                cell = rowtemp.GetCell(col_index_q);
+                if (cell == null)
+                    break;
+                if (cell.CellType == NPOI.SS.UserModel.CellType.Numeric)
+                    q = cell.NumericCellValue;
+                else if (cell.CellType == NPOI.SS.UserModel.CellType.String)
+                    q = Convert.ToDouble(cell.StringCellValue);
+                else
+                    continue;
+
+                if (q < 0)
+                    break;
+
+                cell = rowtemp.GetCell(col_index_l);
+                if (cell == null)
+                    break;
+                if (cell.CellType == NPOI.SS.UserModel.CellType.Numeric)
+                    l = cell.NumericCellValue;
+                else if (cell.CellType == NPOI.SS.UserModel.CellType.String)
+                    l = Convert.ToDouble(cell.StringCellValue);
+                else if (cell.CellType == NPOI.SS.UserModel.CellType.Blank)
+                    break;
+                if (l < 0)
+                    break;
+
+                _allBindList.Add(new CurrentViewModel(index++, q, l));
+            }
+
+            if (_allBindList.Count < 4)
+            {
+                this.xtrPerform2dChart1.InitialChartData();
+                XtraMessageBox.Show("瀵煎叆鐐硅繃灏�,璇锋墜鍔ㄦ坊鍔犵偣,鐐规暟鑷冲皯4涓偣");
+                return;
+            }
+            this.bindingSource1.ResetBindings(false);
+            loadChart();
+            //}
+            //catch (Exception err)
+            //{
+            //    XtraMessageBox.Show(string.Format("璇诲彇Excel鍑洪敊!閿欒鍘熷洜锛歿0},琛屽彿: {1}", err.Message, line), "鎻愮ず淇℃伅",
+            //        System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Information);
+            //}
+        }
+
+        //鍔犺浇鏇茬嚎
+        private bool loadChart()
+        {
+            if (_allBindList == null || _allBindList.Count < 4)
+            {
+                this.xtrPerform2dChart1.InitialChartData();
+                return false;
+            }
+
+            _pt_ql_list = new List<Yw.Geometry.Point2d>();
+            for (int i = 0; i < _allBindList.Count; i++)
+            {
+                var model = _allBindList[i];
+                if (model.L > 0)
+                    _pt_ql_list.Add(new Yw.Geometry.Point2d() { X = model.Q, Y = model.L });
+            }
+
+            _cubic_spline_ql = new Yw.Geometry.CubicSpline2d(_pt_ql_list);
+            this.xtrPerform2dChart1.SetBindingData(_cubic_spline_ql.ToDbString(), string.Empty, true);
+            return true;
+        }
+
+        /// <summary>
+        /// 鑾峰彇鏁版嵁
+        /// </summary>
+        /// <returns></returns>
+        public bool Get(out List<Yw.Geometry.Point2d> pt_list)
+        {
+            pt_list = null;
+
+            if (!loadChart())
+                return false;
+            pt_list = _pt_ql_list;
+            return true;
+        }
+    }
+}
\ No newline at end of file
diff --git a/WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/05-import/01-excel/ImportTankPerform2dByExcelCtrl.designer.cs b/WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/05-import/01-excel/ImportTankPerform2dByExcelCtrl.designer.cs
new file mode 100644
index 0000000..f90ded9
--- /dev/null
+++ b/WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/05-import/01-excel/ImportTankPerform2dByExcelCtrl.designer.cs
@@ -0,0 +1,279 @@
+锘縰sing Yw.WinFrmUI.Phart;
+
+namespace HStation.WinFrmUI
+{
+    partial class ImportTankPerform2dByExcelCtrl
+    {
+        /// <summary> 
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary> 
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Component Designer generated code
+
+        /// <summary> 
+        /// Required method for Designer support - do not modify 
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            components = new System.ComponentModel.Container();
+            DevExpress.XtraEditors.Controls.EditorButtonImageOptions editorButtonImageOptions2 = new DevExpress.XtraEditors.Controls.EditorButtonImageOptions();
+            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ImportTankPerform2dByExcelCtrl));
+            DevExpress.Utils.SerializableAppearanceObject serializableAppearanceObject5 = new DevExpress.Utils.SerializableAppearanceObject();
+            DevExpress.Utils.SerializableAppearanceObject serializableAppearanceObject6 = new DevExpress.Utils.SerializableAppearanceObject();
+            DevExpress.Utils.SerializableAppearanceObject serializableAppearanceObject7 = new DevExpress.Utils.SerializableAppearanceObject();
+            DevExpress.Utils.SerializableAppearanceObject serializableAppearanceObject8 = new DevExpress.Utils.SerializableAppearanceObject();
+            layoutControl1 = new DevExpress.XtraLayout.LayoutControl();
+            gridControl1 = new DevExpress.XtraGrid.GridControl();
+            bindingSource1 = new BindingSource(components);
+            gridView1 = new DevExpress.XtraGrid.Views.Grid.GridView();
+            colID = new DevExpress.XtraGrid.Columns.GridColumn();
+            colQ = new DevExpress.XtraGrid.Columns.GridColumn();
+            colL = new DevExpress.XtraGrid.Columns.GridColumn();
+            btnExcelFilePath = new DevExpress.XtraEditors.ButtonEdit();
+            txtCurveCode = new DevExpress.XtraEditors.TextEdit();
+            Root = new DevExpress.XtraLayout.LayoutControlGroup();
+            layoutControlGroup1 = new DevExpress.XtraLayout.LayoutControlGroup();
+            layoutControlItem6 = new DevExpress.XtraLayout.LayoutControlItem();
+            layoutControlItem7 = new DevExpress.XtraLayout.LayoutControlItem();
+            layoutControlGroup2 = new DevExpress.XtraLayout.LayoutControlGroup();
+            layoutControlItem3 = new DevExpress.XtraLayout.LayoutControlItem();
+            sidePanel1 = new DevExpress.XtraEditors.SidePanel();
+            xtrPerform2dChart1 = new ValveViewChart();
+            ((System.ComponentModel.ISupportInitialize)layoutControl1).BeginInit();
+            layoutControl1.SuspendLayout();
+            ((System.ComponentModel.ISupportInitialize)gridControl1).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)bindingSource1).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)gridView1).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)btnExcelFilePath.Properties).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)txtCurveCode.Properties).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)Root).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)layoutControlGroup1).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)layoutControlItem6).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)layoutControlItem7).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)layoutControlGroup2).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)layoutControlItem3).BeginInit();
+            sidePanel1.SuspendLayout();
+            SuspendLayout();
+            // 
+            // layoutControl1
+            // 
+            layoutControl1.Controls.Add(gridControl1);
+            layoutControl1.Controls.Add(btnExcelFilePath);
+            layoutControl1.Controls.Add(txtCurveCode);
+            layoutControl1.Dock = DockStyle.Fill;
+            layoutControl1.Location = new Point(0, 0);
+            layoutControl1.Name = "layoutControl1";
+            layoutControl1.OptionsCustomizationForm.DesignTimeCustomizationFormPositionAndSize = new Rectangle(784, 368, 986, 935);
+            layoutControl1.Root = Root;
+            layoutControl1.Size = new Size(425, 660);
+            layoutControl1.TabIndex = 0;
+            layoutControl1.Text = "layoutControl1";
+            // 
+            // gridControl1
+            // 
+            gridControl1.DataSource = bindingSource1;
+            gridControl1.Location = new Point(0, 114);
+            gridControl1.MainView = gridView1;
+            gridControl1.Name = "gridControl1";
+            gridControl1.Size = new Size(425, 546);
+            gridControl1.TabIndex = 9;
+            gridControl1.ViewCollection.AddRange(new DevExpress.XtraGrid.Views.Base.BaseView[] { gridView1 });
+            // 
+            // gridView1
+            // 
+            gridView1.Columns.AddRange(new DevExpress.XtraGrid.Columns.GridColumn[] { colID, colQ, colL });
+            gridView1.GridControl = gridControl1;
+            gridView1.Name = "gridView1";
+            gridView1.OptionsView.ShowDetailButtons = false;
+            gridView1.OptionsView.ShowGroupPanel = false;
+            // 
+            // colID
+            // 
+            colID.FieldName = "ID";
+            colID.Name = "colID";
+            // 
+            // colQ
+            // 
+            colQ.AppearanceCell.Options.UseTextOptions = true;
+            colQ.AppearanceCell.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center;
+            colQ.AppearanceHeader.Options.UseTextOptions = true;
+            colQ.AppearanceHeader.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center;
+            colQ.Caption = "娴侀噺m鲁/h ";
+            colQ.FieldName = "Q";
+            colQ.Name = "colQ";
+            colQ.Visible = true;
+            colQ.VisibleIndex = 0;
+            // 
+            // colL
+            // 
+            colL.AppearanceCell.Options.UseTextOptions = true;
+            colL.AppearanceCell.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center;
+            colL.AppearanceHeader.Options.UseTextOptions = true;
+            colL.AppearanceHeader.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center;
+            colL.Caption = "瀹圭Нm鲁";
+            colL.FieldName = "L";
+            colL.Name = "colL";
+            colL.Visible = true;
+            colL.VisibleIndex = 1;
+            // 
+            // btnExcelFilePath
+            // 
+            btnExcelFilePath.Location = new Point(56, 34);
+            btnExcelFilePath.Name = "btnExcelFilePath";
+            editorButtonImageOptions2.SvgImage = (DevExpress.Utils.Svg.SvgImage)resources.GetObject("editorButtonImageOptions2.SvgImage");
+            editorButtonImageOptions2.SvgImageSize = new Size(14, 14);
+            btnExcelFilePath.Properties.Buttons.AddRange(new DevExpress.XtraEditors.Controls.EditorButton[] { new DevExpress.XtraEditors.Controls.EditorButton(DevExpress.XtraEditors.Controls.ButtonPredefines.Glyph, "", -1, true, true, false, editorButtonImageOptions2, new DevExpress.Utils.KeyShortcut(Keys.None), serializableAppearanceObject5, serializableAppearanceObject6, serializableAppearanceObject7, serializableAppearanceObject8, "", null, null, DevExpress.Utils.ToolTipAnchor.Default) });
+            btnExcelFilePath.Size = new Size(357, 22);
+            btnExcelFilePath.StyleController = layoutControl1;
+            btnExcelFilePath.TabIndex = 18;
+            btnExcelFilePath.ButtonClick += btnExcelFilePath_ButtonClick;
+            // 
+            // txtCurveCode
+            // 
+            txtCurveCode.Location = new Point(56, 60);
+            txtCurveCode.Name = "txtCurveCode";
+            txtCurveCode.Size = new Size(357, 20);
+            txtCurveCode.StyleController = layoutControl1;
+            txtCurveCode.TabIndex = 19;
+            // 
+            // Root
+            // 
+            Root.EnableIndentsWithoutBorders = DevExpress.Utils.DefaultBoolean.True;
+            Root.GroupBordersVisible = false;
+            Root.Items.AddRange(new DevExpress.XtraLayout.BaseLayoutItem[] { layoutControlGroup1, layoutControlGroup2 });
+            Root.Name = "Root";
+            Root.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
+            Root.Size = new Size(425, 660);
+            Root.TextVisible = false;
+            // 
+            // layoutControlGroup1
+            // 
+            layoutControlGroup1.GroupStyle = DevExpress.Utils.GroupStyle.Title;
+            layoutControlGroup1.Items.AddRange(new DevExpress.XtraLayout.BaseLayoutItem[] { layoutControlItem6, layoutControlItem7 });
+            layoutControlGroup1.Location = new Point(0, 0);
+            layoutControlGroup1.Name = "layoutControlGroup1";
+            layoutControlGroup1.Size = new Size(425, 92);
+            layoutControlGroup1.Spacing = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
+            layoutControlGroup1.Text = "鏇茬嚎淇℃伅";
+            // 
+            // layoutControlItem6
+            // 
+            layoutControlItem6.Control = btnExcelFilePath;
+            layoutControlItem6.Location = new Point(0, 0);
+            layoutControlItem6.Name = "layoutControlItem6";
+            layoutControlItem6.Size = new Size(405, 26);
+            layoutControlItem6.Text = "Excel:";
+            layoutControlItem6.TextSize = new Size(32, 14);
+            // 
+            // layoutControlItem7
+            // 
+            layoutControlItem7.Control = txtCurveCode;
+            layoutControlItem7.Location = new Point(0, 26);
+            layoutControlItem7.Name = "layoutControlItem7";
+            layoutControlItem7.Size = new Size(405, 24);
+            layoutControlItem7.Text = "鍚嶇О:";
+            layoutControlItem7.TextSize = new Size(32, 14);
+            // 
+            // layoutControlGroup2
+            // 
+            layoutControlGroup2.GroupStyle = DevExpress.Utils.GroupStyle.Title;
+            layoutControlGroup2.Items.AddRange(new DevExpress.XtraLayout.BaseLayoutItem[] { layoutControlItem3 });
+            layoutControlGroup2.Location = new Point(0, 92);
+            layoutControlGroup2.Name = "layoutControlGroup2";
+            layoutControlGroup2.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
+            layoutControlGroup2.Size = new Size(425, 568);
+            layoutControlGroup2.Spacing = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
+            layoutControlGroup2.Text = "鏇茬嚎瀹氫箟鐐�";
+            // 
+            // layoutControlItem3
+            // 
+            layoutControlItem3.Control = gridControl1;
+            layoutControlItem3.Location = new Point(0, 0);
+            layoutControlItem3.Name = "layoutControlItem3";
+            layoutControlItem3.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
+            layoutControlItem3.Size = new Size(425, 546);
+            layoutControlItem3.TextSize = new Size(0, 0);
+            layoutControlItem3.TextVisible = false;
+            // 
+            // sidePanel1
+            // 
+            sidePanel1.Controls.Add(layoutControl1);
+            sidePanel1.Dock = DockStyle.Left;
+            sidePanel1.Location = new Point(0, 0);
+            sidePanel1.Name = "sidePanel1";
+            sidePanel1.Size = new Size(426, 660);
+            sidePanel1.TabIndex = 2;
+            sidePanel1.Text = "sidePanel1";
+            // 
+            // xtrPerform2dChart1
+            // 
+            xtrPerform2dChart1.DefinePointVisible = false;
+            xtrPerform2dChart1.Dock = DockStyle.Fill;
+            xtrPerform2dChart1.LineVisible = false;
+            xtrPerform2dChart1.Location = new Point(426, 0);
+            xtrPerform2dChart1.Margin = new Padding(2);
+            xtrPerform2dChart1.Name = "xtrPerform2dChart1";
+            xtrPerform2dChart1.Size = new Size(574, 660);
+            xtrPerform2dChart1.TabIndex = 3;
+            // 
+            // ImportTankPerform2dByExcelCtrl
+            // 
+            Appearance.BackColor = SystemColors.Control;
+            Appearance.Options.UseBackColor = true;
+            AutoScaleMode = AutoScaleMode.None;
+            Controls.Add(xtrPerform2dChart1);
+            Controls.Add(sidePanel1);
+            Name = "ImportTankPerform2dByExcelCtrl";
+            Size = new Size(1000, 660);
+            ((System.ComponentModel.ISupportInitialize)layoutControl1).EndInit();
+            layoutControl1.ResumeLayout(false);
+            ((System.ComponentModel.ISupportInitialize)gridControl1).EndInit();
+            ((System.ComponentModel.ISupportInitialize)bindingSource1).EndInit();
+            ((System.ComponentModel.ISupportInitialize)gridView1).EndInit();
+            ((System.ComponentModel.ISupportInitialize)btnExcelFilePath.Properties).EndInit();
+            ((System.ComponentModel.ISupportInitialize)txtCurveCode.Properties).EndInit();
+            ((System.ComponentModel.ISupportInitialize)Root).EndInit();
+            ((System.ComponentModel.ISupportInitialize)layoutControlGroup1).EndInit();
+            ((System.ComponentModel.ISupportInitialize)layoutControlItem6).EndInit();
+            ((System.ComponentModel.ISupportInitialize)layoutControlItem7).EndInit();
+            ((System.ComponentModel.ISupportInitialize)layoutControlGroup2).EndInit();
+            ((System.ComponentModel.ISupportInitialize)layoutControlItem3).EndInit();
+            sidePanel1.ResumeLayout(false);
+            ResumeLayout(false);
+        }
+
+        #endregion
+        private DevExpress.XtraLayout.LayoutControl layoutControl1;
+        private DevExpress.XtraLayout.LayoutControlGroup Root;
+        private System.Windows.Forms.BindingSource bindingSource1;
+        private DevExpress.XtraGrid.GridControl gridControl1;
+        private DevExpress.XtraGrid.Views.Grid.GridView gridView1;
+        private DevExpress.XtraGrid.Columns.GridColumn colID;
+        private DevExpress.XtraGrid.Columns.GridColumn colQ;
+        private DevExpress.XtraGrid.Columns.GridColumn colL;
+        private DevExpress.XtraLayout.LayoutControlItem layoutControlItem3;
+        private DevExpress.XtraEditors.ButtonEdit btnExcelFilePath;
+        private DevExpress.XtraLayout.LayoutControlItem layoutControlItem6;
+        private DevExpress.XtraEditors.TextEdit txtCurveCode; 
+        private DevExpress.XtraLayout.LayoutControlItem layoutControlItem7;
+        private DevExpress.XtraLayout.LayoutControlGroup layoutControlGroup1;
+        private DevExpress.XtraLayout.LayoutControlGroup layoutControlGroup2;
+        private DevExpress.XtraEditors.SidePanel sidePanel1;
+        private ValveViewChart xtrPerform2dChart1;
+    }
+}
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/01-matching/02-pump/01-pumpsinglematching/PumpMatchingDlg.resx b/WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/05-import/01-excel/ImportTankPerform2dByExcelCtrl.en-US.resx
similarity index 72%
copy from WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/01-matching/02-pump/01-pumpsinglematching/PumpMatchingDlg.resx
copy to WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/05-import/01-excel/ImportTankPerform2dByExcelCtrl.en-US.resx
index 59f029d..89c7621 100644
--- a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/01-matching/02-pump/01-pumpsinglematching/PumpMatchingDlg.resx
+++ b/WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/05-import/01-excel/ImportTankPerform2dByExcelCtrl.en-US.resx
@@ -1,17 +1,17 @@
 锘�<?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
+    
+    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>
@@ -26,36 +26,36 @@
         <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
+                
+    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
+    
+    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
+    
+    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
+    
+    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
+    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
+    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
+    value   : The object must be serialized into a byte array 
             : using a System.ComponentModel.TypeConverter
             : and then encoded with base64 encoding.
     -->
@@ -117,24 +117,7 @@
   <resheader name="writer">
     <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </resheader>
-  <assembly alias="DevExpress.Data.v23.2" name="DevExpress.Data.v23.2, Culture=neutral, PublicKeyToken=b88d1754d700e49a" />
-  <data name="barBtnOK.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
-    <value>
-        AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIzLjIsIFZlcnNpb249MjMuMi40
-        LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
-        dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAAMICAAAC77u/
-        PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi
-        IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv
-        MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh
-        Y2U9InByZXNlcnZlIiBpZD0iTGF5ZXJfMSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAg
-        MzIgMzIiPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLkJsYWNre2ZpbGw6IzczNzM3NDt9Cgku
-        WWVsbG93e2ZpbGw6I0ZDQjAxQjt9CgkuR3JlZW57ZmlsbDojMTI5QzQ5O30KCS5CbHVle2ZpbGw6IzM4
-        N0NCNzt9CgkuUmVke2ZpbGw6I0QwMjEyNzt9CgkuV2hpdGV7ZmlsbDojRkZGRkZGO30KCS5zdDB7b3Bh
-        Y2l0eTowLjU7fQoJLnN0MXtvcGFjaXR5OjAuNzU7fQoJLnN0MntvcGFjaXR5OjAuMjU7fQoJLnN0M3tk
-        aXNwbGF5Om5vbmU7ZmlsbDojNzM3Mzc0O30KPC9zdHlsZT4NCiAgPHBhdGggZD0iTTI3LDRoLTN2MTBI
-        OFY0SDVDNC40LDQsNCw0LjQsNCw1djIyYzAsMC42LDAuNCwxLDEsMWgyMmMwLjYsMCwxLTAuNCwxLTFW
-        NUMyOCw0LjQsMjcuNiw0LDI3LDR6IE0yNCwyNEg4di02ICBoMTZWMjR6IE0xMCw0djhoMTBWNEgxMHog
-        TTE0LDEwaC0yVjZoMlYxMHoiIGNsYXNzPSJCbGFjayIgLz4NCjwvc3ZnPgs=
-</value>
+  <data name="btnUpdateCurve.Text" xml:space="preserve">
+    <value>Update Curve</value>
   </data>
 </root>
\ No newline at end of file
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/01-matching/02-pump/01-pumpsinglematching/PumpMatchingDlg.resx b/WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/05-import/01-excel/ImportTankPerform2dByExcelCtrl.resx
similarity index 82%
rename from WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/01-matching/02-pump/01-pumpsinglematching/PumpMatchingDlg.resx
rename to WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/05-import/01-excel/ImportTankPerform2dByExcelCtrl.resx
index 59f029d..1fe3546 100644
--- a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/01-matching/02-pump/01-pumpsinglematching/PumpMatchingDlg.resx
+++ b/WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/05-import/01-excel/ImportTankPerform2dByExcelCtrl.resx
@@ -117,24 +117,28 @@
   <resheader name="writer">
     <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </resheader>
+  <metadata name="bindingSource1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
   <assembly alias="DevExpress.Data.v23.2" name="DevExpress.Data.v23.2, Culture=neutral, PublicKeyToken=b88d1754d700e49a" />
-  <data name="barBtnOK.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
+  <data name="editorButtonImageOptions2.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
     <value>
         AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIzLjIsIFZlcnNpb249MjMuMi40
         LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
-        dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAAMICAAAC77u/
+        dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAAAMDAAAC77u/
         PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi
         IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv
         MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh
-        Y2U9InByZXNlcnZlIiBpZD0iTGF5ZXJfMSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAg
-        MzIgMzIiPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLkJsYWNre2ZpbGw6IzczNzM3NDt9Cgku
-        WWVsbG93e2ZpbGw6I0ZDQjAxQjt9CgkuR3JlZW57ZmlsbDojMTI5QzQ5O30KCS5CbHVle2ZpbGw6IzM4
-        N0NCNzt9CgkuUmVke2ZpbGw6I0QwMjEyNzt9CgkuV2hpdGV7ZmlsbDojRkZGRkZGO30KCS5zdDB7b3Bh
-        Y2l0eTowLjU7fQoJLnN0MXtvcGFjaXR5OjAuNzU7fQoJLnN0MntvcGFjaXR5OjAuMjU7fQoJLnN0M3tk
-        aXNwbGF5Om5vbmU7ZmlsbDojNzM3Mzc0O30KPC9zdHlsZT4NCiAgPHBhdGggZD0iTTI3LDRoLTN2MTBI
-        OFY0SDVDNC40LDQsNCw0LjQsNCw1djIyYzAsMC42LDAuNCwxLDEsMWgyMmMwLjYsMCwxLTAuNCwxLTFW
-        NUMyOCw0LjQsMjcuNiw0LDI3LDR6IE0yNCwyNEg4di02ICBoMTZWMjR6IE0xMCw0djhoMTBWNEgxMHog
-        TTE0LDEwaC0yVjZoMlYxMHoiIGNsYXNzPSJCbGFjayIgLz4NCjwvc3ZnPgs=
+        Y2U9InByZXNlcnZlIiBpZD0iT3BlbjIiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDMy
+        IDMyIj4NCiAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KCS5HcmVlbntmaWxsOiMwMzlDMjM7fQoJLlll
+        bGxvd3tmaWxsOiNGRkIxMTU7fQoJLnN0MHtvcGFjaXR5OjAuNzU7fQo8L3N0eWxlPg0KICA8ZyBjbGFz
+        cz0ic3QwIj4NCiAgICA8cGF0aCBkPSJNMTkuMiwxMEgxMlY3YzAtMC42LTAuNC0xLTEtMUgzQzIuNCw2
+        LDIsNi41LDIsN3YxOGMwLDAuMiwwLDAuMywwLjEsMC40YzAsMCwwLjEtMC4xLDAuMS0wLjJsNS41LTEw
+        ICAgQzgsMTQuNSw4LjcsMTQsOS41LDE0aDEzLjdMMTkuMiwxMHoiIGNsYXNzPSJZZWxsb3ciIC8+DQog
+        IDwvZz4NCiAgPHBhdGggZD0iTTI5LjMsMTZIOS42TDQsMjZoMTkuOGMwLjUsMCwxLjEtMC4yLDEuMy0w
+        LjZsNC45LTguOUMzMC4xLDE2LjIsMjkuOCwxNiwyOS4zLDE2eiIgY2xhc3M9IlllbGxvdyIgLz4NCiAg
+        PHBhdGggZD0iTTI4LDhjMC0zLjMtMi43LTYtNi02cy02LDIuNy02LDZjMC0yLjIsMS44LTQsNC00czQs
+        MS44LDQsNGgtNGw2LDZsNi02SDI4eiIgY2xhc3M9IkdyZWVuIiAvPg0KPC9zdmc+Cw==
 </value>
   </data>
 </root>
\ No newline at end of file
diff --git a/WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/05-import/01-excel/ImportTankPerform2dByExcelDlg.Designer.cs b/WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/05-import/01-excel/ImportTankPerform2dByExcelDlg.Designer.cs
new file mode 100644
index 0000000..a70f7d2
--- /dev/null
+++ b/WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/05-import/01-excel/ImportTankPerform2dByExcelDlg.Designer.cs
@@ -0,0 +1,207 @@
+锘�
+namespace HStation.WinFrmUI
+{
+    partial class ImportTankPerform2dByExcelDlg
+    {
+        /// <summary>
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary>
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Windows Form Designer generated code
+
+        /// <summary>
+        /// Required method for Designer support - do not modify
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.components = new System.ComponentModel.Container();
+            this.dataLayoutControl1 = new DevExpress.XtraDataLayout.DataLayoutControl();
+            this.importCurveByExcelCtrl1 = new HStation.WinFrmUI.ImportTankPerform2dByExcelCtrl();
+            this.btnOk = new DevExpress.XtraEditors.SimpleButton();
+            this.btnCancel = new DevExpress.XtraEditors.SimpleButton();
+            this.Root = new DevExpress.XtraLayout.LayoutControlGroup();
+            this.layoutControlGroup1 = new DevExpress.XtraLayout.LayoutControlGroup();
+            this.layoutControlItem1 = new DevExpress.XtraLayout.LayoutControlItem();
+            this.layoutControlItem2 = new DevExpress.XtraLayout.LayoutControlItem();
+            this.emptySpaceItem1 = new DevExpress.XtraLayout.EmptySpaceItem();
+            this.layoutControlItem3 = new DevExpress.XtraLayout.LayoutControlItem();
+            this.dxErrorProvider1 = new DevExpress.XtraEditors.DXErrorProvider.DXErrorProvider(this.components);
+            ((System.ComponentModel.ISupportInitialize)(this.dataLayoutControl1)).BeginInit();
+            this.dataLayoutControl1.SuspendLayout();
+            ((System.ComponentModel.ISupportInitialize)(this.Root)).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)(this.layoutControlGroup1)).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)(this.layoutControlItem1)).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)(this.layoutControlItem2)).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)(this.emptySpaceItem1)).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)(this.layoutControlItem3)).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)(this.dxErrorProvider1)).BeginInit();
+            this.SuspendLayout();
+            // 
+            // dataLayoutControl1
+            // 
+            this.dataLayoutControl1.Controls.Add(this.importCurveByExcelCtrl1);
+            this.dataLayoutControl1.Controls.Add(this.btnOk);
+            this.dataLayoutControl1.Controls.Add(this.btnCancel);
+            this.dataLayoutControl1.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.dataLayoutControl1.Location = new System.Drawing.Point(0, 0);
+            this.dataLayoutControl1.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
+            this.dataLayoutControl1.Name = "dataLayoutControl1";
+            this.dataLayoutControl1.OptionsCustomizationForm.DesignTimeCustomizationFormPositionAndSize = new System.Drawing.Rectangle(859, 142, 650, 400);
+            this.dataLayoutControl1.Root = this.Root;
+            this.dataLayoutControl1.Size = new System.Drawing.Size(1154, 885);
+            this.dataLayoutControl1.TabIndex = 0;
+            this.dataLayoutControl1.Text = "dataLayoutControl1";
+            // 
+            // importCurveByExcelCtrl1
+            // 
+            this.importCurveByExcelCtrl1.Appearance.BackColor = System.Drawing.SystemColors.Control;
+            this.importCurveByExcelCtrl1.Appearance.Options.UseBackColor = true;
+            this.importCurveByExcelCtrl1.Location = new System.Drawing.Point(2, 2);
+            this.importCurveByExcelCtrl1.Name = "importCurveByExcelCtrl1";
+            this.importCurveByExcelCtrl1.Size = new System.Drawing.Size(1150, 845);
+            this.importCurveByExcelCtrl1.TabIndex = 9;
+            // 
+            // btnOk
+            // 
+            this.btnOk.Appearance.BackColor = DevExpress.LookAndFeel.DXSkinColors.FillColors.Primary;
+            this.btnOk.Appearance.Options.UseBackColor = true;
+            this.btnOk.Location = new System.Drawing.Point(891, 851);
+            this.btnOk.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
+            this.btnOk.Name = "btnOk";
+            this.btnOk.Size = new System.Drawing.Size(128, 32);
+            this.btnOk.StyleController = this.dataLayoutControl1;
+            this.btnOk.TabIndex = 8;
+            this.btnOk.Text = "纭畾";
+            this.btnOk.Click += new System.EventHandler(this.btnOk_Click);
+            // 
+            // btnCancel
+            // 
+            this.btnCancel.Appearance.BackColor = DevExpress.LookAndFeel.DXSkinColors.FillColors.Warning;
+            this.btnCancel.Appearance.Options.UseBackColor = true;
+            this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+            this.btnCancel.Location = new System.Drawing.Point(1023, 851);
+            this.btnCancel.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
+            this.btnCancel.Name = "btnCancel";
+            this.btnCancel.Size = new System.Drawing.Size(129, 32);
+            this.btnCancel.StyleController = this.dataLayoutControl1;
+            this.btnCancel.TabIndex = 7;
+            this.btnCancel.Text = "鍙栨秷";
+            // 
+            // Root
+            // 
+            this.Root.AppearanceItemCaption.Options.UseTextOptions = true;
+            this.Root.AppearanceItemCaption.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Far;
+            this.Root.EnableIndentsWithoutBorders = DevExpress.Utils.DefaultBoolean.True;
+            this.Root.GroupBordersVisible = false;
+            this.Root.Items.AddRange(new DevExpress.XtraLayout.BaseLayoutItem[] {
+            this.layoutControlGroup1});
+            this.Root.Name = "Root";
+            this.Root.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
+            this.Root.Size = new System.Drawing.Size(1154, 885);
+            this.Root.TextVisible = false;
+            // 
+            // layoutControlGroup1
+            // 
+            this.layoutControlGroup1.AllowDrawBackground = false;
+            this.layoutControlGroup1.GroupBordersVisible = false;
+            this.layoutControlGroup1.Items.AddRange(new DevExpress.XtraLayout.BaseLayoutItem[] {
+            this.layoutControlItem1,
+            this.layoutControlItem2,
+            this.emptySpaceItem1,
+            this.layoutControlItem3});
+            this.layoutControlGroup1.Location = new System.Drawing.Point(0, 0);
+            this.layoutControlGroup1.Name = "autoGeneratedGroup0";
+            this.layoutControlGroup1.Size = new System.Drawing.Size(1154, 885);
+            // 
+            // layoutControlItem1
+            // 
+            this.layoutControlItem1.Control = this.btnCancel;
+            this.layoutControlItem1.Location = new System.Drawing.Point(1021, 849);
+            this.layoutControlItem1.Name = "layoutControlItem1";
+            this.layoutControlItem1.Size = new System.Drawing.Size(133, 36);
+            this.layoutControlItem1.TextSize = new System.Drawing.Size(0, 0);
+            this.layoutControlItem1.TextVisible = false;
+            // 
+            // layoutControlItem2
+            // 
+            this.layoutControlItem2.Control = this.btnOk;
+            this.layoutControlItem2.Location = new System.Drawing.Point(889, 849);
+            this.layoutControlItem2.Name = "layoutControlItem2";
+            this.layoutControlItem2.Size = new System.Drawing.Size(132, 36);
+            this.layoutControlItem2.TextSize = new System.Drawing.Size(0, 0);
+            this.layoutControlItem2.TextVisible = false;
+            // 
+            // emptySpaceItem1
+            // 
+            this.emptySpaceItem1.AllowHotTrack = false;
+            this.emptySpaceItem1.Location = new System.Drawing.Point(0, 849);
+            this.emptySpaceItem1.Name = "emptySpaceItem1";
+            this.emptySpaceItem1.Size = new System.Drawing.Size(889, 36);
+            this.emptySpaceItem1.TextSize = new System.Drawing.Size(0, 0);
+            // 
+            // layoutControlItem3
+            // 
+            this.layoutControlItem3.Control = this.importCurveByExcelCtrl1;
+            this.layoutControlItem3.Location = new System.Drawing.Point(0, 0);
+            this.layoutControlItem3.Name = "layoutControlItem3";
+            this.layoutControlItem3.Size = new System.Drawing.Size(1154, 849);
+            this.layoutControlItem3.TextSize = new System.Drawing.Size(0, 0);
+            this.layoutControlItem3.TextVisible = false;
+            // 
+            // dxErrorProvider1
+            // 
+            this.dxErrorProvider1.ContainerControl = this;
+            // 
+            // ImportCurveByExcelDlg
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(10F, 22F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.ClientSize = new System.Drawing.Size(1154, 885);
+            this.Controls.Add(this.dataLayoutControl1);
+            this.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
+            this.Name = "ImportCurveByExcelDlg";
+            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+            this.Text = "鏇茬嚎瀵煎叆";
+            ((System.ComponentModel.ISupportInitialize)(this.dataLayoutControl1)).EndInit();
+            this.dataLayoutControl1.ResumeLayout(false);
+            ((System.ComponentModel.ISupportInitialize)(this.Root)).EndInit();
+            ((System.ComponentModel.ISupportInitialize)(this.layoutControlGroup1)).EndInit();
+            ((System.ComponentModel.ISupportInitialize)(this.layoutControlItem1)).EndInit();
+            ((System.ComponentModel.ISupportInitialize)(this.layoutControlItem2)).EndInit();
+            ((System.ComponentModel.ISupportInitialize)(this.emptySpaceItem1)).EndInit();
+            ((System.ComponentModel.ISupportInitialize)(this.layoutControlItem3)).EndInit();
+            ((System.ComponentModel.ISupportInitialize)(this.dxErrorProvider1)).EndInit();
+            this.ResumeLayout(false);
+
+        }
+
+        #endregion
+
+        private DevExpress.XtraDataLayout.DataLayoutControl dataLayoutControl1;
+        private DevExpress.XtraLayout.LayoutControlGroup Root;
+        private DevExpress.XtraEditors.SimpleButton btnOk;
+        private DevExpress.XtraEditors.SimpleButton btnCancel;
+        private DevExpress.XtraLayout.LayoutControlGroup layoutControlGroup1;
+        private DevExpress.XtraLayout.LayoutControlItem layoutControlItem1;
+        private DevExpress.XtraLayout.LayoutControlItem layoutControlItem2;
+        private DevExpress.XtraLayout.EmptySpaceItem emptySpaceItem1;
+        private DevExpress.XtraEditors.DXErrorProvider.DXErrorProvider dxErrorProvider1;
+        private ImportTankPerform2dByExcelCtrl importCurveByExcelCtrl1;
+        private DevExpress.XtraLayout.LayoutControlItem layoutControlItem3;
+    }
+}
\ No newline at end of file
diff --git a/WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/05-import/01-excel/ImportTankPerform2dByExcelDlg.cs b/WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/05-import/01-excel/ImportTankPerform2dByExcelDlg.cs
new file mode 100644
index 0000000..53c2bb7
--- /dev/null
+++ b/WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/05-import/01-excel/ImportTankPerform2dByExcelDlg.cs
@@ -0,0 +1,43 @@
+锘縰sing DevExpress.XtraEditors;
+
+namespace HStation.WinFrmUI
+{
+    public partial class ImportTankPerform2dByExcelDlg : XtraForm
+    {
+        public ImportTankPerform2dByExcelDlg()
+        {
+            InitializeComponent();
+        }
+
+        /// <summary>
+        /// 鍥炶皟浜嬩欢
+        /// </summary>
+        public event Func<string, Task<bool>> ReloadDataEvent;
+
+        public void SetBindingData(string x, string y)
+        {
+            this.importCurveByExcelCtrl1.SetBindingData(x, y);
+        }
+
+        //纭畾
+        private async void btnOk_Click(object sender, EventArgs e)
+        {
+            var bol = this.importCurveByExcelCtrl1.Get(out List<Yw.Geometry.Point2d> pt_list);
+            if (!bol)
+            {
+                return;
+            }
+
+            var json = Yw.JsonHelper.Object2Json(pt_list);
+            var result = await this.ReloadDataEvent?.Invoke(json);
+            if (!result)
+            {
+                XtraMessageBox.Show("瀵煎叆澶辫触锛�");
+                return;
+            }
+            XtraMessageBox.Show("瀵煎叆鎴愬姛锛�");
+            this.DialogResult = DialogResult.OK;
+            this.Close();
+        }
+    }
+}
\ No newline at end of file
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/01-matching/02-pump/01-pumpsinglematching/PumpMatchingDlg.resx b/WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/05-import/01-excel/ImportTankPerform2dByExcelDlg.resx
similarity index 72%
copy from WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/01-matching/02-pump/01-pumpsinglematching/PumpMatchingDlg.resx
copy to WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/05-import/01-excel/ImportTankPerform2dByExcelDlg.resx
index 59f029d..5ce537f 100644
--- a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/01-matching/02-pump/01-pumpsinglematching/PumpMatchingDlg.resx
+++ b/WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/05-import/01-excel/ImportTankPerform2dByExcelDlg.resx
@@ -1,17 +1,17 @@
 锘�<?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
+    
+    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>
@@ -26,36 +26,36 @@
         <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
+                
+    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
+    
+    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
+    
+    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
+    
+    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
+    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
+    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
+    value   : The object must be serialized into a byte array 
             : using a System.ComponentModel.TypeConverter
             : and then encoded with base64 encoding.
     -->
@@ -117,24 +117,7 @@
   <resheader name="writer">
     <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </resheader>
-  <assembly alias="DevExpress.Data.v23.2" name="DevExpress.Data.v23.2, Culture=neutral, PublicKeyToken=b88d1754d700e49a" />
-  <data name="barBtnOK.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
-    <value>
-        AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIzLjIsIFZlcnNpb249MjMuMi40
-        LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
-        dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAAMICAAAC77u/
-        PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi
-        IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv
-        MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh
-        Y2U9InByZXNlcnZlIiBpZD0iTGF5ZXJfMSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAg
-        MzIgMzIiPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLkJsYWNre2ZpbGw6IzczNzM3NDt9Cgku
-        WWVsbG93e2ZpbGw6I0ZDQjAxQjt9CgkuR3JlZW57ZmlsbDojMTI5QzQ5O30KCS5CbHVle2ZpbGw6IzM4
-        N0NCNzt9CgkuUmVke2ZpbGw6I0QwMjEyNzt9CgkuV2hpdGV7ZmlsbDojRkZGRkZGO30KCS5zdDB7b3Bh
-        Y2l0eTowLjU7fQoJLnN0MXtvcGFjaXR5OjAuNzU7fQoJLnN0MntvcGFjaXR5OjAuMjU7fQoJLnN0M3tk
-        aXNwbGF5Om5vbmU7ZmlsbDojNzM3Mzc0O30KPC9zdHlsZT4NCiAgPHBhdGggZD0iTTI3LDRoLTN2MTBI
-        OFY0SDVDNC40LDQsNCw0LjQsNCw1djIyYzAsMC42LDAuNCwxLDEsMWgyMmMwLjYsMCwxLTAuNCwxLTFW
-        NUMyOCw0LjQsMjcuNiw0LDI3LDR6IE0yNCwyNEg4di02ICBoMTZWMjR6IE0xMCw0djhoMTBWNEgxMHog
-        TTE0LDEwaC0yVjZoMlYxMHoiIGNsYXNzPSJCbGFjayIgLz4NCjwvc3ZnPgs=
-</value>
-  </data>
+  <metadata name="dxErrorProvider1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
 </root>
\ No newline at end of file
diff --git a/WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/TankManageMainPage.Designer.cs b/WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/TankManageMainPage.Designer.cs
index e2db501..a813665 100644
--- a/WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/TankManageMainPage.Designer.cs
+++ b/WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/TankManageMainPage.Designer.cs
@@ -36,6 +36,7 @@
             BtnDelete = new DevExpress.XtraBars.BarButtonItem();
             BarBtnEidtPumpPart = new DevExpress.XtraBars.BarButtonItem();
             barBtnSetCoefficient = new DevExpress.XtraBars.BarButtonItem();
+            barBtnTankChart = new DevExpress.XtraBars.BarButtonItem();
             ribbonPage1 = new DevExpress.XtraBars.Ribbon.RibbonPage();
             ribbonPageGroup1 = new DevExpress.XtraBars.Ribbon.RibbonPageGroup();
             ribbonPageGroup2 = new DevExpress.XtraBars.Ribbon.RibbonPageGroup();
@@ -45,17 +46,19 @@
             TankViewModelBindingSource = new BindingSource(components);
             gridView1 = new DevExpress.XtraGrid.Views.Grid.GridView();
             colName = new DevExpress.XtraGrid.Columns.GridColumn();
-            colCaliber = new DevExpress.XtraGrid.Columns.GridColumn();
             colDescription = new DevExpress.XtraGrid.Columns.GridColumn();
             colKeyWord = new DevExpress.XtraGrid.Columns.GridColumn();
-            colMaterial = new DevExpress.XtraGrid.Columns.GridColumn();
-            colMinorLoss = new DevExpress.XtraGrid.Columns.GridColumn();
+            colDN = new DevExpress.XtraGrid.Columns.GridColumn();
+            colMinLevel = new DevExpress.XtraGrid.Columns.GridColumn();
+            colMinVol = new DevExpress.XtraGrid.Columns.GridColumn();
+            colOverFlow = new DevExpress.XtraGrid.Columns.GridColumn();
+            colSortCode = new DevExpress.XtraGrid.Columns.GridColumn();
+            colMaxLevel = new DevExpress.XtraGrid.Columns.GridColumn();
             dockManager1 = new DevExpress.XtraBars.Docking.DockManager(components);
             dockPanel1 = new DevExpress.XtraBars.Docking.DockPanel();
             dockPanel1_Container = new DevExpress.XtraBars.Docking.ControlContainer();
             TankTreeListCtrl1 = new TankTreeListCtrl();
             barBtnValveLine = new DevExpress.XtraBars.BarButtonItem();
-            barBtnTankChart = new DevExpress.XtraBars.BarButtonItem();
             ((System.ComponentModel.ISupportInitialize)ribbonControl1).BeginInit();
             ((System.ComponentModel.ISupportInitialize)svgImageCollection1).BeginInit();
             sidePanel1.SuspendLayout();
@@ -120,7 +123,16 @@
             barBtnSetCoefficient.Id = 24;
             barBtnSetCoefficient.ImageOptions.SvgImage = (DevExpress.Utils.Svg.SvgImage)resources.GetObject("barBtnSetCoefficient.ImageOptions.SvgImage");
             barBtnSetCoefficient.Name = "barBtnSetCoefficient";
+            barBtnSetCoefficient.Visibility = DevExpress.XtraBars.BarItemVisibility.Never;
             barBtnSetCoefficient.ItemClick += barBtnSetCoefficient_ItemClick;
+            // 
+            // barBtnTankChart
+            // 
+            barBtnTankChart.Caption = "瀹圭Н鏇茬嚎";
+            barBtnTankChart.Id = 25;
+            barBtnTankChart.ImageOptions.SvgImage = (DevExpress.Utils.Svg.SvgImage)resources.GetObject("barBtnTankChart.ImageOptions.SvgImage");
+            barBtnTankChart.Name = "barBtnTankChart";
+            barBtnTankChart.ItemClick += barBtnTankChart_ItemClick;
             // 
             // ribbonPage1
             // 
@@ -179,7 +191,7 @@
             gridView1.Appearance.HeaderPanel.Options.UseTextOptions = true;
             gridView1.Appearance.HeaderPanel.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center;
             gridView1.BorderStyle = DevExpress.XtraEditors.Controls.BorderStyles.NoBorder;
-            gridView1.Columns.AddRange(new DevExpress.XtraGrid.Columns.GridColumn[] { colName, colCaliber, colDescription, colKeyWord, colMaterial, colMinorLoss });
+            gridView1.Columns.AddRange(new DevExpress.XtraGrid.Columns.GridColumn[] { colName, colDescription, colKeyWord, colDN, colMinLevel, colMinVol, colOverFlow, colSortCode, colMaxLevel });
             gridView1.GridControl = gridControl1;
             gridView1.Name = "gridView1";
             gridView1.OptionsView.ShowGroupPanel = false;
@@ -192,17 +204,7 @@
             colName.Name = "colName";
             colName.Visible = true;
             colName.VisibleIndex = 0;
-            colName.Width = 192;
-            // 
-            // colCaliber
-            // 
-            colCaliber.AppearanceCell.Options.UseTextOptions = true;
-            colCaliber.AppearanceCell.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center;
-            colCaliber.FieldName = "Caliber";
-            colCaliber.Name = "colCaliber";
-            colCaliber.Visible = true;
-            colCaliber.VisibleIndex = 3;
-            colCaliber.Width = 85;
+            colName.Width = 163;
             // 
             // colDescription
             // 
@@ -211,8 +213,8 @@
             colDescription.FieldName = "Description";
             colDescription.Name = "colDescription";
             colDescription.Visible = true;
-            colDescription.VisibleIndex = 5;
-            colDescription.Width = 222;
+            colDescription.VisibleIndex = 8;
+            colDescription.Width = 158;
             // 
             // colKeyWord
             // 
@@ -220,21 +222,55 @@
             colKeyWord.Name = "colKeyWord";
             colKeyWord.Visible = true;
             colKeyWord.VisibleIndex = 1;
-            colKeyWord.Width = 128;
+            colKeyWord.Width = 101;
             // 
-            // colMaterial
+            // colDN
             // 
-            colMaterial.FieldName = "Material";
-            colMaterial.Name = "colMaterial";
-            colMaterial.Visible = true;
-            colMaterial.VisibleIndex = 2;
+            colDN.FieldName = "DN";
+            colDN.Name = "colDN";
+            colDN.Visible = true;
+            colDN.VisibleIndex = 2;
+            colDN.Width = 78;
             // 
-            // colMinorLoss
+            // colMinLevel
             // 
-            colMinorLoss.FieldName = "MinorLoss";
-            colMinorLoss.Name = "colMinorLoss";
-            colMinorLoss.Visible = true;
-            colMinorLoss.VisibleIndex = 4;
+            colMinLevel.FieldName = "MinLevel";
+            colMinLevel.Name = "colMinLevel";
+            colMinLevel.Visible = true;
+            colMinLevel.VisibleIndex = 3;
+            colMinLevel.Width = 74;
+            // 
+            // colMinVol
+            // 
+            colMinVol.FieldName = "MinVol";
+            colMinVol.Name = "colMinVol";
+            colMinVol.Visible = true;
+            colMinVol.VisibleIndex = 4;
+            colMinVol.Width = 63;
+            // 
+            // colOverFlow
+            // 
+            colOverFlow.FieldName = "OverFlow";
+            colOverFlow.Name = "colOverFlow";
+            colOverFlow.Visible = true;
+            colOverFlow.VisibleIndex = 5;
+            colOverFlow.Width = 101;
+            // 
+            // colSortCode
+            // 
+            colSortCode.FieldName = "SortCode";
+            colSortCode.Name = "colSortCode";
+            colSortCode.Visible = true;
+            colSortCode.VisibleIndex = 7;
+            colSortCode.Width = 53;
+            // 
+            // colMaxLevel
+            // 
+            colMaxLevel.FieldName = "MaxLevel";
+            colMaxLevel.Name = "colMaxLevel";
+            colMaxLevel.Visible = true;
+            colMaxLevel.VisibleIndex = 6;
+            colMaxLevel.Width = 68;
             // 
             // dockManager1
             // 
@@ -253,7 +289,7 @@
             dockPanel1.Name = "dockPanel1";
             dockPanel1.OriginalSize = new Size(200, 200);
             dockPanel1.Size = new Size(200, 520);
-            dockPanel1.Text = "鍠峰ご绯诲垪";
+            dockPanel1.Text = "姘存睜绯诲垪";
             // 
             // dockPanel1_Container
             // 
@@ -279,13 +315,6 @@
             barBtnValveLine.Id = 22;
             barBtnValveLine.ImageOptions.SvgImage = (DevExpress.Utils.Svg.SvgImage)resources.GetObject("barBtnValveLine.ImageOptions.SvgImage");
             barBtnValveLine.Name = "barBtnValveLine";
-            // 
-            // barBtnTankChart
-            // 
-            barBtnTankChart.Caption = "barButtonItem1";
-            barBtnTankChart.Id = 25;
-            barBtnTankChart.Name = "barBtnTankChart";
-            barBtnTankChart.ItemClick += barBtnTankChart_ItemClick;
             // 
             // TankManageMainPage
             // 
@@ -324,7 +353,6 @@
         private DevExpress.XtraGrid.GridControl gridControl1;
         private DevExpress.XtraGrid.Views.Grid.GridView gridView1;
         private DevExpress.XtraGrid.Columns.GridColumn colName;
-        private DevExpress.XtraGrid.Columns.GridColumn colCaliber;
         private DevExpress.XtraGrid.Columns.GridColumn colDescription;
         private DevExpress.XtraBars.Docking.DockManager dockManager1;
         private DevExpress.XtraBars.Docking.DockPanel dockPanel1;
@@ -334,9 +362,13 @@
         private BindingSource TankViewModelBindingSource;
         private TankTreeListCtrl TankTreeListCtrl1;
         private DevExpress.XtraBars.BarButtonItem barBtnSetCoefficient;
-        private DevExpress.XtraGrid.Columns.GridColumn colMaterial;
-        private DevExpress.XtraGrid.Columns.GridColumn colMinorLoss;
         private DevExpress.XtraBars.BarButtonItem barBtnTankChart;
         private DevExpress.XtraBars.BarButtonItem barBtnValveLine;
+        private DevExpress.XtraGrid.Columns.GridColumn colDN;
+        private DevExpress.XtraGrid.Columns.GridColumn colMinLevel;
+        private DevExpress.XtraGrid.Columns.GridColumn colMinVol;
+        private DevExpress.XtraGrid.Columns.GridColumn colOverFlow;
+        private DevExpress.XtraGrid.Columns.GridColumn colSortCode;
+        private DevExpress.XtraGrid.Columns.GridColumn colMaxLevel;
     }
 }
diff --git a/WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/TankManageMainPage.cs b/WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/TankManageMainPage.cs
index 3c1f215..f28c09d 100644
--- a/WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/TankManageMainPage.cs
+++ b/WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/TankManageMainPage.cs
@@ -5,7 +5,7 @@
         public TankManageMainPage()
         {
             InitializeComponent();
-            this.PageTitle.Caption = "闂峰ご绠$悊";
+            this.PageTitle.Caption = "姘存睜绠$悊";
             this.gridView1.SetNormalView();
             this.gridView1.RegistCustomDrawRowIndicator();
             this.PageTitle.HeaderSvgImage = this.svgImageCollection1[0];
@@ -136,7 +136,7 @@
             }
             var guid = new PageGuid()
             {
-                Function = "闃�闂ㄦ按澶存崯澶辨洸绾�",
+                Function = "姘存睜瀹圭Н鏇茬嚎",
                 TagName = currentVm.ID.ToString(),
                 Modular = ""
             };
@@ -148,9 +148,9 @@
                     MessageBoxHelper.ShowWarning($"{currentVm.Name}:AssetsValveMainDto is null锛�");
                     return;
                 }
-                var page = new HStation.WinFrmUI.PhartRelation.XhsValveMainPhartPanel();
+                var page = new HStation.WinFrmUI.PhartRelation.TankMainPhartMinorLossPanel();
                 page.InitialDataSource(currentVm.ID);
-                guid.Function = "闃�闂ㄦ按澶存崯澶辨洸绾�";
+                guid.Function = "姘存睜瀹圭Н鏇茬嚎";
                 page.PageTitle.Caption = guid.Function;
                 page.PageGuid = guid;
                 CreatePage(page, guid);
diff --git a/WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/TankManageMainPage.resx b/WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/TankManageMainPage.resx
index 924820c..819e301 100644
--- a/WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/TankManageMainPage.resx
+++ b/WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/TankManageMainPage.resx
@@ -215,6 +215,35 @@
         bGFzcz0iQmx1ZSIgLz4NCiAgPC9nPg0KPC9zdmc+Cw==
 </value>
   </data>
+  <data name="barBtnTankChart.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIzLjIsIFZlcnNpb249MjMuMi40
+        LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
+        dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAABwFAAAC77u/
+        PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi
+        IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv
+        MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh
+        Y2U9InByZXNlcnZlIiBpZD0iTGF5ZXJfMSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAg
+        MzIgMzIiPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLkJsYWNre2ZpbGw6IzcyNzI3Mjt9Cgku
+        Qmx1ZXtmaWxsOiMxMTc3RDc7fQoJLkdyZWVue2ZpbGw6IzAzOUMyMzt9CgkuWWVsbG93e2ZpbGw6I0ZG
+        QjExNTt9CgkuUmVke2ZpbGw6I0QxMUMxQzt9CgkuV2hpdGV7ZmlsbDojRkZGRkZGO30KCS5zdDB7b3Bh
+        Y2l0eTowLjU7fQoJLnN0MXtvcGFjaXR5OjAuNzU7fQoJLnN0MntkaXNwbGF5Om5vbmU7fQoJLnN0M3tk
+        aXNwbGF5OmlubGluZTtmaWxsOiMxMTc3RDc7fQoJLnN0NHtkaXNwbGF5OmlubGluZTtmaWxsOiM3Mjcy
+        NzI7fQo8L3N0eWxlPg0KICA8ZyBpZD0iU3BhcmtsaW5lTGluZSI+DQogICAgPHBhdGggZD0iTTI3LDhj
+        LTEuNywwLTMsMS4zLTMsM2MwLDAuNSwwLjEsMC45LDAuMywxLjNsLTYsNkMxNy45LDE4LjEsMTcuNSwx
+        OCwxNywxOHMtMC45LDAuMS0xLjMsMC4zbC0yLTIgICBjMC4yLTAuNCwwLjMtMC44LDAuMy0xLjNjMC0x
+        LjctMS4zLTMtMy0zcy0zLDEuMy0zLDNjMCwwLjUsMC4xLDAuOSwwLjMsMS4zbC0yLDJDNS45LDE4LjEs
+        NS41LDE4LDUsMThjLTEuNywwLTMsMS4zLTMsM3MxLjMsMywzLDMgICBzMy0xLjMsMy0zYzAtMC41LTAu
+        MS0wLjktMC4zLTEuM2wyLTJjMC40LDAuMiwwLjgsMC4zLDEuMywwLjNzMC45LTAuMSwxLjMtMC4zbDIs
+        MkMxNC4xLDIwLjEsMTQsMjAuNSwxNCwyMWMwLDEuNywxLjMsMywzLDMgICBzMy0xLjMsMy0zYzAtMC41
+        LTAuMS0wLjktMC4zLTEuM2w2LTZjMC40LDAuMiwwLjgsMC4zLDEuMywwLjNjMS43LDAsMy0xLjMsMy0z
+        UzI4LjcsOCwyNyw4eiBNNSwyMmMtMC42LDAtMS0wLjQtMS0xczAuNC0xLDEtMSAgIHMxLDAuNCwxLDFT
+        NS42LDIyLDUsMjJ6IE0xMSwxNmMtMC42LDAtMS0wLjQtMS0xczAuNC0xLDEtMXMxLDAuNCwxLDFTMTEu
+        NiwxNiwxMSwxNnogTTE3LDIyYy0wLjYsMC0xLTAuNC0xLTFzMC40LTEsMS0xczEsMC40LDEsMSAgIFMx
+        Ny42LDIyLDE3LDIyeiBNMjcsMTJjLTAuNiwwLTEtMC40LTEtMXMwLjQtMSwxLTFzMSwwLjQsMSwxUzI3
+        LjYsMTIsMjcsMTJ6IiBjbGFzcz0iQmx1ZSIgLz4NCiAgPC9nPg0KPC9zdmc+Cw==
+</value>
+  </data>
   <metadata name="svgImageCollection1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
     <value>249, 17</value>
   </metadata>
diff --git a/WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/TankViewModel.cs b/WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/TankViewModel.cs
index 6296ccf..7eb9c3e 100644
--- a/WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/TankViewModel.cs
+++ b/WinFrmUI/HStation.WinFrmUI.Assets.Core/14-tank/TankViewModel.cs
@@ -11,19 +11,29 @@
         public TankViewModel(Vmo.AssetsTankMainVmo rhs)
         {
             this.ID = rhs.ID;
-            this.Description = rhs.Description;
             this.Name = rhs.Name;
-            this.SortCode = rhs.SortCode;
+            this.MinLevel = rhs.MinLevel;
+            this.MaxLevel = rhs.MaxLevel;
+            this.DN = rhs.DN;
+            this.MinVol = rhs.MinVol;
+            this.OverFlow = rhs.OverFlow;
             this.KeyWord = string.Join(",", rhs.KeyWord);
+            this.SortCode = rhs.SortCode;
+            this.Description = rhs.Description;
         }
 
         public void Reset(Vmo.AssetsTankMainVmo rhs)
         {
             this.ID = rhs.ID;
-            this.Description = rhs.Description;
             this.Name = rhs.Name;
+            this.MinLevel = rhs.MinLevel;
+            this.MaxLevel = rhs.MaxLevel;
+            this.DN = rhs.DN;
+            this.MinVol = rhs.MinVol;
+            this.OverFlow = rhs.OverFlow;
             this.KeyWord = string.Join(",", rhs.KeyWord);
             this.SortCode = rhs.SortCode;
+            this.Description = rhs.Description;
         }
 
         /// <summary>
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 6186082..fd44935 100644
--- a/WinFrmUI/HStation.WinFrmUI.Assets.Core/HStation.WinFrmUI.Assets.Core.csproj
+++ b/WinFrmUI/HStation.WinFrmUI.Assets.Core/HStation.WinFrmUI.Assets.Core.csproj
@@ -118,6 +118,21 @@
     <Compile Update="07-fourLink\03-coefficient\SetFourlinkCoefficientDlg.cs">
       <SubType>Form</SubType>
     </Compile>
+    <Compile Update="14-tank\04-chart-edit\TankPerform2dEditCtrl.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Update="14-tank\04-chart-edit\TankPerform2dEditDlg.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Update="14-tank\04-chart-edit\TankMainPhartMinorLossPanel.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Update="14-tank\05-import\01-excel\ImportTankPerform2dByExcelCtrl.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Update="14-tank\05-import\01-excel\ImportTankPerform2dByExcelDlg.cs">
+      <SubType>Form</SubType>
+    </Compile>
     <Compile Update="19-translation\01-series\AddAssetsBluntheadSeriesDlg.cs">
       <SubType>Form</SubType>
     </Compile>
diff --git a/WinFrmUI/HStation.WinFrmUI.Assets.Core/HStation.WinFrmUI.Assets.Core.csproj.user b/WinFrmUI/HStation.WinFrmUI.Assets.Core/HStation.WinFrmUI.Assets.Core.csproj.user
index 971f747..c19e8dc 100644
--- a/WinFrmUI/HStation.WinFrmUI.Assets.Core/HStation.WinFrmUI.Assets.Core.csproj.user
+++ b/WinFrmUI/HStation.WinFrmUI.Assets.Core/HStation.WinFrmUI.Assets.Core.csproj.user
@@ -257,5 +257,8 @@
     <Compile Update="11-compressor\ExchangerManageMainPage.cs">
       <SubType>UserControl</SubType>
     </Compile>
+    <Compile Update="14-tank\04-chart-edit\TankPerform2dEditChart.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
   </ItemGroup>
 </Project>
\ No newline at end of file
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/04-scheme/01-add/01-set/01-pump/SetSchemePumpListCtrl.cs b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/04-scheme/01-add/01-set/01-pump/SetSchemePumpListCtrl.cs
index 2da3097..bf2a5d0 100644
--- a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/04-scheme/01-add/01-set/01-pump/SetSchemePumpListCtrl.cs
+++ b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/04-scheme/01-add/01-set/01-pump/SetSchemePumpListCtrl.cs
@@ -30,6 +30,7 @@
         /// 姘村姏鐐瑰嚮浜嬩欢
         /// </summary>
         public event Action<Yw.Model.HydroParterInfo> HydroClickEvent;
+
         /// <summary>
         /// 姘村姏鏀瑰彉浜嬩欢
         /// </summary>
@@ -60,16 +61,17 @@
             get { return _allList != null && _allList.Count > 0; }
         }
 
-
         //姘村姏淇℃伅
         private Yw.Model.HydroModelInfo _hydroInfo = null;
+
         //姘村姏淇℃伅(澶囦唤)
         private Yw.Model.HydroModelInfo _hydroInfo_bak = null;
+
         //鎵�鏈夊垪琛�
         private List<HydroPumpViewModel> _allList = null;
+
         //鎵�鏈夌粦瀹氬垪琛�
         private List<HydroPumpViewModel> _allBindingList = null;
-
 
         /// <summary>
         /// 缁戝畾鏁版嵁
@@ -231,84 +233,81 @@
         //閫夋嫨
         private void SelectChange()
         {
-            if (_hydroInfo == null)
-            {
-                XtraMessageBox.Show("鏃犳按鍔涗俊鎭�");
-                return;
-            }
-            Search();
-            var row = this.gridView1.GetFocusedRow() as HydroPumpViewModel;
-            if (row == null)
-            {
-                XtraMessageBox.Show("鏃犲彲璁剧疆姘存车鏁版嵁");
-                return;
-            }
+            /*  if (_hydroInfo == null)
+              {
+                  XtraMessageBox.Show("鏃犳按鍔涗俊鎭�");
+                  return;
+              }
+              Search();
+              var row = this.gridView1.GetFocusedRow() as HydroPumpViewModel;
+              if (row == null)
+              {
+                  XtraMessageBox.Show("鏃犲彲璁剧疆姘存车鏁版嵁");
+                  return;
+              }
 
-            var input = AssetsMatchingParasHelper.Create(_hydroInfo, row.Vmo, null);
-            var dlg = new PumpMatchingDlg();
-            dlg.SetBindingData(input);
-            dlg.ReloadDataEvent += (output) =>
-            {
-                var bol = AssetsMatchingParasHelper.Apply(_hydroInfo, output);
-                if (bol)
-                {
-                    UpdateProperty();
-                }
-            };
-            dlg.ShowDialog();
+              var input = AssetsMatchingParasHelper.Create(_hydroInfo, row.Vmo, null);
+              var dlg = new SimulationPumpSingleMatchingDlg();
+              dlg.SetBindingData(input);
+              dlg.ReloadDataEvent += (output) =>
+              {
+                  var bol = AssetsMatchingParasHelper.Apply(_hydroInfo, output);
+                  if (bol)
+                  {
+                      UpdateProperty();
+                  }
+              };
+              dlg.ShowDialog();*/
         }
-
 
         private void gridView1_RowCellClick(object sender, DevExpress.XtraGrid.Views.Grid.RowCellClickEventArgs e)
         {
-            var row = this.gridView1.GetRow(e.RowHandle) as HydroPumpViewModel;
-            if (row == null)
-            {
-                return;
-            }
+            /*  var row = this.gridView1.GetRow(e.RowHandle) as HydroPumpViewModel;
+              if (row == null)
+              {
+                  return;
+              }
 
-            if (e.Column == this.colSelect)
-            {
-                var input = AssetsMatchingParasHelper.Create(_hydroInfo, row.Vmo, null);
-                var dlg = new PumpMatchingDlg();
-                dlg.SetBindingData(input);
-                dlg.ReloadDataEvent += (output) =>
-                {
+              if (e.Column == this.colSelect)
+              {
+                  var input = AssetsMatchingParasHelper.Create(_hydroInfo, row.Vmo, null);
+                  var dlg = new SimulationPumpSingleMatchingDlg();
+                  dlg.SetBindingData(input);
+                  dlg.ReloadDataEvent += (output) =>
+                  {
+                      var bol = AssetsMatchingParasHelper.Apply(_hydroInfo, output);
+                      if (bol)
+                      {
+                          row.UpdateProperty();
+                          this.gridView1.RefreshRow(e.RowHandle);
+                          this.HydroChangedEvent?.Invoke(new List<Yw.Model.HydroParterInfo>() { row.Vmo });
 
-                    var bol = AssetsMatchingParasHelper.Apply(_hydroInfo, output);
-                    if (bol)
-                    {
-                        row.UpdateProperty();
-                        this.gridView1.RefreshRow(e.RowHandle);
-                        this.HydroChangedEvent?.Invoke(new List<Yw.Model.HydroParterInfo>() { row.Vmo });
+                          var record = new SetSchemeParterRecord();
+                          record.Name = row.Vmo.Name;
+                          record.Code = row.Vmo.Code;
+                          record.Catalog = Yw.Hydro.ParterCatalog.Pump;
+                          record.MatchingModel = output;
 
-                        var record = new SetSchemeParterRecord();
-                        record.Name = row.Vmo.Name;
-                        record.Code = row.Vmo.Code;
-                        record.Catalog = Yw.Hydro.ParterCatalog.Pump;
-                        record.MatchingModel = output;
+                          record.Items = new List<SetSchemeParterRecordItem>() {
+                          new() {Name="鍨嬪彿",BeforeValue=$"{output.ModelType}",AfterValue=$"{output.MatchingModelType}"},
+                          new() {Name="棰濆畾鍔熺巼",BeforeValue=$"{output.RatedP}",AfterValue=$"{output.MatchingRatedP}"},
+                          new() {Name="棰濆畾娴侀噺",BeforeValue=$"{output.RatedQ}",AfterValue=$"{output.MatchingRatedQ}"},
+                          new() {Name="棰濆畾鎵▼",BeforeValue=$"{output.RatedH}",AfterValue=$"{output.MatchingRatedH}"},
+                          new() {Name="棰濆畾杞��",BeforeValue=$"{output.RatedN}",AfterValue=$"{output.MatchingRatedN}"},
+                          new() {Name="棰濆畾棰戠巼",BeforeValue=$"{output.RatedHz}",AfterValue=$"{output.MatchingRatedHz}"}
+                          };
+                          this.HydroRecordChangedEvent?.Invoke(record);
+                      }
+                  };
+                  dlg.ShowDialog();
+              }
+              else
+              {
+                  this.HydroClickEvent?.Invoke(row.Vmo);
+              }
+          }
 
-                        record.Items = new List<SetSchemeParterRecordItem>() {
-                        new() {Name="鍨嬪彿",BeforeValue=$"{output.ModelType}",AfterValue=$"{output.MatchingModelType}"},
-                        new() {Name="棰濆畾鍔熺巼",BeforeValue=$"{output.RatedP}",AfterValue=$"{output.MatchingRatedP}"},
-                        new() {Name="棰濆畾娴侀噺",BeforeValue=$"{output.RatedQ}",AfterValue=$"{output.MatchingRatedQ}"},
-                        new() {Name="棰濆畾鎵▼",BeforeValue=$"{output.RatedH}",AfterValue=$"{output.MatchingRatedH}"},
-                        new() {Name="棰濆畾杞��",BeforeValue=$"{output.RatedN}",AfterValue=$"{output.MatchingRatedN}"},
-                        new() {Name="棰濆畾棰戠巼",BeforeValue=$"{output.RatedHz}",AfterValue=$"{output.MatchingRatedHz}"}
-                        };
-                        this.HydroRecordChangedEvent?.Invoke(record);
-                    }
-                };
-                dlg.ShowDialog();
-            }
-            else
-            {
-                this.HydroClickEvent?.Invoke(row.Vmo);
-            }
+  */
         }
-
-
-
-
     }
-}
+}
\ No newline at end of file
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/01-matching/02-pump/01-pumpsinglematching/PumpMatchingDlg.Designer.cs b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/01-matching/02-pump/01-pumpsinglematching/PumpMatchingDlg.Designer.cs
deleted file mode 100644
index 59c6945..0000000
--- a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/01-matching/02-pump/01-pumpsinglematching/PumpMatchingDlg.Designer.cs
+++ /dev/null
@@ -1,557 +0,0 @@
-锘縩amespace HStation.WinFrmUI.Xhs
-{
-    partial class PumpMatchingDlg
-    {
-        /// <summary>
-        /// Required designer variable.
-        /// </summary>
-        private System.ComponentModel.IContainer components = null;
-
-        /// <summary>
-        /// Clean up any resources being used.
-        /// </summary>
-        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
-        protected override void Dispose(bool disposing)
-        {
-            if (disposing && (components != null))
-            {
-                components.Dispose();
-            }
-            base.Dispose(disposing);
-        }
-
-        #region Windows Form Designer generated code
-
-        /// <summary>
-        /// Required method for Designer support - do not modify
-        /// the contents of this method with the code editor.
-        /// </summary>
-        private void InitializeComponent()
-        {
-            ComponentResourceManager resources = new ComponentResourceManager(typeof(PumpMatchingDlg));
-            ribbon = new DevExpress.XtraBars.Ribbon.RibbonControl();
-            barEditSearch = new DevExpress.XtraBars.BarEditItem();
-            repSearchCtrl = new DevExpress.XtraEditors.Repository.RepositoryItemSearchControl();
-            gridControlPumpMain = new DevExpress.XtraGrid.GridControl();
-            gridViewPumpMain = new DevExpress.XtraGrid.Views.Grid.GridView();
-            colName = new DevExpress.XtraGrid.Columns.GridColumn();
-            colRatedFlow = new DevExpress.XtraGrid.Columns.GridColumn();
-            colRatedHead = new DevExpress.XtraGrid.Columns.GridColumn();
-            colD2 = new DevExpress.XtraGrid.Columns.GridColumn();
-            colErosion = new DevExpress.XtraGrid.Columns.GridColumn();
-            colRatedEfficiency = new DevExpress.XtraGrid.Columns.GridColumn();
-            colRatedPower = new DevExpress.XtraGrid.Columns.GridColumn();
-            colRatedSpeed = new DevExpress.XtraGrid.Columns.GridColumn();
-            barBtnOK = new DevExpress.XtraBars.BarButtonItem();
-            ribbonPage1 = new DevExpress.XtraBars.Ribbon.RibbonPage();
-            ribbonPageGroup1 = new DevExpress.XtraBars.Ribbon.RibbonPageGroup();
-            xtrPerform2dChart1 = new Yw.WinFrmUI.Phart.PumpViewChart();
-            sidePanel1 = new SidePanel();
-            sidePanel3 = new SidePanel();
-            layoutControl3 = new DevExpress.XtraLayout.LayoutControl();
-            gridControlCurve = new DevExpress.XtraGrid.GridControl();
-            gridViewCurve = new DevExpress.XtraGrid.Views.Grid.GridView();
-            gridColumn3 = new DevExpress.XtraGrid.Columns.GridColumn();
-            gridColumn2 = new DevExpress.XtraGrid.Columns.GridColumn();
-            gridColumn1 = new DevExpress.XtraGrid.Columns.GridColumn();
-            layoutControlGroup6 = new DevExpress.XtraLayout.LayoutControlGroup();
-            layoutControlGroup7 = new DevExpress.XtraLayout.LayoutControlGroup();
-            layoutControlItem3 = new DevExpress.XtraLayout.LayoutControlItem();
-            sidePanel2 = new SidePanel();
-            layoutControl2 = new DevExpress.XtraLayout.LayoutControl();
-            layoutControlGroup4 = new DevExpress.XtraLayout.LayoutControlGroup();
-            layoutControlGroup5 = new DevExpress.XtraLayout.LayoutControlGroup();
-            layoutControlItem4 = new DevExpress.XtraLayout.LayoutControlItem();
-            layoutControl1 = new DevExpress.XtraLayout.LayoutControl();
-            Root = new DevExpress.XtraLayout.LayoutControlGroup();
-            layoutControlGroup1 = new DevExpress.XtraLayout.LayoutControlGroup();
-            layoutControlItem1 = new DevExpress.XtraLayout.LayoutControlItem();
-            ((ISupportInitialize)ribbon).BeginInit();
-            ((ISupportInitialize)repSearchCtrl).BeginInit();
-            ((ISupportInitialize)gridControlPumpMain).BeginInit();
-            ((ISupportInitialize)gridViewPumpMain).BeginInit();
-            sidePanel1.SuspendLayout();
-            sidePanel3.SuspendLayout();
-            ((ISupportInitialize)layoutControl3).BeginInit();
-            layoutControl3.SuspendLayout();
-            ((ISupportInitialize)gridControlCurve).BeginInit();
-            ((ISupportInitialize)gridViewCurve).BeginInit();
-            ((ISupportInitialize)layoutControlGroup6).BeginInit();
-            ((ISupportInitialize)layoutControlGroup7).BeginInit();
-            ((ISupportInitialize)layoutControlItem3).BeginInit();
-            sidePanel2.SuspendLayout();
-            ((ISupportInitialize)layoutControl2).BeginInit();
-            layoutControl2.SuspendLayout();
-            ((ISupportInitialize)layoutControlGroup4).BeginInit();
-            ((ISupportInitialize)layoutControlGroup5).BeginInit();
-            ((ISupportInitialize)layoutControlItem4).BeginInit();
-            ((ISupportInitialize)layoutControl1).BeginInit();
-            layoutControl1.SuspendLayout();
-            ((ISupportInitialize)Root).BeginInit();
-            ((ISupportInitialize)layoutControlGroup1).BeginInit();
-            ((ISupportInitialize)layoutControlItem1).BeginInit();
-            SuspendLayout();
-            // 
-            // ribbon
-            // 
-            ribbon.EmptyAreaImageOptions.ImagePadding = new Padding(21, 19, 21, 19);
-            ribbon.ExpandCollapseItem.Id = 0;
-            ribbon.ItemPanelStyle = DevExpress.XtraBars.Ribbon.RibbonItemPanelStyle.Classic;
-            ribbon.Items.AddRange(new DevExpress.XtraBars.BarItem[] { ribbon.ExpandCollapseItem, barEditSearch, barBtnOK });
-            ribbon.Location = new Point(0, 0);
-            ribbon.Margin = new Padding(2);
-            ribbon.MaxItemId = 3;
-            ribbon.Name = "ribbon";
-            ribbon.OptionsMenuMinWidth = 231;
-            ribbon.Pages.AddRange(new DevExpress.XtraBars.Ribbon.RibbonPage[] { ribbonPage1 });
-            ribbon.RepositoryItems.AddRange(new DevExpress.XtraEditors.Repository.RepositoryItem[] { repSearchCtrl });
-            ribbon.RibbonStyle = DevExpress.XtraBars.Ribbon.RibbonControlStyle.TabletOffice;
-            ribbon.SearchItemPosition = DevExpress.XtraBars.Ribbon.SearchItemPosition.None;
-            ribbon.ShowApplicationButton = DevExpress.Utils.DefaultBoolean.False;
-            ribbon.ShowDisplayOptionsMenuButton = DevExpress.Utils.DefaultBoolean.False;
-            ribbon.ShowExpandCollapseButton = DevExpress.Utils.DefaultBoolean.False;
-            ribbon.ShowMoreCommandsButton = DevExpress.Utils.DefaultBoolean.False;
-            ribbon.ShowPageHeadersInFormCaption = DevExpress.Utils.DefaultBoolean.False;
-            ribbon.ShowPageHeadersMode = DevExpress.XtraBars.Ribbon.ShowPageHeadersMode.Hide;
-            ribbon.ShowQatLocationSelector = false;
-            ribbon.ShowToolbarCustomizeItem = false;
-            ribbon.Size = new Size(1244, 57);
-            ribbon.Toolbar.ShowCustomizeItem = false;
-            // 
-            // barEditSearch
-            // 
-            barEditSearch.Edit = repSearchCtrl;
-            barEditSearch.EditWidth = 200;
-            barEditSearch.Id = 1;
-            barEditSearch.Name = "barEditSearch";
-            // 
-            // repSearchCtrl
-            // 
-            repSearchCtrl.AutoHeight = false;
-            repSearchCtrl.Buttons.AddRange(new EditorButton[] { new DevExpress.XtraEditors.Repository.ClearButton(), new DevExpress.XtraEditors.Repository.SearchButton() });
-            repSearchCtrl.Client = gridControlPumpMain;
-            repSearchCtrl.Name = "repSearchCtrl";
-            repSearchCtrl.NullValuePrompt = "鍨嬪彿";
-            // 
-            // gridControlPumpMain
-            // 
-            gridControlPumpMain.EmbeddedNavigator.Margin = new Padding(4, 5, 4, 5);
-            gridControlPumpMain.Location = new Point(0, 22);
-            gridControlPumpMain.MainView = gridViewPumpMain;
-            gridControlPumpMain.Margin = new Padding(4, 5, 4, 5);
-            gridControlPumpMain.Name = "gridControlPumpMain";
-            gridControlPumpMain.Size = new Size(718, 299);
-            gridControlPumpMain.TabIndex = 3;
-            gridControlPumpMain.ViewCollection.AddRange(new DevExpress.XtraGrid.Views.Base.BaseView[] { gridViewPumpMain });
-            // 
-            // gridViewPumpMain
-            // 
-            gridViewPumpMain.Appearance.HeaderPanel.Options.UseTextOptions = true;
-            gridViewPumpMain.Appearance.HeaderPanel.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center;
-            gridViewPumpMain.Columns.AddRange(new DevExpress.XtraGrid.Columns.GridColumn[] { colName, colRatedFlow, colRatedHead, colD2, colErosion, colRatedEfficiency, colRatedPower, colRatedSpeed });
-            gridViewPumpMain.DetailHeight = 550;
-            gridViewPumpMain.GridControl = gridControlPumpMain;
-            gridViewPumpMain.Name = "gridViewPumpMain";
-            gridViewPumpMain.OptionsEditForm.PopupEditFormWidth = 1143;
-            gridViewPumpMain.OptionsView.ShowGroupPanel = false;
-            gridViewPumpMain.FocusedRowChanged += gridViewPumpMain_FocusedRowChanged;
-            // 
-            // colName
-            // 
-            colName.Caption = "鍨嬪彿";
-            colName.FieldName = "Name";
-            colName.MinWidth = 29;
-            colName.Name = "colName";
-            colName.Visible = true;
-            colName.VisibleIndex = 0;
-            colName.Width = 407;
-            // 
-            // colRatedFlow
-            // 
-            colRatedFlow.Caption = "棰濆畾娴侀噺(m鲁/h)";
-            colRatedFlow.FieldName = "RatedFlow";
-            colRatedFlow.MinWidth = 29;
-            colRatedFlow.Name = "colRatedFlow";
-            colRatedFlow.Visible = true;
-            colRatedFlow.VisibleIndex = 1;
-            colRatedFlow.Width = 107;
-            // 
-            // colRatedHead
-            // 
-            colRatedHead.Caption = "棰濆畾鎵▼(m)";
-            colRatedHead.FieldName = "RatedHead";
-            colRatedHead.MinWidth = 29;
-            colRatedHead.Name = "colRatedHead";
-            colRatedHead.Visible = true;
-            colRatedHead.VisibleIndex = 2;
-            colRatedHead.Width = 87;
-            // 
-            // colD2
-            // 
-            colD2.Caption = "鍙惰疆澶栧緞(mm)";
-            colD2.FieldName = "D2";
-            colD2.MinWidth = 29;
-            colD2.Name = "colD2";
-            colD2.Visible = true;
-            colD2.VisibleIndex = 3;
-            colD2.Width = 110;
-            // 
-            // colErosion
-            // 
-            colErosion.Caption = "姘旇殌";
-            colErosion.FieldName = "Erosion";
-            colErosion.MinWidth = 29;
-            colErosion.Name = "colErosion";
-            colErosion.Visible = true;
-            colErosion.VisibleIndex = 4;
-            colErosion.Width = 62;
-            // 
-            // colRatedEfficiency
-            // 
-            colRatedEfficiency.Caption = "棰濆畾鏁堢巼";
-            colRatedEfficiency.FieldName = "RatedEfficiency";
-            colRatedEfficiency.MinWidth = 29;
-            colRatedEfficiency.Name = "colRatedEfficiency";
-            colRatedEfficiency.Visible = true;
-            colRatedEfficiency.VisibleIndex = 5;
-            colRatedEfficiency.Width = 72;
-            // 
-            // colRatedPower
-            // 
-            colRatedPower.Caption = "棰濆畾鍔熺巼";
-            colRatedPower.FieldName = "RatedPower";
-            colRatedPower.MinWidth = 29;
-            colRatedPower.Name = "colRatedPower";
-            colRatedPower.Visible = true;
-            colRatedPower.VisibleIndex = 6;
-            colRatedPower.Width = 64;
-            // 
-            // colRatedSpeed
-            // 
-            colRatedSpeed.Caption = "棰濆畾杞��";
-            colRatedSpeed.FieldName = "RatedSpeed";
-            colRatedSpeed.MinWidth = 29;
-            colRatedSpeed.Name = "colRatedSpeed";
-            colRatedSpeed.Visible = true;
-            colRatedSpeed.VisibleIndex = 7;
-            colRatedSpeed.Width = 97;
-            // 
-            // barBtnOK
-            // 
-            barBtnOK.Caption = "淇濆瓨";
-            barBtnOK.Id = 2;
-            barBtnOK.ImageOptions.SvgImage = (DevExpress.Utils.Svg.SvgImage)resources.GetObject("barBtnOK.ImageOptions.SvgImage");
-            barBtnOK.Name = "barBtnOK";
-            barBtnOK.ItemClick += barBtnOK_ItemClick;
-            // 
-            // ribbonPage1
-            // 
-            ribbonPage1.Groups.AddRange(new DevExpress.XtraBars.Ribbon.RibbonPageGroup[] { ribbonPageGroup1 });
-            ribbonPage1.Name = "ribbonPage1";
-            ribbonPage1.Text = "ribbonPage1";
-            // 
-            // ribbonPageGroup1
-            // 
-            ribbonPageGroup1.ItemLinks.Add(barEditSearch);
-            ribbonPageGroup1.ItemLinks.Add(barBtnOK);
-            ribbonPageGroup1.Name = "ribbonPageGroup1";
-            ribbonPageGroup1.Text = "鎼滅储";
-            // 
-            // xtrPerform2dChart1
-            // 
-            xtrPerform2dChart1.DefinePointVisible = false;
-            xtrPerform2dChart1.LineVisible = false;
-            xtrPerform2dChart1.Location = new Point(0, 22);
-            xtrPerform2dChart1.Margin = new Padding(1);
-            xtrPerform2dChart1.Name = "xtrPerform2dChart1";
-            xtrPerform2dChart1.Size = new Size(526, 636);
-            xtrPerform2dChart1.TabIndex = 3;
-            // 
-            // sidePanel1
-            // 
-            sidePanel1.BorderThickness = 0;
-            sidePanel1.Controls.Add(sidePanel3);
-            sidePanel1.Controls.Add(sidePanel2);
-            sidePanel1.Dock = DockStyle.Left;
-            sidePanel1.Location = new Point(0, 57);
-            sidePanel1.Name = "sidePanel1";
-            sidePanel1.Size = new Size(718, 658);
-            sidePanel1.TabIndex = 4;
-            sidePanel1.Text = "sidePanel1";
-            // 
-            // sidePanel3
-            // 
-            sidePanel3.BorderThickness = 0;
-            sidePanel3.Controls.Add(layoutControl3);
-            sidePanel3.Dock = DockStyle.Fill;
-            sidePanel3.Location = new Point(0, 321);
-            sidePanel3.Name = "sidePanel3";
-            sidePanel3.Size = new Size(718, 337);
-            sidePanel3.TabIndex = 6;
-            sidePanel3.Text = "sidePanel3";
-            // 
-            // layoutControl3
-            // 
-            layoutControl3.Controls.Add(gridControlCurve);
-            layoutControl3.Dock = DockStyle.Fill;
-            layoutControl3.Location = new Point(0, 0);
-            layoutControl3.Name = "layoutControl3";
-            layoutControl3.OptionsCustomizationForm.DesignTimeCustomizationFormPositionAndSize = new Rectangle(1227, 608, 975, 600);
-            layoutControl3.Root = layoutControlGroup6;
-            layoutControl3.Size = new Size(718, 337);
-            layoutControl3.TabIndex = 0;
-            layoutControl3.Text = "layoutControl3";
-            // 
-            // gridControlCurve
-            // 
-            gridControlCurve.Location = new Point(0, 22);
-            gridControlCurve.MainView = gridViewCurve;
-            gridControlCurve.Margin = new Padding(0);
-            gridControlCurve.Name = "gridControlCurve";
-            gridControlCurve.Size = new Size(718, 315);
-            gridControlCurve.TabIndex = 4;
-            gridControlCurve.ViewCollection.AddRange(new DevExpress.XtraGrid.Views.Base.BaseView[] { gridViewCurve });
-            // 
-            // gridViewCurve
-            // 
-            gridViewCurve.Columns.AddRange(new DevExpress.XtraGrid.Columns.GridColumn[] { gridColumn3, gridColumn2, gridColumn1 });
-            gridViewCurve.GridControl = gridControlCurve;
-            gridViewCurve.Name = "gridViewCurve";
-            gridViewCurve.OptionsView.ShowGroupPanel = false;
-            gridViewCurve.FocusedRowChanged += gridViewCurve_FocusedRowChanged;
-            // 
-            // gridColumn3
-            // 
-            gridColumn3.Caption = "鎺掑簭鐮�";
-            gridColumn3.FieldName = "SortCode";
-            gridColumn3.Name = "gridColumn3";
-            // 
-            // gridColumn2
-            // 
-            gridColumn2.Caption = "閲嶈搴�";
-            gridColumn2.FieldName = "Importance";
-            gridColumn2.Name = "gridColumn2";
-            gridColumn2.Visible = true;
-            gridColumn2.VisibleIndex = 1;
-            // 
-            // gridColumn1
-            // 
-            gridColumn1.Caption = "鍚嶇О";
-            gridColumn1.FieldName = "OtherName";
-            gridColumn1.Name = "gridColumn1";
-            gridColumn1.Visible = true;
-            gridColumn1.VisibleIndex = 0;
-            // 
-            // layoutControlGroup6
-            // 
-            layoutControlGroup6.EnableIndentsWithoutBorders = DevExpress.Utils.DefaultBoolean.True;
-            layoutControlGroup6.GroupBordersVisible = false;
-            layoutControlGroup6.Items.AddRange(new DevExpress.XtraLayout.BaseLayoutItem[] { layoutControlGroup7 });
-            layoutControlGroup6.Name = "Root";
-            layoutControlGroup6.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
-            layoutControlGroup6.Size = new Size(718, 337);
-            layoutControlGroup6.TextVisible = false;
-            // 
-            // layoutControlGroup7
-            // 
-            layoutControlGroup7.GroupStyle = DevExpress.Utils.GroupStyle.Title;
-            layoutControlGroup7.Items.AddRange(new DevExpress.XtraLayout.BaseLayoutItem[] { layoutControlItem3 });
-            layoutControlGroup7.Location = new Point(0, 0);
-            layoutControlGroup7.Name = "layoutControlGroup7";
-            layoutControlGroup7.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
-            layoutControlGroup7.Size = new Size(718, 337);
-            layoutControlGroup7.Spacing = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
-            layoutControlGroup7.Text = "娉靛瀷鍙锋洸绾�";
-            // 
-            // layoutControlItem3
-            // 
-            layoutControlItem3.Control = gridControlCurve;
-            layoutControlItem3.Location = new Point(0, 0);
-            layoutControlItem3.Name = "layoutControlItem3";
-            layoutControlItem3.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
-            layoutControlItem3.Size = new Size(718, 315);
-            layoutControlItem3.TextSize = new Size(0, 0);
-            layoutControlItem3.TextVisible = false;
-            // 
-            // sidePanel2
-            // 
-            sidePanel2.BorderThickness = 0;
-            sidePanel2.Controls.Add(layoutControl2);
-            sidePanel2.Dock = DockStyle.Top;
-            sidePanel2.Location = new Point(0, 0);
-            sidePanel2.Margin = new Padding(4, 5, 4, 5);
-            sidePanel2.Name = "sidePanel2";
-            sidePanel2.Size = new Size(718, 321);
-            sidePanel2.TabIndex = 5;
-            sidePanel2.Text = "sidePanel2";
-            // 
-            // layoutControl2
-            // 
-            layoutControl2.Controls.Add(gridControlPumpMain);
-            layoutControl2.Dock = DockStyle.Fill;
-            layoutControl2.Location = new Point(0, 0);
-            layoutControl2.Margin = new Padding(6, 8, 6, 8);
-            layoutControl2.Name = "layoutControl2";
-            layoutControl2.OptionsCustomizationForm.DesignTimeCustomizationFormPositionAndSize = new Rectangle(760, 358, 975, 600);
-            layoutControl2.Root = layoutControlGroup4;
-            layoutControl2.Size = new Size(718, 321);
-            layoutControl2.TabIndex = 0;
-            layoutControl2.Text = "layoutControl2";
-            // 
-            // layoutControlGroup4
-            // 
-            layoutControlGroup4.EnableIndentsWithoutBorders = DevExpress.Utils.DefaultBoolean.True;
-            layoutControlGroup4.GroupBordersVisible = false;
-            layoutControlGroup4.Items.AddRange(new DevExpress.XtraLayout.BaseLayoutItem[] { layoutControlGroup5 });
-            layoutControlGroup4.Name = "Root";
-            layoutControlGroup4.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
-            layoutControlGroup4.Size = new Size(718, 321);
-            layoutControlGroup4.TextVisible = false;
-            // 
-            // layoutControlGroup5
-            // 
-            layoutControlGroup5.GroupStyle = DevExpress.Utils.GroupStyle.Title;
-            layoutControlGroup5.Items.AddRange(new DevExpress.XtraLayout.BaseLayoutItem[] { layoutControlItem4 });
-            layoutControlGroup5.Location = new Point(0, 0);
-            layoutControlGroup5.Name = "layoutControlGroup5";
-            layoutControlGroup5.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
-            layoutControlGroup5.Size = new Size(718, 321);
-            layoutControlGroup5.Spacing = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
-            layoutControlGroup5.Text = "娉靛瀷鍙�";
-            // 
-            // layoutControlItem4
-            // 
-            layoutControlItem4.Control = gridControlPumpMain;
-            layoutControlItem4.Location = new Point(0, 0);
-            layoutControlItem4.Name = "layoutControlItem4";
-            layoutControlItem4.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
-            layoutControlItem4.Size = new Size(718, 299);
-            layoutControlItem4.TextSize = new Size(0, 0);
-            layoutControlItem4.TextVisible = false;
-            // 
-            // layoutControl1
-            // 
-            layoutControl1.Controls.Add(xtrPerform2dChart1);
-            layoutControl1.Dock = DockStyle.Fill;
-            layoutControl1.Location = new Point(718, 57);
-            layoutControl1.Margin = new Padding(2);
-            layoutControl1.Name = "layoutControl1";
-            layoutControl1.OptionsCustomizationForm.DesignTimeCustomizationFormPositionAndSize = new Rectangle(1487, 656, 975, 600);
-            layoutControl1.Root = Root;
-            layoutControl1.Size = new Size(526, 658);
-            layoutControl1.TabIndex = 6;
-            layoutControl1.Text = "layoutControl1";
-            // 
-            // Root
-            // 
-            Root.EnableIndentsWithoutBorders = DevExpress.Utils.DefaultBoolean.True;
-            Root.GroupBordersVisible = false;
-            Root.Items.AddRange(new DevExpress.XtraLayout.BaseLayoutItem[] { layoutControlGroup1 });
-            Root.Name = "Root";
-            Root.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
-            Root.Size = new Size(526, 658);
-            Root.TextVisible = false;
-            // 
-            // layoutControlGroup1
-            // 
-            layoutControlGroup1.GroupStyle = DevExpress.Utils.GroupStyle.Title;
-            layoutControlGroup1.Items.AddRange(new DevExpress.XtraLayout.BaseLayoutItem[] { layoutControlItem1 });
-            layoutControlGroup1.Location = new Point(0, 0);
-            layoutControlGroup1.Name = "layoutControlGroup1";
-            layoutControlGroup1.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
-            layoutControlGroup1.Size = new Size(526, 658);
-            layoutControlGroup1.Spacing = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
-            layoutControlGroup1.Text = "鏇茬嚎瑙嗗浘";
-            // 
-            // layoutControlItem1
-            // 
-            layoutControlItem1.Control = xtrPerform2dChart1;
-            layoutControlItem1.Location = new Point(0, 0);
-            layoutControlItem1.Name = "layoutControlItem1";
-            layoutControlItem1.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
-            layoutControlItem1.Size = new Size(526, 636);
-            layoutControlItem1.TextSize = new Size(0, 0);
-            layoutControlItem1.TextVisible = false;
-            // 
-            // PumpMatchingDlg
-            // 
-            AutoScaleDimensions = new SizeF(7F, 14F);
-            AutoScaleMode = AutoScaleMode.Font;
-            ClientSize = new Size(1244, 715);
-            Controls.Add(layoutControl1);
-            Controls.Add(sidePanel1);
-            Controls.Add(ribbon);
-            Margin = new Padding(2);
-            Name = "PumpMatchingDlg";
-            Ribbon = ribbon;
-            StartPosition = FormStartPosition.CenterScreen;
-            Text = "閫夋嫨娉靛瀷鍙�";
-            ((ISupportInitialize)ribbon).EndInit();
-            ((ISupportInitialize)repSearchCtrl).EndInit();
-            ((ISupportInitialize)gridControlPumpMain).EndInit();
-            ((ISupportInitialize)gridViewPumpMain).EndInit();
-            sidePanel1.ResumeLayout(false);
-            sidePanel3.ResumeLayout(false);
-            ((ISupportInitialize)layoutControl3).EndInit();
-            layoutControl3.ResumeLayout(false);
-            ((ISupportInitialize)gridControlCurve).EndInit();
-            ((ISupportInitialize)gridViewCurve).EndInit();
-            ((ISupportInitialize)layoutControlGroup6).EndInit();
-            ((ISupportInitialize)layoutControlGroup7).EndInit();
-            ((ISupportInitialize)layoutControlItem3).EndInit();
-            sidePanel2.ResumeLayout(false);
-            ((ISupportInitialize)layoutControl2).EndInit();
-            layoutControl2.ResumeLayout(false);
-            ((ISupportInitialize)layoutControlGroup4).EndInit();
-            ((ISupportInitialize)layoutControlGroup5).EndInit();
-            ((ISupportInitialize)layoutControlItem4).EndInit();
-            ((ISupportInitialize)layoutControl1).EndInit();
-            layoutControl1.ResumeLayout(false);
-            ((ISupportInitialize)Root).EndInit();
-            ((ISupportInitialize)layoutControlGroup1).EndInit();
-            ((ISupportInitialize)layoutControlItem1).EndInit();
-            ResumeLayout(false);
-            PerformLayout();
-        }
-
-        #endregion
-
-        private DevExpress.XtraBars.Ribbon.RibbonControl ribbon;
-        private DevExpress.XtraBars.BarEditItem barEditSearch;
-        private DevExpress.XtraEditors.Repository.RepositoryItemSearchControl repSearchCtrl;
-        private DevExpress.XtraBars.Ribbon.RibbonPage ribbonPage1;
-        private DevExpress.XtraBars.Ribbon.RibbonPageGroup ribbonPageGroup1;
-        private Yw.WinFrmUI.Phart.PumpViewChart xtrPerform2dChart1;
-        private SidePanel sidePanel1;
-        private SidePanel sidePanel3;
-        private DevExpress.XtraLayout.LayoutControl layoutControl3;
-        private DevExpress.XtraGrid.GridControl gridControlCurve;
-        private DevExpress.XtraGrid.Views.Grid.GridView gridViewCurve;
-        private DevExpress.XtraGrid.Columns.GridColumn gridColumn3;
-        private DevExpress.XtraGrid.Columns.GridColumn gridColumn2;
-        private DevExpress.XtraGrid.Columns.GridColumn gridColumn1;
-        private DevExpress.XtraLayout.LayoutControlGroup layoutControlGroup6;
-        private DevExpress.XtraLayout.LayoutControlGroup layoutControlGroup7;
-        private DevExpress.XtraLayout.LayoutControlItem layoutControlItem3;
-        private SidePanel sidePanel2;
-        private DevExpress.XtraLayout.LayoutControl layoutControl2;
-        private DevExpress.XtraGrid.GridControl gridControlPumpMain;
-        private DevExpress.XtraGrid.Views.Grid.GridView gridViewPumpMain;
-        private DevExpress.XtraGrid.Columns.GridColumn colName;
-        private DevExpress.XtraGrid.Columns.GridColumn colRatedFlow;
-        private DevExpress.XtraGrid.Columns.GridColumn colRatedHead;
-        private DevExpress.XtraGrid.Columns.GridColumn colD2;
-        private DevExpress.XtraGrid.Columns.GridColumn colErosion;
-        private DevExpress.XtraGrid.Columns.GridColumn colRatedEfficiency;
-        private DevExpress.XtraGrid.Columns.GridColumn colRatedPower;
-        private DevExpress.XtraGrid.Columns.GridColumn colRatedSpeed;
-        private DevExpress.XtraLayout.LayoutControlGroup layoutControlGroup4;
-        private DevExpress.XtraLayout.LayoutControlGroup layoutControlGroup5;
-        private DevExpress.XtraLayout.LayoutControlItem layoutControlItem4;
-        private DevExpress.XtraBars.BarButtonItem barBtnOK;
-        private DevExpress.XtraLayout.LayoutControl layoutControl1;
-        private DevExpress.XtraLayout.LayoutControlGroup Root;
-        private DevExpress.XtraLayout.LayoutControlGroup layoutControlGroup1;
-        private DevExpress.XtraLayout.LayoutControlItem layoutControlItem1;
-    }
-}
\ No newline at end of file
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/01-matching/02-pump/01-pumpsinglematching/PumpMatchingDlg.cs b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/01-matching/02-pump/01-pumpsinglematching/PumpMatchingDlg.cs
deleted file mode 100644
index 3c4f700..0000000
--- a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/01-matching/02-pump/01-pumpsinglematching/PumpMatchingDlg.cs
+++ /dev/null
@@ -1,205 +0,0 @@
-锘縰sing DevExpress.XtraBars;
-using HStation.WinFrmUI.PhartRelation;
-using System.Data;
-
-namespace HStation.WinFrmUI.Xhs
-{
-    public partial class PumpMatchingDlg : DevExpress.XtraBars.Ribbon.RibbonForm
-    {
-        public PumpMatchingDlg()
-        {
-            InitializeComponent();
-            this.IconOptions.Icon = Yw.WinFrmUI.GlobalParas.AppIcon;
-            this.gridViewPumpMain.SetNormalView();
-            this.gridViewCurve.SetNormalView();
-        }
-
-        public class PhartViewModel
-        {
-            public long ID { get; set; }
-            public string OtherName { get; set; }
-            public int Importance { get; set; }
-            public int SortCode { get; set; }
-            public PhartDiagramExGraphList Diagram { get; set; }
-        }
-
-        private PumpMatchingViewModel _pump_matching_vm = null;
-        private List<PumpSingleMatchingViewModel> _pump_mian_vm_list = null;
-        private List<PhartViewModel> _phart_vm_list = null;
-
-        private readonly Lazy<BLL.AssetsPumpMain> _pump_main_bll = new();
-        private readonly Lazy<BLL.XhsPumpMainPhartMappingExtensions> _phart_ex_bll = new();
-
-        public event Action<PumpMatchingViewModel> ReloadDataEvent;
-
-        public async void SetBindingData(PumpMatchingViewModel pump_matching_vm)
-        {
-            _pump_matching_vm = pump_matching_vm;
-            _pump_mian_vm_list = new List<PumpSingleMatchingViewModel>();
-
-            int sel_index = 0;
-            var pump_main_list = await _pump_main_bll.Value.GetAll();
-            if (pump_main_list != null && pump_main_list.Any())
-            {
-                for (int i = 0; i < pump_main_list.Count; i++)
-                {
-                    var item = pump_main_list[i];
-                    var vm = new PumpSingleMatchingViewModel(item);
-                    _pump_mian_vm_list.Add(vm);
-                    if (vm.ID.ToString() == pump_matching_vm.DbId.ToString())
-                    {
-                        sel_index = i;
-                    }
-                }
-            }
-
-
-            this.gridControlPumpMain.DataSource = _pump_mian_vm_list;
-            this.gridControlPumpMain.RefreshDataSource();
-            this.gridViewPumpMain.BestFitColumns();
-            this.gridViewPumpMain.FocusedRowHandle = sel_index;
-        }
-
-
-        private void barBtnOK_ItemClick(object sender, ItemClickEventArgs e)
-        {
-            var pump_mian = this.gridViewPumpMain.GetCurrentViewModel(_pump_mian_vm_list);
-            if (pump_mian == null)
-            {
-                TipFormHelper.ShowError("娉靛瀷鍙蜂负绌�");
-                return;
-            }
-            var phart = this.gridViewCurve.GetCurrentViewModel(_phart_vm_list);
-            if (phart == null)
-            {
-                TipFormHelper.ShowError("娉靛瀷鍙锋洸绾夸负绌�");
-                return;
-            }
-
-            var diagram = phart.Diagram;
-            if (!OutPtList
-                (diagram,
-                out List<Yw.Geometry.Point2d> qh_pt_list,
-                out List<Yw.Geometry.Point2d> qe_pt_list,
-                out List<Yw.Geometry.Point2d> qp_pt_list
-                ))
-            {
-                return;
-            }
-
-            _pump_matching_vm.MatchingDbId = pump_mian.ID.ToString();
-            _pump_matching_vm.MatchingModelType = pump_mian.Name.ToString();
-            _pump_matching_vm.MatchingRatedH = pump_mian.RatedHead;
-            _pump_matching_vm.MatchingRatedN = pump_mian.RatedSpeed;
-            _pump_matching_vm.MatchingRatedP = pump_mian.RatedPower;
-            _pump_matching_vm.MatchingRatedQ = pump_mian.RatedFlow;
-
-            _pump_matching_vm.MatchingCurveDbId = phart.ID.ToString();
-            _pump_matching_vm.MatchingCurveQH = qh_pt_list.Select(x => new CurvePointMatchingViewModel(x.X, x.Y)).ToList();
-            _pump_matching_vm.MatchingCurveQE = qe_pt_list?.Select(x => new CurvePointMatchingViewModel(x.X, x.Y)).ToList();
-            _pump_matching_vm.MatchingCurveQP = qp_pt_list?.Select(x => new CurvePointMatchingViewModel(x.X, x.Y)).ToList();
-
-            this.ReloadDataEvent?.Invoke(_pump_matching_vm);
-            this.Close();
-        }
-
-
-
-        private async void gridViewPumpMain_FocusedRowChanged(object sender, DevExpress.XtraGrid.Views.Base.FocusedRowChangedEventArgs e)
-        {
-            _phart_vm_list = new List<PhartViewModel>();
-            var pump_main = this.gridViewPumpMain.GetCurrentViewModel(_pump_mian_vm_list);
-            if (pump_main != null)
-            {
-                var phart_list = await _phart_ex_bll.Value.GetByPumpMainID(pump_main.ID);
-                if (phart_list != null && phart_list.Any())
-                {
-                    foreach (var item in phart_list)
-                    {
-                        var vm = new PhartViewModel();
-                        vm.ID = item.ID;
-                        vm.OtherName = item.OtherName;
-                        vm.Importance = item.Importance;
-                        vm.SortCode = item.SortCode;
-                        vm.Diagram = item.Diagram;
-                        _phart_vm_list.Add(vm);
-                    }
-                }
-            }
-
-            this.gridViewCurve.FocusInvalidRow();
-            this.gridControlCurve.DataSource = _phart_vm_list;
-            this.gridControlCurve.RefreshDataSource();
-
-
-
-        }
-
-        private void gridViewCurve_FocusedRowChanged(object sender, DevExpress.XtraGrid.Views.Base.FocusedRowChangedEventArgs e)
-        {
-            var phart = this.gridViewCurve.GetCurrentViewModel(_phart_vm_list);
-            if (phart == null)
-            {
-                this.xtrPerform2dChart1.InitialChartData();
-                return;
-            }
-
-            var diagram = phart.Diagram;
-            if (!OutPtList
-                (diagram,
-                out List<Yw.Geometry.Point2d> qh_pt_list,
-                out List<Yw.Geometry.Point2d> qe_pt_list,
-                out List<Yw.Geometry.Point2d> qp_pt_list
-                ))
-            {
-                this.xtrPerform2dChart1.InitialChartData();
-                return;
-            }
-
-            var cubic_spline_qh = new Yw.Geometry.CubicSpline2d(qh_pt_list);
-            var cubic_spline_qe = new Yw.Geometry.CubicSpline2d(qe_pt_list);
-            var cubic_spline_qp = new Yw.Geometry.CubicSpline2d(qp_pt_list);
-            var disp_paras = diagram.DispParas;
-            var is_calc_disp_paras = string.IsNullOrWhiteSpace(disp_paras);
-            this.xtrPerform2dChart1.SetBindingData(cubic_spline_qh, cubic_spline_qe, cubic_spline_qp, disp_paras, is_calc_disp_paras);
-
-        }
-
-        private bool OutPtList(
-            PhartDiagramExGraphList diagram,
-            out List<Yw.Geometry.Point2d> qh_pt_list,
-            out List<Yw.Geometry.Point2d> qe_pt_list,
-            out List<Yw.Geometry.Point2d> qp_pt_list
-            )
-        {
-            qh_pt_list = null;
-            qe_pt_list = null;
-            qp_pt_list = null;
-
-            var graph_qh = diagram.GraphList.Find(x => x.GraphType == HStation.PhartRelation.eGraphType.PumpQH);
-            var graph_qe = diagram.GraphList.Find(x => x.GraphType == HStation.PhartRelation.eGraphType.PumpQE);
-            var graph_qp = diagram.GraphList.Find(x => x.GraphType == HStation.PhartRelation.eGraphType.PumpQP);
-            if (graph_qh == null)
-            {
-                this.xtrPerform2dChart1.InitialChartData();
-                return false;
-            }
-
-            qh_pt_list = PhartPerformCurveHelper.GetFeatPointList(graph_qh.GraphType, graph_qh.GeometryInfo, 100, null);
-            if (graph_qe != null)
-            {
-                qe_pt_list = PhartPerformCurveHelper.GetFeatPointList(graph_qe.GraphType, graph_qe.GeometryInfo, 100, null);
-            }
-            if (graph_qp != null)
-            {
-                qp_pt_list = PhartPerformCurveHelper.GetFeatPointList(graph_qp.GraphType, graph_qp.GeometryInfo, 100, null);
-            }
-
-            return true;
-        }
-
-
-
-
-    }
-}
\ No newline at end of file
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/01-matching/02-pump/01-pumpsinglematching/SimulationPumpSingleMatchingDlg.Designer.cs b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/01-matching/02-pump/01-pumpsinglematching/SimulationPumpSingleMatchingDlg.Designer.cs
index e4b7fdd..7575fbd 100644
--- a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/01-matching/02-pump/01-pumpsinglematching/SimulationPumpSingleMatchingDlg.Designer.cs
+++ b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/01-matching/02-pump/01-pumpsinglematching/SimulationPumpSingleMatchingDlg.Designer.cs
@@ -1,5 +1,5 @@
-锘縩amespace HStation.WinFrmUI 
-{ 
+锘縩amespace HStation.WinFrmUI
+{
     partial class SimulationPumpSingleMatchingDlg
     {
         /// <summary>
@@ -28,123 +28,448 @@
         /// </summary>
         private void InitializeComponent()
         {
+            ComponentResourceManager resources = new ComponentResourceManager(typeof(SimulationPumpSingleMatchingDlg));
+            ribbon = new DevExpress.XtraBars.Ribbon.RibbonControl();
+            barEditSearch = new DevExpress.XtraBars.BarEditItem();
+            repSearchCtrl = new DevExpress.XtraEditors.Repository.RepositoryItemSearchControl();
+            gridControlPumpMain = new DevExpress.XtraGrid.GridControl();
+            gridViewPumpMain = new DevExpress.XtraGrid.Views.Grid.GridView();
+            colName = new DevExpress.XtraGrid.Columns.GridColumn();
+            colRatedFlow = new DevExpress.XtraGrid.Columns.GridColumn();
+            colRatedHead = new DevExpress.XtraGrid.Columns.GridColumn();
+            colD2 = new DevExpress.XtraGrid.Columns.GridColumn();
+            colErosion = new DevExpress.XtraGrid.Columns.GridColumn();
+            colRatedEfficiency = new DevExpress.XtraGrid.Columns.GridColumn();
+            colRatedPower = new DevExpress.XtraGrid.Columns.GridColumn();
+            colRatedSpeed = new DevExpress.XtraGrid.Columns.GridColumn();
+            barBtnOK = new DevExpress.XtraBars.BarButtonItem();
+            ribbonPage1 = new DevExpress.XtraBars.Ribbon.RibbonPage();
+            ribbonPageGroup1 = new DevExpress.XtraBars.Ribbon.RibbonPageGroup();
+            xtrPerform2dChart1 = new Yw.WinFrmUI.Phart.PumpViewChart();
+            sidePanel1 = new SidePanel();
+            sidePanel3 = new SidePanel();
+            layoutControl3 = new DevExpress.XtraLayout.LayoutControl();
+            gridControlCurve = new DevExpress.XtraGrid.GridControl();
+            gridViewCurve = new DevExpress.XtraGrid.Views.Grid.GridView();
+            gridColumn3 = new DevExpress.XtraGrid.Columns.GridColumn();
+            gridColumn2 = new DevExpress.XtraGrid.Columns.GridColumn();
+            gridColumn1 = new DevExpress.XtraGrid.Columns.GridColumn();
+            layoutControlGroup6 = new DevExpress.XtraLayout.LayoutControlGroup();
+            layoutControlGroup7 = new DevExpress.XtraLayout.LayoutControlGroup();
+            layoutControlItem3 = new DevExpress.XtraLayout.LayoutControlItem();
+            sidePanel2 = new SidePanel();
+            layoutControl2 = new DevExpress.XtraLayout.LayoutControl();
+            layoutControlGroup4 = new DevExpress.XtraLayout.LayoutControlGroup();
+            layoutControlGroup5 = new DevExpress.XtraLayout.LayoutControlGroup();
+            layoutControlItem4 = new DevExpress.XtraLayout.LayoutControlItem();
             layoutControl1 = new DevExpress.XtraLayout.LayoutControl();
-            pumpSingleMatchingCtrl = new PumpSingleMatchingCtrl();
-            btnComplete = new SimpleButton();
-            btnCancel = new SimpleButton();
             Root = new DevExpress.XtraLayout.LayoutControlGroup();
-            emptySpaceItem1 = new DevExpress.XtraLayout.EmptySpaceItem();
-            itemForCancel = new DevExpress.XtraLayout.LayoutControlItem();
-            itemForComplete = new DevExpress.XtraLayout.LayoutControlItem();
+            layoutControlGroup1 = new DevExpress.XtraLayout.LayoutControlGroup();
             layoutControlItem1 = new DevExpress.XtraLayout.LayoutControlItem();
+            ((ISupportInitialize)ribbon).BeginInit();
+            ((ISupportInitialize)repSearchCtrl).BeginInit();
+            ((ISupportInitialize)gridControlPumpMain).BeginInit();
+            ((ISupportInitialize)gridViewPumpMain).BeginInit();
+            sidePanel1.SuspendLayout();
+            sidePanel3.SuspendLayout();
+            ((ISupportInitialize)layoutControl3).BeginInit();
+            layoutControl3.SuspendLayout();
+            ((ISupportInitialize)gridControlCurve).BeginInit();
+            ((ISupportInitialize)gridViewCurve).BeginInit();
+            ((ISupportInitialize)layoutControlGroup6).BeginInit();
+            ((ISupportInitialize)layoutControlGroup7).BeginInit();
+            ((ISupportInitialize)layoutControlItem3).BeginInit();
+            sidePanel2.SuspendLayout();
+            ((ISupportInitialize)layoutControl2).BeginInit();
+            layoutControl2.SuspendLayout();
+            ((ISupportInitialize)layoutControlGroup4).BeginInit();
+            ((ISupportInitialize)layoutControlGroup5).BeginInit();
+            ((ISupportInitialize)layoutControlItem4).BeginInit();
             ((ISupportInitialize)layoutControl1).BeginInit();
             layoutControl1.SuspendLayout();
             ((ISupportInitialize)Root).BeginInit();
-            ((ISupportInitialize)emptySpaceItem1).BeginInit();
-            ((ISupportInitialize)itemForCancel).BeginInit();
-            ((ISupportInitialize)itemForComplete).BeginInit();
+            ((ISupportInitialize)layoutControlGroup1).BeginInit();
             ((ISupportInitialize)layoutControlItem1).BeginInit();
             SuspendLayout();
             // 
+            // ribbon
+            // 
+            ribbon.EmptyAreaImageOptions.ImagePadding = new Padding(21, 19, 21, 19);
+            ribbon.ExpandCollapseItem.Id = 0;
+            ribbon.ItemPanelStyle = DevExpress.XtraBars.Ribbon.RibbonItemPanelStyle.Classic;
+            ribbon.Items.AddRange(new DevExpress.XtraBars.BarItem[] { ribbon.ExpandCollapseItem, barEditSearch, barBtnOK });
+            ribbon.Location = new Point(0, 0);
+            ribbon.Margin = new Padding(2);
+            ribbon.MaxItemId = 3;
+            ribbon.Name = "ribbon";
+            ribbon.OptionsMenuMinWidth = 231;
+            ribbon.Pages.AddRange(new DevExpress.XtraBars.Ribbon.RibbonPage[] { ribbonPage1 });
+            ribbon.RepositoryItems.AddRange(new DevExpress.XtraEditors.Repository.RepositoryItem[] { repSearchCtrl });
+            ribbon.RibbonStyle = DevExpress.XtraBars.Ribbon.RibbonControlStyle.TabletOffice;
+            ribbon.SearchItemPosition = DevExpress.XtraBars.Ribbon.SearchItemPosition.None;
+            ribbon.ShowApplicationButton = DevExpress.Utils.DefaultBoolean.False;
+            ribbon.ShowDisplayOptionsMenuButton = DevExpress.Utils.DefaultBoolean.False;
+            ribbon.ShowExpandCollapseButton = DevExpress.Utils.DefaultBoolean.False;
+            ribbon.ShowMoreCommandsButton = DevExpress.Utils.DefaultBoolean.False;
+            ribbon.ShowPageHeadersInFormCaption = DevExpress.Utils.DefaultBoolean.False;
+            ribbon.ShowPageHeadersMode = DevExpress.XtraBars.Ribbon.ShowPageHeadersMode.Hide;
+            ribbon.ShowQatLocationSelector = false;
+            ribbon.ShowToolbarCustomizeItem = false;
+            ribbon.Size = new Size(1244, 57);
+            ribbon.Toolbar.ShowCustomizeItem = false;
+            // 
+            // barEditSearch
+            // 
+            barEditSearch.Edit = repSearchCtrl;
+            barEditSearch.EditWidth = 200;
+            barEditSearch.Id = 1;
+            barEditSearch.Name = "barEditSearch";
+            // 
+            // repSearchCtrl
+            // 
+            repSearchCtrl.AutoHeight = false;
+            repSearchCtrl.Buttons.AddRange(new EditorButton[] { new DevExpress.XtraEditors.Repository.ClearButton(), new DevExpress.XtraEditors.Repository.SearchButton() });
+            repSearchCtrl.Client = gridControlPumpMain;
+            repSearchCtrl.Name = "repSearchCtrl";
+            repSearchCtrl.NullValuePrompt = "鍨嬪彿";
+            // 
+            // gridControlPumpMain
+            // 
+            gridControlPumpMain.EmbeddedNavigator.Margin = new Padding(4, 5, 4, 5);
+            gridControlPumpMain.Location = new Point(0, 22);
+            gridControlPumpMain.MainView = gridViewPumpMain;
+            gridControlPumpMain.Margin = new Padding(4, 5, 4, 5);
+            gridControlPumpMain.Name = "gridControlPumpMain";
+            gridControlPumpMain.Size = new Size(718, 299);
+            gridControlPumpMain.TabIndex = 3;
+            gridControlPumpMain.ViewCollection.AddRange(new DevExpress.XtraGrid.Views.Base.BaseView[] { gridViewPumpMain });
+            // 
+            // gridViewPumpMain
+            // 
+            gridViewPumpMain.Appearance.HeaderPanel.Options.UseTextOptions = true;
+            gridViewPumpMain.Appearance.HeaderPanel.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center;
+            gridViewPumpMain.Columns.AddRange(new DevExpress.XtraGrid.Columns.GridColumn[] { colName, colRatedFlow, colRatedHead, colD2, colErosion, colRatedEfficiency, colRatedPower, colRatedSpeed });
+            gridViewPumpMain.DetailHeight = 550;
+            gridViewPumpMain.GridControl = gridControlPumpMain;
+            gridViewPumpMain.Name = "gridViewPumpMain";
+            gridViewPumpMain.OptionsEditForm.PopupEditFormWidth = 1143;
+            gridViewPumpMain.OptionsView.ShowGroupPanel = false;
+            gridViewPumpMain.FocusedRowChanged += gridViewPumpMain_FocusedRowChanged;
+            // 
+            // colName
+            // 
+            colName.Caption = "鍨嬪彿";
+            colName.FieldName = "Name";
+            colName.MinWidth = 29;
+            colName.Name = "colName";
+            colName.Visible = true;
+            colName.VisibleIndex = 0;
+            colName.Width = 407;
+            // 
+            // colRatedFlow
+            // 
+            colRatedFlow.Caption = "棰濆畾娴侀噺(m鲁/h)";
+            colRatedFlow.FieldName = "RatedFlow";
+            colRatedFlow.MinWidth = 29;
+            colRatedFlow.Name = "colRatedFlow";
+            colRatedFlow.Visible = true;
+            colRatedFlow.VisibleIndex = 1;
+            colRatedFlow.Width = 107;
+            // 
+            // colRatedHead
+            // 
+            colRatedHead.Caption = "棰濆畾鎵▼(m)";
+            colRatedHead.FieldName = "RatedHead";
+            colRatedHead.MinWidth = 29;
+            colRatedHead.Name = "colRatedHead";
+            colRatedHead.Visible = true;
+            colRatedHead.VisibleIndex = 2;
+            colRatedHead.Width = 87;
+            // 
+            // colD2
+            // 
+            colD2.Caption = "鍙惰疆澶栧緞(mm)";
+            colD2.FieldName = "D2";
+            colD2.MinWidth = 29;
+            colD2.Name = "colD2";
+            colD2.Visible = true;
+            colD2.VisibleIndex = 3;
+            colD2.Width = 110;
+            // 
+            // colErosion
+            // 
+            colErosion.Caption = "姘旇殌";
+            colErosion.FieldName = "Erosion";
+            colErosion.MinWidth = 29;
+            colErosion.Name = "colErosion";
+            colErosion.Visible = true;
+            colErosion.VisibleIndex = 4;
+            colErosion.Width = 62;
+            // 
+            // colRatedEfficiency
+            // 
+            colRatedEfficiency.Caption = "棰濆畾鏁堢巼";
+            colRatedEfficiency.FieldName = "RatedEfficiency";
+            colRatedEfficiency.MinWidth = 29;
+            colRatedEfficiency.Name = "colRatedEfficiency";
+            colRatedEfficiency.Visible = true;
+            colRatedEfficiency.VisibleIndex = 5;
+            colRatedEfficiency.Width = 72;
+            // 
+            // colRatedPower
+            // 
+            colRatedPower.Caption = "棰濆畾鍔熺巼";
+            colRatedPower.FieldName = "RatedPower";
+            colRatedPower.MinWidth = 29;
+            colRatedPower.Name = "colRatedPower";
+            colRatedPower.Visible = true;
+            colRatedPower.VisibleIndex = 6;
+            colRatedPower.Width = 64;
+            // 
+            // colRatedSpeed
+            // 
+            colRatedSpeed.Caption = "棰濆畾杞��";
+            colRatedSpeed.FieldName = "RatedSpeed";
+            colRatedSpeed.MinWidth = 29;
+            colRatedSpeed.Name = "colRatedSpeed";
+            colRatedSpeed.Visible = true;
+            colRatedSpeed.VisibleIndex = 7;
+            colRatedSpeed.Width = 97;
+            // 
+            // barBtnOK
+            // 
+            barBtnOK.Caption = "淇濆瓨";
+            barBtnOK.Id = 2;
+            barBtnOK.ImageOptions.SvgImage = (DevExpress.Utils.Svg.SvgImage)resources.GetObject("barBtnOK.ImageOptions.SvgImage");
+            barBtnOK.Name = "barBtnOK";
+            barBtnOK.ItemClick += barBtnOK_ItemClick;
+            // 
+            // ribbonPage1
+            // 
+            ribbonPage1.Groups.AddRange(new DevExpress.XtraBars.Ribbon.RibbonPageGroup[] { ribbonPageGroup1 });
+            ribbonPage1.Name = "ribbonPage1";
+            ribbonPage1.Text = "ribbonPage1";
+            // 
+            // ribbonPageGroup1
+            // 
+            ribbonPageGroup1.ItemLinks.Add(barEditSearch);
+            ribbonPageGroup1.ItemLinks.Add(barBtnOK);
+            ribbonPageGroup1.Name = "ribbonPageGroup1";
+            ribbonPageGroup1.Text = "鎼滅储";
+            // 
+            // xtrPerform2dChart1
+            // 
+            xtrPerform2dChart1.DefinePointVisible = false;
+            xtrPerform2dChart1.LineVisible = false;
+            xtrPerform2dChart1.Location = new Point(0, 22);
+            xtrPerform2dChart1.Margin = new Padding(1);
+            xtrPerform2dChart1.Name = "xtrPerform2dChart1";
+            xtrPerform2dChart1.Size = new Size(526, 636);
+            xtrPerform2dChart1.TabIndex = 3;
+            // 
+            // sidePanel1
+            // 
+            sidePanel1.BorderThickness = 0;
+            sidePanel1.Controls.Add(sidePanel3);
+            sidePanel1.Controls.Add(sidePanel2);
+            sidePanel1.Dock = DockStyle.Left;
+            sidePanel1.Location = new Point(0, 57);
+            sidePanel1.Name = "sidePanel1";
+            sidePanel1.Size = new Size(718, 658);
+            sidePanel1.TabIndex = 4;
+            sidePanel1.Text = "sidePanel1";
+            // 
+            // sidePanel3
+            // 
+            sidePanel3.BorderThickness = 0;
+            sidePanel3.Controls.Add(layoutControl3);
+            sidePanel3.Dock = DockStyle.Fill;
+            sidePanel3.Location = new Point(0, 321);
+            sidePanel3.Name = "sidePanel3";
+            sidePanel3.Size = new Size(718, 337);
+            sidePanel3.TabIndex = 6;
+            sidePanel3.Text = "sidePanel3";
+            // 
+            // layoutControl3
+            // 
+            layoutControl3.Controls.Add(gridControlCurve);
+            layoutControl3.Dock = DockStyle.Fill;
+            layoutControl3.Location = new Point(0, 0);
+            layoutControl3.Name = "layoutControl3";
+            layoutControl3.OptionsCustomizationForm.DesignTimeCustomizationFormPositionAndSize = new Rectangle(1227, 608, 975, 600);
+            layoutControl3.Root = layoutControlGroup6;
+            layoutControl3.Size = new Size(718, 337);
+            layoutControl3.TabIndex = 0;
+            layoutControl3.Text = "layoutControl3";
+            // 
+            // gridControlCurve
+            // 
+            gridControlCurve.Location = new Point(0, 22);
+            gridControlCurve.MainView = gridViewCurve;
+            gridControlCurve.Margin = new Padding(0);
+            gridControlCurve.Name = "gridControlCurve";
+            gridControlCurve.Size = new Size(718, 315);
+            gridControlCurve.TabIndex = 4;
+            gridControlCurve.ViewCollection.AddRange(new DevExpress.XtraGrid.Views.Base.BaseView[] { gridViewCurve });
+            // 
+            // gridViewCurve
+            // 
+            gridViewCurve.Columns.AddRange(new DevExpress.XtraGrid.Columns.GridColumn[] { gridColumn3, gridColumn2, gridColumn1 });
+            gridViewCurve.GridControl = gridControlCurve;
+            gridViewCurve.Name = "gridViewCurve";
+            gridViewCurve.OptionsView.ShowGroupPanel = false;
+            gridViewCurve.FocusedRowChanged += gridViewCurve_FocusedRowChanged;
+            // 
+            // gridColumn3
+            // 
+            gridColumn3.Caption = "鎺掑簭鐮�";
+            gridColumn3.FieldName = "SortCode";
+            gridColumn3.Name = "gridColumn3";
+            // 
+            // gridColumn2
+            // 
+            gridColumn2.Caption = "閲嶈搴�";
+            gridColumn2.FieldName = "Importance";
+            gridColumn2.Name = "gridColumn2";
+            gridColumn2.Visible = true;
+            gridColumn2.VisibleIndex = 1;
+            // 
+            // gridColumn1
+            // 
+            gridColumn1.Caption = "鍚嶇О";
+            gridColumn1.FieldName = "OtherName";
+            gridColumn1.Name = "gridColumn1";
+            gridColumn1.Visible = true;
+            gridColumn1.VisibleIndex = 0;
+            // 
+            // layoutControlGroup6
+            // 
+            layoutControlGroup6.EnableIndentsWithoutBorders = DevExpress.Utils.DefaultBoolean.True;
+            layoutControlGroup6.GroupBordersVisible = false;
+            layoutControlGroup6.Items.AddRange(new DevExpress.XtraLayout.BaseLayoutItem[] { layoutControlGroup7 });
+            layoutControlGroup6.Name = "Root";
+            layoutControlGroup6.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
+            layoutControlGroup6.Size = new Size(718, 337);
+            layoutControlGroup6.TextVisible = false;
+            // 
+            // layoutControlGroup7
+            // 
+            layoutControlGroup7.GroupStyle = DevExpress.Utils.GroupStyle.Title;
+            layoutControlGroup7.Items.AddRange(new DevExpress.XtraLayout.BaseLayoutItem[] { layoutControlItem3 });
+            layoutControlGroup7.Location = new Point(0, 0);
+            layoutControlGroup7.Name = "layoutControlGroup7";
+            layoutControlGroup7.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
+            layoutControlGroup7.Size = new Size(718, 337);
+            layoutControlGroup7.Spacing = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
+            layoutControlGroup7.Text = "娉靛瀷鍙锋洸绾�";
+            // 
+            // layoutControlItem3
+            // 
+            layoutControlItem3.Control = gridControlCurve;
+            layoutControlItem3.Location = new Point(0, 0);
+            layoutControlItem3.Name = "layoutControlItem3";
+            layoutControlItem3.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
+            layoutControlItem3.Size = new Size(718, 315);
+            layoutControlItem3.TextSize = new Size(0, 0);
+            layoutControlItem3.TextVisible = false;
+            // 
+            // sidePanel2
+            // 
+            sidePanel2.BorderThickness = 0;
+            sidePanel2.Controls.Add(layoutControl2);
+            sidePanel2.Dock = DockStyle.Top;
+            sidePanel2.Location = new Point(0, 0);
+            sidePanel2.Margin = new Padding(4, 5, 4, 5);
+            sidePanel2.Name = "sidePanel2";
+            sidePanel2.Size = new Size(718, 321);
+            sidePanel2.TabIndex = 5;
+            sidePanel2.Text = "sidePanel2";
+            // 
+            // layoutControl2
+            // 
+            layoutControl2.Controls.Add(gridControlPumpMain);
+            layoutControl2.Dock = DockStyle.Fill;
+            layoutControl2.Location = new Point(0, 0);
+            layoutControl2.Margin = new Padding(6, 8, 6, 8);
+            layoutControl2.Name = "layoutControl2";
+            layoutControl2.OptionsCustomizationForm.DesignTimeCustomizationFormPositionAndSize = new Rectangle(760, 358, 975, 600);
+            layoutControl2.Root = layoutControlGroup4;
+            layoutControl2.Size = new Size(718, 321);
+            layoutControl2.TabIndex = 0;
+            layoutControl2.Text = "layoutControl2";
+            // 
+            // layoutControlGroup4
+            // 
+            layoutControlGroup4.EnableIndentsWithoutBorders = DevExpress.Utils.DefaultBoolean.True;
+            layoutControlGroup4.GroupBordersVisible = false;
+            layoutControlGroup4.Items.AddRange(new DevExpress.XtraLayout.BaseLayoutItem[] { layoutControlGroup5 });
+            layoutControlGroup4.Name = "Root";
+            layoutControlGroup4.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
+            layoutControlGroup4.Size = new Size(718, 321);
+            layoutControlGroup4.TextVisible = false;
+            // 
+            // layoutControlGroup5
+            // 
+            layoutControlGroup5.GroupStyle = DevExpress.Utils.GroupStyle.Title;
+            layoutControlGroup5.Items.AddRange(new DevExpress.XtraLayout.BaseLayoutItem[] { layoutControlItem4 });
+            layoutControlGroup5.Location = new Point(0, 0);
+            layoutControlGroup5.Name = "layoutControlGroup5";
+            layoutControlGroup5.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
+            layoutControlGroup5.Size = new Size(718, 321);
+            layoutControlGroup5.Spacing = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
+            layoutControlGroup5.Text = "娉靛瀷鍙�";
+            // 
+            // layoutControlItem4
+            // 
+            layoutControlItem4.Control = gridControlPumpMain;
+            layoutControlItem4.Location = new Point(0, 0);
+            layoutControlItem4.Name = "layoutControlItem4";
+            layoutControlItem4.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
+            layoutControlItem4.Size = new Size(718, 299);
+            layoutControlItem4.TextSize = new Size(0, 0);
+            layoutControlItem4.TextVisible = false;
+            // 
             // layoutControl1
             // 
-            layoutControl1.Controls.Add(pumpSingleMatchingCtrl);
-            layoutControl1.Controls.Add(btnComplete);
-            layoutControl1.Controls.Add(btnCancel);
+            layoutControl1.Controls.Add(xtrPerform2dChart1);
             layoutControl1.Dock = DockStyle.Fill;
-            layoutControl1.Location = new Point(0, 0);
+            layoutControl1.Location = new Point(718, 57);
+            layoutControl1.Margin = new Padding(2);
             layoutControl1.Name = "layoutControl1";
-            layoutControl1.OptionsCustomizationForm.DesignTimeCustomizationFormPositionAndSize = new Rectangle(1222, 300, 650, 400);
+            layoutControl1.OptionsCustomizationForm.DesignTimeCustomizationFormPositionAndSize = new Rectangle(1487, 656, 975, 600);
             layoutControl1.Root = Root;
-            layoutControl1.Size = new Size(1347, 703);
+            layoutControl1.Size = new Size(526, 658);
             layoutControl1.TabIndex = 6;
             layoutControl1.Text = "layoutControl1";
-            // 
-            // xtraUserControl11
-            // 
-            pumpSingleMatchingCtrl.Location = new Point(0, 0);
-            pumpSingleMatchingCtrl.Margin = new Padding(0);
-            pumpSingleMatchingCtrl.Name = "xtraUserControl11";
-            pumpSingleMatchingCtrl.Size = new Size(1347, 677);
-            pumpSingleMatchingCtrl.TabIndex = 7;
-            // 
-            // btnComplete
-            // 
-            btnComplete.Appearance.BackColor = DevExpress.LookAndFeel.DXSkinColors.FillColors.Primary;
-            btnComplete.Appearance.Options.UseBackColor = true;
-            btnComplete.Location = new Point(1133, 679);
-            btnComplete.MaximumSize = new Size(104, 0);
-            btnComplete.MinimumSize = new Size(104, 0);
-            btnComplete.Name = "btnComplete";
-            btnComplete.Size = new Size(104, 22);
-            btnComplete.StyleController = layoutControl1;
-            btnComplete.TabIndex = 6;
-            btnComplete.Text = "纭畾";
-            btnComplete.Click += btnComplete_Click;
-            // 
-            // btnCancel
-            // 
-            btnCancel.Appearance.BackColor = DevExpress.LookAndFeel.DXSkinColors.FillColors.Danger;
-            btnCancel.Appearance.Options.UseBackColor = true;
-            btnCancel.DialogResult = DialogResult.Cancel;
-            btnCancel.Location = new Point(1241, 679);
-            btnCancel.MaximumSize = new Size(104, 0);
-            btnCancel.MinimumSize = new Size(104, 0);
-            btnCancel.Name = "btnCancel";
-            btnCancel.Size = new Size(104, 22);
-            btnCancel.StyleController = layoutControl1;
-            btnCancel.TabIndex = 3;
-            btnCancel.Text = "鍙栨秷";
             // 
             // Root
             // 
             Root.EnableIndentsWithoutBorders = DevExpress.Utils.DefaultBoolean.True;
             Root.GroupBordersVisible = false;
-            Root.Items.AddRange(new DevExpress.XtraLayout.BaseLayoutItem[] { emptySpaceItem1, itemForCancel, itemForComplete, layoutControlItem1 });
+            Root.Items.AddRange(new DevExpress.XtraLayout.BaseLayoutItem[] { layoutControlGroup1 });
             Root.Name = "Root";
             Root.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
-            Root.Size = new Size(1347, 703);
+            Root.Size = new Size(526, 658);
             Root.TextVisible = false;
             // 
-            // emptySpaceItem1
+            // layoutControlGroup1
             // 
-            emptySpaceItem1.AllowHotTrack = false;
-            emptySpaceItem1.Location = new Point(0, 677);
-            emptySpaceItem1.Name = "emptySpaceItem1";
-            emptySpaceItem1.Size = new Size(1131, 26);
-            emptySpaceItem1.TextSize = new Size(0, 0);
-            // 
-            // itemForCancel
-            // 
-            itemForCancel.Control = btnCancel;
-            itemForCancel.Location = new Point(1239, 677);
-            itemForCancel.MaxSize = new Size(108, 26);
-            itemForCancel.MinSize = new Size(108, 26);
-            itemForCancel.Name = "itemForCancel";
-            itemForCancel.Size = new Size(108, 26);
-            itemForCancel.SizeConstraintsType = DevExpress.XtraLayout.SizeConstraintsType.Custom;
-            itemForCancel.TextSize = new Size(0, 0);
-            itemForCancel.TextVisible = false;
-            // 
-            // itemForComplete
-            // 
-            itemForComplete.Control = btnComplete;
-            itemForComplete.Location = new Point(1131, 677);
-            itemForComplete.MaxSize = new Size(108, 26);
-            itemForComplete.MinSize = new Size(108, 26);
-            itemForComplete.Name = "itemForComplete";
-            itemForComplete.Size = new Size(108, 26);
-            itemForComplete.SizeConstraintsType = DevExpress.XtraLayout.SizeConstraintsType.Custom;
-            itemForComplete.TextSize = new Size(0, 0);
-            itemForComplete.TextVisible = false;
+            layoutControlGroup1.GroupStyle = DevExpress.Utils.GroupStyle.Title;
+            layoutControlGroup1.Items.AddRange(new DevExpress.XtraLayout.BaseLayoutItem[] { layoutControlItem1 });
+            layoutControlGroup1.Location = new Point(0, 0);
+            layoutControlGroup1.Name = "layoutControlGroup1";
+            layoutControlGroup1.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
+            layoutControlGroup1.Size = new Size(526, 658);
+            layoutControlGroup1.Spacing = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
+            layoutControlGroup1.Text = "鏇茬嚎瑙嗗浘";
             // 
             // layoutControlItem1
             // 
-            layoutControlItem1.Control = pumpSingleMatchingCtrl;
+            layoutControlItem1.Control = xtrPerform2dChart1;
             layoutControlItem1.Location = new Point(0, 0);
             layoutControlItem1.Name = "layoutControlItem1";
             layoutControlItem1.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
-            layoutControlItem1.Size = new Size(1347, 677);
+            layoutControlItem1.Size = new Size(526, 636);
             layoutControlItem1.TextSize = new Size(0, 0);
             layoutControlItem1.TextVisible = false;
             // 
@@ -152,31 +477,81 @@
             // 
             AutoScaleDimensions = new SizeF(7F, 14F);
             AutoScaleMode = AutoScaleMode.Font;
-            ClientSize = new Size(1347, 703);
+            ClientSize = new Size(1244, 715);
             Controls.Add(layoutControl1);
-            Name = "AssetsPumpMainCurveChoiceDlg";
+            Controls.Add(sidePanel1);
+            Controls.Add(ribbon);
+            Margin = new Padding(2);
+            Name = "PumpMatchingDlg";
+            Ribbon = ribbon;
             StartPosition = FormStartPosition.CenterScreen;
-            Text = "娉垫洸绾块�夋嫨";
+            Text = "閫夋嫨娉靛瀷鍙�";
+            ((ISupportInitialize)ribbon).EndInit();
+            ((ISupportInitialize)repSearchCtrl).EndInit();
+            ((ISupportInitialize)gridControlPumpMain).EndInit();
+            ((ISupportInitialize)gridViewPumpMain).EndInit();
+            sidePanel1.ResumeLayout(false);
+            sidePanel3.ResumeLayout(false);
+            ((ISupportInitialize)layoutControl3).EndInit();
+            layoutControl3.ResumeLayout(false);
+            ((ISupportInitialize)gridControlCurve).EndInit();
+            ((ISupportInitialize)gridViewCurve).EndInit();
+            ((ISupportInitialize)layoutControlGroup6).EndInit();
+            ((ISupportInitialize)layoutControlGroup7).EndInit();
+            ((ISupportInitialize)layoutControlItem3).EndInit();
+            sidePanel2.ResumeLayout(false);
+            ((ISupportInitialize)layoutControl2).EndInit();
+            layoutControl2.ResumeLayout(false);
+            ((ISupportInitialize)layoutControlGroup4).EndInit();
+            ((ISupportInitialize)layoutControlGroup5).EndInit();
+            ((ISupportInitialize)layoutControlItem4).EndInit();
             ((ISupportInitialize)layoutControl1).EndInit();
             layoutControl1.ResumeLayout(false);
             ((ISupportInitialize)Root).EndInit();
-            ((ISupportInitialize)emptySpaceItem1).EndInit();
-            ((ISupportInitialize)itemForCancel).EndInit();
-            ((ISupportInitialize)itemForComplete).EndInit();
+            ((ISupportInitialize)layoutControlGroup1).EndInit();
             ((ISupportInitialize)layoutControlItem1).EndInit();
             ResumeLayout(false);
+            PerformLayout();
         }
 
         #endregion
 
+        private DevExpress.XtraBars.Ribbon.RibbonControl ribbon;
+        private DevExpress.XtraBars.BarEditItem barEditSearch;
+        private DevExpress.XtraEditors.Repository.RepositoryItemSearchControl repSearchCtrl;
+        private DevExpress.XtraBars.Ribbon.RibbonPage ribbonPage1;
+        private DevExpress.XtraBars.Ribbon.RibbonPageGroup ribbonPageGroup1;
+        private Yw.WinFrmUI.Phart.PumpViewChart xtrPerform2dChart1;
+        private SidePanel sidePanel1;
+        private SidePanel sidePanel3;
+        private DevExpress.XtraLayout.LayoutControl layoutControl3;
+        private DevExpress.XtraGrid.GridControl gridControlCurve;
+        private DevExpress.XtraGrid.Views.Grid.GridView gridViewCurve;
+        private DevExpress.XtraGrid.Columns.GridColumn gridColumn3;
+        private DevExpress.XtraGrid.Columns.GridColumn gridColumn2;
+        private DevExpress.XtraGrid.Columns.GridColumn gridColumn1;
+        private DevExpress.XtraLayout.LayoutControlGroup layoutControlGroup6;
+        private DevExpress.XtraLayout.LayoutControlGroup layoutControlGroup7;
+        private DevExpress.XtraLayout.LayoutControlItem layoutControlItem3;
+        private SidePanel sidePanel2;
+        private DevExpress.XtraLayout.LayoutControl layoutControl2;
+        private DevExpress.XtraGrid.GridControl gridControlPumpMain;
+        private DevExpress.XtraGrid.Views.Grid.GridView gridViewPumpMain;
+        private DevExpress.XtraGrid.Columns.GridColumn colName;
+        private DevExpress.XtraGrid.Columns.GridColumn colRatedFlow;
+        private DevExpress.XtraGrid.Columns.GridColumn colRatedHead;
+        private DevExpress.XtraGrid.Columns.GridColumn colD2;
+        private DevExpress.XtraGrid.Columns.GridColumn colErosion;
+        private DevExpress.XtraGrid.Columns.GridColumn colRatedEfficiency;
+        private DevExpress.XtraGrid.Columns.GridColumn colRatedPower;
+        private DevExpress.XtraGrid.Columns.GridColumn colRatedSpeed;
+        private DevExpress.XtraLayout.LayoutControlGroup layoutControlGroup4;
+        private DevExpress.XtraLayout.LayoutControlGroup layoutControlGroup5;
+        private DevExpress.XtraLayout.LayoutControlItem layoutControlItem4;
+        private DevExpress.XtraBars.BarButtonItem barBtnOK;
         private DevExpress.XtraLayout.LayoutControl layoutControl1;
         private DevExpress.XtraLayout.LayoutControlGroup Root;
-        private DevExpress.XtraEditors.SimpleButton btnComplete;
-        private DevExpress.XtraEditors.SimpleButton btnCancel;
-        private DevExpress.XtraLayout.LayoutControlItem itemForComplete;
-        private DevExpress.XtraLayout.LayoutControlItem itemForCancel;
-        private DevExpress.XtraLayout.EmptySpaceItem emptySpaceItem1;
-        private PumpSingleMatchingCtrl pumpSingleMatchingCtrl;
+        private DevExpress.XtraLayout.LayoutControlGroup layoutControlGroup1;
         private DevExpress.XtraLayout.LayoutControlItem layoutControlItem1;
     }
 }
\ No newline at end of file
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/01-matching/02-pump/01-pumpsinglematching/SimulationPumpSingleMatchingDlg.cs b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/01-matching/02-pump/01-pumpsinglematching/SimulationPumpSingleMatchingDlg.cs
index 5671f13..acd1b20 100644
--- a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/01-matching/02-pump/01-pumpsinglematching/SimulationPumpSingleMatchingDlg.cs
+++ b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/01-matching/02-pump/01-pumpsinglematching/SimulationPumpSingleMatchingDlg.cs
@@ -1,37 +1,193 @@
-锘縩amespace HStation.WinFrmUI
+锘縰sing DevExpress.XtraBars;
+using HStation.WinFrmUI.PhartRelation;
+using System.Data;
+
+namespace HStation.WinFrmUI
 {
-    public partial class SimulationPumpSingleMatchingDlg : DevExpress.XtraEditors.XtraForm
+    public partial class SimulationPumpSingleMatchingDlg : DevExpress.XtraBars.Ribbon.RibbonForm
     {
         public SimulationPumpSingleMatchingDlg()
         {
             InitializeComponent();
+            this.IconOptions.Icon = Yw.WinFrmUI.GlobalParas.AppIcon;
+            this.gridViewPumpMain.SetNormalView();
+            this.gridViewCurve.SetNormalView();
         }
+
+        public class PhartViewModel
+        {
+            public long ID { get; set; }
+            public string OtherName { get; set; }
+            public int Importance { get; set; }
+            public int SortCode { get; set; }
+            public PhartDiagramExGraphList Diagram { get; set; }
+        }
+
+        private HydroPumpMatchingViewModel _pump_matching_vm = null;
+        private List<PumpSingleMatchingViewModel> _pump_mian_vm_list = null;
+        private List<PhartViewModel> _phart_vm_list = null;
+
+        private readonly Lazy<BLL.AssetsPumpMain> _pump_main_bll = new();
+        private readonly Lazy<BLL.XhsPumpMainPhartMappingExtensions> _phart_ex_bll = new();
 
         public event Action<HydroPumpMatchingViewModel> ReloadDataEvent;
 
-        private HydroPumpMatchingViewModel _pumpMatchingView = null;
-
-        public void SetBindingData(HydroPumpMatchingViewModel pumpMatchingViewModel)
+        public async void SetBindingData(HydroPumpMatchingViewModel pump_matching_vm)
         {
-            this.pumpSingleMatchingCtrl.SetBindingData(pumpMatchingViewModel);
-            _pumpMatchingView = pumpMatchingViewModel;
+            _pump_matching_vm = pump_matching_vm;
+            _pump_mian_vm_list = new List<PumpSingleMatchingViewModel>();
+
+            int sel_index = 0;
+            var pump_main_list = await _pump_main_bll.Value.GetAll();
+            if (pump_main_list != null && pump_main_list.Any())
+            {
+                for (int i = 0; i < pump_main_list.Count; i++)
+                {
+                    var item = pump_main_list[i];
+                    var vm = new PumpSingleMatchingViewModel(item);
+                    _pump_mian_vm_list.Add(vm);
+                    if (vm.ID.ToString() == pump_matching_vm.DbId.ToString())
+                    {
+                        sel_index = i;
+                    }
+                }
+            }
+
+            this.gridControlPumpMain.DataSource = _pump_mian_vm_list;
+            this.gridControlPumpMain.RefreshDataSource();
+            this.gridViewPumpMain.BestFitColumns();
+            this.gridViewPumpMain.FocusedRowHandle = sel_index;
         }
 
-        //纭畾
-        private void btnComplete_Click(object sender, EventArgs e)
+        private void barBtnOK_ItemClick(object sender, ItemClickEventArgs e)
         {
-            if (_pumpMatchingView.MatchingDbId == null || _pumpMatchingView.MatchingDbId == string.Empty)
+            var pump_mian = this.gridViewPumpMain.GetCurrentViewModel(_pump_mian_vm_list);
+            if (pump_mian == null)
             {
-                TipFormHelper.ShowError("娉靛瀷鍙烽�夋嫨閿欒");
+                TipFormHelper.ShowError("娉靛瀷鍙蜂负绌�");
                 return;
             }
-            if (_pumpMatchingView.MatchingCurveDbId == null || _pumpMatchingView.MatchingCurveDbId == string.Empty)
+            var phart = this.gridViewCurve.GetCurrentViewModel(_phart_vm_list);
+            if (phart == null)
             {
-                TipFormHelper.ShowError("鏇茬嚎閫夋嫨閿欒");
+                TipFormHelper.ShowError("娉靛瀷鍙锋洸绾夸负绌�");
                 return;
             }
-            ReloadDataEvent.Invoke(_pumpMatchingView);
+
+            var diagram = phart.Diagram;
+            if (!OutPtList
+                (diagram,
+                out List<Yw.Geometry.Point2d> qh_pt_list,
+                out List<Yw.Geometry.Point2d> qe_pt_list,
+                out List<Yw.Geometry.Point2d> qp_pt_list
+                ))
+            {
+                return;
+            }
+
+            _pump_matching_vm.MatchingDbId = pump_mian.ID.ToString();
+            _pump_matching_vm.MatchingModelType = pump_mian.Name.ToString();
+            _pump_matching_vm.MatchingRatedH = pump_mian.RatedHead;
+            _pump_matching_vm.MatchingRatedN = pump_mian.RatedSpeed;
+            _pump_matching_vm.MatchingRatedP = pump_mian.RatedPower;
+            _pump_matching_vm.MatchingRatedQ = pump_mian.RatedFlow;
+
+            _pump_matching_vm.MatchingCurveDbId = phart.ID.ToString();
+            _pump_matching_vm.MatchingCurveQH = qh_pt_list.Select(x => new HydroCurvePointViewModel(x.X, x.Y)).ToList();
+            _pump_matching_vm.MatchingCurveQE = qe_pt_list?.Select(x => new HydroCurvePointViewModel(x.X, x.Y)).ToList();
+            _pump_matching_vm.MatchingCurveQP = qp_pt_list?.Select(x => new HydroCurvePointViewModel(x.X, x.Y)).ToList();
+
+            this.ReloadDataEvent?.Invoke(_pump_matching_vm);
             this.Close();
         }
+
+        private async void gridViewPumpMain_FocusedRowChanged(object sender, DevExpress.XtraGrid.Views.Base.FocusedRowChangedEventArgs e)
+        {
+            _phart_vm_list = new List<PhartViewModel>();
+            var pump_main = this.gridViewPumpMain.GetCurrentViewModel(_pump_mian_vm_list);
+            if (pump_main != null)
+            {
+                var phart_list = await _phart_ex_bll.Value.GetByPumpMainID(pump_main.ID);
+                if (phart_list != null && phart_list.Any())
+                {
+                    foreach (var item in phart_list)
+                    {
+                        var vm = new PhartViewModel();
+                        vm.ID = item.ID;
+                        vm.OtherName = item.OtherName;
+                        vm.Importance = item.Importance;
+                        vm.SortCode = item.SortCode;
+                        vm.Diagram = item.Diagram;
+                        _phart_vm_list.Add(vm);
+                    }
+                }
+            }
+
+            this.gridViewCurve.FocusInvalidRow();
+            this.gridControlCurve.DataSource = _phart_vm_list;
+            this.gridControlCurve.RefreshDataSource();
+        }
+
+        private void gridViewCurve_FocusedRowChanged(object sender, DevExpress.XtraGrid.Views.Base.FocusedRowChangedEventArgs e)
+        {
+            var phart = this.gridViewCurve.GetCurrentViewModel(_phart_vm_list);
+            if (phart == null)
+            {
+                this.xtrPerform2dChart1.InitialChartData();
+                return;
+            }
+
+            var diagram = phart.Diagram;
+            if (!OutPtList
+                (diagram,
+                out List<Yw.Geometry.Point2d> qh_pt_list,
+                out List<Yw.Geometry.Point2d> qe_pt_list,
+                out List<Yw.Geometry.Point2d> qp_pt_list
+                ))
+            {
+                this.xtrPerform2dChart1.InitialChartData();
+                return;
+            }
+
+            var cubic_spline_qh = new Yw.Geometry.CubicSpline2d(qh_pt_list);
+            var cubic_spline_qe = new Yw.Geometry.CubicSpline2d(qe_pt_list);
+            var cubic_spline_qp = new Yw.Geometry.CubicSpline2d(qp_pt_list);
+            var disp_paras = diagram.DispParas;
+            var is_calc_disp_paras = string.IsNullOrWhiteSpace(disp_paras);
+            this.xtrPerform2dChart1.SetBindingData(cubic_spline_qh, cubic_spline_qe, cubic_spline_qp, disp_paras, is_calc_disp_paras);
+        }
+
+        private bool OutPtList(
+            PhartDiagramExGraphList diagram,
+            out List<Yw.Geometry.Point2d> qh_pt_list,
+            out List<Yw.Geometry.Point2d> qe_pt_list,
+            out List<Yw.Geometry.Point2d> qp_pt_list
+            )
+        {
+            qh_pt_list = null;
+            qe_pt_list = null;
+            qp_pt_list = null;
+
+            var graph_qh = diagram.GraphList.Find(x => x.GraphType == HStation.PhartRelation.eGraphType.PumpQH);
+            var graph_qe = diagram.GraphList.Find(x => x.GraphType == HStation.PhartRelation.eGraphType.PumpQE);
+            var graph_qp = diagram.GraphList.Find(x => x.GraphType == HStation.PhartRelation.eGraphType.PumpQP);
+            if (graph_qh == null)
+            {
+                this.xtrPerform2dChart1.InitialChartData();
+                return false;
+            }
+
+            qh_pt_list = PhartPerformCurveHelper.GetFeatPointList(graph_qh.GraphType, graph_qh.GeometryInfo, 100, null);
+            if (graph_qe != null)
+            {
+                qe_pt_list = PhartPerformCurveHelper.GetFeatPointList(graph_qe.GraphType, graph_qe.GeometryInfo, 100, null);
+            }
+            if (graph_qp != null)
+            {
+                qp_pt_list = PhartPerformCurveHelper.GetFeatPointList(graph_qp.GraphType, graph_qp.GeometryInfo, 100, null);
+            }
+
+            return true;
+        }
     }
 }
\ No newline at end of file
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/01-matching/02-pump/01-pumpsinglematching/SimulationPumpSingleMatchingDlg.resx b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/01-matching/02-pump/01-pumpsinglematching/SimulationPumpSingleMatchingDlg.resx
index af32865..59f029d 100644
--- a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/01-matching/02-pump/01-pumpsinglematching/SimulationPumpSingleMatchingDlg.resx
+++ b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/01-matching/02-pump/01-pumpsinglematching/SimulationPumpSingleMatchingDlg.resx
@@ -117,4 +117,24 @@
   <resheader name="writer">
     <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </resheader>
+  <assembly alias="DevExpress.Data.v23.2" name="DevExpress.Data.v23.2, Culture=neutral, PublicKeyToken=b88d1754d700e49a" />
+  <data name="barBtnOK.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v23.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIzLjIsIFZlcnNpb249MjMuMi40
+        LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
+        dkV4cHJlc3MuVXRpbHMuU3ZnLlN2Z0ltYWdlAQAAAAREYXRhBwICAAAACQMAAAAPAwAAAMICAAAC77u/
+        PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCjxzdmcgeD0iMHB4IiB5PSIwcHgi
+        IHZpZXdCb3g9IjAgMCAzMiAzMiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv
+        MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3Bh
+        Y2U9InByZXNlcnZlIiBpZD0iTGF5ZXJfMSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAg
+        MzIgMzIiPg0KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLkJsYWNre2ZpbGw6IzczNzM3NDt9Cgku
+        WWVsbG93e2ZpbGw6I0ZDQjAxQjt9CgkuR3JlZW57ZmlsbDojMTI5QzQ5O30KCS5CbHVle2ZpbGw6IzM4
+        N0NCNzt9CgkuUmVke2ZpbGw6I0QwMjEyNzt9CgkuV2hpdGV7ZmlsbDojRkZGRkZGO30KCS5zdDB7b3Bh
+        Y2l0eTowLjU7fQoJLnN0MXtvcGFjaXR5OjAuNzU7fQoJLnN0MntvcGFjaXR5OjAuMjU7fQoJLnN0M3tk
+        aXNwbGF5Om5vbmU7ZmlsbDojNzM3Mzc0O30KPC9zdHlsZT4NCiAgPHBhdGggZD0iTTI3LDRoLTN2MTBI
+        OFY0SDVDNC40LDQsNCw0LjQsNCw1djIyYzAsMC42LDAuNCwxLDEsMWgyMmMwLjYsMCwxLTAuNCwxLTFW
+        NUMyOCw0LjQsMjcuNiw0LDI3LDR6IE0yNCwyNEg4di02ICBoMTZWMjR6IE0xMCw0djhoMTBWNEgxMHog
+        TTE0LDEwaC0yVjZoMlYxMHoiIGNsYXNzPSJCbGFjayIgLz4NCjwvc3ZnPgs=
+</value>
+  </data>
 </root>
\ No newline at end of file
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/01-matching/09-Tank/TankChartShowDlg.cs b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/01-matching/09-Tank/TankChartShowDlg.cs
index 68257c5..47eed35 100644
--- a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/01-matching/09-Tank/TankChartShowDlg.cs
+++ b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/01-matching/09-Tank/TankChartShowDlg.cs
@@ -69,7 +69,7 @@
         {
             this.xtrPerform2dchart1.SetBindingData(curveStr, null);
 
-            this.xtrPerform2dchart1.SetAxisTitle("闃�闂ㄥ紑搴�", "鎹熷け绯绘暟");
+            this.xtrPerform2dchart1.SetAxisTitle("娴侀噺m鲁/h", "瀹圭Нm鲁");
         }
     }
 }
\ No newline at end of file
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/01-matching/09-Tank/TankSingleMatchingCtrl.Designer.cs b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/01-matching/09-Tank/TankSingleMatchingCtrl.Designer.cs
index d05c0bc..a76f54f 100644
--- a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/01-matching/09-Tank/TankSingleMatchingCtrl.Designer.cs
+++ b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/01-matching/09-Tank/TankSingleMatchingCtrl.Designer.cs
@@ -39,15 +39,11 @@
             gridControl3 = new DevExpress.XtraGrid.GridControl();
             TankSingleMatchingViewModelBindingSource = new BindingSource(components);
             gridView3 = new DevExpress.XtraGrid.Views.Grid.GridView();
-            colCaliber = new DevExpress.XtraGrid.Columns.GridColumn();
             colCoefficient = new DevExpress.XtraGrid.Columns.GridColumn();
-            colTankLift = new DevExpress.XtraGrid.Columns.GridColumn();
             colName = new DevExpress.XtraGrid.Columns.GridColumn();
             colKeyWord = new DevExpress.XtraGrid.Columns.GridColumn();
             colTankSetting = new DevExpress.XtraGrid.Columns.GridColumn();
             colDescription = new DevExpress.XtraGrid.Columns.GridColumn();
-            colMaterial = new DevExpress.XtraGrid.Columns.GridColumn();
-            colSeriesType = new DevExpress.XtraGrid.Columns.GridColumn();
             gridControl1 = new DevExpress.XtraGrid.GridControl();
             gridView1 = new DevExpress.XtraGrid.Views.Grid.GridView();
             ColShowChart = new DevExpress.XtraGrid.Columns.GridColumn();
@@ -62,6 +58,11 @@
             layoutControlGroup2 = new DevExpress.XtraLayout.LayoutControlGroup();
             layoutControlItem3 = new DevExpress.XtraLayout.LayoutControlItem();
             layoutControlItem5 = new DevExpress.XtraLayout.LayoutControlItem();
+            colDN = new DevExpress.XtraGrid.Columns.GridColumn();
+            colMaxLevel = new DevExpress.XtraGrid.Columns.GridColumn();
+            colMinLevel = new DevExpress.XtraGrid.Columns.GridColumn();
+            colMinVol = new DevExpress.XtraGrid.Columns.GridColumn();
+            colOverFlow = new DevExpress.XtraGrid.Columns.GridColumn();
             ((ISupportInitialize)layoutControl1).BeginInit();
             layoutControl1.SuspendLayout();
             ((ISupportInitialize)gridControl3).BeginInit();
@@ -111,35 +112,18 @@
             // 
             gridView3.Appearance.HeaderPanel.Options.UseTextOptions = true;
             gridView3.Appearance.HeaderPanel.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center;
-            gridView3.Columns.AddRange(new DevExpress.XtraGrid.Columns.GridColumn[] { colCaliber, colCoefficient, colTankLift, colName, colKeyWord, colTankSetting, colDescription, colMaterial, colSeriesType });
+            gridView3.Columns.AddRange(new DevExpress.XtraGrid.Columns.GridColumn[] { colCoefficient, colName, colKeyWord, colTankSetting, colDescription, colDN, colMaxLevel, colMinLevel, colMinVol, colOverFlow });
             gridView3.GridControl = gridControl3;
             gridView3.Name = "gridView3";
             gridView3.OptionsView.ShowGroupPanel = false;
             gridView3.FocusedRowChanged += gridView2_FocusedRowChanged;
-            // 
-            // colCaliber
-            // 
-            colCaliber.FieldName = "Caliber";
-            colCaliber.Name = "colCaliber";
-            colCaliber.Visible = true;
-            colCaliber.VisibleIndex = 2;
-            colCaliber.Width = 123;
             // 
             // colCoefficient
             // 
             colCoefficient.FieldName = "Coefficient";
             colCoefficient.Name = "colCoefficient";
             colCoefficient.Visible = true;
-            colCoefficient.VisibleIndex = 3;
-            colCoefficient.Width = 89;
-            // 
-            // colTankLift
-            // 
-            colTankLift.FieldName = "TankLift";
-            colTankLift.Name = "colTankLift";
-            colTankLift.Visible = true;
-            colTankLift.VisibleIndex = 4;
-            colTankLift.Width = 86;
+            colCoefficient.VisibleIndex = 2;
             // 
             // colName
             // 
@@ -147,7 +131,7 @@
             colName.Name = "colName";
             colName.Visible = true;
             colName.VisibleIndex = 0;
-            colName.Width = 167;
+            colName.Width = 148;
             // 
             // colKeyWord
             // 
@@ -155,39 +139,23 @@
             colKeyWord.Name = "colKeyWord";
             colKeyWord.Visible = true;
             colKeyWord.VisibleIndex = 1;
-            colKeyWord.Width = 85;
+            colKeyWord.Width = 72;
             // 
             // colTankSetting
             // 
             colTankSetting.FieldName = "TankSetting";
             colTankSetting.Name = "colTankSetting";
             colTankSetting.Visible = true;
-            colTankSetting.VisibleIndex = 5;
-            colTankSetting.Width = 84;
+            colTankSetting.VisibleIndex = 3;
+            colTankSetting.Width = 71;
             // 
             // colDescription
             // 
             colDescription.FieldName = "Description";
             colDescription.Name = "colDescription";
             colDescription.Visible = true;
-            colDescription.VisibleIndex = 8;
-            colDescription.Width = 194;
-            // 
-            // colMaterial
-            // 
-            colMaterial.FieldName = "Material";
-            colMaterial.Name = "colMaterial";
-            colMaterial.Visible = true;
-            colMaterial.VisibleIndex = 6;
-            colMaterial.Width = 66;
-            // 
-            // colSeriesType
-            // 
-            colSeriesType.FieldName = "SeriesType";
-            colSeriesType.Name = "colSeriesType";
-            colSeriesType.Visible = true;
-            colSeriesType.VisibleIndex = 7;
-            colSeriesType.Width = 112;
+            colDescription.VisibleIndex = 9;
+            colDescription.Width = 176;
             // 
             // gridControl1
             // 
@@ -335,6 +303,46 @@
             layoutControlItem5.TextSize = new Size(0, 0);
             layoutControlItem5.TextVisible = false;
             // 
+            // colDN
+            // 
+            colDN.FieldName = "DN";
+            colDN.Name = "colDN";
+            colDN.Visible = true;
+            colDN.VisibleIndex = 4;
+            colDN.Width = 63;
+            // 
+            // colMaxLevel
+            // 
+            colMaxLevel.FieldName = "MaxLevel";
+            colMaxLevel.Name = "colMaxLevel";
+            colMaxLevel.Visible = true;
+            colMaxLevel.VisibleIndex = 5;
+            colMaxLevel.Width = 63;
+            // 
+            // colMinLevel
+            // 
+            colMinLevel.FieldName = "MinLevel";
+            colMinLevel.Name = "colMinLevel";
+            colMinLevel.Visible = true;
+            colMinLevel.VisibleIndex = 6;
+            colMinLevel.Width = 63;
+            // 
+            // colMinVol
+            // 
+            colMinVol.FieldName = "MinVol";
+            colMinVol.Name = "colMinVol";
+            colMinVol.Visible = true;
+            colMinVol.VisibleIndex = 7;
+            colMinVol.Width = 63;
+            // 
+            // colOverFlow
+            // 
+            colOverFlow.FieldName = "OverFlow";
+            colOverFlow.Name = "colOverFlow";
+            colOverFlow.Visible = true;
+            colOverFlow.VisibleIndex = 8;
+            colOverFlow.Width = 63;
+            // 
             // TankSingleMatchingCtrl
             // 
             AutoScaleDimensions = new SizeF(7F, 14F);
@@ -378,16 +386,19 @@
         private DevExpress.XtraGrid.Views.Grid.GridView gridView3;
         private DevExpress.XtraLayout.LayoutControlItem layoutControlItem5;
         private BindingSource TankSingleMatchingViewModelBindingSource;
-        private DevExpress.XtraGrid.Columns.GridColumn colCaliber;
         private DevExpress.XtraGrid.Columns.GridColumn colCoefficient;
         private DevExpress.XtraGrid.Columns.GridColumn colTankLift;
         private DevExpress.XtraGrid.Columns.GridColumn colName;
         private DevExpress.XtraGrid.Columns.GridColumn colKeyWord;
         private DevExpress.XtraGrid.Columns.GridColumn colTankSetting;
         private DevExpress.XtraGrid.Columns.GridColumn colDescription;
-        private DevExpress.XtraGrid.Columns.GridColumn colMaterial;
         private DevExpress.XtraGrid.Columns.GridColumn colSeriesType;
         private DevExpress.XtraGrid.Columns.GridColumn ColShowChart;
         private DevExpress.XtraEditors.Repository.RepositoryItemButtonEdit repositoryItemButtonEdit1;
+        private DevExpress.XtraGrid.Columns.GridColumn colDN;
+        private DevExpress.XtraGrid.Columns.GridColumn colMaxLevel;
+        private DevExpress.XtraGrid.Columns.GridColumn colMinLevel;
+        private DevExpress.XtraGrid.Columns.GridColumn colMinVol;
+        private DevExpress.XtraGrid.Columns.GridColumn colOverFlow;
     }
 }
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/01-matching/09-Tank/TankSingleMatchingCtrl.cs b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/01-matching/09-Tank/TankSingleMatchingCtrl.cs
index dd857ef..bd537dd 100644
--- a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/01-matching/09-Tank/TankSingleMatchingCtrl.cs
+++ b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/01-matching/09-Tank/TankSingleMatchingCtrl.cs
@@ -18,6 +18,11 @@
             public string OtherName { get; set; }
             public int Importance { get; set; }
             public int SortCode { get; set; }
+
+            /// <summary>
+            /// 瀹圭Н鏇茬嚎
+            /// </summary>
+            public string VolCurve { get; set; }
         }
 
         public class CurvieInfo
@@ -44,9 +49,12 @@
             _allBindingList = new List<TankSingleMatchingViewModel>();
             _TankBll = new BLL.AssetsTankMain();
             var allAssetsPumpMain = await _TankBll.GetAll();
-            foreach (var Main in allAssetsPumpMain)
+            if (allAssetsPumpMain != null)
             {
-                _allBindingList.Add(new TankSingleMatchingViewModel(Main));
+                foreach (var Main in allAssetsPumpMain)
+                {
+                    _allBindingList.Add(new TankSingleMatchingViewModel(Main));
+                }
             }
             this.TankSingleMatchingViewModelBindingSource.DataSource = _allBindingList;
             this.searchControl1.Text = _pumpMatchingViewModel.ModelType;
@@ -72,16 +80,16 @@
             {
                 _pumpMatchingViewModel.MatchingDbId = vm.ID.ToString();
                 _pumpMatchingViewModel.MatchingModelType = vm.Name.ToString();
-                /*  _pumpMatchingViewModel.MatchingMinorLoss = vm.Coefficient;
-                 _pumpMatchingViewModel.MatchingMaterial = vm.Material;
-                 _pumpMatchingViewModel.MatchingTankType = (eTankType?)vm.SeriesType;
-                 _pumpMatchingViewModel.MatchingTankSetting = vm.TankSetting;*/
+                _pumpMatchingViewModel.MatchingMaxLevel = vm.MaxLevel;
+                _pumpMatchingViewModel.MatchingMinLevel = vm.MinLevel;
+                _pumpMatchingViewModel.MatchingDN = vm.DN;
+                _pumpMatchingViewModel.MatchingMinVol = vm.MinVol;
                 var list = await _bll_ex.Value.GetByMainID(vm.ID);
                 if (list != null && list.Any())
                 {
                     foreach (var item in list)
                     {
-                        _allPhartList.Add(new PhartViewModel { ID = item.ID });
+                        _allPhartList.Add(new PhartViewModel { ID = item.ID, VolCurve = item.VolCurve });
                     }
                 }
             }
@@ -127,6 +135,8 @@
             if (vmo != null)
             {
                 _pumpMatchingViewModel.MatchingCurveDbId = vm.ID.ToString();
+                var pt_list = Yw.JsonHelper.Json2Object<List<HydroCurvePointViewModel>>(vm.VolCurve);
+                _pumpMatchingViewModel.MatchingVolCurve = pt_list;
             }
         }
     }
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/01-matching/09-Tank/TankSingleMatchingCtrl.resx b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/01-matching/09-Tank/TankSingleMatchingCtrl.resx
index 2f9f91a..9307916 100644
--- a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/01-matching/09-Tank/TankSingleMatchingCtrl.resx
+++ b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/01-matching/09-Tank/TankSingleMatchingCtrl.resx
@@ -117,7 +117,7 @@
   <resheader name="writer">
     <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </resheader>
-  <metadata name="valveSingleMatchingViewModelBindingSource.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+  <metadata name="TankSingleMatchingViewModelBindingSource.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
     <value>17, 17</value>
   </metadata>
   <assembly alias="DevExpress.Data.v23.2" name="DevExpress.Data.v23.2, Culture=neutral, PublicKeyToken=b88d1754d700e49a" />
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/01-matching/09-Tank/TankSingleMatchingViewModel.cs b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/01-matching/09-Tank/TankSingleMatchingViewModel.cs
index 762c0af..1248522 100644
--- a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/01-matching/09-Tank/TankSingleMatchingViewModel.cs
+++ b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/01-matching/09-Tank/TankSingleMatchingViewModel.cs
@@ -28,18 +28,39 @@
         public long SeriesID { get; set; }
 
         /// <summary>
-        /// 鍙e緞
+        /// 鏈�浣庢按浣�
         /// </summary>
-        [DisplayName("鍙e緞(mm)")]
+        [DisplayName("鏈�浣庢按浣�")]
         [Browsable(true)]
-        public string Caliber { get; set; }
+        public double MinLevel { get; set; }
 
         /// <summary>
-        /// 鏉愭枡
+        /// 鏈�楂樻按浣�
         /// </summary>
-        [DisplayName("鏉愭枡")]
+        [DisplayName("鏈�楂樻按浣�")]
         [Browsable(true)]
-        public string Material { get; set; }
+        public double MaxLevel { get; set; }
+
+        /// <summary>
+        /// 鍏О鐩村緞
+        /// </summary>
+        [DisplayName("鍏О鐩村緞")]
+        [Browsable(true)]
+        public double DN { get; set; }
+
+        /// <summary>
+        /// 鏈�灏忓绉�
+        /// </summary>
+        [DisplayName("鏈�灏忓绉�")]
+        [Browsable(true)]
+        public double MinVol { get; set; }
+
+        /// <summary>
+        /// 鏄惁鍏佽婧㈡祦
+        /// </summary>
+        [DisplayName("鏄惁鍏佽婧㈡祦")]
+        [Browsable(true)]
+        public bool OverFlow { get; set; }
 
         /// <summary>
         /// 鎹熷け绯绘暟
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/01-matching/09-tank/SimulationTankSingleMatchingDlg.cs b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/01-matching/09-tank/SimulationTankSingleMatchingDlg.cs
index 9589410..4f40762 100644
--- a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/01-matching/09-tank/SimulationTankSingleMatchingDlg.cs
+++ b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/01-matching/09-tank/SimulationTankSingleMatchingDlg.cs
@@ -23,7 +23,7 @@
         {
             if (_TankMatchingView.MatchingDbId == null || _TankMatchingView.MatchingDbId == string.Empty)
             {
-                TipFormHelper.ShowError("闃�闂ㄥ瀷鍙烽�夋嫨閿欒");
+                TipFormHelper.ShowError("姘存睜鍨嬪彿閫夋嫨閿欒");
                 return;
             }
 
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/01-matching/17-compressor/CompressorSingleMatchingCtrl.cs b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/01-matching/17-compressor/CompressorSingleMatchingCtrl.cs
index c6ead10..4e7b4dd 100644
--- a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/01-matching/17-compressor/CompressorSingleMatchingCtrl.cs
+++ b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/01-matching/17-compressor/CompressorSingleMatchingCtrl.cs
@@ -44,9 +44,12 @@
             _allBindingList = new List<CompressorSingleMatchingViewModel>();
             _CompressorBll = new BLL.AssetsCompressorMain();
             var allAssetsPumpMain = await _CompressorBll.GetAll();
-            foreach (var Main in allAssetsPumpMain)
+            if (allAssetsPumpMain != null)
             {
-                _allBindingList.Add(new CompressorSingleMatchingViewModel(Main));
+                foreach (var Main in allAssetsPumpMain)
+                {
+                    _allBindingList.Add(new CompressorSingleMatchingViewModel(Main));
+                }
             }
             this.CompressorSingleMatchingViewModelBindingSource.DataSource = _allBindingList;
             this.searchControl1.Text = _pumpMatchingViewModel.ModelType;
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/01-matching/18-exchanger/ExchangerSingleMatchingCtrl.cs b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/01-matching/18-exchanger/ExchangerSingleMatchingCtrl.cs
index c0b86fe..c2a7212 100644
--- a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/01-matching/18-exchanger/ExchangerSingleMatchingCtrl.cs
+++ b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/01-matching/18-exchanger/ExchangerSingleMatchingCtrl.cs
@@ -44,9 +44,12 @@
             _allBindingList = new List<ExchangerSingleMatchingViewModel>();
             _ExchangerBll = new BLL.AssetsExchangerMain();
             var allAssetsPumpMain = await _ExchangerBll.GetAll();
-            foreach (var Main in allAssetsPumpMain)
+            if (allAssetsPumpMain != null)
             {
-                _allBindingList.Add(new ExchangerSingleMatchingViewModel(Main));
+                foreach (var Main in allAssetsPumpMain)
+                {
+                    _allBindingList.Add(new ExchangerSingleMatchingViewModel(Main));
+                }
             }
             this.ExchangerSingleMatchingViewModelBindingSource.DataSource = _allBindingList;
             this.searchControl1.Text = _pumpMatchingViewModel.ModelType;
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/HStation.WinFrmUI.Xhs.Core.csproj b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/HStation.WinFrmUI.Xhs.Core.csproj
index f69ba51..5c75729 100644
--- a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/HStation.WinFrmUI.Xhs.Core.csproj
+++ b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/HStation.WinFrmUI.Xhs.Core.csproj
@@ -234,7 +234,6 @@
     <Compile Update="03-simulation\06-simulation\01-matching\14-blunthead\SimulationBluntheadSingleMatchingDlg.cs">
       <SubType>Form</SubType>
     </Compile>
-    <Compile Update="03-simulation\06-simulation\01-matching\02-pump\01-pumpsinglematching\SimulationPumpSingleMatchingDlg.cs" />
     <Compile Update="03-simulation\01-info\XhsProjectSimulationHydroInfoCtrl.cs" />
     <Compile Update="03-simulation\01-info\XhsProjectSimulationProjectInfoCtrl.cs" />
     <Compile Update="03-simulation\01-info\XhsProjectSimulationBimfaceInfoCtrl.cs" />
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/HStation.WinFrmUI.Xhs.Core.csproj.user b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/HStation.WinFrmUI.Xhs.Core.csproj.user
index 3199958..0c28cf6 100644
--- a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/HStation.WinFrmUI.Xhs.Core.csproj.user
+++ b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/HStation.WinFrmUI.Xhs.Core.csproj.user
@@ -100,14 +100,11 @@
     <Compile Update="03-simulation\05-function\XhsProjectSimulationFunctionCtrl.cs">
       <SubType>UserControl</SubType>
     </Compile>
-    <Compile Update="03-simulation\06-simulation\01-matching\02-pump\01-pumpsinglematching\PumpMatchingDlg.cs">
+    <Compile Update="03-simulation\06-simulation\01-matching\02-pump\01-pumpsinglematching\SimulationPumpSingleMatchingDlg.cs">
       <SubType>Form</SubType>
     </Compile>
     <Compile Update="03-simulation\06-simulation\01-matching\02-pump\01-pumpsinglematching\PumpSingleMatchingCtrl.cs">
       <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Update="03-simulation\06-simulation\01-matching\02-pump\01-pumpsinglematching\SimulationPumpSingleMatchingDlg.cs">
-      <SubType>Form</SubType>
     </Compile>
     <Compile Update="03-simulation\06-simulation\01-matching\03-valve\01-valvesinglematching\ValveChartShowDlg.cs">
       <SubType>Form</SubType>

--
Gitblit v1.9.3