From 9aa8106d88fc3070498493e2819922f7ac31746e Mon Sep 17 00:00:00 2001
From: lixiaojun <1287241240@qq.com>
Date: 星期三, 09 四月 2025 15:09:05 +0800
Subject: [PATCH] 增加BIMFACE水流动画效果

---
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/06-function/HydroFunctionHelper.cs                                    |    0 
 WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/XhsProjectSimulationCorePage.resx             |    4 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/04-extensions/HydroGradingVmoExtensiongs.cs                           |    0 
 WinFrmUI/Yw.WinFrmUI.Bimface.Core/00-core/05-logic-flow-effect/LogicFlowEffect.cs                             |    0 
 WinFrmUI/HStation.WinFrmUI.Hydro.Core/HStation.WinFrmUI.Hydro.Core.csproj                                     |   14 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/05-svg/HydroMainSvgImageHelper.cs                                     |    0 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/04-extensions/HydroMonitorValueExtensions.cs                          |    0 
 Hydro/HStation.Hydro.Core/HStation.Hydro.Core.csproj                                                          |    2 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/02-model/HydroModelMgrPage.cs                                                 |   12 
 WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/00-core/01-flow-effect/ISimulationFlowEffectView.cs         |    2 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/05-property/HydroVisualPropertyCtrl.cs                                        |   12 
 WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/03-q3d/XhsProjectSimulationL3d2Ctrl.Designer.cs             |    4 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/04-extensions/HydroParterInfoExtensions.cs                            |    0 
 Entry/HStation.Entry.Xhs.Core/HStation.Entry.Xhs.Core.csproj                                                  |    2 
 WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/00-core/04-monitor/01-monitor/SimulationMonitorHelper.cs    |    4 
 Desktop/HStation.Desktop.Xhs.Core/Properties/PublishProfiles/FolderProfile.pubxml.user                        |    2 
 WinFrmUI/HStation.WinFrmUI.Hydro.Core/01-l3d2/HydroL3d2TransferHelper.cs                                      |   94 +-
 WinFrmUI/HStation.WinFrmUI.Xhs.Core/HStation.WinFrmUI.Xhs.Core.csproj.user                                    |    5 
 WinFrmUI/Yw.WinFrmUI.Bimface.Core/bimface/js/LogicFlowEffect.js                                               |  141 ++--
 WinFrmUI/HStation.WinFrmUI.Hydro.Core/01-l3d2/HydroL3d2ViewPage.resx                                          |    0 
 WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/XhsProjectSimulationCorePage.cs               |   93 ++
 WinFrmUI/HStation.WinFrmUI.Xhs.Core/02-project/03-mgr/XhsProjectMgrPage.cs                                    |    2 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/06-converter/HydroFlowDirectionConverter.cs                      |   39 +
 WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/00-core/04-monitor/02-value/SimulationMonitorValueHelper.cs |    3 
 WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/XhsProjectSimulationCorePage.Designer.cs      |   15 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/Yw.WinFrmUI.Hydro.Core.csproj.user                                            |    3 
 WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/01-property/SimulationPropertyCtrl.cs                       |   16 
 WinFrmUI/HStation.WinFrmUI.Xhs.Core/02-project/04-l3d2/XhsProjectL3d2ViewPage.cs                              |   33 -
 WinFrmUI/HStation.WinFrmUI.Xhs.Core/02-project/04-l3d2/XhsProjectL3d2ViewPage.Designer.cs                     |   57 ++
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/04-extensions/DictionaryExtensions.cs                                 |    0 
 Desktop/HStation.Desktop.Xhs.Core/MainForm.cs                                                                 |    4 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/05-svg/HydroMonitorSvgImageHelper.cs                                  |    0 
 WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/00-core/01-flow-effect/SimulationFlowEffectHelper.cs        |  324 +++++++++---
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/02-visual/HydroVisualViewModel.cs                                |   45 +
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/energy-analy/05-working/HydroEnergyAnalyWorkingListCtrl.cs                    |    1 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/04-extensions/HydroModelInfoExtensions.cs                             |    0 
 Desktop/HStation.Desktop.Xhs.Core/HStation.Desktop.Xhs.Core.csproj.user                                       |    2 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/05-attribute/HydroFlowDirectionProAttribute.cs                   |   17 
 WinFrmUI/HStation.WinFrmUI.Hydro.Core/01-l3d2/HydroL3d2ViewPage.Designer.cs                                   |   61 ++
 WinFrmUI/Yw.WinFrmUI.Bimface.Core/01-interop/01-interop3d/BimfaceInterop3dContainer.cs                        |   22 
 WinFrmUI/HStation.WinFrmUI.Xhs.Core/HStation.WinFrmUI.Xhs.Core.csproj                                         |    5 
 WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/03-q3d/XhsProjectSimulationL3d2Ctrl.resx                    |    0 
 HStation.Xhs.Core.sln                                                                                         |  105 ----
 WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/00-core/07-grading/SimulationGradingHelper.cs               |    7 
 WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/02-bimface/SimulationBimfaceCtrl.cs                         |   24 
 WinFrmUI/Yw.WinFrmUI.Core/06-document/DocumentPage.cs                                                         |   13 
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/03-helper/HydroFlowDirectionHelper.cs                                 |   41 +
 WinFrmUI/Yw.WinFrmUI.Hydro.Core/Yw.WinFrmUI.Hydro.Core.csproj                                                 |   77 +-
 /dev/null                                                                                                     |  120 ----
 Hydro/Yw.Hydro.Core/Yw.Hydro.Core.csproj                                                                      |    2 
 WinFrmUI/HStation.WinFrmUI.Xhs.Core/02-project/04-l3d2/XhsProjectL3d2ViewPage.resx                            |    0 
 WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/03-q3d/XhsProjectSimulationL3d2Ctrl.cs                      |   66 ++
 WinFrmUI/HStation.WinFrmUI.Hydro.Core/HStation.WinFrmUI.Hydro.Core.csproj.user                                |    9 
 WinFrmUI/HStation.WinFrmUI.Hydro.Core/01-l3d2/HydroL3d2ViewPage.cs                                            |   40 +
 54 files changed, 944 insertions(+), 600 deletions(-)

diff --git a/Desktop/HStation.Desktop.Xhs.Core/HStation.Desktop.Xhs.Core.csproj.user b/Desktop/HStation.Desktop.Xhs.Core/HStation.Desktop.Xhs.Core.csproj.user
index 9c30250..1769061 100644
--- a/Desktop/HStation.Desktop.Xhs.Core/HStation.Desktop.Xhs.Core.csproj.user
+++ b/Desktop/HStation.Desktop.Xhs.Core/HStation.Desktop.Xhs.Core.csproj.user
@@ -1,7 +1,7 @@
 锘�<?xml version="1.0" encoding="utf-8"?>
 <Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <PropertyGroup>
-    <_LastSelectedProfileId>D:\WorkData\git\HStation\XHS\Desktop\HStation.Desktop.Xhs.Core\Properties\PublishProfiles\FolderProfile.pubxml</_LastSelectedProfileId>
+    <_LastSelectedProfileId>D:\WorkData\HStation\XHS\Desktop\HStation.Desktop.Xhs.Core\Properties\PublishProfiles\FolderProfile.pubxml</_LastSelectedProfileId>
   </PropertyGroup>
   <ItemGroup>
     <Compile Update="AutoUpdater\AutoUpdateConfirmDlg.cs">
diff --git a/Desktop/HStation.Desktop.Xhs.Core/MainForm.cs b/Desktop/HStation.Desktop.Xhs.Core/MainForm.cs
index 3b9d568..ed595c4 100644
--- a/Desktop/HStation.Desktop.Xhs.Core/MainForm.cs
+++ b/Desktop/HStation.Desktop.Xhs.Core/MainForm.cs
@@ -1263,8 +1263,8 @@
                         };
                         if (!IsExistPage(guid, true))
                         {
-                            var page = new HStation.WinFrmUI.HydroModelMgrPage();
-                            CreatePage(page, guid);
+                            //var page = new HStation.WinFrmUI.HydroModelMgrPage();
+                            //CreatePage(page, guid);
                         }
                     }
                     break;
diff --git a/Desktop/HStation.Desktop.Xhs.Core/Properties/PublishProfiles/FolderProfile.pubxml.user b/Desktop/HStation.Desktop.Xhs.Core/Properties/PublishProfiles/FolderProfile.pubxml.user
index ee3a096..fd2c653 100644
--- a/Desktop/HStation.Desktop.Xhs.Core/Properties/PublishProfiles/FolderProfile.pubxml.user
+++ b/Desktop/HStation.Desktop.Xhs.Core/Properties/PublishProfiles/FolderProfile.pubxml.user
@@ -4,7 +4,7 @@
 -->
 <Project>
   <PropertyGroup>
-    <History>True|2025-03-12T00:45:15.7015478Z;True|2025-03-11T22:15:02.8833947+08:00;True|2025-03-11T21:55:49.2273208+08:00;True|2025-03-11T18:27:12.8629670+08:00;True|2025-03-11T16:45:22.7703655+08:00;True|2025-03-02T15:44:29.0809925+08:00;True|2025-03-02T15:40:28.7846274+08:00;True|2025-03-02T15:39:46.2586998+08:00;True|2025-03-02T15:23:07.3152127+08:00;True|2025-03-02T15:22:53.8096029+08:00;True|2025-02-25T22:53:44.2646465+08:00;True|2025-02-15T17:09:50.6365222+08:00;True|2025-02-15T01:47:09.6027737+08:00;True|2025-02-10T13:32:35.7746635+08:00;True|2025-02-06T14:55:56.1351264+08:00;True|2025-01-25T12:27:20.2443551+08:00;True|2025-01-24T09:16:09.4525881+08:00;True|2025-01-23T14:29:01.1814366+08:00;True|2025-01-23T14:28:18.0513868+08:00;True|2025-01-23T13:53:07.5061161+08:00;True|2025-01-23T12:58:32.3093753+08:00;True|2025-01-23T12:58:02.8169460+08:00;True|2025-01-23T12:57:05.6740839+08:00;True|2025-01-23T11:07:51.4564403+08:00;True|2025-01-13T11:03:21.1732352+08:00;True|2024-10-21T12:02:00.7754536+08:00;False|2024-10-21T11:51:29.4414327+08:00;False|2024-10-21T11:50:51.8640100+08:00;False|2024-10-21T11:49:14.9169777+08:00;</History>
+    <History>True|2025-04-06T04:08:35.7908283Z||;True|2025-03-12T08:45:15.7015478+08:00||;True|2025-03-11T22:15:02.8833947+08:00||;True|2025-03-11T21:55:49.2273208+08:00||;True|2025-03-11T18:27:12.8629670+08:00||;True|2025-03-11T16:45:22.7703655+08:00||;True|2025-03-02T15:44:29.0809925+08:00||;True|2025-03-02T15:40:28.7846274+08:00||;True|2025-03-02T15:39:46.2586998+08:00||;True|2025-03-02T15:23:07.3152127+08:00||;True|2025-03-02T15:22:53.8096029+08:00||;True|2025-02-25T22:53:44.2646465+08:00||;True|2025-02-15T17:09:50.6365222+08:00||;True|2025-02-15T01:47:09.6027737+08:00||;True|2025-02-10T13:32:35.7746635+08:00||;True|2025-02-06T14:55:56.1351264+08:00||;True|2025-01-25T12:27:20.2443551+08:00||;True|2025-01-24T09:16:09.4525881+08:00||;True|2025-01-23T14:29:01.1814366+08:00||;True|2025-01-23T14:28:18.0513868+08:00||;True|2025-01-23T13:53:07.5061161+08:00||;True|2025-01-23T12:58:32.3093753+08:00||;True|2025-01-23T12:58:02.8169460+08:00||;True|2025-01-23T12:57:05.6740839+08:00||;True|2025-01-23T11:07:51.4564403+08:00||;True|2025-01-13T11:03:21.1732352+08:00||;True|2024-10-21T12:02:00.7754536+08:00||;False|2024-10-21T11:51:29.4414327+08:00||;False|2024-10-21T11:50:51.8640100+08:00||;False|2024-10-21T11:49:14.9169777+08:00||;</History>
     <LastFailureDetails />
   </PropertyGroup>
 </Project>
\ No newline at end of file
diff --git a/Entry/HStation.Entry.Xhs.Core/HStation.Entry.Xhs.Core.csproj b/Entry/HStation.Entry.Xhs.Core/HStation.Entry.Xhs.Core.csproj
index 45b92ce..4032211 100644
--- a/Entry/HStation.Entry.Xhs.Core/HStation.Entry.Xhs.Core.csproj
+++ b/Entry/HStation.Entry.Xhs.Core/HStation.Entry.Xhs.Core.csproj
@@ -20,7 +20,7 @@
 	  <PackageReference Include="Yw.Application.Basic.Core" Version="3.3.3" />
 	  <PackageReference Include="Yw.Application.Bimface.Core" Version="3.2.0" />
 	  <PackageReference Include="Yw.Application.Dict.Core" Version="3.1.3" />
-	  <PackageReference Include="Yw.Application.Hydro.Core" Version="3.9.1" />
+	  <PackageReference Include="Yw.Application.Hydro.Core" Version="3.9.2" />
 	  <PackageReference Include="Yw.Application.Map.Core" Version="3.2.2" />
 	  <PackageReference Include="Yw.Application.Phart.Core" Version="3.3.1" />
 	  <PackageReference Include="Yw.Application.Unit.Core" Version="3.1.8" />
diff --git a/HStation.Xhs.Core.sln b/HStation.Xhs.Core.sln
index 7e74d60..d65faf7 100644
--- a/HStation.Xhs.Core.sln
+++ b/HStation.Xhs.Core.sln
@@ -63,8 +63,6 @@
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Yw.BIMFace.SDK.Core", "Component\Yw.BIMFace.SDK.Core\Yw.BIMFace.SDK.Core.csproj", "{D6D805ED-C848-4403-97AB-E86715B9E2DB}"
 EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Yw.WinFrmUI.Hydro.Q3d.Core", "WinFrmUI\Yw.WinFrmUI.Hydro.Q3d.Core\Yw.WinFrmUI.Hydro.Q3d.Core.csproj", "{454B8C89-EFF0-42E2-B569-C211F0168F5D}"
-EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HStation.WinFrmUI.Assets.Core", "WinFrmUI\HStation.WinFrmUI.Assets.Core\HStation.WinFrmUI.Assets.Core.csproj", "{2AC76D6E-7035-4FD0-84EA-E00BA7D9876B}"
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HStation.BLL.Assets.Core", "BLL\HStation.BLL.Assets.Core\HStation.BLL.Assets.Core.csproj", "{EC0D8314-B4AB-4FA6-A490-C34E5773C8AA}"
@@ -105,19 +103,13 @@
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HStation.Vmo.Xhs.Core", "Vmo\HStation.Vmo.Xhs.Core\HStation.Vmo.Xhs.Core.csproj", "{2F469712-C0AB-405C-BCA3-410612141D49}"
 EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Yw.WinFrmUI.Hydro.L2d.Core", "WinFrmUI\Yw.WinFrmUI.Hydro.L2d.Core\Yw.WinFrmUI.Hydro.L2d.Core.csproj", "{AE2775AE-3C2D-49CB-BD3C-2FF5D4AE5B53}"
-EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HStation.WinFrmUI.Auth.Core", "WinFrmUI\HStation.WinFrmUI.Auth.Core\HStation.WinFrmUI.Auth.Core.csproj", "{62B68CCE-1FDA-42EB-8BBC-2053EB0E04CA}"
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HStation.Application.Assets.Core", "Application\HStation.Application.Assets.Core\HStation.Application.Assets.Core.csproj", "{6BC4873C-FB0D-46F1-ADCD-C1FD96B29A5D}"
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HStation.WinFrmUI.Dict.Core", "WinFrmUI\HStation.WinFrmUI.Dict.Core\HStation.WinFrmUI.Dict.Core.csproj", "{0D096C38-89A7-4C18-A62D-74A70693DC9F}"
 EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Yw.WinFrmUI.Hydro.L3d.Core", "WinFrmUI\Yw.WinFrmUI.Hydro.L3d.Core\Yw.WinFrmUI.Hydro.L3d.Core.csproj", "{1201C5C6-8762-4168-B6D6-C658B6D654E7}"
-EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Yw.WinFrmUI.Unit.Core", "WinFrmUI\Yw.WinFrmUI.Unit.Core\Yw.WinFrmUI.Unit.Core.csproj", "{2274B96A-C41A-42B5-A4E7-1C0706DF5D48}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Yw.Vmo.Division.Core", "Vmo\Yw.Vmo.Division.Core\Yw.Vmo.Division.Core.csproj", "{D6AC90F8-0DF0-4AC2-B17A-6A02DB467347}"
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Yw.Service.Division.Core", "Service\Yw.Service.Division.Core\Yw.Service.Division.Core.csproj", "{893B060A-8576-497A-B573-53680A271E6F}"
 EndProject
@@ -140,8 +132,6 @@
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Hstation.Dto.Core", "Dto\Hstation.Dto.Core\Hstation.Dto.Core.csproj", "{C0C9D757-5AA3-4590-9161-C4CE2700F822}"
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HStation.WinFrmUI.Basic.Core", "WinFrmUI\HStation.WinFrmUI.Basic.Core\HStation.WinFrmUI.Basic.Core.csproj", "{2A30EB54-38CA-44D4-BB11-3C2658568346}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Yw.WinFrmUI.Hydro.W3d.Core", "WinFrmUI\Yw.WinFrmUI.Hydro.W3d.Core\Yw.WinFrmUI.Hydro.W3d.Core.csproj", "{F0829321-2C4D-40F8-A729-47FA9428DC66}"
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HStation.ReportFile.SDK.Core", "Component\HStation.ReportFile.SDK.Core\HStation.ReportFile.SDK.Core.csproj", "{4C71B0A5-2F2A-4AE3-86BF-556E7F8EF97B}"
 EndProject
@@ -526,24 +516,6 @@
 		{D6D805ED-C848-4403-97AB-E86715B9E2DB}.Release|x64.Build.0 = Release|Any CPU
 		{D6D805ED-C848-4403-97AB-E86715B9E2DB}.Release|x86.ActiveCfg = Release|Any CPU
 		{D6D805ED-C848-4403-97AB-E86715B9E2DB}.Release|x86.Build.0 = Release|Any CPU
-		{454B8C89-EFF0-42E2-B569-C211F0168F5D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{454B8C89-EFF0-42E2-B569-C211F0168F5D}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{454B8C89-EFF0-42E2-B569-C211F0168F5D}.Debug|x64.ActiveCfg = Debug|Any CPU
-		{454B8C89-EFF0-42E2-B569-C211F0168F5D}.Debug|x64.Build.0 = Debug|Any CPU
-		{454B8C89-EFF0-42E2-B569-C211F0168F5D}.Debug|x86.ActiveCfg = Debug|Any CPU
-		{454B8C89-EFF0-42E2-B569-C211F0168F5D}.Debug|x86.Build.0 = Debug|Any CPU
-		{454B8C89-EFF0-42E2-B569-C211F0168F5D}.dll_test|Any CPU.ActiveCfg = Debug|Any CPU
-		{454B8C89-EFF0-42E2-B569-C211F0168F5D}.dll_test|Any CPU.Build.0 = Debug|Any CPU
-		{454B8C89-EFF0-42E2-B569-C211F0168F5D}.dll_test|x64.ActiveCfg = Debug|Any CPU
-		{454B8C89-EFF0-42E2-B569-C211F0168F5D}.dll_test|x64.Build.0 = Debug|Any CPU
-		{454B8C89-EFF0-42E2-B569-C211F0168F5D}.dll_test|x86.ActiveCfg = Debug|Any CPU
-		{454B8C89-EFF0-42E2-B569-C211F0168F5D}.dll_test|x86.Build.0 = Debug|Any CPU
-		{454B8C89-EFF0-42E2-B569-C211F0168F5D}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{454B8C89-EFF0-42E2-B569-C211F0168F5D}.Release|Any CPU.Build.0 = Release|Any CPU
-		{454B8C89-EFF0-42E2-B569-C211F0168F5D}.Release|x64.ActiveCfg = Release|Any CPU
-		{454B8C89-EFF0-42E2-B569-C211F0168F5D}.Release|x64.Build.0 = Release|Any CPU
-		{454B8C89-EFF0-42E2-B569-C211F0168F5D}.Release|x86.ActiveCfg = Release|Any CPU
-		{454B8C89-EFF0-42E2-B569-C211F0168F5D}.Release|x86.Build.0 = Release|Any CPU
 		{2AC76D6E-7035-4FD0-84EA-E00BA7D9876B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{2AC76D6E-7035-4FD0-84EA-E00BA7D9876B}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{2AC76D6E-7035-4FD0-84EA-E00BA7D9876B}.Debug|x64.ActiveCfg = Debug|Any CPU
@@ -886,24 +858,6 @@
 		{2F469712-C0AB-405C-BCA3-410612141D49}.Release|x64.Build.0 = Release|Any CPU
 		{2F469712-C0AB-405C-BCA3-410612141D49}.Release|x86.ActiveCfg = Release|Any CPU
 		{2F469712-C0AB-405C-BCA3-410612141D49}.Release|x86.Build.0 = Release|Any CPU
-		{AE2775AE-3C2D-49CB-BD3C-2FF5D4AE5B53}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{AE2775AE-3C2D-49CB-BD3C-2FF5D4AE5B53}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{AE2775AE-3C2D-49CB-BD3C-2FF5D4AE5B53}.Debug|x64.ActiveCfg = Debug|Any CPU
-		{AE2775AE-3C2D-49CB-BD3C-2FF5D4AE5B53}.Debug|x64.Build.0 = Debug|Any CPU
-		{AE2775AE-3C2D-49CB-BD3C-2FF5D4AE5B53}.Debug|x86.ActiveCfg = Debug|Any CPU
-		{AE2775AE-3C2D-49CB-BD3C-2FF5D4AE5B53}.Debug|x86.Build.0 = Debug|Any CPU
-		{AE2775AE-3C2D-49CB-BD3C-2FF5D4AE5B53}.dll_test|Any CPU.ActiveCfg = Debug|Any CPU
-		{AE2775AE-3C2D-49CB-BD3C-2FF5D4AE5B53}.dll_test|Any CPU.Build.0 = Debug|Any CPU
-		{AE2775AE-3C2D-49CB-BD3C-2FF5D4AE5B53}.dll_test|x64.ActiveCfg = Debug|Any CPU
-		{AE2775AE-3C2D-49CB-BD3C-2FF5D4AE5B53}.dll_test|x64.Build.0 = Debug|Any CPU
-		{AE2775AE-3C2D-49CB-BD3C-2FF5D4AE5B53}.dll_test|x86.ActiveCfg = Debug|Any CPU
-		{AE2775AE-3C2D-49CB-BD3C-2FF5D4AE5B53}.dll_test|x86.Build.0 = Debug|Any CPU
-		{AE2775AE-3C2D-49CB-BD3C-2FF5D4AE5B53}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{AE2775AE-3C2D-49CB-BD3C-2FF5D4AE5B53}.Release|Any CPU.Build.0 = Release|Any CPU
-		{AE2775AE-3C2D-49CB-BD3C-2FF5D4AE5B53}.Release|x64.ActiveCfg = Release|Any CPU
-		{AE2775AE-3C2D-49CB-BD3C-2FF5D4AE5B53}.Release|x64.Build.0 = Release|Any CPU
-		{AE2775AE-3C2D-49CB-BD3C-2FF5D4AE5B53}.Release|x86.ActiveCfg = Release|Any CPU
-		{AE2775AE-3C2D-49CB-BD3C-2FF5D4AE5B53}.Release|x86.Build.0 = Release|Any CPU
 		{62B68CCE-1FDA-42EB-8BBC-2053EB0E04CA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{62B68CCE-1FDA-42EB-8BBC-2053EB0E04CA}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{62B68CCE-1FDA-42EB-8BBC-2053EB0E04CA}.Debug|x64.ActiveCfg = Debug|Any CPU
@@ -958,24 +912,6 @@
 		{0D096C38-89A7-4C18-A62D-74A70693DC9F}.Release|x64.Build.0 = Release|Any CPU
 		{0D096C38-89A7-4C18-A62D-74A70693DC9F}.Release|x86.ActiveCfg = Release|Any CPU
 		{0D096C38-89A7-4C18-A62D-74A70693DC9F}.Release|x86.Build.0 = Release|Any CPU
-		{1201C5C6-8762-4168-B6D6-C658B6D654E7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{1201C5C6-8762-4168-B6D6-C658B6D654E7}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{1201C5C6-8762-4168-B6D6-C658B6D654E7}.Debug|x64.ActiveCfg = Debug|Any CPU
-		{1201C5C6-8762-4168-B6D6-C658B6D654E7}.Debug|x64.Build.0 = Debug|Any CPU
-		{1201C5C6-8762-4168-B6D6-C658B6D654E7}.Debug|x86.ActiveCfg = Debug|Any CPU
-		{1201C5C6-8762-4168-B6D6-C658B6D654E7}.Debug|x86.Build.0 = Debug|Any CPU
-		{1201C5C6-8762-4168-B6D6-C658B6D654E7}.dll_test|Any CPU.ActiveCfg = Debug|Any CPU
-		{1201C5C6-8762-4168-B6D6-C658B6D654E7}.dll_test|Any CPU.Build.0 = Debug|Any CPU
-		{1201C5C6-8762-4168-B6D6-C658B6D654E7}.dll_test|x64.ActiveCfg = Debug|Any CPU
-		{1201C5C6-8762-4168-B6D6-C658B6D654E7}.dll_test|x64.Build.0 = Debug|Any CPU
-		{1201C5C6-8762-4168-B6D6-C658B6D654E7}.dll_test|x86.ActiveCfg = Debug|Any CPU
-		{1201C5C6-8762-4168-B6D6-C658B6D654E7}.dll_test|x86.Build.0 = Debug|Any CPU
-		{1201C5C6-8762-4168-B6D6-C658B6D654E7}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{1201C5C6-8762-4168-B6D6-C658B6D654E7}.Release|Any CPU.Build.0 = Release|Any CPU
-		{1201C5C6-8762-4168-B6D6-C658B6D654E7}.Release|x64.ActiveCfg = Release|Any CPU
-		{1201C5C6-8762-4168-B6D6-C658B6D654E7}.Release|x64.Build.0 = Release|Any CPU
-		{1201C5C6-8762-4168-B6D6-C658B6D654E7}.Release|x86.ActiveCfg = Release|Any CPU
-		{1201C5C6-8762-4168-B6D6-C658B6D654E7}.Release|x86.Build.0 = Release|Any CPU
 		{2274B96A-C41A-42B5-A4E7-1C0706DF5D48}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{2274B96A-C41A-42B5-A4E7-1C0706DF5D48}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{2274B96A-C41A-42B5-A4E7-1C0706DF5D48}.Debug|x64.ActiveCfg = Debug|Any CPU
@@ -994,24 +930,6 @@
 		{2274B96A-C41A-42B5-A4E7-1C0706DF5D48}.Release|x64.Build.0 = Release|Any CPU
 		{2274B96A-C41A-42B5-A4E7-1C0706DF5D48}.Release|x86.ActiveCfg = Release|Any CPU
 		{2274B96A-C41A-42B5-A4E7-1C0706DF5D48}.Release|x86.Build.0 = Release|Any CPU
-		{D6AC90F8-0DF0-4AC2-B17A-6A02DB467347}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{D6AC90F8-0DF0-4AC2-B17A-6A02DB467347}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{D6AC90F8-0DF0-4AC2-B17A-6A02DB467347}.Debug|x64.ActiveCfg = Debug|Any CPU
-		{D6AC90F8-0DF0-4AC2-B17A-6A02DB467347}.Debug|x64.Build.0 = Debug|Any CPU
-		{D6AC90F8-0DF0-4AC2-B17A-6A02DB467347}.Debug|x86.ActiveCfg = Debug|Any CPU
-		{D6AC90F8-0DF0-4AC2-B17A-6A02DB467347}.Debug|x86.Build.0 = Debug|Any CPU
-		{D6AC90F8-0DF0-4AC2-B17A-6A02DB467347}.dll_test|Any CPU.ActiveCfg = Debug|Any CPU
-		{D6AC90F8-0DF0-4AC2-B17A-6A02DB467347}.dll_test|Any CPU.Build.0 = Debug|Any CPU
-		{D6AC90F8-0DF0-4AC2-B17A-6A02DB467347}.dll_test|x64.ActiveCfg = Debug|Any CPU
-		{D6AC90F8-0DF0-4AC2-B17A-6A02DB467347}.dll_test|x64.Build.0 = Debug|Any CPU
-		{D6AC90F8-0DF0-4AC2-B17A-6A02DB467347}.dll_test|x86.ActiveCfg = Debug|Any CPU
-		{D6AC90F8-0DF0-4AC2-B17A-6A02DB467347}.dll_test|x86.Build.0 = Debug|Any CPU
-		{D6AC90F8-0DF0-4AC2-B17A-6A02DB467347}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{D6AC90F8-0DF0-4AC2-B17A-6A02DB467347}.Release|Any CPU.Build.0 = Release|Any CPU
-		{D6AC90F8-0DF0-4AC2-B17A-6A02DB467347}.Release|x64.ActiveCfg = Release|Any CPU
-		{D6AC90F8-0DF0-4AC2-B17A-6A02DB467347}.Release|x64.Build.0 = Release|Any CPU
-		{D6AC90F8-0DF0-4AC2-B17A-6A02DB467347}.Release|x86.ActiveCfg = Release|Any CPU
-		{D6AC90F8-0DF0-4AC2-B17A-6A02DB467347}.Release|x86.Build.0 = Release|Any CPU
 		{893B060A-8576-497A-B573-53680A271E6F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{893B060A-8576-497A-B573-53680A271E6F}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{893B060A-8576-497A-B573-53680A271E6F}.Debug|x64.ActiveCfg = Debug|Any CPU
@@ -1210,24 +1128,6 @@
 		{2A30EB54-38CA-44D4-BB11-3C2658568346}.Release|x64.Build.0 = Release|Any CPU
 		{2A30EB54-38CA-44D4-BB11-3C2658568346}.Release|x86.ActiveCfg = Release|Any CPU
 		{2A30EB54-38CA-44D4-BB11-3C2658568346}.Release|x86.Build.0 = Release|Any CPU
-		{F0829321-2C4D-40F8-A729-47FA9428DC66}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{F0829321-2C4D-40F8-A729-47FA9428DC66}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{F0829321-2C4D-40F8-A729-47FA9428DC66}.Debug|x64.ActiveCfg = Debug|Any CPU
-		{F0829321-2C4D-40F8-A729-47FA9428DC66}.Debug|x64.Build.0 = Debug|Any CPU
-		{F0829321-2C4D-40F8-A729-47FA9428DC66}.Debug|x86.ActiveCfg = Debug|Any CPU
-		{F0829321-2C4D-40F8-A729-47FA9428DC66}.Debug|x86.Build.0 = Debug|Any CPU
-		{F0829321-2C4D-40F8-A729-47FA9428DC66}.dll_test|Any CPU.ActiveCfg = Debug|Any CPU
-		{F0829321-2C4D-40F8-A729-47FA9428DC66}.dll_test|Any CPU.Build.0 = Debug|Any CPU
-		{F0829321-2C4D-40F8-A729-47FA9428DC66}.dll_test|x64.ActiveCfg = Debug|Any CPU
-		{F0829321-2C4D-40F8-A729-47FA9428DC66}.dll_test|x64.Build.0 = Debug|Any CPU
-		{F0829321-2C4D-40F8-A729-47FA9428DC66}.dll_test|x86.ActiveCfg = Debug|Any CPU
-		{F0829321-2C4D-40F8-A729-47FA9428DC66}.dll_test|x86.Build.0 = Debug|Any CPU
-		{F0829321-2C4D-40F8-A729-47FA9428DC66}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{F0829321-2C4D-40F8-A729-47FA9428DC66}.Release|Any CPU.Build.0 = Release|Any CPU
-		{F0829321-2C4D-40F8-A729-47FA9428DC66}.Release|x64.ActiveCfg = Release|Any CPU
-		{F0829321-2C4D-40F8-A729-47FA9428DC66}.Release|x64.Build.0 = Release|Any CPU
-		{F0829321-2C4D-40F8-A729-47FA9428DC66}.Release|x86.ActiveCfg = Release|Any CPU
-		{F0829321-2C4D-40F8-A729-47FA9428DC66}.Release|x86.Build.0 = Release|Any CPU
 		{4C71B0A5-2F2A-4AE3-86BF-556E7F8EF97B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{4C71B0A5-2F2A-4AE3-86BF-556E7F8EF97B}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{4C71B0A5-2F2A-4AE3-86BF-556E7F8EF97B}.Debug|x64.ActiveCfg = Debug|Any CPU
@@ -1307,7 +1207,6 @@
 		{784A568F-A01F-45FC-AACB-B80F87EA3ABA} = {276C57AF-5A9C-4A50-A79E-A5098D322FE9}
 		{4724474E-66CD-4237-B3A0-085125AD2D8F} = {276C57AF-5A9C-4A50-A79E-A5098D322FE9}
 		{D6D805ED-C848-4403-97AB-E86715B9E2DB} = {0469F9DE-F12C-4B83-A871-A77A82DCB4C8}
-		{454B8C89-EFF0-42E2-B569-C211F0168F5D} = {46F06FE7-18FB-4F0E-9AB1-A9A0A3E5C81A}
 		{2AC76D6E-7035-4FD0-84EA-E00BA7D9876B} = {AB800C2A-5367-42B8-B3FF-0E7F4640E9B3}
 		{EC0D8314-B4AB-4FA6-A490-C34E5773C8AA} = {4D3764D7-19DE-4C77-8F75-0EFB19D64B3F}
 		{A9253100-6A3B-47E8-AACC-289C9756336B} = {929B3BD5-B817-4EAF-ADA4-3DFBD1580DA6}
@@ -1327,13 +1226,10 @@
 		{0A0F9D7E-87C9-4276-823D-495355A01E8C} = {9F4F9ECE-9C4C-4796-91A1-69805F823EA5}
 		{DBC6DC37-8BA8-4CFC-A98C-E6D34EE2E5D7} = {AB800C2A-5367-42B8-B3FF-0E7F4640E9B3}
 		{2F469712-C0AB-405C-BCA3-410612141D49} = {E956660D-6E09-417B-9A3C-27888AF69266}
-		{AE2775AE-3C2D-49CB-BD3C-2FF5D4AE5B53} = {46F06FE7-18FB-4F0E-9AB1-A9A0A3E5C81A}
 		{62B68CCE-1FDA-42EB-8BBC-2053EB0E04CA} = {AB800C2A-5367-42B8-B3FF-0E7F4640E9B3}
 		{6BC4873C-FB0D-46F1-ADCD-C1FD96B29A5D} = {276C57AF-5A9C-4A50-A79E-A5098D322FE9}
 		{0D096C38-89A7-4C18-A62D-74A70693DC9F} = {AB800C2A-5367-42B8-B3FF-0E7F4640E9B3}
-		{1201C5C6-8762-4168-B6D6-C658B6D654E7} = {46F06FE7-18FB-4F0E-9AB1-A9A0A3E5C81A}
 		{2274B96A-C41A-42B5-A4E7-1C0706DF5D48} = {46F06FE7-18FB-4F0E-9AB1-A9A0A3E5C81A}
-		{D6AC90F8-0DF0-4AC2-B17A-6A02DB467347} = {E956660D-6E09-417B-9A3C-27888AF69266}
 		{893B060A-8576-497A-B573-53680A271E6F} = {CF8E0A6C-9342-430D-BD10-6E1B5DE18571}
 		{9667FA40-7268-40D9-AC96-E267D199A280} = {CF8E0A6C-9342-430D-BD10-6E1B5DE18571}
 		{DDC3FA3E-3B50-4ED5-9CE7-C308FC9203BD} = {CF8E0A6C-9342-430D-BD10-6E1B5DE18571}
@@ -1345,7 +1241,6 @@
 		{0DBE9BD3-457E-472C-BB93-86D754B2A348} = {4D3764D7-19DE-4C77-8F75-0EFB19D64B3F}
 		{C0C9D757-5AA3-4590-9161-C4CE2700F822} = {929B3BD5-B817-4EAF-ADA4-3DFBD1580DA6}
 		{2A30EB54-38CA-44D4-BB11-3C2658568346} = {AB800C2A-5367-42B8-B3FF-0E7F4640E9B3}
-		{F0829321-2C4D-40F8-A729-47FA9428DC66} = {46F06FE7-18FB-4F0E-9AB1-A9A0A3E5C81A}
 		{4C71B0A5-2F2A-4AE3-86BF-556E7F8EF97B} = {0469F9DE-F12C-4B83-A871-A77A82DCB4C8}
 		{21D4EA4C-3A6A-4B65-9FD8-11A34768872C} = {0469F9DE-F12C-4B83-A871-A77A82DCB4C8}
 		{36AD458B-32A8-4FF9-8548-8FD2CD7ADABF} = {276C57AF-5A9C-4A50-A79E-A5098D322FE9}
diff --git a/Hydro/HStation.Hydro.Core/HStation.Hydro.Core.csproj b/Hydro/HStation.Hydro.Core/HStation.Hydro.Core.csproj
index a5c25ed..b8fde39 100644
--- a/Hydro/HStation.Hydro.Core/HStation.Hydro.Core.csproj
+++ b/Hydro/HStation.Hydro.Core/HStation.Hydro.Core.csproj
@@ -7,7 +7,7 @@
   </PropertyGroup>
 
   <ItemGroup>
-    <PackageReference Include="Yw.Service.Hydro.Core" Version="5.1.8" />
+    <PackageReference Include="Yw.Service.Hydro.Core" Version="5.1.9" />
   </ItemGroup>
 
   <ItemGroup>
diff --git a/Hydro/Yw.Hydro.Core/Yw.Hydro.Core.csproj b/Hydro/Yw.Hydro.Core/Yw.Hydro.Core.csproj
index bef47f1..e1b655e 100644
--- a/Hydro/Yw.Hydro.Core/Yw.Hydro.Core.csproj
+++ b/Hydro/Yw.Hydro.Core/Yw.Hydro.Core.csproj
@@ -9,7 +9,7 @@
   <ItemGroup>
     <PackageReference Include="Yw.Epanet.Calcu.Core" Version="1.0.8" />
     <PackageReference Include="Yw.Geometry.Core" Version="3.3.2" />
-    <PackageReference Include="Yw.Service.Hydro.Core" Version="5.1.8" />
+    <PackageReference Include="Yw.Service.Hydro.Core" Version="5.1.9" />
   </ItemGroup>
 
 </Project>
diff --git a/WinFrmUI/HStation.WinFrmUI.Hydro.Core/00-core/HydroQ3dTransferHelper.cs b/WinFrmUI/HStation.WinFrmUI.Hydro.Core/00-core/HydroQ3dTransferHelper.cs
deleted file mode 100644
index d8e4599..0000000
--- a/WinFrmUI/HStation.WinFrmUI.Hydro.Core/00-core/HydroQ3dTransferHelper.cs
+++ /dev/null
@@ -1,153 +0,0 @@
-锘縩amespace HStation.WinFrmUI
-{
-    /// <summary>
-    /// 
-    /// </summary>
-    public class HydroQ3dTransferHelper
-    {
-        /// <summary>
-        /// 杞崲
-        /// </summary>
-        /// <param name="info">妯″瀷淇℃伅</param>
-        /// <returns></returns>
-        public static object Transfer(Yw.Model.HydroModelInfo info)
-        {
-            if (info == null)
-            {
-                return default;
-            }
-            //var netWork = new HyView.MapViewNetWork();
-            //netWork.Nodes = new HyView.NodeViewModelList();
-            //netWork.Links = new HyView.LinkViewModelList();
-
-            //杩炴帴鑺傜偣
-            if (info.Junctions != null && info.Junctions.Count > 0)
-            {
-                foreach (var junction in info.Junctions)
-                {
-                    //var junctionModel = new HyView.JunctionViewModel();
-                    //junctionModel.UserID = junction.Code;
-                    //junctionModel.Name = junction.Name;
-                    //junctionModel.X = (float)junction.Position3d.X;
-                    //junctionModel.Y = (float)junction.Position3d.Y;
-                    ////junctionModel.Z = (float)junction.Position3d.Z;
-                    //junctionModel.Position3D = new HyView.PointF3D((float)junction.Position3d.X, (float)junction.Position3d.Y, (float)junction.Position3d.Z);
-                    //junctionModel.Elev = (float)junction.Elev;
-                    //junctionModel.Demand = junction.Demand.HasValue ? (float)junction.Demand.Value : 0;
-                    //junctionModel.PatternID = junction.DemandPattern;
-                    ////junctionModel.Status = StatusType.DEFAULT;
-                    //netWork.Nodes.Add(junctionModel);
-
-                    //netWork.Nodes.Add(junctionModel);
-                }
-            }
-
-            //姘村簱
-            if (info.Reservoirs != null && info.Reservoirs.Count > 0)
-            {
-                foreach (var reservoir in info.Reservoirs)
-                {
-                    //var reservoirModel = new HyView.ReservoirViewModel();
-                    //reservoirModel.UserID = reservoir.Code;
-                    //reservoirModel.Name = reservoir.Name;
-                    //reservoirModel.X = (float)reservoir.Position3d.X;
-                    //reservoirModel.Y = (float)reservoir.Position3d.Y;
-                    ////reservoirModel.Z = (float)reservoir.Position3d.Z;
-                    //reservoirModel.Demand = 0;
-                    //reservoirModel.Head = (float)reservoir.Head;
-                    //reservoirModel.PatternID = reservoir.HeadPattern;
-                    //reservoirModel.Position3D = new HyView.PointF3D((float)reservoir.Position3d.X, (float)reservoir.Position3d.Y, (float)reservoir.Position3d.Z);
-                    //netWork.Nodes.Add(reservoirModel);
-                }
-            }
-
-            //姘存睜
-            if (info.Tanks != null && info.Tanks.Count > 0)
-            {
-                foreach (var tank in info.Tanks)
-                {
-                    //var tankModel = new HyView.TankViewModel();
-                    //tankModel.UserID = tank.Code;
-                    //tankModel.Name = tank.Name;
-                    //tankModel.X = (float)tank.Position3d.X;
-                    //tankModel.Y = (float)tank.Position3d.Y;
-                    ////tankModel.Z = (float)tank.Position3d.Z;
-                    //tankModel.Demand = 0;
-                    //tankModel.Diameter = (float)tank.Diameter;
-                    //tankModel.Elev = (float)tank.PoolElev;
-                    //tankModel.InitLevel = (float)tank.InitLevel;
-                    //tankModel.MinLevel = (float)tank.MinLevel;
-                    //tankModel.MaxLevel = (float)tank.MaxLevel;
-                    //tankModel.MinVol = (float)tank.MinVol;
-                    //tankModel.VolCurve = tank.VolCurve;
-                    //tankModel.Position3D = new HyView.PointF3D((float)tank.Position3d.X, (float)tank.Position3d.Y, (float)tank.Position3d.Z);
-                    //netWork.Nodes.Add(tankModel);
-                }
-            }
-
-            //绠¢亾
-            if (info.Pipes != null && info.Pipes.Count > 0)
-            {
-                foreach (var pipe in info.Pipes)
-                {
-                    //var pipeModel = new HyView.PipeViewModel();
-                    //pipeModel.UserID = pipe.Code;
-                    //pipeModel.Name = pipe.Name;
-                    //// pipeModel.Status = StatusType.OPEN;
-                    //pipeModel.StartNode = netWork.Nodes.Find(x => x.UserID == pipe.StartCode);
-                    //pipeModel.EndNode = netWork.Nodes.Find(x => x.UserID == pipe.EndCode);
-                    //pipeModel.Diameter = (float)pipe.Diameter;
-                    //pipeModel.Length = (float)pipe.Length;
-                    //pipeModel.Roughness = (float)pipe.Roughness;
-                    //pipeModel.MinorLoss = (float)pipe.MinorLoss;
-
-                    //netWork.Links.Add(pipeModel);
-
-                }
-            }
-
-            //姘存车
-            if (info.Pumps != null && info.Pumps.Count > 0)
-            {
-                foreach (var pump in info.Pumps)
-                {
-                    //var pumpModel = new HyView.PumpViewModel();
-                    //pumpModel.UserID = pump.Code;
-                    //pumpModel.Name = pump.Name;
-                    ////pumpModel.Status = StatusType.OPEN;
-                    //pumpModel.StartNode = netWork.Nodes.Find(x => x.UserID == pump.StartCode);
-                    //pumpModel.EndNode = netWork.Nodes.Find(x => x.UserID == pump.EndCode);
-                    //pumpModel.HeadCurve = pump.CurveQH;
-
-
-                    //netWork.Links.Add(pumpModel);
-
-                }
-            }
-
-            //闃�闂�
-            if (info.Valves != null && info.Valves.Count > 0)
-            {
-                foreach (var valve in info.Valves)
-                {
-                    //var valveModel = new HyView.ValveViewModel();
-                    //valveModel.UserID = valve.Code;
-                    //valveModel.Name = valve.Name;
-                    ////valveModel.Status = StatusType.OPEN;
-                    //valveModel.StartNode = netWork.Nodes.Find(x => x.UserID == valve.StartCode);
-                    //valveModel.EndNode = netWork.Nodes.Find(x => x.UserID == valve.EndCode);
-                    //valveModel.Diameter = (float)valve.Diameter;
-                    //valveModel.Type = valve.ValveType;
-                    //valveModel.Setting = valve.ValveSetting;
-
-
-                    //netWork.Links.Add(valveModel);
-
-                }
-            }
-
-            return default;
-        }
-
-    }
-}
diff --git a/WinFrmUI/HStation.WinFrmUI.Hydro.Core/00-core/HydroQ3dViewPage.Designer.cs b/WinFrmUI/HStation.WinFrmUI.Hydro.Core/00-core/HydroQ3dViewPage.Designer.cs
deleted file mode 100644
index a3c1b11..0000000
--- a/WinFrmUI/HStation.WinFrmUI.Hydro.Core/00-core/HydroQ3dViewPage.Designer.cs
+++ /dev/null
@@ -1,53 +0,0 @@
-锘�
-namespace HStation.WinFrmUI
-{
-    partial class HydroQ3dViewPage
-    {
-        /// <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()
-        {
-            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(HydroQ3dViewPage));
-
-            SuspendLayout();
-            // 
-            // HydroQ3dViewPage
-            // 
-            Appearance.BackColor = SystemColors.Control;
-            Appearance.Options.UseBackColor = true;
-            AutoScaleDimensions = new SizeF(7F, 14F);
-            AutoScaleMode = AutoScaleMode.Font;
-            Margin = new Padding(3, 2, 3, 2);
-            Name = "HydroQ3dViewPage";
-            Size = new Size(882, 480);
-            ResumeLayout(false);
-        }
-
-        #endregion
-
-
-
-    }
-}
diff --git a/WinFrmUI/HStation.WinFrmUI.Hydro.Core/00-core/HydroQ3dViewPage.cs b/WinFrmUI/HStation.WinFrmUI.Hydro.Core/00-core/HydroQ3dViewPage.cs
deleted file mode 100644
index 8ab83df..0000000
--- a/WinFrmUI/HStation.WinFrmUI.Hydro.Core/00-core/HydroQ3dViewPage.cs
+++ /dev/null
@@ -1,41 +0,0 @@
-锘縩amespace HStation.WinFrmUI
-{
-    public partial class HydroQ3dViewPage : Yw.WinFrmUI.DocumentPage
-    {
-        public HydroQ3dViewPage()
-        {
-            InitializeComponent();
-            this.PageTitle.Caption = "姘村姏妯″瀷";
-        }
-
-        private long _hydroModelId;//姘村姏妯″瀷id
-        private Yw.Model.HydroModelInfo _hydroModelInfo = null;//姘村姏妯″瀷淇℃伅
-        private Lazy<Yw.BLL.HydroModelInfo> _bllModelInfo = new Lazy<Yw.BLL.HydroModelInfo>(() => new Yw.BLL.HydroModelInfo());//bll鎳掑姞杞藉璞�
-        private const string _sceneCode = Yw.Hydro.Scene.Q3d;
-
-        /// <summary>
-        /// 缁戝畾鏁版嵁
-        /// </summary>
-        /// <param name="hydroModelId">姘村姏妯″瀷id</param>
-        public async void SetBindingData(long hydroModelId)
-        {
-            _hydroModelId = hydroModelId;
-            //_hydroModelInfo = await _bllModelInfo.Value.GetByIDOfScene(hydroModelId, _sceneCode);
-            //this.PageTitle.Caption = $"{_hydroModelInfo.Name}\r\n姘村姏妯″瀷";
-
-            var netWork = HydroQ3dTransferHelper.Transfer(_hydroModelInfo);
-
-            //var temp = new Template();
-            //temp.network = netWork;
-            //mapViewer1.SetData(temp);
-        }
-
-        /// <summary>
-        /// 鍒濆鍖栨暟鎹簮
-        /// </summary>
-        public override void InitialDataSource()
-        {
-            base.InitialDataSource();
-        }
-    }
-}
\ No newline at end of file
diff --git a/WinFrmUI/HStation.WinFrmUI.Hydro.Core/00-core/HydroQ3dViewPage.resx b/WinFrmUI/HStation.WinFrmUI.Hydro.Core/00-core/HydroQ3dViewPage.resx
deleted file mode 100644
index bcc3830..0000000
--- a/WinFrmUI/HStation.WinFrmUI.Hydro.Core/00-core/HydroQ3dViewPage.resx
+++ /dev/null
@@ -1,145 +0,0 @@
-锘�<?xml version="1.0" encoding="utf-8"?>
-<root>
-  <!--
-    Microsoft ResX Schema 
-
-    Version 2.0
-
-    The primary goals of this format is to allow a simple XML format
-    that is mostly human readable. The generation and parsing of the
-    various data types are done through the TypeConverter classes
-    associated with the data types.
-
-    Example:
-
-    ... ado.net/XML headers & schema ...
-    <resheader name="resmimetype">text/microsoft-resx</resheader>
-    <resheader name="version">2.0</resheader>
-    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
-    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
-    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
-    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
-    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
-        <value>[base64 mime encoded serialized .NET Framework object]</value>
-    </data>
-    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
-        <comment>This is a comment</comment>
-    </data>
-
-    There are any number of "resheader" rows that contain simple
-    name/value pairs.
-
-    Each data row contains a name, and value. The row also contains a
-    type or mimetype. Type corresponds to a .NET class that support
-    text/value conversion through the TypeConverter architecture.
-    Classes that don't support this are serialized and stored with the
-    mimetype set.
-
-    The mimetype is used for serialized objects, and tells the
-    ResXResourceReader how to depersist the object. This is currently not
-    extensible. For a given mimetype the value must be set accordingly:
-
-    Note - application/x-microsoft.net.object.binary.base64 is the format
-    that the ResXResourceWriter will generate, however the reader can
-    read any of the formats listed below.
-
-    mimetype: application/x-microsoft.net.object.binary.base64
-    value   : The object must be serialized with
-            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
-            : and then encoded with base64 encoding.
-    
-    mimetype: application/x-microsoft.net.object.soap.base64
-    value   : The object must be serialized with
-            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
-            : and then encoded with base64 encoding.
-
-    mimetype: application/x-microsoft.net.object.bytearray.base64
-    value   : The object must be serialized into a byte array
-            : using a System.ComponentModel.TypeConverter
-            : and then encoded with base64 encoding.
-    -->
-  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
-    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
-    <xsd:element name="root" msdata:IsDataSet="true">
-      <xsd:complexType>
-        <xsd:choice maxOccurs="unbounded">
-          <xsd:element name="metadata">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" />
-              </xsd:sequence>
-              <xsd:attribute name="name" use="required" type="xsd:string" />
-              <xsd:attribute name="type" type="xsd:string" />
-              <xsd:attribute name="mimetype" type="xsd:string" />
-              <xsd:attribute ref="xml:space" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="assembly">
-            <xsd:complexType>
-              <xsd:attribute name="alias" type="xsd:string" />
-              <xsd:attribute name="name" type="xsd:string" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="data">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
-              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
-              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
-              <xsd:attribute ref="xml:space" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="resheader">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" />
-            </xsd:complexType>
-          </xsd:element>
-        </xsd:choice>
-      </xsd:complexType>
-    </xsd:element>
-  </xsd:schema>
-  <resheader name="resmimetype">
-    <value>text/microsoft-resx</value>
-  </resheader>
-  <resheader name="version">
-    <value>2.0</value>
-  </resheader>
-  <resheader name="reader">
-    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <resheader name="writer">
-    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <data name="mapViewer1.MapCenter" mimetype="application/x-microsoft.net.object.binary.base64">
-    <value>
-        AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
-        dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABVTeXN0ZW0uRHJh
-        d2luZy5Qb2ludEYCAAAAAXgBeQAACwsCAAAAAAAAAAAAAAAL
-</value>
-  </data>
-  <data name="mapViewer1.mapOption" mimetype="application/x-microsoft.net.object.binary.base64">
-    <value>
-        AAEAAAD/////AQAAAAAAAAAMAgAAAEBZdy5XaW5Gcm1VSS5IeWRyby5RM2QuQ29yZSwgQ3VsdHVyZT1u
-        ZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1udWxsDAMAAABRU3lzdGVtLkRyYXdpbmcsIFZlcnNpb249NC4w
-        LjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iMDNmNWY3ZjExZDUwYTNhBQEAAAAb
-        SHlkcm8uTWFwVmlldy5NYXBEaW1lbnNpb25zDQAAABc8Q2VudGVyPmtfX0JhY2tpbmdGaWVsZBU8em9v
-        bT5rX19CYWNraW5nRmllbGQZPHJvdGF0aW9uPmtfX0JhY2tpbmdGaWVsZApfcm90YXRpb25GGjxTaG93
-        Rmxvb3I+a19fQmFja2luZ0ZpZWxkGjxpc1Nob3dQaWM+a19fQmFja2luZ0ZpZWxkFWlzQXV0b0JhY2tn
-        cm91bmRJbWFnZR48aXNTaG93VW5mYXZvcj5rX19CYWNraW5nRmllbGQbPExvY2syRFZpZXc+a19fQmFj
-        a2luZ0ZpZWxkGzxpc0VkaXRNb2RlPmtfX0JhY2tpbmdGaWVsZBg8SXNPcnRobz5rX19CYWNraW5nRmll
-        bGQbPENvbG91ck5vZGU+a19fQmFja2luZ0ZpZWxkGzxDb2xvdXJMaW5rPmtfX0JhY2tpbmdGaWVsZAQA
-        AAAAAAAAAAAABAQVU3lzdGVtLkRyYXdpbmcuUG9pbnRGAwAAAAsGBggBAQEBAQEYSHlkcm8uTWFwVmll
-        dy5Db2xvdXJUeXBlAgAAABhIeWRyby5NYXBWaWV3LkNvbG91clR5cGUCAAAAAgAAAAX8////FVN5c3Rl
-        bS5EcmF3aW5nLlBvaW50RgIAAAABeAF5AAALCwMAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAAAAAAAAA
-        AAAAgAEAAQABAQX7////GEh5ZHJvLk1hcFZpZXcuQ29sb3VyVHlwZQEAAAAHdmFsdWVfXwAIAgAAAAAA
-        AAAB+v////v///8AAAAACw==
-</value>
-  </data>
-</root>
\ No newline at end of file
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/02-transfer/HydroL3dTransferHelper.cs b/WinFrmUI/HStation.WinFrmUI.Hydro.Core/01-l3d2/HydroL3d2TransferHelper.cs
similarity index 62%
rename from WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/02-transfer/HydroL3dTransferHelper.cs
rename to WinFrmUI/HStation.WinFrmUI.Hydro.Core/01-l3d2/HydroL3d2TransferHelper.cs
index 7c088c2..e579cfd 100644
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/02-transfer/HydroL3dTransferHelper.cs
+++ b/WinFrmUI/HStation.WinFrmUI.Hydro.Core/01-l3d2/HydroL3d2TransferHelper.cs
@@ -1,30 +1,30 @@
-锘縰sing Yw.WinFrmUI.HydroL3d;
+锘縰sing Yw.WpfUI.Hydro;
 
-namespace Yw.WinFrmUI
+namespace HStation.WinFrmUI
 {
     /// <summary>
     /// 
     /// </summary>
-    public static class HydroL3dTransferHelper
+    public static class HydroL3d2TransferHelper
     {
         /// <summary>
         /// 
         /// </summary>
-        public static Network ToL3dNetworkViewModel(this Yw.Model.HydroModelInfo rhs)
+        public static NetworkL3d ToL3d2NetworkViewModel(this Yw.Model.HydroModelInfo rhs)
         {
             if (rhs == null)
             {
                 return default;
             }
-            var vm = new Network();
+            var vm = new NetworkL3d();
             if (rhs.Junctions != null && rhs.Junctions.Count > 0)
             {
                 foreach (var junction in rhs.Junctions)
                 {
-                    var junctionViewModel = new Junction();
+                    var junctionViewModel = new JunctionL3d();
                     junctionViewModel.Id = junction.Code;
                     junctionViewModel.Name = junction.Name;
-                    junctionViewModel.Position = new Point3d(junction.Position3d.X, junction.Position3d.Y, junction.Position3d.Z);
+                    junctionViewModel.Position = new PointL3d(junction.Position3d.X, junction.Position3d.Y, junction.Position3d.Z);
                     vm.Append(junctionViewModel, out _);
                 }
             }
@@ -32,10 +32,10 @@
             {
                 foreach (var nozzle in rhs.Nozzles)
                 {
-                    var nozzleViewModel = new Junction();
+                    var nozzleViewModel = new JunctionL3d();
                     nozzleViewModel.Id = nozzle.Code;
                     nozzleViewModel.Name = nozzle.Name;
-                    nozzleViewModel.Position = new Point3d(nozzle.Position3d.X, nozzle.Position3d.Y, nozzle.Position3d.Z);
+                    nozzleViewModel.Position = new PointL3d(nozzle.Position3d.X, nozzle.Position3d.Y, nozzle.Position3d.Z);
                     vm.Append(nozzleViewModel, out _);
                 }
             }
@@ -43,10 +43,10 @@
             {
                 foreach (var hydrant in rhs.Hydrants)
                 {
-                    var hydrantViewModel = new Junction();
+                    var hydrantViewModel = new JunctionL3d();
                     hydrantViewModel.Id = hydrant.Code;
                     hydrantViewModel.Name = hydrant.Name;
-                    hydrantViewModel.Position = new Point3d(hydrant.Position3d.X, hydrant.Position3d.Y, hydrant.Position3d.Z);
+                    hydrantViewModel.Position = new PointL3d(hydrant.Position3d.X, hydrant.Position3d.Y, hydrant.Position3d.Z);
                     vm.Append(hydrantViewModel, out _);
                 }
             }
@@ -54,10 +54,10 @@
             {
                 foreach (var elbow in rhs.Elbows)
                 {
-                    var elbowViewModel = new Junction();
+                    var elbowViewModel = new JunctionL3d();
                     elbowViewModel.Id = elbow.Code;
                     elbowViewModel.Name = elbow.Name;
-                    elbowViewModel.Position = new Point3d(elbow.Position3d.X, elbow.Position3d.Y, elbow.Position3d.Z);
+                    elbowViewModel.Position = new PointL3d(elbow.Position3d.X, elbow.Position3d.Y, elbow.Position3d.Z);
                     vm.Append(elbowViewModel, out _);
                 }
             }
@@ -65,10 +65,10 @@
             {
                 foreach (var threelink in rhs.Threelinks)
                 {
-                    var threelinkViewModel = new Junction();
+                    var threelinkViewModel = new JunctionL3d();
                     threelinkViewModel.Id = threelink.Code;
                     threelinkViewModel.Name = threelink.Name;
-                    threelinkViewModel.Position = new Point3d(threelink.Position3d.X, threelink.Position3d.Y, threelink.Position3d.Z);
+                    threelinkViewModel.Position = new PointL3d(threelink.Position3d.X, threelink.Position3d.Y, threelink.Position3d.Z);
                     vm.Append(threelinkViewModel, out _);
                 }
             }
@@ -76,10 +76,10 @@
             {
                 foreach (var fourlink in rhs.Fourlinks)
                 {
-                    var fourlinkViewModel = new Junction();
+                    var fourlinkViewModel = new JunctionL3d();
                     fourlinkViewModel.Id = fourlink.Code;
                     fourlinkViewModel.Name = fourlink.Name;
-                    fourlinkViewModel.Position = new Point3d(fourlink.Position3d.X, fourlink.Position3d.Y, fourlink.Position3d.Z);
+                    fourlinkViewModel.Position = new PointL3d(fourlink.Position3d.X, fourlink.Position3d.Y, fourlink.Position3d.Z);
                     vm.Append(fourlinkViewModel, out _);
                 }
             }
@@ -87,10 +87,10 @@
             {
                 foreach (var meter in rhs.Meters)
                 {
-                    var meterViewModel = new Junction();
+                    var meterViewModel = new JunctionL3d();
                     meterViewModel.Id = meter.Code;
                     meterViewModel.Name = meter.Name;
-                    meterViewModel.Position = new Point3d(meter.Position3d.X, meter.Position3d.Y, meter.Position3d.Z);
+                    meterViewModel.Position = new PointL3d(meter.Position3d.X, meter.Position3d.Y, meter.Position3d.Z);
                     vm.Append(meterViewModel, out _);
                 }
             }
@@ -98,10 +98,10 @@
             {
                 foreach (var flowmeter in rhs.Flowmeters)
                 {
-                    var flowmeterViewModel = new Junction();
+                    var flowmeterViewModel = new JunctionL3d();
                     flowmeterViewModel.Id = flowmeter.Code;
                     flowmeterViewModel.Name = flowmeter.Name;
-                    flowmeterViewModel.Position = new Point3d(flowmeter.Position3d.X, flowmeter.Position3d.Y, flowmeter.Position3d.Z);
+                    flowmeterViewModel.Position = new PointL3d(flowmeter.Position3d.X, flowmeter.Position3d.Y, flowmeter.Position3d.Z);
                     vm.Append(flowmeterViewModel, out _);
                 }
             }
@@ -109,10 +109,10 @@
             {
                 foreach (var pressmeter in rhs.Pressmeters)
                 {
-                    var pressmeterViewModel = new Junction();
+                    var pressmeterViewModel = new JunctionL3d();
                     pressmeterViewModel.Id = pressmeter.Code;
                     pressmeterViewModel.Name = pressmeter.Name;
-                    pressmeterViewModel.Position = new Point3d(pressmeter.Position3d.X, pressmeter.Position3d.Y, pressmeter.Position3d.Z);
+                    pressmeterViewModel.Position = new PointL3d(pressmeter.Position3d.X, pressmeter.Position3d.Y, pressmeter.Position3d.Z);
                     vm.Append(pressmeterViewModel, out _);
                 }
             }
@@ -120,10 +120,10 @@
             {
                 foreach (var blunthead in rhs.Bluntheads)
                 {
-                    var bluntheadViewModel = new Junction();
+                    var bluntheadViewModel = new JunctionL3d();
                     bluntheadViewModel.Id = blunthead.Code;
                     bluntheadViewModel.Name = blunthead.Name;
-                    bluntheadViewModel.Position = new Point3d(blunthead.Position3d.X, blunthead.Position3d.Y, blunthead.Position3d.Z);
+                    bluntheadViewModel.Position = new PointL3d(blunthead.Position3d.X, blunthead.Position3d.Y, blunthead.Position3d.Z);
                     vm.Append(bluntheadViewModel, out _);
                 }
             }
@@ -132,10 +132,10 @@
             {
                 foreach (var reservoir in rhs.Reservoirs)
                 {
-                    var reservoirViewModel = new Reservoir();
+                    var reservoirViewModel = new ReservoirL3d();
                     reservoirViewModel.Id = reservoir.Code;
                     reservoirViewModel.Name = reservoir.Name;
-                    reservoirViewModel.Position = new Point3d(reservoir.Position3d.X, reservoir.Position3d.Y, reservoir.Position3d.Z);
+                    reservoirViewModel.Position = new PointL3d(reservoir.Position3d.X, reservoir.Position3d.Y, reservoir.Position3d.Z);
                     vm.Append(reservoirViewModel, out _);
                 }
             }
@@ -143,10 +143,10 @@
             {
                 foreach (var tank in rhs.Tanks)
                 {
-                    var tankViewModel = new Tank();
+                    var tankViewModel = new TankL3d();
                     tankViewModel.Id = tank.Code;
                     tankViewModel.Name = tank.Name;
-                    tankViewModel.Position = new Point3d(tank.Position3d.X, tank.Position3d.Y, tank.Position3d.Z);
+                    tankViewModel.Position = new PointL3d(tank.Position3d.X, tank.Position3d.Y, tank.Position3d.Z);
                     vm.Append(tankViewModel, out _);
                 }
             }
@@ -154,10 +154,10 @@
             {
                 foreach (var waterbox in rhs.Waterboxs)
                 {
-                    var waterboxViewModel = new Tank();
+                    var waterboxViewModel = new TankL3d();
                     waterboxViewModel.Id = waterbox.Code;
                     waterboxViewModel.Name = waterbox.Name;
-                    waterboxViewModel.Position = new Point3d(waterbox.Position3d.X, waterbox.Position3d.Y, waterbox.Position3d.Z);
+                    waterboxViewModel.Position = new PointL3d(waterbox.Position3d.X, waterbox.Position3d.Y, waterbox.Position3d.Z);
                     vm.Append(waterboxViewModel, out _);
                 }
             }
@@ -168,11 +168,11 @@
                 {
                     var startNode = rhs.GetAllNodes().Find(x => x.Code == pipe.StartCode);
                     var endNode = rhs.GetAllNodes().Find(x => x.Code == pipe.EndCode);
-                    var pipeViewModel = new Pipe();
+                    var pipeViewModel = new PipeL3d();
                     pipeViewModel.Id = pipe.Code;
                     pipeViewModel.Name = pipe.Name;
-                    pipeViewModel.StartPosition = new Point3d(startNode.Position3d.X, startNode.Position3d.Y, startNode.Position3d.Z);
-                    pipeViewModel.EndPosition = new Point3d(endNode.Position3d.X, endNode.Position3d.Y, endNode.Position3d.Z);
+                    pipeViewModel.StartPosition = new PointL3d(startNode.Position3d.X, startNode.Position3d.Y, startNode.Position3d.Z);
+                    pipeViewModel.EndPosition = new PointL3d(endNode.Position3d.X, endNode.Position3d.Y, endNode.Position3d.Z);
                     vm.Append(pipeViewModel, out _);
                 }
             }
@@ -182,11 +182,11 @@
                 {
                     var startNode = rhs.GetAllNodes().Find(x => x.Code == translation.StartCode);
                     var endNode = rhs.GetAllNodes().Find(x => x.Code == translation.EndCode);
-                    var pipeViewModel = new Pipe();
+                    var pipeViewModel = new PipeL3d();
                     pipeViewModel.Id = translation.Code;
                     pipeViewModel.Name = translation.Name;
-                    pipeViewModel.StartPosition = new Point3d(startNode.Position3d.X, startNode.Position3d.Y, startNode.Position3d.Z);
-                    pipeViewModel.EndPosition = new Point3d(endNode.Position3d.X, endNode.Position3d.Y, endNode.Position3d.Z);
+                    pipeViewModel.StartPosition = new PointL3d(startNode.Position3d.X, startNode.Position3d.Y, startNode.Position3d.Z);
+                    pipeViewModel.EndPosition = new PointL3d(endNode.Position3d.X, endNode.Position3d.Y, endNode.Position3d.Z);
                     vm.Append(pipeViewModel, out _);
                 }
             }
@@ -196,11 +196,11 @@
                 {
                     var startNode = rhs.GetAllNodes().Find(x => x.Code == exchanger.StartCode);
                     var endNode = rhs.GetAllNodes().Find(x => x.Code == exchanger.EndCode);
-                    var pipeViewModel = new Pipe();
+                    var pipeViewModel = new ValveL3d();
                     pipeViewModel.Id = exchanger.Code;
                     pipeViewModel.Name = exchanger.Name;
-                    pipeViewModel.StartPosition = new Point3d(startNode.Position3d.X, startNode.Position3d.Y, startNode.Position3d.Z);
-                    pipeViewModel.EndPosition = new Point3d(endNode.Position3d.X, endNode.Position3d.Y, endNode.Position3d.Z);
+                    pipeViewModel.StartPosition = new PointL3d(startNode.Position3d.X, startNode.Position3d.Y, startNode.Position3d.Z);
+                    pipeViewModel.EndPosition = new PointL3d(endNode.Position3d.X, endNode.Position3d.Y, endNode.Position3d.Z);
                     vm.Append(pipeViewModel, out _);
                 }
             }
@@ -211,12 +211,12 @@
                 {
                     var startNode = rhs.GetAllNodes().Find(x => x.Code == pump.StartCode);
                     var endNode = rhs.GetAllNodes().Find(x => x.Code == pump.EndCode);
-                    var pipeViewModel = new Pipe();
+                    var pipeViewModel = new PumpL3d();
                     pipeViewModel.Id = pump.Code;
                     pipeViewModel.Name = pump.Name;
-                    pipeViewModel.StartPosition = new Point3d(startNode.Position3d.X, startNode.Position3d.Y, startNode.Position3d.Z);
-                    pipeViewModel.EndPosition = new Point3d(endNode.Position3d.X, endNode.Position3d.Y, endNode.Position3d.Z);
-                    vm.Append(pipeViewModel, out _);
+                    pipeViewModel.StartPosition = new PointL3d(startNode.Position3d.X, startNode.Position3d.Y, startNode.Position3d.Z);
+                    pipeViewModel.EndPosition = new PointL3d(endNode.Position3d.X, endNode.Position3d.Y, endNode.Position3d.Z);
+                    vm.Append(pipeViewModel, msg: out _);
                 }
             }
             if (rhs.Valves != null && rhs.Valves.Count > 0)
@@ -225,11 +225,11 @@
                 {
                     var startNode = rhs.GetAllNodes().Find(x => x.Code == valve.StartCode);
                     var endNode = rhs.GetAllNodes().Find(x => x.Code == valve.EndCode);
-                    var pipeViewModel = new Pipe();
+                    var pipeViewModel = new ValveL3d();
                     pipeViewModel.Id = valve.Code;
                     pipeViewModel.Name = valve.Name;
-                    pipeViewModel.StartPosition = new Point3d(startNode.Position3d.X, startNode.Position3d.Y, startNode.Position3d.Z);
-                    pipeViewModel.EndPosition = new Point3d(endNode.Position3d.X, endNode.Position3d.Y, endNode.Position3d.Z);
+                    pipeViewModel.StartPosition = new PointL3d(startNode.Position3d.X, startNode.Position3d.Y, startNode.Position3d.Z);
+                    pipeViewModel.EndPosition = new PointL3d(endNode.Position3d.X, endNode.Position3d.Y, endNode.Position3d.Z);
                     vm.Append(pipeViewModel, out _);
                 }
             }
diff --git a/WinFrmUI/HStation.WinFrmUI.Hydro.Core/01-l3d2/HydroL3d2ViewPage.Designer.cs b/WinFrmUI/HStation.WinFrmUI.Hydro.Core/01-l3d2/HydroL3d2ViewPage.Designer.cs
new file mode 100644
index 0000000..b84a4db
--- /dev/null
+++ b/WinFrmUI/HStation.WinFrmUI.Hydro.Core/01-l3d2/HydroL3d2ViewPage.Designer.cs
@@ -0,0 +1,61 @@
+锘縰sing Yw.WinFrmUI.Hydro;
+
+namespace HStation.WinFrmUI
+{
+    partial class HydroL3d2ViewPage
+    {
+        /// <summary> 
+        /// 蹇呴渶鐨勮璁″櫒鍙橀噺銆�
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary> 
+        /// 娓呯悊鎵�鏈夋鍦ㄤ娇鐢ㄧ殑璧勬簮銆�
+        /// </summary>
+        /// <param name="disposing">濡傛灉搴旈噴鏀炬墭绠¤祫婧愶紝涓� true锛涘惁鍒欎负 false銆�</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region 缁勪欢璁捐鍣ㄧ敓鎴愮殑浠g爜
+
+        /// <summary> 
+        /// 璁捐鍣ㄦ敮鎸佹墍闇�鐨勬柟娉� - 涓嶈淇敼
+        /// 浣跨敤浠g爜缂栬緫鍣ㄤ慨鏀规鏂规硶鐨勫唴瀹广��
+        /// </summary>
+        private void InitializeComponent()
+        {
+            viewerL3d21 = new ViewerL3d2();
+            SuspendLayout();
+            // 
+            // viewerL3d21
+            // 
+            viewerL3d21.BackColor = Color.White;
+            viewerL3d21.Dock = DockStyle.Fill;
+            viewerL3d21.Location = new Point(0, 0);
+            viewerL3d21.Name = "viewerL3d21";
+            viewerL3d21.Size = new Size(888, 529);
+            viewerL3d21.TabIndex = 0;
+            // 
+            // HydroL3d2ViewPage
+            // 
+            Appearance.BackColor = SystemColors.Control;
+            Appearance.Options.UseBackColor = true;
+            AutoScaleDimensions = new SizeF(7F, 14F);
+            AutoScaleMode = AutoScaleMode.Font;
+            Controls.Add(viewerL3d21);
+            Name = "HydroL3d2ViewPage";
+            Size = new Size(888, 529);
+            ResumeLayout(false);
+        }
+
+        #endregion
+
+        private ViewerL3d2 viewerL3d21;
+    }
+}
diff --git a/WinFrmUI/HStation.WinFrmUI.Hydro.Core/01-l3d2/HydroL3d2ViewPage.cs b/WinFrmUI/HStation.WinFrmUI.Hydro.Core/01-l3d2/HydroL3d2ViewPage.cs
new file mode 100644
index 0000000..d4ad501
--- /dev/null
+++ b/WinFrmUI/HStation.WinFrmUI.Hydro.Core/01-l3d2/HydroL3d2ViewPage.cs
@@ -0,0 +1,40 @@
+锘縩amespace HStation.WinFrmUI
+{
+    public partial class HydroL3d2ViewPage : Yw.WinFrmUI.DocumentPage
+    {
+        public HydroL3d2ViewPage()
+        {
+            InitializeComponent();
+            this.PageTitle.Caption = "姘村姏妯″瀷";
+        }
+
+        private Yw.Model.HydroModelInfo _hydro = null;//姘村姏淇℃伅
+
+
+        /// <summary>
+        /// 缁戝畾鏁版嵁
+        /// </summary>
+        public void SetBindingData(Yw.Model.HydroModelInfo hydro)
+        {
+            this.PageTitle.Caption = $"{hydro.Name}\r\n姘村姏妯″瀷";
+            _hydro = hydro;
+        }
+
+        /// <summary>
+        /// 鍒濆鍖栨暟鎹簮
+        /// </summary>
+        public override void InitialDataSource()
+        {
+            base.InitialDataSource();
+            if (_hydro == null)
+            {
+                return;
+            }
+            var nw = HydroL3d2TransferHelper.ToL3d2NetworkViewModel(_hydro);
+            this.viewerL3d21.Initial(nw);
+        }
+
+
+
+    }
+}
diff --git a/WinFrmUI/HStation.WinFrmUI.Hydro.Core/01-model/HydroModelMgrPage.resx b/WinFrmUI/HStation.WinFrmUI.Hydro.Core/01-l3d2/HydroL3d2ViewPage.resx
similarity index 100%
rename from WinFrmUI/HStation.WinFrmUI.Hydro.Core/01-model/HydroModelMgrPage.resx
rename to WinFrmUI/HStation.WinFrmUI.Hydro.Core/01-l3d2/HydroL3d2ViewPage.resx
diff --git a/WinFrmUI/HStation.WinFrmUI.Hydro.Core/01-model/HydroModelMgrPage.Designer.cs b/WinFrmUI/HStation.WinFrmUI.Hydro.Core/01-model/HydroModelMgrPage.Designer.cs
deleted file mode 100644
index 9714593..0000000
--- a/WinFrmUI/HStation.WinFrmUI.Hydro.Core/01-model/HydroModelMgrPage.Designer.cs
+++ /dev/null
@@ -1,62 +0,0 @@
-锘縩amespace HStation.WinFrmUI
-{
-    partial class HydroModelMgrPage
-    {
-        /// <summary> 
-        /// 蹇呴渶鐨勮璁″櫒鍙橀噺銆�
-        /// </summary>
-        private System.ComponentModel.IContainer components = null;
-
-        /// <summary> 
-        /// 娓呯悊鎵�鏈夋鍦ㄤ娇鐢ㄧ殑璧勬簮銆�
-        /// </summary>
-        /// <param name="disposing">濡傛灉搴旈噴鏀炬墭绠¤祫婧愶紝涓� true锛涘惁鍒欎负 false銆�</param>
-        protected override void Dispose(bool disposing)
-        {
-            if (disposing && (components != null))
-            {
-                components.Dispose();
-            }
-            base.Dispose(disposing);
-        }
-
-        #region 缁勪欢璁捐鍣ㄧ敓鎴愮殑浠g爜
-
-        /// <summary> 
-        /// 璁捐鍣ㄦ敮鎸佹墍闇�鐨勬柟娉� - 涓嶈淇敼
-        /// 浣跨敤浠g爜缂栬緫鍣ㄤ慨鏀规鏂规硶鐨勫唴瀹广��
-        /// </summary>
-        private void InitializeComponent()
-        {
-            barButtonItem1 = new DevExpress.XtraBars.BarButtonItem();
-            ((System.ComponentModel.ISupportInitialize)ribbonControl1).BeginInit();
-            SuspendLayout();
-            // 
-            // ribbonControl1
-            // 
-            ribbonControl1.ExpandCollapseItem.Id = 0;
-            // 
-            // barButtonItem1
-            // 
-            barButtonItem1.Caption = "barButtonItem1";
-            barButtonItem1.Id = 18;
-            barButtonItem1.Name = "barButtonItem1";
-            // 
-            // HydroModelMgrPage
-            // 
-            Appearance.BackColor = SystemColors.Control;
-            Appearance.Options.UseBackColor = true;
-            AutoScaleDimensions = new SizeF(7F, 14F);
-            AutoScaleMode = AutoScaleMode.Font;
-            Name = "HydroModelMgrPage";
-            ((System.ComponentModel.ISupportInitialize)ribbonControl1).EndInit();
-            ResumeLayout(false);
-            PerformLayout();
-        }
-
-        #endregion
-
-        private DevExpress.XtraBars.Ribbon.RibbonPageGroup ribbonPageGroup1;
-        private DevExpress.XtraBars.BarButtonItem barButtonItem1;
-    }
-}
diff --git a/WinFrmUI/HStation.WinFrmUI.Hydro.Core/01-model/HydroModelMgrPage.cs b/WinFrmUI/HStation.WinFrmUI.Hydro.Core/01-model/HydroModelMgrPage.cs
deleted file mode 100644
index 7f60988..0000000
--- a/WinFrmUI/HStation.WinFrmUI.Hydro.Core/01-model/HydroModelMgrPage.cs
+++ /dev/null
@@ -1,29 +0,0 @@
-锘縰sing Yw.WinFrmUI;
-
-namespace HStation.WinFrmUI
-{
-    public partial class HydroModelMgrPage : Yw.WinFrmUI.HydroModelMgrPage
-    {
-        public HydroModelMgrPage()
-        {
-            InitializeComponent();
-        }
-
-        protected override void ViewModel(Yw.Vmo.HydroModelVmo vmo)
-        {
-            base.ViewModel(vmo);
-            var guid = new PageGuid()
-            {
-                Modular = "Hydro",
-                MoudingType = Yw.WinFrmUI.Page.eMoudingType.Tab,
-                Function = "ViewModel",
-            };
-            if (!IsExistPage(guid, true))
-            {
-                var page = new HydroQ3dViewPage();
-                page.SetBindingData(vmo.ID);
-                CreatePage(page, guid);
-            }
-        }
-    }
-}
\ No newline at end of file
diff --git a/WinFrmUI/HStation.WinFrmUI.Hydro.Core/HStation.WinFrmUI.Hydro.Core.csproj b/WinFrmUI/HStation.WinFrmUI.Hydro.Core/HStation.WinFrmUI.Hydro.Core.csproj
index 9628df7..1a41ad5 100644
--- a/WinFrmUI/HStation.WinFrmUI.Hydro.Core/HStation.WinFrmUI.Hydro.Core.csproj
+++ b/WinFrmUI/HStation.WinFrmUI.Hydro.Core/HStation.WinFrmUI.Hydro.Core.csproj
@@ -8,11 +8,17 @@
   </PropertyGroup>
 
   <ItemGroup>
-    <ProjectReference Include="..\..\Hydro\HStation.Hydro.Core\HStation.Hydro.Core.csproj" />
-    <ProjectReference Include="..\HStation.WinFrmUI.Bimface.Core\HStation.WinFrmUI.Bimface.Core.csproj" />
-    <ProjectReference Include="..\HStation.WinFrmUI.Core\HStation.WinFrmUI.Core.csproj" />
+    <PackageReference Include="Yw.WinFrmUI.Hydro.L3d2.Core" Version="1.0.2" />
+  </ItemGroup>
+
+  <ItemGroup>
     <ProjectReference Include="..\Yw.WinFrmUI.Hydro.Core\Yw.WinFrmUI.Hydro.Core.csproj" />
-    <ProjectReference Include="..\Yw.WinFrmUI.Hydro.Q3d.Core\Yw.WinFrmUI.Hydro.Q3d.Core.csproj" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <Compile Update="01-l3d2\HydroL3d2ViewPage.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
   </ItemGroup>
 
 </Project>
diff --git a/WinFrmUI/HStation.WinFrmUI.Hydro.Core/HStation.WinFrmUI.Hydro.Core.csproj.user b/WinFrmUI/HStation.WinFrmUI.Hydro.Core/HStation.WinFrmUI.Hydro.Core.csproj.user
index 1ef09dd..0295687 100644
--- a/WinFrmUI/HStation.WinFrmUI.Hydro.Core/HStation.WinFrmUI.Hydro.Core.csproj.user
+++ b/WinFrmUI/HStation.WinFrmUI.Hydro.Core/HStation.WinFrmUI.Hydro.Core.csproj.user
@@ -1,11 +1,4 @@
 锘�<?xml version="1.0" encoding="utf-8"?>
 <Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup>
-    <Compile Update="00-core\HydroQ3dViewPage.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Update="01-model\HydroModelMgrPage.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-  </ItemGroup>
+  <ItemGroup />
 </Project>
\ No newline at end of file
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/02-project/03-mgr/XhsProjectMgrPage.cs b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/02-project/03-mgr/XhsProjectMgrPage.cs
index 39fd51a..2f23c47 100644
--- a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/02-project/03-mgr/XhsProjectMgrPage.cs
+++ b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/02-project/03-mgr/XhsProjectMgrPage.cs
@@ -397,7 +397,7 @@
 
             if (!IsExistPage(guid, true))
             {
-                var page = new XhsProjectQ3dViewPage();
+                var page = new XhsProjectL3d2ViewPage();
                 page.SetBindingData(vm.Project);
                 CreatePage(page, guid);
             }
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/02-project/04-l3d2/XhsProjectL3d2ViewPage.Designer.cs b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/02-project/04-l3d2/XhsProjectL3d2ViewPage.Designer.cs
new file mode 100644
index 0000000..4c3fdd9
--- /dev/null
+++ b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/02-project/04-l3d2/XhsProjectL3d2ViewPage.Designer.cs
@@ -0,0 +1,57 @@
+锘縩amespace HStation.WinFrmUI
+{
+    partial class XhsProjectL3d2ViewPage
+    {
+        /// <summary> 
+        /// 蹇呴渶鐨勮璁″櫒鍙橀噺銆�
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary> 
+        /// 娓呯悊鎵�鏈夋鍦ㄤ娇鐢ㄧ殑璧勬簮銆�
+        /// </summary>
+        /// <param name="disposing">濡傛灉搴旈噴鏀炬墭绠¤祫婧愶紝涓� true锛涘惁鍒欎负 false銆�</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region 缁勪欢璁捐鍣ㄧ敓鎴愮殑浠g爜
+
+        /// <summary> 
+        /// 璁捐鍣ㄦ敮鎸佹墍闇�鐨勬柟娉� - 涓嶈淇敼
+        /// 浣跨敤浠g爜缂栬緫鍣ㄤ慨鏀规鏂规硶鐨勫唴瀹广��
+        /// </summary>
+        private void InitializeComponent()
+        {
+            viewerL3d21 = new Yw.WinFrmUI.Hydro.ViewerL3d2();
+            SuspendLayout();
+            // 
+            // viewerL3d21
+            // 
+            viewerL3d21.BackColor = Color.White;
+            viewerL3d21.Dock = DockStyle.Fill;
+            viewerL3d21.Location = new Point(0, 0);
+            viewerL3d21.Name = "viewerL3d21";
+            viewerL3d21.Size = new Size(656, 442);
+            viewerL3d21.TabIndex = 0;
+            // 
+            // XhsProjectL3d2ViewPage
+            // 
+            AutoScaleDimensions = new SizeF(7F, 17F);
+            AutoScaleMode = AutoScaleMode.Font;
+            Controls.Add(viewerL3d21);
+            Name = "XhsProjectL3d2ViewPage";
+            Size = new Size(656, 442);
+            ResumeLayout(false);
+        }
+
+        #endregion
+
+        private Yw.WinFrmUI.Hydro.ViewerL3d2 viewerL3d21;
+    }
+}
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/02-project/04-q3d/XhsProjectQ3dViewPage.cs b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/02-project/04-l3d2/XhsProjectL3d2ViewPage.cs
similarity index 73%
rename from WinFrmUI/HStation.WinFrmUI.Xhs.Core/02-project/04-q3d/XhsProjectQ3dViewPage.cs
rename to WinFrmUI/HStation.WinFrmUI.Xhs.Core/02-project/04-l3d2/XhsProjectL3d2ViewPage.cs
index f4f0b6b..2aadc9c 100644
--- a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/02-project/04-q3d/XhsProjectQ3dViewPage.cs
+++ b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/02-project/04-l3d2/XhsProjectL3d2ViewPage.cs
@@ -1,8 +1,8 @@
 锘縩amespace HStation.WinFrmUI
 {
-    public partial class XhsProjectQ3dViewPage : DocumentPage
+    public partial class XhsProjectL3d2ViewPage : DocumentPage
     {
-        public XhsProjectQ3dViewPage()
+        public XhsProjectL3d2ViewPage()
         {
             InitializeComponent();
             this.PageTitle.Caption = "姘村姏瑙嗗浘";
@@ -62,13 +62,9 @@
             InitialData();
         }
 
-
         //鍒濆鍖栨暟鎹�
         private async void InitialData()
         {
-            var drawer = GetDrawer();
-            this.Controls.Clear();
-            this.Controls.Add(drawer);
             if (_project == null)
             {
                 return;
@@ -83,31 +79,14 @@
             {
                 return;
             }
-            var hydroInfo = await BLLFactory<Yw.BLL.HydroModelInfo>.Instance.GetByID(relation.ModelID);
-            if (hydroInfo == null)
+            var hydro = await BLLFactory<Yw.BLL.HydroModelInfo>.Instance.GetByID(relation.ModelID);
+            if (hydro == null)
             {
                 return;
             }
-            var network = hydroInfo.ToNetworkViewModel();
-            drawer.SetData(network);
+            var nw = hydro.ToL3d2NetworkViewModel();
+            this.viewerL3d21.Initial(nw);
         }
-
-        #region 缁樺埗瀹瑰櫒
-
-        //鑾峰彇缁樺埗鍣�
-        private Yw.WinFrmUI.Q3d.Drawer GetDrawer()
-        {
-            if (_drawer == null)
-            {
-                _drawer = new Yw.WinFrmUI.Q3d.Drawer();
-                _drawer.Dock = DockStyle.Fill;
-            }
-            return _drawer;
-        }
-        //Q3d缁樺埗鍣�
-        private Yw.WinFrmUI.Q3d.Drawer _drawer = null;
-
-        #endregion
 
 
     }
diff --git a/WinFrmUI/HStation.WinFrmUI.Hydro.Core/01-model/HydroModelMgrPage.resx b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/02-project/04-l3d2/XhsProjectL3d2ViewPage.resx
similarity index 100%
copy from WinFrmUI/HStation.WinFrmUI.Hydro.Core/01-model/HydroModelMgrPage.resx
copy to WinFrmUI/HStation.WinFrmUI.Xhs.Core/02-project/04-l3d2/XhsProjectL3d2ViewPage.resx
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/02-project/04-q3d/XhsProjectQ3dViewPage.Designer.cs b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/02-project/04-q3d/XhsProjectQ3dViewPage.Designer.cs
deleted file mode 100644
index ae648b8..0000000
--- a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/02-project/04-q3d/XhsProjectQ3dViewPage.Designer.cs
+++ /dev/null
@@ -1,47 +0,0 @@
-锘縩amespace HStation.WinFrmUI
-{
-    partial class XhsProjectQ3dViewPage
-    {
-        /// <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()
-        {
-            ComponentResourceManager resources = new ComponentResourceManager(typeof(XhsProjectQ3dViewPage));
-            SuspendLayout();
-            // 
-            // XhsProjectHydroQ3dCtrl
-            // 
-            AutoScaleDimensions = new SizeF(7F, 14F);
-            AutoScaleMode = AutoScaleMode.Font;
-            Name = "XhsProjectQ3dViewPage";
-            Size = new Size(889, 597);
-            ResumeLayout(false);
-        }
-
-        #endregion
-
-
-    }
-}
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/02-project/04-q3d/XhsProjectQ3dViewPage.resx b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/02-project/04-q3d/XhsProjectQ3dViewPage.resx
deleted file mode 100644
index b27f0a7..0000000
--- a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/02-project/04-q3d/XhsProjectQ3dViewPage.resx
+++ /dev/null
@@ -1,145 +0,0 @@
-锘�<?xml version="1.0" encoding="utf-8"?>
-<root>
-  <!--
-    Microsoft ResX Schema 
-
-    Version 2.0
-
-    The primary goals of this format is to allow a simple XML format
-    that is mostly human readable. The generation and parsing of the
-    various data types are done through the TypeConverter classes
-    associated with the data types.
-
-    Example:
-
-    ... ado.net/XML headers & schema ...
-    <resheader name="resmimetype">text/microsoft-resx</resheader>
-    <resheader name="version">2.0</resheader>
-    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
-    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
-    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
-    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
-    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
-        <value>[base64 mime encoded serialized .NET Framework object]</value>
-    </data>
-    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
-        <comment>This is a comment</comment>
-    </data>
-
-    There are any number of "resheader" rows that contain simple
-    name/value pairs.
-
-    Each data row contains a name, and value. The row also contains a
-    type or mimetype. Type corresponds to a .NET class that support
-    text/value conversion through the TypeConverter architecture.
-    Classes that don't support this are serialized and stored with the
-    mimetype set.
-
-    The mimetype is used for serialized objects, and tells the
-    ResXResourceReader how to depersist the object. This is currently not
-    extensible. For a given mimetype the value must be set accordingly:
-
-    Note - application/x-microsoft.net.object.binary.base64 is the format
-    that the ResXResourceWriter will generate, however the reader can
-    read any of the formats listed below.
-
-    mimetype: application/x-microsoft.net.object.binary.base64
-    value   : The object must be serialized with
-            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
-            : and then encoded with base64 encoding.
-    
-    mimetype: application/x-microsoft.net.object.soap.base64
-    value   : The object must be serialized with
-            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
-            : and then encoded with base64 encoding.
-
-    mimetype: application/x-microsoft.net.object.bytearray.base64
-    value   : The object must be serialized into a byte array
-            : using a System.ComponentModel.TypeConverter
-            : and then encoded with base64 encoding.
-    -->
-  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
-    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
-    <xsd:element name="root" msdata:IsDataSet="true">
-      <xsd:complexType>
-        <xsd:choice maxOccurs="unbounded">
-          <xsd:element name="metadata">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" />
-              </xsd:sequence>
-              <xsd:attribute name="name" use="required" type="xsd:string" />
-              <xsd:attribute name="type" type="xsd:string" />
-              <xsd:attribute name="mimetype" type="xsd:string" />
-              <xsd:attribute ref="xml:space" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="assembly">
-            <xsd:complexType>
-              <xsd:attribute name="alias" type="xsd:string" />
-              <xsd:attribute name="name" type="xsd:string" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="data">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
-              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
-              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
-              <xsd:attribute ref="xml:space" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="resheader">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" />
-            </xsd:complexType>
-          </xsd:element>
-        </xsd:choice>
-      </xsd:complexType>
-    </xsd:element>
-  </xsd:schema>
-  <resheader name="resmimetype">
-    <value>text/microsoft-resx</value>
-  </resheader>
-  <resheader name="version">
-    <value>2.0</value>
-  </resheader>
-  <resheader name="reader">
-    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <resheader name="writer">
-    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <data name="drawer1.MapCenter" mimetype="application/x-microsoft.net.object.binary.base64">
-    <value>
-        AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
-        dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABVTeXN0ZW0uRHJh
-        d2luZy5Qb2ludEYCAAAAAXgBeQAACwsCAAAAAAAAAAAAAAAL
-</value>
-  </data>
-  <data name="drawer1.mapOption" mimetype="application/x-microsoft.net.object.binary.base64">
-    <value>
-        AAEAAAD/////AQAAAAAAAAAMAgAAAEBZdy5XaW5Gcm1VSS5IeWRyby5RM2QuQ29yZSwgQ3VsdHVyZT1u
-        ZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1udWxsDAMAAABRU3lzdGVtLkRyYXdpbmcsIFZlcnNpb249NC4w
-        LjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iMDNmNWY3ZjExZDUwYTNhBQEAAAAd
-        WXcuV2luRnJtVUkuUTNkLk1hcERpbWVuc2lvbnMNAAAAFzxDZW50ZXI+a19fQmFja2luZ0ZpZWxkFTx6
-        b29tPmtfX0JhY2tpbmdGaWVsZBk8cm90YXRpb24+a19fQmFja2luZ0ZpZWxkCl9yb3RhdGlvbkYaPFNo
-        b3dGbG9vcj5rX19CYWNraW5nRmllbGQaPGlzU2hvd1BpYz5rX19CYWNraW5nRmllbGQVaXNBdXRvQmFj
-        a2dyb3VuZEltYWdlHjxpc1Nob3dVbmZhdm9yPmtfX0JhY2tpbmdGaWVsZBs8TG9jazJEVmlldz5rX19C
-        YWNraW5nRmllbGQbPGlzRWRpdE1vZGU+a19fQmFja2luZ0ZpZWxkGDxJc09ydGhvPmtfX0JhY2tpbmdG
-        aWVsZBs8Q29sb3VyTm9kZT5rX19CYWNraW5nRmllbGQbPENvbG91ckxpbms+a19fQmFja2luZ0ZpZWxk
-        BAAAAAAAAAAAAAAEBBVTeXN0ZW0uRHJhd2luZy5Qb2ludEYDAAAACwYGCAEBAQEBARpZdy5XaW5Gcm1V
-        SS5RM2QuQ29sb3VyVHlwZQIAAAAaWXcuV2luRnJtVUkuUTNkLkNvbG91clR5cGUCAAAAAgAAAAX8////
-        FVN5c3RlbS5EcmF3aW5nLlBvaW50RgIAAAABeAF5AAALCwMAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAA
-        AAAAAAAAAAAAgAEAAQABAQX7////Gll3LldpbkZybVVJLlEzZC5Db2xvdXJUeXBlAQAAAAd2YWx1ZV9f
-        AAgCAAAAAAAAAAH6////+////wAAAAAL
-</value>
-  </data>
-</root>
\ No newline at end of file
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/00-core/01-flow-effect/ISimulationFlowEffectView.cs b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/00-core/01-flow-effect/ISimulationFlowEffectView.cs
index 4ee351b..722cf3c 100644
--- a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/00-core/01-flow-effect/ISimulationFlowEffectView.cs
+++ b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/00-core/01-flow-effect/ISimulationFlowEffectView.cs
@@ -10,7 +10,7 @@
         /// <summary>
         /// 鍔犺浇姘存祦鍔ㄧ敾
         /// </summary>
-        Task LoadFlowEffect(List<LogicFlowEffect> items);
+        Task LoadFlowEffect(List<LogicFlowEffect> data);
 
         /// <summary>
         /// 鍗歌浇姘存祦鍔ㄧ敾
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/00-core/01-flow-effect/SimulationFlowEffectHelper.cs b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/00-core/01-flow-effect/SimulationFlowEffectHelper.cs
index 29bec79..41517e6 100644
--- a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/00-core/01-flow-effect/SimulationFlowEffectHelper.cs
+++ b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/00-core/01-flow-effect/SimulationFlowEffectHelper.cs
@@ -11,15 +11,41 @@
         /// <summary>
         /// 
         /// </summary>
-        public SimulationFlowEffectHelper(SimulationVisualListHelper visualListHelper, ISimulationFlowEffectView view)
+        public SimulationFlowEffectHelper
+            (
+                SimulationVisualListHelper visualListHelper,
+                SimulationCalcuResultHelper calcuResultHelper,
+                ISimulationFlowEffectView view
+            )
         {
             _visualListHelper = visualListHelper;
+            _calcuResultHelper = calcuResultHelper;
+            _calcuResultHelper.InitialEvent += InitialData;
             _views = new List<ISimulationFlowEffectView>() { view };
+            InitialData();
         }
 
-        private SimulationVisualListHelper _visualListHelper = null;//鍙鍒楄〃杈呭姪绫�
-        private List<ISimulationFlowEffectView> _views = null;//瑙嗗浘鍒楄〃
-        private HydroCalcuResult _calcuResult = null;//璁$畻缁撴灉
+        /// <summary>
+        /// 
+        /// </summary>
+        public SimulationFlowEffectHelper
+            (
+                SimulationVisualListHelper visualListHelper,
+                SimulationCalcuResultHelper calcuResultHelper,
+                List<ISimulationFlowEffectView> views
+            )
+        {
+            _visualListHelper = visualListHelper;
+            _calcuResultHelper = calcuResultHelper;
+            _calcuResultHelper.InitialEvent += InitialData;
+            _views = views;
+            InitialData();
+        }
+
+        private readonly SimulationVisualListHelper _visualListHelper = null;//鍙鍒楄〃杈呭姪绫�
+        private readonly SimulationCalcuResultHelper _calcuResultHelper = null;//璁$畻缁撴灉杈呭姪绫�
+        private readonly List<ISimulationFlowEffectView> _views = null;//瑙嗗浘鍒楄〃
+        private readonly Dictionary<string, LogicFlowEffect> _cache = new();//缂撳瓨
 
         /// <summary>
         /// 鍙鎬�
@@ -31,42 +57,24 @@
         }
         private bool _visible = false;
 
-        /// <summary>
-        /// 椤瑰垪琛�
-        /// </summary>
-        public List<LogicFlowEffect> Items
-        {
-            get { return _items; }
-            private set { _items = value; }
-        }
-        private List<LogicFlowEffect> _items = null;
 
-        /// <summary>
-        /// 鍒濆鍖栨暟鎹�
-        /// </summary>
-        public void InitialData(HydroCalcuResult calcuResult)
+        //鍒濆鍖栨暟鎹�
+        private void InitialData()
         {
-            _calcuResult = calcuResult;
-            var allCalcuResultVisualDict = calcuResult?.GetVisualDict();
-            _visualListHelper.HydroInfo.Pipes?.ForEach(x => InitialItem(x, allCalcuResultVisualDict));
-        }
-
-        //鍒濆鍖栭」
-        private void InitialItem(HydroVisualInfo visual, Dictionary<string, HydroCalcuVisualResult> allCalcuResultVisualDict)
-        {
-            var item = CreateItem(visual, allCalcuResultVisualDict);
-            if (item != null)
+            var allCalcuVisualResultDict = _calcuResultHelper.GetVisualDict();
+            _cache.Clear();
+            _visualListHelper.GetVisualList()?.ForEach(x =>
             {
-                if (this.Items == null)
+                var item = CreateItem(x, allCalcuVisualResultDict);
+                if (item != null)
                 {
-                    this.Items = new List<LogicFlowEffect>();
+                    _cache[x.Code] = item;
                 }
-                this.Items.Add(item);
-            }
+            });
         }
 
         //鍒涘缓椤�
-        private LogicFlowEffect CreateItem(HydroVisualInfo visual, Dictionary<string, HydroCalcuVisualResult> allCalcuResultVisualDict = null)
+        private LogicFlowEffect CreateItem(HydroVisualInfo visual, Dictionary<string, HydroCalcuVisualResult> allCalcuVisualResultDict = null)
         {
             if (visual == null)
             {
@@ -82,39 +90,213 @@
                         item.Id = pipe.Code;
                         item.Rotation = 90;
                         item.SpeedX = 0.1;
-                        //if (pipe.FlowDirectionX == Yw.Hydro.FlowDirection.None)
-                        //{
-                        //    item.SpeedX = 0;
-                        //}
-                        //else if (pipe.FlowDirectionX == Yw.Hydro.FlowDirection.Positive)
-                        //{
-                        //    item.SpeedX = 0.1;
-                        //}
-                        //else
-                        //{
-                        //    item.SpeedX = -0.1;
-                        //}
+                        if (pipe.FlowDirectionX == Yw.Hydro.FlowDirection.None)
+                        {
+                            item.SpeedX = 0;
+                        }
+                        else if (pipe.FlowDirectionX == Yw.Hydro.FlowDirection.Positive)
+                        {
+                            item.SpeedX = 0.1;
+                        }
+                        else
+                        {
+                            item.SpeedX = -0.1;
+                        }
 
-                        //if (pipe.FlowDirectionY == Yw.Hydro.FlowDirection.None)
-                        //{
-                        //    item.SpeedY = 0;
-                        //}
-                        //else if (pipe.FlowDirectionY == Yw.Hydro.FlowDirection.Positive)
-                        //{
-                        //    item.SpeedY = 0.1;
-                        //}
-                        //else
-                        //{
-                        //    item.SpeedY = -0.1;
-                        //}
+                        if (pipe.FlowDirectionY == Yw.Hydro.FlowDirection.None)
+                        {
+                            item.SpeedY = 0;
+                        }
+                        else if (pipe.FlowDirectionY == Yw.Hydro.FlowDirection.Positive)
+                        {
+                            item.SpeedY = 0.1;
+                        }
+                        else
+                        {
+                            item.SpeedY = -0.1;
+                        }
 
-                        var calcuLinkResult = allCalcuResultVisualDict?.GetValue(pipe.Code) as HydroCalcuLinkResult;
+                        var calcuLinkResult = allCalcuVisualResultDict?.GetValue(pipe.Code) as HydroCalcuLinkResult;
                         if (calcuLinkResult != null)
                         {
                             if (calcuLinkResult.CalcuVelocity < 0)
                             {
                                 item.SpeedX = -item.SpeedX;
                             }
+                        }
+                    }
+                    break;
+                case Yw.Hydro.ParterCatalog.Translation:
+                    {
+                        HydroTranslationInfo translation = visual as HydroTranslationInfo;
+                        item = new LogicFlowEffect();
+                        item.Id = translation.Code;
+                        item.Rotation = 90;
+                        item.SpeedX = 0.1;
+                        if (translation.FlowDirectionX == Yw.Hydro.FlowDirection.None)
+                        {
+                            item.SpeedX = 0;
+                        }
+                        else if (translation.FlowDirectionX == Yw.Hydro.FlowDirection.Positive)
+                        {
+                            item.SpeedX = 0.1;
+                        }
+                        else
+                        {
+                            item.SpeedX = -0.1;
+                        }
+                        if (translation.FlowDirectionY == Yw.Hydro.FlowDirection.None)
+                        {
+                            item.SpeedY = 0;
+                        }
+                        else if (translation.FlowDirectionY == Yw.Hydro.FlowDirection.Positive)
+                        {
+                            item.SpeedY = 0.1;
+                        }
+                        else
+                        {
+                            item.SpeedY = -0.1;
+                        }
+
+                        var calcuLinkResult = allCalcuVisualResultDict?.GetValue(translation.Code) as HydroCalcuLinkResult;
+                        if (calcuLinkResult != null)
+                        {
+                            if (calcuLinkResult.CalcuVelocity < 0)
+                            {
+                                item.SpeedX = -item.SpeedX;
+                            }
+                        }
+                    }
+                    break;
+                case Yw.Hydro.ParterCatalog.Blunthead:
+                    {
+                        HydroBluntheadInfo blunthead = visual as HydroBluntheadInfo;
+                        item = new LogicFlowEffect();
+                        item.Id = blunthead.Code;
+                        item.Rotation = 90;
+                        item.SpeedX = 0.1;
+                        if (blunthead.FlowDirectionX == Yw.Hydro.FlowDirection.None)
+                        {
+                            item.SpeedX = 0;
+                        }
+                        else if (blunthead.FlowDirectionX == Yw.Hydro.FlowDirection.Positive)
+                        {
+                            item.SpeedX = 0.1;
+                        }
+                        else
+                        {
+                            item.SpeedX = -0.1;
+                        }
+                        if (blunthead.FlowDirectionY == Yw.Hydro.FlowDirection.None)
+                        {
+                            item.SpeedY = 0;
+                        }
+                        else if (blunthead.FlowDirectionY == Yw.Hydro.FlowDirection.Positive)
+                        {
+                            item.SpeedY = 0.1;
+                        }
+                        else
+                        {
+                            item.SpeedY = -0.1;
+                        }
+                    }
+                    break;
+                case Yw.Hydro.ParterCatalog.Elbow:
+                    {
+                        HydroElbowInfo elbow = visual as HydroElbowInfo;
+                        item = new LogicFlowEffect();
+                        item.Id = elbow.Code;
+                        item.Rotation = 90;
+                        item.SpeedX = 0.1;
+                        if (elbow.FlowDirectionX == Yw.Hydro.FlowDirection.None)
+                        {
+                            item.SpeedX = 0;
+                        }
+                        else if (elbow.FlowDirectionX == Yw.Hydro.FlowDirection.Positive)
+                        {
+                            item.SpeedX = 0.1;
+                        }
+                        else
+                        {
+                            item.SpeedX = -0.1;
+                        }
+                        if (elbow.FlowDirectionY == Yw.Hydro.FlowDirection.None)
+                        {
+                            item.SpeedY = 0;
+                        }
+                        else if (elbow.FlowDirectionY == Yw.Hydro.FlowDirection.Positive)
+                        {
+                            item.SpeedY = 0.1;
+                        }
+                        else
+                        {
+                            item.SpeedY = -0.1;
+                        }
+                    }
+                    break;
+                case Yw.Hydro.ParterCatalog.Threelink:
+                    {
+                        HydroThreelinkInfo threelink = visual as HydroThreelinkInfo;
+                        item = new LogicFlowEffect();
+                        item.Id = threelink.Code;
+                        item.Rotation = 90;
+                        item.SpeedX = 0.1;
+                        if (threelink.FlowDirectionX == Yw.Hydro.FlowDirection.None)
+                        {
+                            item.SpeedX = 0;
+                        }
+                        else if (threelink.FlowDirectionX == Yw.Hydro.FlowDirection.Positive)
+                        {
+                            item.SpeedX = 0.1;
+                        }
+                        else
+                        {
+                            item.SpeedX = -0.1;
+                        }
+                        if (threelink.FlowDirectionY == Yw.Hydro.FlowDirection.None)
+                        {
+                            item.SpeedY = 0;
+                        }
+                        else if (threelink.FlowDirectionY == Yw.Hydro.FlowDirection.Positive)
+                        {
+                            item.SpeedY = 0.1;
+                        }
+                        else
+                        {
+                            item.SpeedY = -0.1;
+                        }
+                    }
+                    break;
+                case Yw.Hydro.ParterCatalog.Fourlink:
+                    {
+                        HydroFourlinkInfo fourlink = visual as HydroFourlinkInfo;
+                        item = new LogicFlowEffect();
+                        item.Id = fourlink.Code;
+                        item.Rotation = 90;
+                        item.SpeedX = 0.1;
+                        if (fourlink.FlowDirectionX == Yw.Hydro.FlowDirection.None)
+                        {
+                            item.SpeedX = 0;
+                        }
+                        else if (fourlink.FlowDirectionX == Yw.Hydro.FlowDirection.Positive)
+                        {
+                            item.SpeedX = 0.1;
+                        }
+                        else
+                        {
+                            item.SpeedX = -0.1;
+                        }
+                        if (fourlink.FlowDirectionY == Yw.Hydro.FlowDirection.None)
+                        {
+                            item.SpeedY = 0;
+                        }
+                        else if (fourlink.FlowDirectionY == Yw.Hydro.FlowDirection.Positive)
+                        {
+                            item.SpeedY = 0.1;
+                        }
+                        else
+                        {
+                            item.SpeedY = -0.1;
                         }
                     }
                     break;
@@ -130,7 +312,7 @@
         {
             if (this.Visible)
             {
-                _views?.ForEach(async x => await x.LoadFlowEffect(this.Items));
+                _views?.ForEach(async x => await x.LoadFlowEffect(_cache.Values.ToList()));
             }
             else
             {
@@ -147,30 +329,12 @@
             {
                 return;
             }
-            var oldItem = this.Items?.Find(x => x.Id == visual.Code);
-            if (oldItem != null)
-            {
-                if (this.Items != null)
-                {
-                    this.Items.Remove(oldItem);
-                }
-                this.Items?.Remove(oldItem);
-            }
-            var allCalcuResultVisualDict = _calcuResult?.GetVisualDict();
-            var newItem = CreateItem(visual, allCalcuResultVisualDict);
-            if (newItem != null)
-            {
-                if (this.Items != null)
-                {
-                    this.Items.Add(newItem);
-                }
-            }
+            var allCalcuVisualResultDict = _calcuResultHelper?.GetVisualDict();
+            var item = CreateItem(visual, allCalcuVisualResultDict);
+            _cache[visual.Code] = item;
             if (this.Visible)
             {
-                if (newItem != null)
-                {
-                    _views?.ForEach(async x => await x.UpdateFlowEffect(newItem));
-                }
+                _views?.ForEach(async x => await x.UpdateFlowEffect(item));
             }
 
         }
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/00-core/04-monitor/01-monitor/SimulationMonitorHelper.cs b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/00-core/04-monitor/01-monitor/SimulationMonitorHelper.cs
index b364b08..eabb9c7 100644
--- a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/00-core/04-monitor/01-monitor/SimulationMonitorHelper.cs
+++ b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/00-core/04-monitor/01-monitor/SimulationMonitorHelper.cs
@@ -1,6 +1,4 @@
-锘縰sing Yw.Hydro;
-using Yw.Vmo;
-using static Yw.WinFrmUI.Q3d.EpanetEnum;
+锘縰sing Yw.Vmo;
 
 namespace HStation.WinFrmUI
 {
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/00-core/04-monitor/02-value/SimulationMonitorValueHelper.cs b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/00-core/04-monitor/02-value/SimulationMonitorValueHelper.cs
index de69dcc..327dc2a 100644
--- a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/00-core/04-monitor/02-value/SimulationMonitorValueHelper.cs
+++ b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/00-core/04-monitor/02-value/SimulationMonitorValueHelper.cs
@@ -1,5 +1,4 @@
-锘縰sing Yw.Hydro;
-using static Yw.WinFrmUI.Q3d.EpanetEnum;
+锘�
 
 namespace HStation.WinFrmUI
 {
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/00-core/07-grading/SimulationGradingHelper.cs b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/00-core/07-grading/SimulationGradingHelper.cs
index 4e21f22..a5eec61 100644
--- a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/00-core/07-grading/SimulationGradingHelper.cs
+++ b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/00-core/07-grading/SimulationGradingHelper.cs
@@ -11,7 +11,12 @@
         /// <summary>
         /// 
         /// </summary>
-        public SimulationGradingHelper(SimulationVisualListHelper visualListHelper, SimulationCalcuResultHelper calcuResultHelper, ISimulationGradingView view)
+        public SimulationGradingHelper
+            (
+                SimulationVisualListHelper visualListHelper,
+                SimulationCalcuResultHelper calcuResultHelper,
+                ISimulationGradingView view
+            )
         {
             _visualListHelper = visualListHelper;
             _calcuResultHelper = calcuResultHelper;
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/01-property/SimulationPropertyCtrl.cs b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/01-property/SimulationPropertyCtrl.cs
index e7ac3bc..48cf4bc 100644
--- a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/01-property/SimulationPropertyCtrl.cs
+++ b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/01-property/SimulationPropertyCtrl.cs
@@ -18,7 +18,10 @@
             this.hydroVisualPropertyCtrl1.PropertyValueChangedEvent += HydroVisualPropertyCtrl1_PropertyValueChangedEvent;
             this.hydroVisualPropertyCtrl1.MarkPropertyValueChangedEvent += HydroVisualPropertyCtrl1_MarkPropertyValueChangedEvent;
             this.hydroVisualPropertyCtrl1.GradingPropertyValueChangedEvent += HydroPVisualPropertyCtrl1_GradingPropertyValueChangedEvent;
+            this.hydroVisualPropertyCtrl1.FlowDirectionPropertyValueChangedEvent+=HydroVisualPropertyCtrl1_FlowDirectionPropertyValueChangedEvent;
         }
+
+
 
         #region 浜嬩欢闆嗗悎
 
@@ -26,28 +29,28 @@
         /// 鏋勪欢鏌ョ湅浜嬩欢
         /// </summary>
         public event Action<HydroVisualInfo> HydroViewEvent;
-
         /// <summary>
         /// 寮鸿皟杩炴帴缁勪欢浜嬩欢
         /// 绗竴涓弬鏁颁负缁勪欢
         /// 绗簩涓弬鏁颁负杩炴帴鑺傜偣Code
         /// </summary>
         public event Action<HydroLinkInfo, string> BlinkLinkNodeEvent;
-
         /// <summary>
         /// 灞炴�у�兼敼鍙樹簨浠�
         /// </summary>
         public event Action<HydroVisualInfo> PropertyValueChangedEvent;
-
         /// <summary>
         /// 鏍囨敞灞炴�у�兼敼鍙樹簨浠�
         /// </summary>
         public event Action<HydroVisualInfo> MarkPropertyValueChangedEvent;
-
         /// <summary>
         /// 鍒嗙骇灞炴�у�兼敼鍙樹簨浠�
         /// </summary>
         public event Action<HydroVisualInfo> GradingPropertyValueChangedEvent;
+        /// <summary>
+        /// 娴佸悜灞炴�у�兼敼鍙樹簨浠�
+        /// </summary>
+        public event Action<HydroVisualInfo> FlowDirectionPropertyValueChangedEvent;
 
         private HydroChangeHelper _changeHelper = null;//鏀瑰彉杈呭姪绫�
         private HydroPropStatusHelper _propStatusHelper = null;//灞炴�х姸鎬佽緟鍔╃被
@@ -585,6 +588,11 @@
             this.GradingPropertyValueChangedEvent?.Invoke(vm?.Vmo);
         }
 
+        //娴佸悜灞炴�у彂鐢熸敼鍙�
+        private void HydroVisualPropertyCtrl1_FlowDirectionPropertyValueChangedEvent(HydroVisualViewModel obj)
+        {
+            this.FlowDirectionPropertyValueChangedEvent?.Invoke(obj?.Vmo);
+        }
 
         #endregion
 
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/02-bimface/SimulationBimfaceCtrl.cs b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/02-bimface/SimulationBimfaceCtrl.cs
index 96aac17..4b57754 100644
--- a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/02-bimface/SimulationBimfaceCtrl.cs
+++ b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/02-bimface/SimulationBimfaceCtrl.cs
@@ -441,14 +441,6 @@
         /// <summary>
         /// 鍔犺浇姘存祦鍔ㄧ敾
         /// </summary>
-        public async Task LoadFlowEffect(LogicFlowEffect obj)
-        {
-            await _bimfaceInteropContainer?.LoadFlowEffect(obj);
-        }
-
-        /// <summary>
-        /// 鍔犺浇姘存祦鍔ㄧ敾
-        /// </summary>
         public async Task LoadFlowEffect(List<LogicFlowEffect> obj)
         {
             await _bimfaceInteropContainer?.LoadFlowEffectList(obj);
@@ -463,27 +455,11 @@
         }
 
         /// <summary>
-        /// 鏇存柊姘存祦鍔ㄧ敾
-        /// </summary>
-        public async Task UpdateFlowEffectList(List<LogicFlowEffect> obj)
-        {
-            await _bimfaceInteropContainer?.UpdateFlowEffectList(obj);
-        }
-
-        /// <summary>
         /// 鍗歌浇姘存祦鍔ㄧ敾
         /// </summary>
         public async Task UnloadFlowEffect()
         {
             await _bimfaceInteropContainer?.UnloadFlowEffect();
-        }
-
-        /// <summary>
-        /// 閫氳繃Id鍗歌浇姘存祦鍔ㄧ敾
-        /// </summary>
-        public async Task UnloadFlowEffectById(string Id)
-        {
-            await _bimfaceInteropContainer?.UnloadFlowEffectById(Id);
         }
 
         #endregion
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/03-q3d/XhsProjectSimulationQ3dCtrl.Designer.cs b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/03-q3d/XhsProjectSimulationL3d2Ctrl.Designer.cs
similarity index 92%
rename from WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/03-q3d/XhsProjectSimulationQ3dCtrl.Designer.cs
rename to WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/03-q3d/XhsProjectSimulationL3d2Ctrl.Designer.cs
index 4c63f0b..3ab3711 100644
--- a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/03-q3d/XhsProjectSimulationQ3dCtrl.Designer.cs
+++ b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/03-q3d/XhsProjectSimulationL3d2Ctrl.Designer.cs
@@ -1,6 +1,6 @@
 锘縩amespace HStation.WinFrmUI
 {
-    partial class XhsProjectSimulationQ3dCtrl
+    partial class XhsProjectSimulationL3d2Ctrl
     {
         /// <summary> 
         /// Required designer variable.
@@ -28,7 +28,7 @@
         /// </summary>
         private void InitializeComponent()
         {
-            ComponentResourceManager resources = new ComponentResourceManager(typeof(XhsProjectSimulationQ3dCtrl));
+            ComponentResourceManager resources = new ComponentResourceManager(typeof(XhsProjectSimulationL3d2Ctrl));
             SuspendLayout();
             // 
             // XhsProjectHydroQ3dCtrl
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/03-q3d/XhsProjectSimulationL3d2Ctrl.cs b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/03-q3d/XhsProjectSimulationL3d2Ctrl.cs
new file mode 100644
index 0000000..6d4c1d1
--- /dev/null
+++ b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/03-q3d/XhsProjectSimulationL3d2Ctrl.cs
@@ -0,0 +1,66 @@
+锘縩amespace HStation.WinFrmUI
+{
+    public partial class XhsProjectSimulationL3d2Ctrl : DevExpress.XtraEditors.XtraUserControl
+    {
+        public XhsProjectSimulationL3d2Ctrl()
+        {
+            InitializeComponent();
+        }
+
+        /// <summary>
+        /// 閫夋嫨缁勪欢鏀瑰彉浜嬩欢
+        /// </summary>
+        public event Action<List<string>> SelectedPartersChangedEvent;
+
+        //鑾峰彇姘村姏淇℃伅鏂规硶
+        private Func<Yw.Model.HydroModelInfo> _hydroInfoFunc = null;
+
+        //鑾峰彇灞曠ず鍣�
+        private Yw.WinFrmUI.Hydro.ViewerL3d2 GetViewer()
+        {
+            if (_viewer == null)
+            {
+                _viewer = new Yw.WinFrmUI.Hydro.ViewerL3d2();
+                _viewer.Dock = DockStyle.Fill;
+                _viewer.SelectionChangedEvent += (visuals) =>
+                {
+                    var codes = visuals?.Select(x => x.Id).Distinct().ToList();
+                    this.SelectedPartersChangedEvent?.Invoke(codes);
+                };
+            }
+            return _viewer;
+        }
+        //Q3d缁樺埗鍣�
+        private Yw.WinFrmUI.Hydro.ViewerL3d2 _viewer = null;
+
+
+        /// <summary>
+        /// 鍒濆鍖栨暟鎹�
+        /// </summary>
+        public void InitialData(Func<Yw.Model.HydroModelInfo> hydroInfoFunc)
+        {
+            _hydroInfoFunc = hydroInfoFunc;
+            var viewer = GetViewer();
+            this.Controls.Clear();
+            this.Controls.Add(viewer);
+            LoadData();
+        }
+
+        //鍔犺浇鏁版嵁
+        private void LoadData()
+        {
+            var hydroInfo = _hydroInfoFunc?.Invoke();
+            if (hydroInfo == null)
+            {
+                return;
+            }
+            var network =HStation.WinFrmUI.HydroL3d2TransferHelper.ToL3d2NetworkViewModel(hydroInfo);
+            var viewer = GetViewer();
+            viewer.Initial(network);
+        }
+
+
+
+
+    }
+}
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/03-q3d/XhsProjectSimulationQ3dCtrl.resx b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/03-q3d/XhsProjectSimulationL3d2Ctrl.resx
similarity index 100%
rename from WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/03-q3d/XhsProjectSimulationQ3dCtrl.resx
rename to WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/03-q3d/XhsProjectSimulationL3d2Ctrl.resx
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/03-q3d/XhsProjectSimulationQ3dCtrl.cs b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/03-q3d/XhsProjectSimulationQ3dCtrl.cs
deleted file mode 100644
index 3a32150..0000000
--- a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/03-q3d/XhsProjectSimulationQ3dCtrl.cs
+++ /dev/null
@@ -1,66 +0,0 @@
-锘縩amespace HStation.WinFrmUI
-{
-    public partial class XhsProjectSimulationQ3dCtrl : DevExpress.XtraEditors.XtraUserControl
-    {
-        public XhsProjectSimulationQ3dCtrl()
-        {
-            InitializeComponent();
-        }
-
-        /// <summary>
-        /// 閫夋嫨缁勪欢鏀瑰彉浜嬩欢
-        /// </summary>
-        public event Action<List<string>> SelectedPartersChangedEvent;
-
-        //鑾峰彇姘村姏淇℃伅鏂规硶
-        private Func<Yw.Model.HydroModelInfo> _hydroInfoFunc = null;
-
-        //鑾峰彇缁樺埗鍣�
-        private Yw.WinFrmUI.Q3d.Drawer GetDrawer()
-        {
-            if (_drawer == null)
-            {
-                _drawer = new Yw.WinFrmUI.Q3d.Drawer();
-                _drawer.Dock = DockStyle.Fill;
-                _drawer.SelectedObjectsChanged += (sender, obj) =>
-                {
-                    var codes = obj?.Select(x => x.ID).Distinct().ToList();
-                    this.SelectedPartersChangedEvent?.Invoke(codes);
-                };
-            }
-            return _drawer;
-        }
-        //Q3d缁樺埗鍣�
-        private Yw.WinFrmUI.Q3d.Drawer _drawer = null;
-
-
-        /// <summary>
-        /// 鍒濆鍖栨暟鎹�
-        /// </summary>
-        public void InitialData(Func<Yw.Model.HydroModelInfo> hydroInfoFunc)
-        {
-            _hydroInfoFunc = hydroInfoFunc;
-            var drawer = GetDrawer();
-            this.Controls.Clear();
-            this.Controls.Add(drawer);
-            LoadData();
-        }
-
-        //鍔犺浇鏁版嵁
-        private void LoadData()
-        {
-            var hydroInfo = _hydroInfoFunc?.Invoke();
-            if (hydroInfo == null)
-            {
-                return;
-            }
-            var network = Yw.WinFrmUI.HydroQ3dTransferHelper.ToNetworkViewModel(hydroInfo);
-            var drawer = GetDrawer();
-            drawer.SetData(network);
-        }
-
-
-
-
-    }
-}
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/XhsProjectSimulationCorePage.Designer.cs b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/XhsProjectSimulationCorePage.Designer.cs
index a90e1d2..85f4c34 100644
--- a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/XhsProjectSimulationCorePage.Designer.cs
+++ b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/XhsProjectSimulationCorePage.Designer.cs
@@ -111,6 +111,7 @@
             controlContainerBottom = new DevExpress.XtraBars.Docking.ControlContainer();
             svgImg32 = new DevExpress.Utils.SvgImageCollection(components);
             rmSet = new DevExpress.XtraBars.Ribbon.RadialMenu(components);
+            barCkFlowEffect = new DevExpress.XtraBars.BarCheckItem();
             ((ISupportInitialize)ribbonControl1).BeginInit();
             ((ISupportInitialize)repositoryItemImageComboBox1).BeginInit();
             ((ISupportInitialize)repositoryItemRadioGroup1).BeginInit();
@@ -127,9 +128,9 @@
             // 
             ribbonControl1.ExpandCollapseItem.Id = 0;
             ribbonControl1.ItemPanelStyle = DevExpress.XtraBars.Ribbon.RibbonItemPanelStyle.Classic;
-            ribbonControl1.Items.AddRange(new DevExpress.XtraBars.BarItem[] { ribbonControl1.ExpandCollapseItem, barBtnCheck, barBtnCalcu, barBtnExportInp, barBtnSave, barBtnVisualList, barBtnSetList, barBtnSetPumpList, barBtnSetValveList, barBtnSetPipeList, barBtnSetElbowsList, barBtnSetThreelinkList, barBtnSetFourlinkList, barBtnSetTranslationList, barBtnSetExchangerList, barBtnSetJunctionList, barBtnPumpAnaly, barBtnSearch, barBtnSetGradingList, barBtnApplyGradingList, barBtnRefresh, barBtnSetMark, barBtnSetReservoirList, barBtnSetTankList, barBtnSetWaterboxList, barBtnSetBluntheadList, barBtnSetNozzleList, barBtnSetHydrantList, barBtnSetMeterList, barBtnSetCompressorList, barBtnSetFlowmeterList, barBtnSetPressmeterList, barCkMonitorVisible, barCkMark, barCkGrading, barCkCalcu, barBtnWorkingLossCurve, barBtnWorkingLossStatistics, barBtnEnergyAnaly, barBtnWorkingAnaly, barBtnPumpParallel, barBtnAccuracy, barBtnSetVisualVisible, barCkDecorator, barBtnAddWorking, barBtnPumpCurve, barBtnEditScheme, barBtnDeleteScheme, barBtnExportWord, barBtnWorkingMonitorAnaly, barBtnSetCoolingList, barBtnSetMonitorList, barBtnSetMonitorValueList, barBtnMgrWorking, barToggleSwitchPress, barBtnEvaluation });
+            ribbonControl1.Items.AddRange(new DevExpress.XtraBars.BarItem[] { ribbonControl1.ExpandCollapseItem, barBtnCheck, barBtnCalcu, barBtnExportInp, barBtnSave, barBtnVisualList, barBtnSetList, barBtnSetPumpList, barBtnSetValveList, barBtnSetPipeList, barBtnSetElbowsList, barBtnSetThreelinkList, barBtnSetFourlinkList, barBtnSetTranslationList, barBtnSetExchangerList, barBtnSetJunctionList, barBtnPumpAnaly, barBtnSearch, barBtnSetGradingList, barBtnApplyGradingList, barBtnRefresh, barBtnSetMark, barBtnSetReservoirList, barBtnSetTankList, barBtnSetWaterboxList, barBtnSetBluntheadList, barBtnSetNozzleList, barBtnSetHydrantList, barBtnSetMeterList, barBtnSetCompressorList, barBtnSetFlowmeterList, barBtnSetPressmeterList, barCkMonitorVisible, barCkMark, barCkGrading, barCkCalcu, barBtnWorkingLossCurve, barBtnWorkingLossStatistics, barBtnEnergyAnaly, barBtnWorkingAnaly, barBtnPumpParallel, barBtnAccuracy, barBtnSetVisualVisible, barCkDecorator, barBtnAddWorking, barBtnPumpCurve, barBtnEditScheme, barBtnDeleteScheme, barBtnExportWord, barBtnWorkingMonitorAnaly, barBtnSetCoolingList, barBtnSetMonitorList, barBtnSetMonitorValueList, barBtnMgrWorking, barToggleSwitchPress, barBtnEvaluation, barCkFlowEffect });
             ribbonControl1.Location = new Point(0, 0);
-            ribbonControl1.MaxItemId = 97;
+            ribbonControl1.MaxItemId = 98;
             ribbonControl1.Name = "ribbonControl1";
             ribbonControl1.Pages.AddRange(new DevExpress.XtraBars.Ribbon.RibbonPage[] { ribbonPage1 });
             ribbonControl1.RepositoryItems.AddRange(new DevExpress.XtraEditors.Repository.RepositoryItem[] { repositoryItemImageComboBox1, repositoryItemRadioGroup1 });
@@ -615,6 +616,7 @@
             ribbonPageGroup6.ItemLinks.Add(barBtnSetMark);
             ribbonPageGroup6.ItemLinks.Add(barCkMark);
             ribbonPageGroup6.ItemLinks.Add(barCkCalcu);
+            ribbonPageGroup6.ItemLinks.Add(barCkFlowEffect);
             ribbonPageGroup6.Name = "ribbonPageGroup6";
             ribbonPageGroup6.Text = "鏍囨敞";
             // 
@@ -798,6 +800,14 @@
             rmSet.Ribbon = ribbonControl1;
             rmSet.BeforePopup += rmSet_BeforePopup;
             // 
+            // barCkFlowEffect
+            // 
+            barCkFlowEffect.Caption = "娴佸悜";
+            barCkFlowEffect.CheckBoxVisibility = DevExpress.XtraBars.CheckBoxVisibility.BeforeText;
+            barCkFlowEffect.Id = 97;
+            barCkFlowEffect.Name = "barCkFlowEffect";
+            barCkFlowEffect.CheckedChanged += barCkFlowEffect_CheckedChanged;
+            // 
             // XhsProjectSimulationCorePage
             // 
             Appearance.BackColor = SystemColors.Control;
@@ -906,5 +916,6 @@
         private DevExpress.XtraEditors.Repository.RepositoryItemRadioGroup repositoryItemRadioGroup1;
         private DevExpress.XtraBars.BarToggleSwitchItem barToggleSwitchPress;
         private DevExpress.XtraBars.BarButtonItem barBtnEvaluation;
+        private DevExpress.XtraBars.BarCheckItem barCkFlowEffect;
     }
 }
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/XhsProjectSimulationCorePage.cs b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/XhsProjectSimulationCorePage.cs
index 1101784..a86a496 100644
--- a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/XhsProjectSimulationCorePage.cs
+++ b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/XhsProjectSimulationCorePage.cs
@@ -6,6 +6,7 @@
 using Yw.Hydro;
 using Yw.Model;
 using Yw.Vmo;
+using Yw.WinFrmUI.Bimface;
 
 namespace HStation.WinFrmUI
 {
@@ -115,7 +116,7 @@
         {
             base.InitialDataSource();
             ShowBimfaceCtrl();
-            ShowQ3dCtrl();
+            ShowL3d2Ctrl();
             ShowPropertyCtrl();
             InitialSvgImages();
         }
@@ -365,42 +366,42 @@
 
         #endregion BIM鎺т欢
 
-        #region Q3d鎺т欢
+        #region L3d2鎺т欢
 
-        //Q3d 鎺т欢
-        private XhsProjectSimulationQ3dCtrl _q3dCtrl = null;
+        //L3d2鎺т欢
+        private XhsProjectSimulationL3d2Ctrl _l3d2ctrl = null;
 
-        //鑾峰彇 Q3d 鎺т欢
-        private XhsProjectSimulationQ3dCtrl GetQ3dCtrl()
+        //鑾峰彇L3d2鎺т欢
+        private XhsProjectSimulationL3d2Ctrl GetL3d2Ctrl()
         {
             if (_hydroInfo == null)
             {
                 return default;
             }
-            if (_q3dCtrl == null)
+            if (_l3d2ctrl == null)
             {
-                _q3dCtrl = new XhsProjectSimulationQ3dCtrl();
-                _q3dCtrl.Dock = DockStyle.Fill;
-                _q3dCtrl.InitialData(() => _hydroInfo);
-                _q3dCtrl.SelectedPartersChangedEvent += (codes) =>
+                _l3d2ctrl = new XhsProjectSimulationL3d2Ctrl();
+                _l3d2ctrl.Dock = DockStyle.Fill;
+                _l3d2ctrl.InitialData(hydroInfoFunc: () => _hydroInfo);
+                _l3d2ctrl.SelectedPartersChangedEvent += (codes) =>
                 {
                     var visualListHelper = GetVisualListHelper();
                     var visuals = visualListHelper.GetVisualList(codes);
                     SelectVisual(visuals?.LastOrDefault(), eSimulationVisualSource.Q3d);
                 };
             }
-            return _q3dCtrl;
+            return _l3d2ctrl;
         }
 
-        //鏄剧ず Q3d 鎺т欢
-        private void ShowQ3dCtrl()
+        //鏄剧ずL3d2鎺т欢
+        private void ShowL3d2Ctrl()
         {
-            var q3dCtrl = GetQ3dCtrl();
+            var l3d2Ctrl = GetL3d2Ctrl();
             this.tabPageQ3d.Controls.Clear();
-            this.tabPageQ3d.Controls.Add(q3dCtrl);
+            this.tabPageQ3d.Controls.Add(l3d2Ctrl);
         }
 
-        #endregion Q3d鎺т欢
+        #endregion
 
         #region 灞炴�ф帶浠�
 
@@ -488,6 +489,13 @@
                     var gradingHelper = await GetGradingHelper();
                     gradingHelper.Set(visual);
                 };
+                _propertyCtrl.FlowDirectionPropertyValueChangedEvent += async (visual) =>
+                {
+                    //娴佸悜灞炴�у彂鐢熸敼鍙�
+                    //鍒ゆ柇褰撳墠鏄惁鏈夋祦鍚戝睍绀猴紝鑻ユ湁鍒欐洿鏂版祦鍚戯紝鏈�濂芥槸鏇存柊鍗曚釜娴佸悜
+                    var flowDirectionHelper = await GetFlowEffectHelper();
+                    flowDirectionHelper.Set(visual);
+                };
             }
             return _propertyCtrl;
         }
@@ -512,7 +520,7 @@
         }
 
         //鏄剧ず灞炴�ф帶浠�
-        private async void ShowPropertyCtrl()
+        private async Task ShowPropertyCtrl()
         {
             if (IsPropertyCtrlVisible)
             {
@@ -527,9 +535,9 @@
         }
 
         //璁剧疆灞炴�ф帶浠�
-        private void SetPropertyCtrl(HydroVisualInfo visual)
+        private async void SetPropertyCtrl(HydroVisualInfo visual)
         {
-            ShowPropertyCtrl();
+            await ShowPropertyCtrl();
             var visualVmListHelper = GetVisualVmListHelper();
             var vm = visualVmListHelper.GetVisual(visual);
             _propertyCtrl.SelectedObject = vm;
@@ -542,7 +550,7 @@
             _propertyCtrl?.UpdateRows();
         }
 
-        #endregion 灞炴�ф帶浠�
+        #endregion
 
         #region 閫夋嫨鏋勪欢
 
@@ -1761,7 +1769,42 @@
             markHelper.Set();
         }
 
-        #endregion 妯″瀷鏍囨敞
+        #endregion
+
+        #region 姘存祦鍔ㄧ敾
+
+
+        //姘村姏鍔ㄧ敾杈呭姪绫�
+        private SimulationFlowEffectHelper _flowEffectHelper = null;
+
+        //鑾峰彇姘存祦鍔ㄧ敾杈呭姪绫�
+        private async Task<SimulationFlowEffectHelper> GetFlowEffectHelper()
+        {
+            if (_flowEffectHelper == null)
+            {
+                var visualListHelper = GetVisualListHelper();
+                var calcuResultHelper = GetCalcuResultHelper();
+                var bimfaceCtrl = await GetBimfaceCtrl();
+                _flowEffectHelper = new SimulationFlowEffectHelper(visualListHelper, calcuResultHelper, bimfaceCtrl);
+            }
+            return _flowEffectHelper;
+        }
+
+
+        //姘存祦鍔ㄧ敾鏄惁鍙
+        private async void barCkFlowEffect_CheckedChanged(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
+        {
+            if (this.barCkFlowEffect.Checked)
+            {
+                this.barCkGrading.Checked = false;
+            }
+            var flowEffectHelper = await GetFlowEffectHelper();
+            flowEffectHelper.Visible = this.barCkFlowEffect.Checked;
+            flowEffectHelper.Set();
+
+        }
+
+        #endregion
 
         #region 棰滆壊鍒嗙骇
 
@@ -1838,6 +1881,10 @@
         //棰滆壊鍒嗙骇灞曠ず
         private async void barCkGrading_CheckedChanged(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
         {
+            if (this.barCkGrading.Checked)
+            {
+                this.barCkFlowEffect.Checked = false;
+            }
             var gradingHelper = await GetGradingHelper();
             gradingHelper.Visible = this.barCkGrading.Checked;
             gradingHelper.Set();
@@ -3466,5 +3513,7 @@
         }
 
         #endregion 鏂规绠$悊
+
+
     }
 }
\ No newline at end of file
diff --git a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/XhsProjectSimulationCorePage.resx b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/XhsProjectSimulationCorePage.resx
index 6c67036..8c0dd41 100644
--- a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/XhsProjectSimulationCorePage.resx
+++ b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/XhsProjectSimulationCorePage.resx
@@ -1,7 +1,7 @@
 锘�<?xml version="1.0" encoding="utf-8"?>
 <root>
   <!--
-    Microsoft ResX Schema 
+    Microsoft ResX Schema
 
     Version 2.0
 
@@ -48,7 +48,7 @@
     value   : The object must be serialized with
             : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
             : and then encoded with base64 encoding.
-    
+
     mimetype: application/x-microsoft.net.object.soap.base64
     value   : The object must be serialized with
             : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
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 15923e8..a0d40dc 100644
--- a/WinFrmUI/HStation.WinFrmUI.Xhs.Core/HStation.WinFrmUI.Xhs.Core.csproj
+++ b/WinFrmUI/HStation.WinFrmUI.Xhs.Core/HStation.WinFrmUI.Xhs.Core.csproj
@@ -182,10 +182,12 @@
 		<Compile Update="02-project\01-import\04-completed\02-bimface\XhsProjectResultBimfaceCtrl.cs" />
 		<Compile Update="02-project\01-import\04-completed\03-hydro\XhsProjectResultHydroCtrl.cs" />
 		<Compile Update="02-project\01-import\04-completed\01-info\XhsProjectResultInfoCtrl.cs" />
-		<Compile Update="02-project\04-q3d\XhsProjectQ3dViewPage.cs" />
 		<Compile Update="02-project\05-add\AddXhsProjectDlg.cs" />
 		<Compile Update="02-project\08-view\ViewXhsProjectDlg.cs" />
 		<Compile Update="02-project\06-edit\EditXhsProjectDlg.cs" />
+		<Compile Update="03-simulation\03-q3d\XhsProjectSimulationL3d2Ctrl.cs">
+		  <SubType>UserControl</SubType>
+		</Compile>
 		<Compile Update="03-simulation\04-scheme\02-change\00-core\CreateXhsSchemeBimfaceCtrl.cs">
 		  <SubType>UserControl</SubType>
 		</Compile>
@@ -370,7 +372,6 @@
 		<Compile Update="03-simulation\01-info\XhsProjectSimulationProjectInfoCtrl.cs" />
 		<Compile Update="03-simulation\01-info\XhsProjectSimulationBimfaceInfoCtrl.cs" />
 		<Compile Update="03-simulation\01-info\XhsProjectSimulationInfoPage.cs" />
-		<Compile Update="03-simulation\03-q3d\XhsProjectSimulationQ3dCtrl.cs" />
 		<Compile Update="03-simulation\11-pump\05-edit\SimulationPumpCurveEditDlg.cs">
 		  <SubType>Form</SubType>
 		</Compile>
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 b892d70..19952c1 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
@@ -58,7 +58,7 @@
     <Compile Update="02-project\03-mgr\XhsProjectMgrPage.cs">
       <SubType>UserControl</SubType>
     </Compile>
-    <Compile Update="02-project\04-q3d\XhsProjectQ3dViewPage.cs">
+    <Compile Update="02-project\04-l3d2\XhsProjectL3d2ViewPage.cs">
       <SubType>UserControl</SubType>
     </Compile>
     <Compile Update="02-project\05-add\AddXhsProjectDlg.cs">
@@ -89,9 +89,6 @@
       <SubType>UserControl</SubType>
     </Compile>
     <Compile Update="03-simulation\02-bimface\SimulationBimfaceCtrl.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Update="03-simulation\03-q3d\XhsProjectSimulationQ3dCtrl.cs">
       <SubType>UserControl</SubType>
     </Compile>
     <Compile Update="03-simulation\04-scheme\00-core\CreateXhsSchemeDlg.cs">
diff --git a/WinFrmUI/Yw.WinFrmUI.Bimface.Core/00-core/05-logic-flow/LogicFlowEffect.cs b/WinFrmUI/Yw.WinFrmUI.Bimface.Core/00-core/05-logic-flow-effect/LogicFlowEffect.cs
similarity index 100%
rename from WinFrmUI/Yw.WinFrmUI.Bimface.Core/00-core/05-logic-flow/LogicFlowEffect.cs
rename to WinFrmUI/Yw.WinFrmUI.Bimface.Core/00-core/05-logic-flow-effect/LogicFlowEffect.cs
diff --git a/WinFrmUI/Yw.WinFrmUI.Bimface.Core/01-interop/01-interop3d/BimfaceInterop3dContainer.cs b/WinFrmUI/Yw.WinFrmUI.Bimface.Core/01-interop/01-interop3d/BimfaceInterop3dContainer.cs
index f235371..8518f64 100644
--- a/WinFrmUI/Yw.WinFrmUI.Bimface.Core/01-interop/01-interop3d/BimfaceInterop3dContainer.cs
+++ b/WinFrmUI/Yw.WinFrmUI.Bimface.Core/01-interop/01-interop3d/BimfaceInterop3dContainer.cs
@@ -503,6 +503,10 @@
             {
                 return;
             }
+            if (obj == null)
+            {
+                return;
+            }
             await this.webViewControl1.EvaluateScriptAsync("loadFlowEffect", obj);
         }
 
@@ -515,7 +519,12 @@
             {
                 return;
             }
-            await this.webViewControl1.EvaluateScriptAsync("loadFlowEffectList", obj);
+            var list = obj?.Where(x => x != null).ToList();
+            if (list == null || list.Count < 1)
+            {
+                return;
+            }
+            await this.webViewControl1.EvaluateScriptAsync("loadFlowEffectList", list);
         }
 
         /// <summary>
@@ -524,6 +533,10 @@
         public async Task UpdateFlowEffect(LogicFlowEffect obj)
         {
             if (!_isViewInitialized)
+            {
+                return;
+            }
+            if (obj == null)
             {
                 return;
             }
@@ -539,7 +552,12 @@
             {
                 return;
             }
-            await this.webViewControl1.EvaluateScriptAsync("updateFlowEffectList", obj);
+            var list = obj?.Where(x => x != null).ToList();
+            if (list == null || list.Count < 1)
+            {
+                return;
+            }
+            await this.webViewControl1.EvaluateScriptAsync("updateFlowEffectList", list);
         }
 
         /// <summary>
diff --git a/WinFrmUI/Yw.WinFrmUI.Bimface.Core/bimface/js/LogicFlowEffect.js b/WinFrmUI/Yw.WinFrmUI.Bimface.Core/bimface/js/LogicFlowEffect.js
index fd4021f..2150699 100644
--- a/WinFrmUI/Yw.WinFrmUI.Bimface.Core/bimface/js/LogicFlowEffect.js
+++ b/WinFrmUI/Yw.WinFrmUI.Bimface.Core/bimface/js/LogicFlowEffect.js
@@ -1,18 +1,8 @@
-锘�
-let _flowAnimationContainer;//姘存祦鍔ㄧ敾瀹瑰櫒
-let _flowImgSrc = "https://static.bimface.com/attach/34d0d3aeb2e348aea5f3203b760ca667_flow5.png";//姘存祦鏉愯川鍥剧墖
+锘縧et _flowImgSrc = "https://static.bimface.com/attach/34d0d3aeb2e348aea5f3203b760ca667_flow5.png";//姘存祦鏉愯川鍥剧墖
 let _flowImgLocal = _base64_flow_effect.FlowEffect;//鏈湴姘存祦鏉愯川鍥剧墖,娴嬭瘯娌℃湁閫氳繃
 let _flowEffectList = new Set();//姘存祦鍔ㄧ敾鍒楄〃
+let _flowMaterialContainer;//姘存祦鏉愯川瀹瑰櫒
 
-
-//鍔犺浇姘存祦鍔ㄧ敾
-function loadFlowEffect(item) {
-    unloadFlowEffect();
-    let flowMaterial = createFlowMaterial(item);
-    let flowEffect = createFlowEffect(flowMaterial, item);
-    flowEffect.play();
-    renderFlowEffect();
-}
 
 //鍔犺浇姘存祦鍔ㄧ敾鍒楄〃
 function loadFlowEffectList(data) {
@@ -23,7 +13,28 @@
             createFlowEffect(flowMaterial, x);
         });
         playFlowEffect();
-        renderFlowEffect();
+    }
+}
+
+//鍔犺浇姘存祦鍔ㄧ敾
+function loadFlowEffect(item) {
+    unloadFlowEffect();
+    let flowMaterial = createFlowMaterial(item);
+    var flowEffect = createFlowEffect(flowMaterial, x);
+    flowEffect.play();
+}
+
+//鏇存柊姘存祦鍔ㄧ敾鍒楄〃
+function updateFlowEffectList(data) {
+    if (data != null && data.length > 0) {
+        if (_flowEffectList.size > 0) {
+            let flowEffectId = getFlowEffectId(item.id);
+            _flowEffectList.forEach(x => {
+                if (x.getId() == flowEffectId) {
+                    x.setSpeed([item.speedx, item.speedy]);
+                }
+            });
+        }
     }
 }
 
@@ -39,12 +50,19 @@
     }
 }
 
-//鏇存柊姘存祦鍔ㄧ敾鍒楄〃
-function updateFlowEffectList(data) {
-    if (data != null && data.length > 0) {
-        data.forEach(x => {
-            updateFlowEffect(x);
-        });
+//鍗歌浇姘存祦鍔ㄧ敾
+function unloadFlowEffect() {
+    if (_flowEffectList.size > 0) {
+        _flowEffectList.forEach(x => x.stop());
+        _flowEffectList.clear();
+        if (_flowMaterialContainer != null) {
+            let allMaterialList = _flowMaterialContainer.getAllMaterials();
+            if (allMaterialList != null && allMaterialList.length > 0) {
+                allMaterialList.forEach(x => {
+                    x.clearOverrideComponentsMaterial();
+                });
+            }
+        }
     }
 }
 
@@ -59,57 +77,17 @@
             }
         });
         if (flowEffect != null) {
+            flowEffect.stop();
             _flowEffectList.delete(flowEffect);
-            let flowMaterialId = getFlowMaterialId(id);
-            initialFlowAnimationContainer();
-            let flowMaterial = _flowAnimationContainer.getMaterialById(flowMaterialId)
-            if (flowMaterial != null) {
-                flowMaterial.clearOverrideComponentsMaterial();
-                _flowAnimationContainer.removeMaterialById(flowMaterialId)
+            if (_flowMaterialContainer != null) {
+                let flowMaterialId = getFlowMaterialId(id);
+                let flowMaterial = _flowMaterialContainer.getMaterialById(flowMaterialId)
+                if (flowMaterial != null) {
+                    flowMaterial.clearOverrideComponentsMaterial();
+                }
             }
         }
     }
-}
-
-//鍗歌浇姘存祦鍔ㄧ敾
-function unloadFlowEffect() {
-    if (_flowEffectList.size > 0) {
-        _flowEffectList.clear();
-        initialFlowAnimationContainer();
-        let allMaterialList = _flowAnimationContainer.getAllMaterials();
-        if (allMaterialList != null && allMaterialList.length > 0) {
-            allMaterialList.forEach(x => {
-                x.clearOverrideComponentsMaterial();
-            });
-        }
-        _flowAnimationContainer.clear();
-    }
-}
-
-//鍒濆鍖栨按娴佸姩鐢诲鍣�
-function initialFlowAnimationContainer() {
-    if (_flowAnimationContainer == null) {
-        // 鏋勯�犳按娴佹潗璐ㄥ鍣�
-        _flowAnimationContainer = new Glodon.Bimface.Plugins.Material.MaterialContainer();
-    }
-}
-
-//鍒涘缓姘存祦鏉愯川
-function createFlowMaterial(item) {
-    initialFlowAnimationContainer();
-    // 鏋勯�犳潗璐ㄩ厤缃� 
-    let flowMaterialConfig = new Glodon.Bimface.Plugins.Material.MaterialConfig();
-    flowMaterialConfig.viewer = _viewer;
-    flowMaterialConfig.src = _flowImgLocal;
-    flowMaterialConfig.rotation = item.rotation;
-    flowMaterialConfig.offset = [0, 0];
-    flowMaterialConfig.scale = [0.1524, 0.1524];
-    flowMaterialConfig.id = getFlowMaterialId(item.id);
-    // 鏋勯�犳潗璐ㄥ璞� 
-    let flowMaterial = new Glodon.Bimface.Plugins.Material.Material(flowMaterialConfig);
-    _flowAnimationContainer.addMaterial(flowMaterial);
-    flowMaterial.overrideComponentsMaterialById([item.id]);//鏁扮粍
-    return flowMaterial;
 }
 
 //鍒涘缓姘存祦鍔ㄧ敾
@@ -126,6 +104,37 @@
     return flowEffect;
 }
 
+//鍒涘缓姘存祦鏉愯川
+function createFlowMaterial(item) {
+    //鍒濆鍖栨按娴佹潗璐ㄥ鍣�
+    initialFlowMaterialContainer();
+    var flowMaterialId = getFlowMaterialId(item.id);
+    let flowMaterial = _flowMaterialContainer.getMaterialById(flowMaterialId);
+    if (flowMaterial == null) {
+        // 鏋勯�犳潗璐ㄩ厤缃� 
+        let flowMaterialConfig = new Glodon.Bimface.Plugins.Material.MaterialConfig();
+        flowMaterialConfig.viewer = _viewer;
+        flowMaterialConfig.src = _flowImgLocal;
+        flowMaterialConfig.rotation = item.rotation;
+        flowMaterialConfig.offset = [0, 0];
+        flowMaterialConfig.scale = [0.1524, 0.1524];
+        flowMaterialConfig.id = flowMaterialId;
+        // 鏋勯�犳潗璐ㄥ璞� 
+        flowMaterial = new Glodon.Bimface.Plugins.Material.Material(flowMaterialConfig);
+        _flowMaterialContainer.addMaterial(flowMaterial);
+    }
+    flowMaterial.overrideComponentsMaterialById([item.id]);//鏁扮粍
+    return flowMaterial;
+}
+
+//鍒濆鍖栨按娴佹潗璐ㄥ鍣�
+function initialFlowMaterialContainer() {
+    if (_flowMaterialContainer == null) {
+        // 鏋勯�犳按娴佹潗璐ㄥ鍣�
+        _flowMaterialContainer = new Glodon.Bimface.Plugins.Material.MaterialContainer();
+    }
+}
+
 //鑾峰彇姘存祦鍔ㄧ敾id
 function getFlowEffectId(id) {
     return "flow-effect-" + id;
diff --git a/WinFrmUI/Yw.WinFrmUI.Core/06-document/DocumentPage.cs b/WinFrmUI/Yw.WinFrmUI.Core/06-document/DocumentPage.cs
index 4819a17..7a1ed8d 100644
--- a/WinFrmUI/Yw.WinFrmUI.Core/06-document/DocumentPage.cs
+++ b/WinFrmUI/Yw.WinFrmUI.Core/06-document/DocumentPage.cs
@@ -117,11 +117,6 @@
         public event Action<PageGuid> ClosePageEvent;
 
         /// <summary>
-        /// 閲嶇疆鎵�鏈塒age浜嬩欢
-        /// </summary>
-        public event Action ResetAllPagesEvent;
-
-        /// <summary>
         /// 鍏抽棴page
         /// </summary>
         /// <param name="sguid"></param>
@@ -159,16 +154,12 @@
         /// </summary>
         public PageAuthHaveTree AuthTree { get; set; }
 
-        protected void ResetAllPages()
-        {
-            this.ResetAllPagesEvent?.Invoke();
-        }
-
         /// <summary>
         /// 鍒锋柊鏁版嵁
         /// </summary>
         public virtual void RefreshData()
         {
+
         }
 
         /// <summary>
@@ -199,6 +190,7 @@
         /// </summary>
         public virtual void RegistEvents()
         {
+
         }
 
         /// <summary>
@@ -206,6 +198,7 @@
         /// </summary>
         public virtual void UnRegistEvents()
         {
+
         }
     }
 }
\ No newline at end of file
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/02-transfer/HydroL2dTransferHelper.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/02-transfer/HydroL2dTransferHelper.cs
deleted file mode 100644
index 8d79183..0000000
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/02-transfer/HydroL2dTransferHelper.cs
+++ /dev/null
@@ -1,241 +0,0 @@
-锘�
-using Yw.WinFrmUI.HydroL2d;
-
-namespace Yw.WinFrmUI
-{
-    /// <summary>
-    /// 
-    /// </summary>
-    public static class HydroL2dTransferHelper
-    {
-        /// <summary>
-        /// 
-        /// </summary>
-        public static Network ToL2dNetworkViewModel(this Yw.Model.HydroModelInfo rhs)
-        {
-            if (rhs == null)
-            {
-                return default;
-            }
-            var vm = new Network();
-            if (rhs.Junctions != null && rhs.Junctions.Count > 0)
-            {
-                foreach (var junction in rhs.Junctions)
-                {
-                    var junctionViewModel = new Junction();
-                    junctionViewModel.Id = junction.Code;
-                    junctionViewModel.Name = junction.Name;
-                    junctionViewModel.Position = new PointF((float)junction.Position2d.X, (float)junction.Position2d.Y);
-                    vm.Append(junctionViewModel, out _);
-                }
-            }
-            if (rhs.Nozzles != null && rhs.Nozzles.Count > 0)
-            {
-                foreach (var nozzle in rhs.Nozzles)
-                {
-                    var nozzleViewModel = new Junction();
-                    nozzleViewModel.Id = nozzle.Code;
-                    nozzleViewModel.Name = nozzle.Name;
-                    nozzleViewModel.Position = new PointF((float)nozzle.Position2d.X, (float)nozzle.Position2d.Y);
-                    vm.Append(nozzleViewModel, out _);
-                }
-            }
-            if (rhs.Hydrants != null && rhs.Hydrants.Count > 0)
-            {
-                foreach (var hydrant in rhs.Hydrants)
-                {
-                    var hydrantViewModel = new Junction();
-                    hydrantViewModel.Id = hydrant.Code;
-                    hydrantViewModel.Name = hydrant.Name;
-                    hydrantViewModel.Position = new PointF((float)hydrant.Position2d.X, (float)hydrant.Position2d.Y);
-                    vm.Append(hydrantViewModel, out _);
-                }
-            }
-            if (rhs.Elbows != null && rhs.Elbows.Count > 0)
-            {
-                foreach (var elbow in rhs.Elbows)
-                {
-                    var elbowViewModel = new Junction();
-                    elbowViewModel.Id = elbow.Code;
-                    elbowViewModel.Name = elbow.Name;
-                    elbowViewModel.Position = new PointF((float)elbow.Position2d.X, (float)elbow.Position2d.Y);
-                    vm.Append(elbowViewModel, out _);
-                }
-            }
-            if (rhs.Threelinks != null && rhs.Threelinks.Count > 0)
-            {
-                foreach (var threelink in rhs.Threelinks)
-                {
-                    var threelinkViewModel = new Junction();
-                    threelinkViewModel.Id = threelink.Code;
-                    threelinkViewModel.Name = threelink.Name;
-                    threelinkViewModel.Position = new PointF((float)threelink.Position2d.X, (float)threelink.Position2d.Y);
-                    vm.Append(threelinkViewModel, out _);
-                }
-            }
-            if (rhs.Fourlinks != null && rhs.Fourlinks.Count > 0)
-            {
-                foreach (var fourlink in rhs.Fourlinks)
-                {
-                    var fourlinkViewModel = new Junction();
-                    fourlinkViewModel.Id = fourlink.Code;
-                    fourlinkViewModel.Name = fourlink.Name;
-                    fourlinkViewModel.Position = new PointF((float)fourlink.Position2d.X, (float)fourlink.Position2d.Y);
-                    vm.Append(fourlinkViewModel, out _);
-                }
-            }
-            if (rhs.Meters != null && rhs.Meters.Count > 0)
-            {
-                foreach (var meter in rhs.Meters)
-                {
-                    var meterViewModel = new Junction();
-                    meterViewModel.Id = meter.Code;
-                    meterViewModel.Name = meter.Name;
-                    meterViewModel.Position = new PointF((float)meter.Position2d.X, (float)meter.Position2d.Y);
-                    vm.Append(meterViewModel, out _);
-                }
-            }
-            if (rhs.Flowmeters != null && rhs.Flowmeters.Count > 0)
-            {
-                foreach (var flowmeter in rhs.Flowmeters)
-                {
-                    var flowmeterViewModel = new Junction();
-                    flowmeterViewModel.Id = flowmeter.Code;
-                    flowmeterViewModel.Name = flowmeter.Name;
-                    flowmeterViewModel.Position = new PointF((float)flowmeter.Position2d.X, (float)flowmeter.Position2d.Y);
-                    vm.Append(flowmeterViewModel, out _);
-                }
-            }
-            if (rhs.Pressmeters != null && rhs.Pressmeters.Count > 0)
-            {
-                foreach (var pressmeter in rhs.Pressmeters)
-                {
-                    var pressmeterViewModel = new Junction();
-                    pressmeterViewModel.Id = pressmeter.Code;
-                    pressmeterViewModel.Name = pressmeter.Name;
-                    pressmeterViewModel.Position = new PointF((float)pressmeter.Position2d.X, (float)pressmeter.Position2d.Y);
-                    vm.Append(pressmeterViewModel, out _);
-                }
-            }
-            if (rhs.Bluntheads != null && rhs.Bluntheads.Count > 0)
-            {
-                foreach (var blunthead in rhs.Bluntheads)
-                {
-                    var bluntheadViewModel = new Junction();
-                    bluntheadViewModel.Id = blunthead.Code;
-                    bluntheadViewModel.Name = blunthead.Name;
-                    bluntheadViewModel.Position = new PointF((float)blunthead.Position2d.X, (float)blunthead.Position2d.Y);
-                    vm.Append(bluntheadViewModel, out _);
-                }
-            }
-
-            if (rhs.Reservoirs != null && rhs.Reservoirs.Count > 0)
-            {
-                foreach (var reservoir in rhs.Reservoirs)
-                {
-                    var reservoirViewModel = new Reservoir();
-                    reservoirViewModel.Id = reservoir.Code;
-                    reservoirViewModel.Name = reservoir.Name;
-                    reservoirViewModel.Position = new PointF((float)reservoir.Position2d.X, (float)reservoir.Position2d.Y);
-                    vm.Append(reservoirViewModel, out _);
-                }
-            }
-            if (rhs.Tanks != null && rhs.Tanks.Count > 0)
-            {
-                foreach (var tank in rhs.Tanks)
-                {
-                    var tankViewModel = new Tank();
-                    tankViewModel.Id = tank.Code;
-                    tankViewModel.Name = tank.Name;
-                    tankViewModel.Position = new PointF((float)tank.Position2d.X, (float)tank.Position2d.Y);
-                    vm.Append(tankViewModel, out _);
-                }
-            }
-            if (rhs.Waterboxs != null && rhs.Waterboxs.Count > 0)
-            {
-                foreach (var waterbox in rhs.Waterboxs)
-                {
-                    var waterboxViewModel = new Tank();
-                    waterboxViewModel.Id = waterbox.Code;
-                    waterboxViewModel.Name = waterbox.Name;
-                    waterboxViewModel.Position = new PointF((float)waterbox.Position2d.X, (float)waterbox.Position2d.Y);
-                    vm.Append(waterboxViewModel, out _);
-                }
-            }
-
-            if (rhs.Pipes != null && rhs.Pipes.Count > 0)
-            {
-                foreach (var pipe in rhs.Pipes)
-                {
-                    var startNode = rhs.GetAllNodes().Find(x => x.Code == pipe.StartCode);
-                    var endNode = rhs.GetAllNodes().Find(x => x.Code == pipe.EndCode);
-                    var pipeViewModel = new Pipe();
-                    pipeViewModel.Id = pipe.Code;
-                    pipeViewModel.Name = pipe.Name;
-                    pipeViewModel.StartPosition = new PointF((float)startNode.Position2d.X, (float)startNode.Position2d.Y);
-                    pipeViewModel.EndPosition = new PointF((float)endNode.Position2d.X, (float)endNode.Position2d.Y);
-                    vm.Append(pipeViewModel, out _);
-                }
-            }
-            if (rhs.Translations != null && rhs.Translations.Count > 0)
-            {
-                foreach (var translation in rhs.Translations)
-                {
-                    var startNode = rhs.GetAllNodes().Find(x => x.Code == translation.StartCode);
-                    var endNode = rhs.GetAllNodes().Find(x => x.Code == translation.EndCode);
-                    var translationViewModel = new Pipe();
-                    translationViewModel.Id = translation.Code;
-                    translationViewModel.Name = translation.Name;
-                    translationViewModel.StartPosition = new PointF((float)startNode.Position2d.X, (float)startNode.Position2d.Y);
-                    translationViewModel.EndPosition = new PointF((float)endNode.Position2d.X, (float)endNode.Position2d.Y);
-                    vm.Append(translationViewModel, out _);
-                }
-            }
-            if (rhs.Exchangers != null && rhs.Exchangers.Count > 0)
-            {
-                foreach (var exchanger in rhs.Exchangers)
-                {
-                    var startNode = rhs.GetAllNodes().Find(x => x.Code == exchanger.StartCode);
-                    var endNode = rhs.GetAllNodes().Find(x => x.Code == exchanger.EndCode);
-                    var exchangerViewModel = new Pipe();
-                    exchangerViewModel.Id = exchanger.Code;
-                    exchangerViewModel.Name = exchanger.Name;
-                    exchangerViewModel.StartPosition = new PointF((float)startNode.Position2d.X, (float)startNode.Position2d.Y);
-                    exchangerViewModel.EndPosition = new PointF((float)endNode.Position2d.X, (float)endNode.Position2d.Y);
-                    vm.Append(exchangerViewModel, out _);
-                }
-            }
-
-            if (rhs.Pumps != null && rhs.Pumps.Count > 0)
-            {
-                foreach (var pump in rhs.Pumps)
-                {
-                    var startNode = rhs.GetAllNodes().Find(x => x.Code == pump.StartCode);
-                    var endNode = rhs.GetAllNodes().Find(x => x.Code == pump.EndCode);
-                    var pumpViewModel = new Yw.WinFrmUI.HydroL2d.Pump();
-                    pumpViewModel.Id = pump.Code;
-                    pumpViewModel.Name = pump.Name;
-                    pumpViewModel.StartPosition = new PointF((float)startNode.Position2d.X, (float)startNode.Position2d.Y);
-                    pumpViewModel.EndPosition = new PointF((float)endNode.Position2d.X, (float)endNode.Position2d.Y);
-                    vm.Append(pumpViewModel, out _);
-                }
-            }
-            if (rhs.Valves != null && rhs.Valves.Count > 0)
-            {
-                foreach (var valve in rhs.Valves)
-                {
-                    var startNode = rhs.GetAllNodes().Find(x => x.Code == valve.StartCode);
-                    var endNode = rhs.GetAllNodes().Find(x => x.Code == valve.EndCode);
-                    var valveViewModel = new Valve();
-                    valveViewModel.Id = valve.Code;
-                    valveViewModel.Name = valve.Name;
-                    valveViewModel.StartPosition = new PointF((float)startNode.Position2d.X, (float)startNode.Position2d.Y);
-                    valveViewModel.EndPosition = new PointF((float)endNode.Position2d.X, (float)endNode.Position2d.Y);
-                    vm.Append(valveViewModel, out _);
-                }
-            }
-
-            return vm;
-        }
-    }
-}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/02-transfer/HydroQ3dTransferHelper.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/02-transfer/HydroQ3dTransferHelper.cs
deleted file mode 100644
index 3d7d1ca..0000000
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/02-transfer/HydroQ3dTransferHelper.cs
+++ /dev/null
@@ -1,257 +0,0 @@
-锘縰sing Yw.WinFrmUI.Q3d;
-namespace Yw.WinFrmUI
-{
-    /// <summary>
-    /// Q3d杞崲杈呭姪绫�
-    /// </summary>
-    public static class HydroQ3dTransferHelper
-    {
-        /// <summary>
-        /// 
-        /// </summary>
-        public static NetworkViewModel ToNetworkViewModel(this Yw.Model.HydroModelInfo rhs)
-        {
-            if (rhs == null)
-            {
-                return default;
-            }
-            var vm = new NetworkViewModel();
-
-            if (rhs.Reservoirs != null && rhs.Reservoirs.Count > 0)
-            {
-                foreach (var reservoir in rhs.Reservoirs)
-                {
-                    var reservoirViewModel = new ReservoirViewModel();
-                    reservoirViewModel.ID = reservoir.Code;
-                    reservoirViewModel.Name = reservoir.Name;
-                    reservoirViewModel.Position3D = new PointF3D((float)reservoir.Position3d.X, (float)reservoir.Position3d.Y, (float)reservoir.Position3d.Z);
-                    vm.Nodes.Add(reservoirViewModel);
-                }
-            }
-            if (rhs.Tanks != null && rhs.Tanks.Count > 0)
-            {
-                foreach (var tank in rhs.Tanks)
-                {
-                    var tankViewModel = new TankViewModel();
-                    tankViewModel.ID = tank.Code;
-                    tankViewModel.Name = tank.Name;
-                    tankViewModel.Position3D = new PointF3D((float)tank.Position3d.X, (float)tank.Position3d.Y, (float)tank.Position3d.Z);
-                    vm.Nodes.Add(tankViewModel);
-                }
-            }
-            if (rhs.Waterboxs != null && rhs.Waterboxs.Count > 0)
-            {
-                foreach (var waterbox in rhs.Waterboxs)
-                {
-                    var waterboxViewModel = new TankViewModel();
-                    waterboxViewModel.ID = waterbox.Code;
-                    waterboxViewModel.Name = waterbox.Name;
-                    waterboxViewModel.Position3D = new PointF3D((float)waterbox.Position3d.X, (float)waterbox.Position3d.Y, (float)waterbox.Position3d.Z);
-                    vm.Nodes.Add(waterboxViewModel);
-                }
-            }
-            if (rhs.Junctions != null && rhs.Junctions.Count > 0)
-            {
-                foreach (var junction in rhs.Junctions)
-                {
-                    var junctionViewModel = new JunctionViewModel();
-                    junctionViewModel.ID = junction.Code;
-                    junctionViewModel.Name = junction.Name;
-                    junctionViewModel.Position3D = new PointF3D((float)junction.Position3d.X, (float)junction.Position3d.Y, (float)junction.Position3d.Z);
-                    vm.Nodes.Add(junctionViewModel);
-                }
-            }
-            if (rhs.Nozzles != null && rhs.Nozzles.Count > 0)
-            {
-                foreach (var nozzle in rhs.Nozzles)
-                {
-                    var nozzleViewModel = new NozzleViewModel();
-                    nozzleViewModel.ID = nozzle.Code;
-                    nozzleViewModel.Name = nozzle.Name;
-                    nozzleViewModel.Position3D = new PointF3D((float)nozzle.Position3d.X, (float)nozzle.Position3d.Y, (float)nozzle.Position3d.Z);
-                    vm.Nodes.Add(nozzleViewModel);
-                }
-            }
-            if (rhs.Hydrants != null && rhs.Hydrants.Count > 0)
-            {
-                foreach (var hydrant in rhs.Hydrants)
-                {
-                    var hydrantViewModel = new JunctionViewModel();
-                    hydrantViewModel.ID = hydrant.Code;
-                    hydrantViewModel.Name = hydrant.Name;
-                    hydrantViewModel.Position3D = new PointF3D((float)hydrant.Position3d.X, (float)hydrant.Position3d.Y, (float)hydrant.Position3d.Z);
-                    vm.Nodes.Add(hydrantViewModel);
-                }
-            }
-            if (rhs.Coolings != null && rhs.Coolings.Count > 0)
-            {
-                foreach (var cooling in rhs.Coolings)
-                {
-                    var coolingViewModel = new JunctionViewModel();
-                    coolingViewModel.ID = cooling.Code;
-                    coolingViewModel.Name = cooling.Name;
-                    coolingViewModel.Position3D = new PointF3D((float)cooling.Position3d.X, (float)cooling.Position3d.Y, (float)cooling.Position3d.Z);
-                    vm.Nodes.Add(coolingViewModel);
-                }
-            }
-            if (rhs.Bluntheads != null && rhs.Bluntheads.Count > 0)
-            {
-                foreach (var blunthead in rhs.Bluntheads)
-                {
-                    var bluntheadViewModel = new JunctionViewModel();
-                    bluntheadViewModel.ID = blunthead.Code;
-                    bluntheadViewModel.Name = blunthead.Name;
-                    bluntheadViewModel.Position3D = new PointF3D((float)blunthead.Position3d.X, (float)blunthead.Position3d.Y, (float)blunthead.Position3d.Z);
-                    vm.Nodes.Add(bluntheadViewModel);
-                }
-            }
-            if (rhs.Elbows != null && rhs.Elbows.Count > 0)
-            {
-                foreach (var elbow in rhs.Elbows)
-                {
-                    var elbowViewModel = new JunctionViewModel();
-                    elbowViewModel.ID = elbow.Code;
-                    elbowViewModel.Name = elbow.Name;
-                    elbowViewModel.Position3D = new PointF3D((float)elbow.Position3d.X, (float)elbow.Position3d.Y, (float)elbow.Position3d.Z);
-                    vm.Nodes.Add(elbowViewModel);
-                }
-            }
-            if (rhs.Threelinks != null && rhs.Threelinks.Count > 0)
-            {
-                foreach (var threelink in rhs.Threelinks)
-                {
-                    var threelinkViewModel = new JunctionViewModel();
-                    threelinkViewModel.ID = threelink.Code;
-                    threelinkViewModel.Name = threelink.Name;
-                    threelinkViewModel.Position3D = new PointF3D((float)threelink.Position3d.X, (float)threelink.Position3d.Y, (float)threelink.Position3d.Z);
-                    vm.Nodes.Add(threelinkViewModel);
-                }
-            }
-            if (rhs.Fourlinks != null && rhs.Fourlinks.Count > 0)
-            {
-                foreach (var fourlink in rhs.Fourlinks)
-                {
-                    var fourlinkViewModel = new JunctionViewModel();
-                    fourlinkViewModel.ID = fourlink.Code;
-                    fourlinkViewModel.Name = fourlink.Name;
-                    fourlinkViewModel.Position3D = new PointF3D((float)fourlink.Position3d.X, (float)fourlink.Position3d.Y, (float)fourlink.Position3d.Z);
-                    vm.Nodes.Add(fourlinkViewModel);
-                }
-            }
-            if (rhs.Meters != null && rhs.Meters.Count > 0)
-            {
-                foreach (var meter in rhs.Meters)
-                {
-                    var meterViewModel = new MeterViewModel();
-                    meterViewModel.ID = meter.Code;
-                    meterViewModel.Name = meter.Name;
-                    meterViewModel.Position3D = new PointF3D((float)meter.Position3d.X, (float)meter.Position3d.Y, (float)meter.Position3d.Z);
-                    vm.Nodes.Add(meterViewModel);
-                }
-            }
-            if (rhs.Flowmeters != null && rhs.Flowmeters.Count > 0)
-            {
-                foreach (var flowmeter in rhs.Flowmeters)
-                {
-                    var flowmeterViewModel = new JunctionViewModel();
-                    flowmeterViewModel.ID = flowmeter.Code;
-                    flowmeterViewModel.Name = flowmeter.Name;
-                    flowmeterViewModel.Position3D = new PointF3D((float)flowmeter.Position3d.X, (float)flowmeter.Position3d.Y, (float)flowmeter.Position3d.Z);
-                    vm.Nodes.Add(flowmeterViewModel);
-                }
-            }
-            if (rhs.Pressmeters != null && rhs.Pressmeters.Count > 0)
-            {
-                foreach (var pressmeter in rhs.Pressmeters)
-                {
-                    var pressmeterViewModel = new JunctionViewModel();
-                    pressmeterViewModel.ID = pressmeter.Code;
-                    pressmeterViewModel.Name = pressmeter.Name;
-                    pressmeterViewModel.Position3D = new PointF3D((float)pressmeter.Position3d.X, (float)pressmeter.Position3d.Y, (float)pressmeter.Position3d.Z);
-                    vm.Nodes.Add(pressmeterViewModel);
-                }
-            }
-
-            if (rhs.Pipes != null && rhs.Pipes.Count > 0)
-            {
-                foreach (var pipe in rhs.Pipes)
-                {
-                    var pipeViewModel = new PipeViewModel();
-                    pipeViewModel.ID = pipe.Code;
-                    pipeViewModel.Name = pipe.Name;
-                    pipeViewModel.StartNode = vm.Nodes.Find(x => x.ID == pipe.StartCode);
-                    pipeViewModel.EndNode = vm.Nodes.Find(x => x.ID == pipe.EndCode);
-                    vm.Links.Add(pipeViewModel);
-                }
-            }
-            if (rhs.Translations != null && rhs.Translations.Count > 0)
-            {
-                foreach (var translation in rhs.Translations)
-                {
-                    var translationViewModel = new PipeViewModel();
-                    translationViewModel.ID = translation.Code;
-                    translationViewModel.Name = translation.Name;
-                    translationViewModel.StartNode = vm.Nodes.Find(x => x.ID == translation.StartCode);
-                    translationViewModel.EndNode = vm.Nodes.Find(x => x.ID == translation.EndCode);
-                    vm.Links.Add(translationViewModel);
-                }
-            }
-
-            if (rhs.Pumps != null && rhs.Pumps.Count > 0)
-            {
-                foreach (var pump in rhs.Pumps)
-                {
-                    var pumpViewModel = new PumpViewModel();
-                    pumpViewModel.ID = pump.Code;
-                    pumpViewModel.Name = pump.Name;
-                    pumpViewModel.StartNode = vm.Nodes.Find(x => x.ID == pump.StartCode);
-                    pumpViewModel.EndNode = vm.Nodes.Find(x => x.ID == pump.EndCode);
-                    vm.Links.Add(pumpViewModel);
-                }
-            }
-            if (rhs.Valves != null && rhs.Valves.Count > 0)
-            {
-                foreach (var valve in rhs.Valves)
-                {
-                    var valveViewModel = new ValveViewModel();
-                    valveViewModel.ID = valve.Code;
-                    valveViewModel.Name = valve.Name;
-                    valveViewModel.StartNode = vm.Nodes.Find(x => x.ID == valve.StartCode);
-                    valveViewModel.EndNode = vm.Nodes.Find(x => x.ID == valve.EndCode);
-                    vm.Links.Add(valveViewModel);
-                }
-            }
-
-            if (rhs.Exchangers != null && rhs.Exchangers.Count > 0)
-            {
-                foreach (var exchanger in rhs.Exchangers)
-                {
-                    var exchangerViewModel = new PipeViewModel();
-                    exchangerViewModel.ID = exchanger.Code;
-                    exchangerViewModel.Name = exchanger.Name;
-                    exchangerViewModel.StartNode = vm.Nodes.Find(x => x.ID == exchanger.StartCode);
-                    exchangerViewModel.EndNode = vm.Nodes.Find(x => x.ID == exchanger.EndCode);
-                    vm.Links.Add(exchangerViewModel);
-                }
-            }
-            if (rhs.Compressors != null && rhs.Compressors.Count > 0)
-            {
-                foreach (var compressor in rhs.Compressors)
-                {
-                    var compresorViewModel = new PipeViewModel();
-                    compresorViewModel.ID = compressor.Code;
-                    compresorViewModel.Name = compressor.Name;
-                    compresorViewModel.StartNode = vm.Nodes.Find(x => x.ID == compressor.StartCode);
-                    compresorViewModel.EndNode = vm.Nodes.Find(x => x.ID == compressor.EndCode);
-                    vm.Links.Add(compresorViewModel);
-                }
-            }
-
-
-            return vm;
-        }
-
-
-
-    }
-}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/02-transfer/HydroW3dTransferHelper.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/02-transfer/HydroW3dTransferHelper.cs
deleted file mode 100644
index 189607c..0000000
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/02-transfer/HydroW3dTransferHelper.cs
+++ /dev/null
@@ -1,332 +0,0 @@
-锘縰sing Yw.WinFrmUI.HydroW3d;
-
-namespace Yw.WinFrmUI
-{
-    /// <summary>
-    /// W3d杞崲杈呭姪绫�
-    /// </summary>
-    public static class HydroW3dTransferHelper
-    {
-        /// <summary>
-        /// 
-        /// </summary>
-        public static NetworkViewModel ToW3dNetworkViewModel(this Yw.Model.HydroModelInfo model)
-        {
-            if (model == null)
-            {
-                return default;
-            }
-            var netWork = new NetworkViewModel();
-
-            #region 鑺傜偣
-
-            //姘村簱
-            if (model.Reservoirs != null && model.Reservoirs.Count > 0)
-            {
-                foreach (var reservoir in model.Reservoirs)
-                {
-                    var reservoirModel = new ReservoirViewModel();
-                    reservoirModel.Id = reservoir.Code;
-                    reservoirModel.Catalog = Catalog.Reservoir;
-                    reservoirModel.Name = reservoir.Name;
-                    reservoirModel.Position = new Point3d(reservoir.Position3d.X, reservoir.Position3d.Y, reservoir.Position3d.Z);
-                    netWork.Reservoirs.Add(reservoirModel);
-                }
-            }
-
-            //姘存睜
-            if (model.Tanks != null && model.Tanks.Count > 0)
-            {
-                foreach (var tank in model.Tanks)
-                {
-                    var tankModel = new TankViewModel();
-                    tankModel.Id = tank.Code;
-                    tankModel.Catalog = Catalog.Tank;
-                    tankModel.Name = tank.Name;
-                    tankModel.Position = new Point3d(tank.Position3d.X, tank.Position3d.Y, tank.Position3d.Z);
-                    netWork.Tanks.Add(tankModel);
-                }
-            }
-
-            //姘寸
-            if (model.Waterboxs != null && model.Waterboxs.Count > 0)
-            {
-                foreach (var waterbox in model.Waterboxs)
-                {
-                    var waterboxModel = new WaterboxViewModel();
-                    waterboxModel.Id = waterbox.Code;
-                    waterboxModel.Catalog = Catalog.Waterbox;
-                    waterboxModel.Name = waterbox.Name;
-                    waterboxModel.Position = new Point3d(waterbox.Position3d.X, waterbox.Position3d.Y, waterbox.Position3d.Z);
-                    netWork.Waterboxs.Add(waterboxModel);
-                }
-            }
-
-            //杩炴帴鑺傜偣
-            if (model.Junctions != null && model.Junctions.Count > 0)
-            {
-                foreach (var junction in model.Junctions)
-                {
-                    var junctionModel = new JunctionViewModel();
-                    junctionModel.Id = junction.Code;
-                    junctionModel.Catalog = Catalog.Junction;
-                    junctionModel.Name = junction.Name;
-                    junctionModel.Position = new Point3d(junction.Position3d.X, junction.Position3d.Y, junction.Position3d.Z);
-                    netWork.Junctions.Add(junctionModel);
-                }
-            }
-
-            //鍠峰槾
-            if (model.Nozzles != null && model.Nozzles.Count > 0)
-            {
-                foreach (var nozzle in model.Nozzles)
-                {
-                    var nozzleModel = new NozzleViewModel();
-                    nozzleModel.Id = nozzle.Code;
-                    nozzleModel.Catalog = Catalog.Nozzle;
-                    nozzleModel.Name = nozzle.Name;
-                    nozzleModel.Position = new Point3d(nozzle.Position3d.X, nozzle.Position3d.Y, nozzle.Position3d.Z);
-                    netWork.Nozzles.Add(nozzleModel);
-                }
-            }
-
-            //娑堢伀鏍�
-            if (model.Hydrants != null && model.Hydrants.Count > 0)
-            {
-                foreach (var hydrant in model.Hydrants)
-                {
-                    var hydrantModel = new HydrantViewModel();
-                    hydrantModel.Id = hydrant.Code;
-                    hydrantModel.Catalog = Catalog.Hydrant;
-                    hydrantModel.Name = hydrant.Name;
-                    hydrantModel.Position = new Point3d(hydrant.Position3d.X, hydrant.Position3d.Y, hydrant.Position3d.Z);
-                    netWork.Hydrants.Add(hydrantModel);
-                }
-            }
-
-            //闂峰ご
-            if (model.Bluntheads != null && model.Bluntheads.Count > 0)
-            {
-                foreach (var blunthead in model.Bluntheads)
-                {
-                    var bluntheadModel = new BluntheadViewModel();
-                    bluntheadModel.Id = blunthead.Code;
-                    bluntheadModel.Catalog = Catalog.Blunthead;
-                    bluntheadModel.Name = blunthead.Name;
-                    bluntheadModel.Position = new Point3d(blunthead.Position3d.X, blunthead.Position3d.Y, blunthead.Position3d.Z);
-                    netWork.Bluntheads.Add(bluntheadModel);
-                }
-            }
-
-            //寮ご
-            if (model.Elbows != null && model.Elbows.Count > 0)
-            {
-                foreach (var elbow in model.Elbows)
-                {
-                    var elbowModel = new ElbowViewModel();
-                    elbowModel.Id = elbow.Code;
-                    elbowModel.Catalog = Catalog.Elbow;
-                    elbowModel.Name = elbow.Name;
-                    elbowModel.Position = new Point3d(elbow.Position3d.X, elbow.Position3d.Y, elbow.Position3d.Z);
-                    netWork.Elbows.Add(elbowModel);
-                }
-            }
-
-            //涓夐��
-            if (model.Threelinks != null && model.Threelinks.Count > 0)
-            {
-                foreach (var threelink in model.Threelinks)
-                {
-                    var threelinkModel = new ThreelinkViewModel();
-                    threelinkModel.Id = threelink.Code;
-                    threelinkModel.Catalog = Catalog.Threelink;
-                    threelinkModel.Name = threelink.Name;
-                    threelinkModel.Position = new Point3d(threelink.Position3d.X, threelink.Position3d.Y, threelink.Position3d.Z);
-                    netWork.Threelinks.Add(threelinkModel);
-                }
-            }
-
-            //鍥涢��
-            if (model.Fourlinks != null && model.Fourlinks.Count > 0)
-            {
-                foreach (var fourlink in model.Fourlinks)
-                {
-                    var fourlinkModel = new FourlinkViewModel();
-                    fourlinkModel.Id = fourlink.Code;
-                    fourlinkModel.Catalog = Catalog.Fourlink;
-                    fourlinkModel.Name = fourlink.Name;
-                    fourlinkModel.Position = new Point3d(fourlink.Position3d.X, fourlink.Position3d.Y, fourlink.Position3d.Z);
-                    netWork.Fourlinks.Add(fourlinkModel);
-                }
-            }
-
-            //姘磋〃
-            if (model.Meters != null && model.Meters.Count > 0)
-            {
-                foreach (var meter in model.Meters)
-                {
-                    var meterModel = new MeterViewModel();
-                    meterModel.Id = meter.Code;
-                    meterModel.Catalog = Catalog.Meter;
-                    meterModel.Name = meter.Name;
-                    meterModel.Position = new Point3d(meter.Position3d.X, meter.Position3d.Y, meter.Position3d.Z);
-                    netWork.Meters.Add(meterModel);
-                }
-            }
-
-            //娴侀噺璁�
-            if (model.Flowmeters != null && model.Flowmeters.Count > 0)
-            {
-                foreach (var flowmeter in model.Flowmeters)
-                {
-                    var flowmeterModel = new FlowmeterViewModel();
-                    flowmeterModel.Id = flowmeter.Code;
-                    flowmeterModel.Catalog = Catalog.Flowmeter;
-                    flowmeterModel.Name = flowmeter.Name;
-                    flowmeterModel.Position = new Point3d(flowmeter.Position3d.X, flowmeter.Position3d.Y, flowmeter.Position3d.Z);
-                    netWork.Flowmeters.Add(flowmeterModel);
-                }
-            }
-
-            //鍘嬪姏琛�
-            if (model.Pressmeters != null && model.Pressmeters.Count > 0)
-            {
-                foreach (var pressmeter in model.Pressmeters)
-                {
-                    var pressmeterModel = new PressmeterViewModel();
-                    pressmeterModel.Id = pressmeter.Code;
-                    pressmeterModel.Catalog = Catalog.Pressmeter;
-                    pressmeterModel.Name = pressmeter.Name;
-                    pressmeterModel.Position = new Point3d(pressmeter.Position3d.X, pressmeter.Position3d.Y, pressmeter.Position3d.Z);
-                    netWork.Pressmeters.Add(pressmeterModel);
-                }
-            }
-
-            #endregion
-
-            #region 绠℃
-
-            var allNodes = netWork.GetAllNodes();
-            var allNodeDict = new Dictionary<string, NodeViewModel>();
-            allNodes.ForEach(x => allNodeDict.Add(x.Id, x));
-
-            //绠¢亾
-            if (model.Pipes != null && model.Pipes.Count > 0)
-            {
-                foreach (var pipe in model.Pipes)
-                {
-                    var pipeModel = new PipeViewModel();
-                    pipeModel.Id = pipe.Code;
-                    pipeModel.Catalog = Catalog.Pipe;
-                    pipeModel.Name = pipe.Name;
-                    pipeModel.StartId = pipe.StartCode;
-                    pipeModel.EndId = pipe.EndCode;
-                    pipeModel.Diameter = pipe.Diameter;
-                    netWork.Pipes.Add(pipeModel);
-                }
-            }
-
-            //杩囨浮浠�
-            if (model.Translations != null && model.Translations.Count > 0)
-            {
-                foreach (var translation in model.Translations)
-                {
-                    var translationModel = new TranslationViewModel();
-                    translationModel.Id = translation.Code;
-                    translationModel.Catalog = Catalog.Translation;
-                    translationModel.Name = translation.Name;
-                    translationModel.StartId = translation.StartCode;
-                    translationModel.EndId = translation.EndCode;
-                    //translationModel.Diameter = translation.Diameter;
-                    translationModel.StartDiameter = translation.StartDiameter;
-                    translationModel.EndDiameter = translation.EndDiameter;
-                    netWork.Translations.Add(translationModel);
-                }
-            }
-
-            //姘存车
-            if (model.Pumps != null && model.Pumps.Count > 0)
-            {
-                foreach (var pump in model.Pumps)
-                {
-                    var pumpModel = new HydroW3d.PumpViewModel();
-                    pumpModel.Id = pump.Code;
-                    pumpModel.Catalog = Catalog.Pump;
-                    pumpModel.Name = pump.Name;
-                    pumpModel.StartId = pump.StartCode;
-                    pumpModel.EndId = pump.EndCode;
-                    netWork.Pumps.Add(pumpModel);
-                }
-            }
-
-            //闃�闂�
-            if (model.Valves != null && model.Valves.Count > 0)
-            {
-                foreach (var valve in model.Valves)
-                {
-                    var valveModel = new ValveViewModel();
-                    valveModel.Id = valve.Code;
-                    valveModel.Catalog = Catalog.Valve;
-                    valveModel.Name = valve.Name;
-                    valveModel.StartId = valve.StartCode;
-                    valveModel.EndId = valve.EndCode;
-                    valveModel.Diameter = valve.Diameter;
-                    netWork.Valves.Add(valveModel);
-                }
-            }
-
-            //鎹㈢儹鍣�
-            if (model.Exchangers != null && model.Exchangers.Count > 0)
-            {
-                foreach (var exchanger in model.Exchangers)
-                {
-                    var exchangerModel = new ExchangerViewModel();
-                    exchangerModel.Id = exchanger.Code;
-                    exchangerModel.Catalog = Catalog.Exchanger;
-                    exchangerModel.Name = exchanger.Name;
-                    exchangerModel.StartId = exchanger.StartCode;
-                    exchangerModel.EndId = exchanger.EndCode;
-                    exchangerModel.Diameter = exchanger.Diameter;
-                    netWork.Exchangers.Add(exchangerModel);
-                }
-            }
-
-            //鍘嬬缉鏈�
-            if (model.Compressors != null && model.Compressors.Count > 0)
-            {
-                foreach (var compressor in model.Compressors)
-                {
-                    var compressorModel = new CompressorViewModel();
-                    compressorModel.Id = compressor.Code;
-                    compressorModel.Catalog = Catalog.Compressor;
-                    compressorModel.Name = compressor.Name;
-                    compressorModel.StartId = compressor.StartCode;
-                    compressorModel.EndId = compressor.EndCode;
-                    compressorModel.Diameter = compressor.Diameter;
-                    netWork.Compressors.Add(compressorModel);
-                }
-            }
-
-
-            #endregion
-
-            #region 鑺傜偣杩炴帴
-
-            var allLinks = netWork.GetAllLinks();
-            foreach (var node in allNodes)
-            {
-                var links = allLinks.Where(x => x.StartId == node.Id || x.EndId == node.Id).ToList();
-                node.LinkIds = links.Select(x => x.Id).Distinct().ToList();
-            }
-
-            #endregion
-
-
-            return netWork;
-        }
-
-
-
-
-    }
-}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/03-helper/HydroFlowDirectionHelper.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/03-helper/HydroFlowDirectionHelper.cs
new file mode 100644
index 0000000..a28b905
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/03-helper/HydroFlowDirectionHelper.cs
@@ -0,0 +1,41 @@
+锘縩amespace Yw.WinFrmUI
+{
+    /// <summary>
+    /// 姘存祦娴佸悜杈呭姪绫�
+    /// </summary>
+    public class HydroFlowDirectionHelper
+    {
+        //瀛楀吀
+        private static readonly Dictionary<int, string> _dict = new Dictionary<int, string>()
+        {
+            { Yw.Hydro.FlowDirection.None,"鏃�"},
+            { Yw.Hydro.FlowDirection.Positive,"姝�"},
+            { Yw.Hydro.FlowDirection.Negative,"鍙�"}
+        };
+
+        /// <summary>
+        /// 鑾峰彇鍚嶇О
+        /// </summary>
+        public static string GetName(int code)
+        {
+            if (_dict.ContainsKey(code))
+            {
+                return _dict[code];
+            }
+            return string.Empty;
+        }
+
+        /// <summary>
+        /// 鑾峰彇缂栫爜
+        /// </summary>
+        public static int GetCode(string name)
+        {
+            if (_dict.ContainsValue(name))
+            {
+                return _dict.First(x => x.Value == name).Key;
+            }
+            return Yw.Hydro.FlowDirection.None;
+        }
+
+    }
+}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/05-extensions/DictionaryExtensions.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/04-extensions/DictionaryExtensions.cs
similarity index 100%
rename from WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/05-extensions/DictionaryExtensions.cs
rename to WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/04-extensions/DictionaryExtensions.cs
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/05-extensions/HydroGradingVmoExtensiongs.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/04-extensions/HydroGradingVmoExtensiongs.cs
similarity index 100%
rename from WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/05-extensions/HydroGradingVmoExtensiongs.cs
rename to WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/04-extensions/HydroGradingVmoExtensiongs.cs
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/05-extensions/HydroModelInfoExtensions.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/04-extensions/HydroModelInfoExtensions.cs
similarity index 100%
rename from WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/05-extensions/HydroModelInfoExtensions.cs
rename to WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/04-extensions/HydroModelInfoExtensions.cs
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/05-extensions/HydroMonitorValueExtensions.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/04-extensions/HydroMonitorValueExtensions.cs
similarity index 100%
rename from WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/05-extensions/HydroMonitorValueExtensions.cs
rename to WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/04-extensions/HydroMonitorValueExtensions.cs
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/05-extensions/HydroParterInfoExtensions.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/04-extensions/HydroParterInfoExtensions.cs
similarity index 100%
rename from WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/05-extensions/HydroParterInfoExtensions.cs
rename to WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/04-extensions/HydroParterInfoExtensions.cs
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/06-svg/HydroMainSvgImageHelper.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/05-svg/HydroMainSvgImageHelper.cs
similarity index 100%
rename from WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/06-svg/HydroMainSvgImageHelper.cs
rename to WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/05-svg/HydroMainSvgImageHelper.cs
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/06-svg/HydroMonitorSvgImageHelper.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/05-svg/HydroMonitorSvgImageHelper.cs
similarity index 100%
rename from WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/06-svg/HydroMonitorSvgImageHelper.cs
rename to WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/05-svg/HydroMonitorSvgImageHelper.cs
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/07-function/HydroFunctionHelper.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/06-function/HydroFunctionHelper.cs
similarity index 100%
rename from WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/07-function/HydroFunctionHelper.cs
rename to WinFrmUI/Yw.WinFrmUI.Hydro.Core/00-core/06-function/HydroFunctionHelper.cs
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/02-model/HydroModelMgrPage.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/02-model/HydroModelMgrPage.cs
index c5dcc34..0733bec 100644
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/02-model/HydroModelMgrPage.cs
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/02-model/HydroModelMgrPage.cs
@@ -89,9 +89,9 @@
             };
             if (!IsExistPage(guid, true))
             {
-                var page = new HydroQ3dViewPage();
-                page.SetBindingData(info);
-                CreatePage(page, guid);
+                //var page = new HydroQ3dViewPage();
+                //page.SetBindingData(info);
+                //CreatePage(page, guid);
             }
         }
 
@@ -277,9 +277,9 @@
             };
             if (!IsExistPage(guid, true))
             {
-                var page = new HydroL2dViewPage();
-                page.SetBindingData(info);
-                CreatePage(page, guid);
+                //var page = new HydroL2dViewPage();
+                //page.SetBindingData(info);
+                //CreatePage(page, guid);
             }
         }
     }
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/02-visual/HydroVisualViewModel.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/02-visual/HydroVisualViewModel.cs
index 1887d9d..d6d3aab 100644
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/02-visual/HydroVisualViewModel.cs
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/02-visual/HydroVisualViewModel.cs
@@ -15,8 +15,34 @@
         /// </summary>
         public HydroVisualViewModel(Yw.Model.HydroVisualInfo rhs, Yw.Model.HydroModelInfo hydroInfo) : base(rhs, hydroInfo)
         {
+            this.FlowDirectionX = HydroFlowDirectionHelper.GetName(rhs.FlowDirectionX);
+            this.FlowDirectionY = HydroFlowDirectionHelper.GetName(rhs.FlowDirectionY);
 
+            this.Vmo = rhs;
         }
+
+
+        /// <summary>
+        /// X娴佸悜
+        /// </summary>
+        [Category("娴佸悜")]
+        [DisplayName("X娴佸悜")]
+        [HydroFlowDirectionPro]
+        [PropertyOrder(101)]
+        [Browsable(true)]
+        [TypeConverter(typeof(HydroFlowDirectionConverter))]
+        public virtual string FlowDirectionX { get; set; }
+
+        /// <summary>
+        /// Y娴佸悜
+        /// </summary>
+        [Category("娴佸悜")]
+        [DisplayName("Y娴佸悜")]
+        [HydroFlowDirectionPro]
+        [PropertyOrder(102)]
+        [Browsable(true)]
+        [TypeConverter(typeof(HydroFlowDirectionConverter))]
+        public virtual string FlowDirectionY { get; set; }
 
         /// <summary>
         /// vmo
@@ -28,6 +54,25 @@
             set { _vmo = value; }
         }
 
+        /// <summary>
+        /// 鏇存柊灞炴��
+        /// </summary>
+        public override void UpdateProperty()
+        {
+            base.UpdateProperty();
+            this.FlowDirectionX = HydroFlowDirectionHelper.GetName(this.Vmo.FlowDirectionX);
+            this.FlowDirectionY = HydroFlowDirectionHelper.GetName(this.Vmo.FlowDirectionY);
+        }
+
+        /// <summary>
+        /// 鏇存柊 Vmo 灞炴��
+        /// </summary>
+        public override void UpdateVmoProperty()
+        {
+            base.UpdateVmoProperty();
+            this.Vmo.FlowDirectionX = HydroFlowDirectionHelper.GetCode(this.FlowDirectionX);
+            this.Vmo.FlowDirectionY = HydroFlowDirectionHelper.GetCode(this.FlowDirectionY);
+        }
 
         /// <summary>
         /// 鏇存柊璁$畻灞炴��
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/05-attribute/HydroFlowDirectionProAttribute.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/05-attribute/HydroFlowDirectionProAttribute.cs
new file mode 100644
index 0000000..cf77884
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/05-attribute/HydroFlowDirectionProAttribute.cs
@@ -0,0 +1,17 @@
+锘縩amespace Yw.WinFrmUI
+{
+    /// <summary>
+    /// 鐢ㄤ簬鏍囪瘑姘村姏娴佸悜灞炴�х壒鎬�
+    /// </summary>
+    [AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
+    public class HydroFlowDirectionProAttribute : Attribute
+    { 
+        /// <summary>
+        /// 
+        /// </summary>
+        public HydroFlowDirectionProAttribute() { }   
+
+
+    }
+
+}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/06-converter/HydroFlowDirectionConverter.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/06-converter/HydroFlowDirectionConverter.cs
new file mode 100644
index 0000000..5270495
--- /dev/null
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/04-viewmodel/06-converter/HydroFlowDirectionConverter.cs
@@ -0,0 +1,39 @@
+锘縩amespace Yw.WinFrmUI
+{
+    /// <summary>
+    /// 姘村姏娴佸悜杞崲鍣�
+    /// </summary>
+    public class HydroFlowDirectionConverter : StringConverter
+    {
+        /// <summary>
+        /// 
+        /// </summary>
+        public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
+        {
+            return true;
+        }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
+        {
+            var list = new List<string>
+            {
+               HydroFlowDirectionHelper.GetName(Yw.Hydro.FlowDirection.None),
+               HydroFlowDirectionHelper.GetName(Yw.Hydro.FlowDirection.Positive),
+               HydroFlowDirectionHelper.GetName(Yw.Hydro.FlowDirection.Negative)
+            };
+            return new StandardValuesCollection(list);
+        }
+
+        /// <summary>
+        /// 涓嶅厑璁告墜鍔ㄨ緭鍏�
+        /// </summary>
+        public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
+        {
+            return true;
+        }
+
+    }
+}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/05-property/HydroVisualPropertyCtrl.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/05-property/HydroVisualPropertyCtrl.cs
index cea843b..a29e71f 100644
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/05-property/HydroVisualPropertyCtrl.cs
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/05-property/HydroVisualPropertyCtrl.cs
@@ -41,6 +41,10 @@
         /// 鍒嗙骇灞炴�у�兼敼鍙樹簨浠�
         /// </summary>
         public event Action<HydroVisualViewModel> GradingPropertyValueChangedEvent;
+        /// <summary>
+        /// 娴佸悜灞炴�у�兼敼鍙樹簨浠�
+        /// </summary>
+        public event Action<HydroVisualViewModel> FlowDirectionPropertyValueChangedEvent;
 
 
         /// <summary>
@@ -657,7 +661,7 @@
             if (descriptor != null)
             {
                 //鐪熷疄灞炴�у悕绉�
-                var realPropAttri = (HydroRealProAttribute)descriptor.Attributes[typeof(HydroRealProAttribute)];
+                HydroRealProAttribute realPropAttri = (HydroRealProAttribute)descriptor.Attributes[typeof(HydroRealProAttribute)];
                 if (realPropAttri != null)
                 {
                     realFieldName = realPropAttri.RealPropName;
@@ -675,6 +679,12 @@
                     this.GradingPropertyValueChangedEvent?.Invoke(vm);
                 }
 
+                var hydroFlowDirectionAttri = descriptor.Attributes[typeof(HydroFlowDirectionProAttribute)];
+                if (hydroFlowDirectionAttri != null)
+                { 
+                    this.FlowDirectionPropertyValueChangedEvent?.Invoke(vm);
+                }
+
                 this.propertyGridControl1.UpdateRows();
             }
             _changeHelper?.Append(vm.Vmo, eChangeType.Update);
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/99-view/01-q3d/HydroQ3dViewPage.Designer.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/99-view/01-q3d/HydroQ3dViewPage.Designer.cs
deleted file mode 100644
index ff07763..0000000
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/99-view/01-q3d/HydroQ3dViewPage.Designer.cs
+++ /dev/null
@@ -1,64 +0,0 @@
-锘縩amespace Yw.WinFrmUI
-{
-    partial class HydroQ3dViewPage
-    {
-        /// <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()
-        {
-            ComponentResourceManager resources = new ComponentResourceManager(typeof(HydroQ3dViewPage));
-            drawer1 = new Q3d.Drawer();
-            SuspendLayout();
-            // 
-            // drawer1
-            // 
-            drawer1.BackColor = Color.Transparent;
-            drawer1.Dock = DockStyle.Fill;
-            drawer1.IsEditMode = true;
-            drawer1.Location = new Point(0, 0);
-            //var pf = (PointF)resources.GetObject("drawer1.MapCenter");
-            //drawer1.MapCenter = new Yw.WinFrmUI.Q3d.PointF3D(pf.X, pf.Y, 0);
-            //drawer1.mapOption = (Q3d.MapDimensions)resources.GetObject("drawer1.mapOption");
-            drawer1.Name = "drawer1";
-            drawer1.Size = new Size(224, 174);
-            drawer1.TabIndex = 0;
-            drawer1.zoom = 1F;
-            // 
-            // HydroQ3dViewPage
-            // 
-            Appearance.BackColor = SystemColors.Control;
-            Appearance.Options.UseBackColor = true;
-            AutoScaleDimensions = new SizeF(7F, 14F);
-            AutoScaleMode = AutoScaleMode.Font;
-            Controls.Add(drawer1);
-            Name = "HydroQ3dViewPage";
-            ResumeLayout(false);
-        }
-
-        #endregion
-
-        private Q3d.Drawer drawer1;
-    }
-}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/99-view/01-q3d/HydroQ3dViewPage.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/99-view/01-q3d/HydroQ3dViewPage.cs
deleted file mode 100644
index a656f74..0000000
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/99-view/01-q3d/HydroQ3dViewPage.cs
+++ /dev/null
@@ -1,42 +0,0 @@
-锘縩amespace Yw.WinFrmUI
-{
-    public partial class HydroQ3dViewPage : Yw.WinFrmUI.DocumentPage
-    {
-        public HydroQ3dViewPage()
-        {
-            InitializeComponent();
-            this.PageTitle.Caption = "姘村姏妯″瀷";
-        }
-
-        private Yw.Model.HydroModelInfo _hydroInfo = null;
-
-        /// <summary>
-        /// 缁戝畾鏁版嵁
-        /// </summary>
-        public void SetBindingData(Yw.Model.HydroModelInfo hydroInfo)
-        {
-            if (hydroInfo == null)
-            {
-                return;
-            }
-            _hydroInfo = hydroInfo;
-
-        }
-
-        /// <summary>
-        /// 鍒濆鍖栨暟鎹簮
-        /// </summary>
-        public override void InitialDataSource()
-        {
-            base.InitialDataSource();
-            if (_hydroInfo == null)
-            {
-                return;
-            }
-            this.PageTitle.Caption = $"{_hydroInfo.Name}\r\n姘村姏妯″瀷";
-            var netWork = HydroQ3dTransferHelper.ToNetworkViewModel(_hydroInfo);
-            this.drawer1.SetData(netWork);
-        }
-
-    }
-}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/99-view/01-q3d/HydroQ3dViewPage.resx b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/99-view/01-q3d/HydroQ3dViewPage.resx
deleted file mode 100644
index b27f0a7..0000000
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/99-view/01-q3d/HydroQ3dViewPage.resx
+++ /dev/null
@@ -1,145 +0,0 @@
-锘�<?xml version="1.0" encoding="utf-8"?>
-<root>
-  <!--
-    Microsoft ResX Schema 
-
-    Version 2.0
-
-    The primary goals of this format is to allow a simple XML format
-    that is mostly human readable. The generation and parsing of the
-    various data types are done through the TypeConverter classes
-    associated with the data types.
-
-    Example:
-
-    ... ado.net/XML headers & schema ...
-    <resheader name="resmimetype">text/microsoft-resx</resheader>
-    <resheader name="version">2.0</resheader>
-    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
-    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
-    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
-    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
-    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
-        <value>[base64 mime encoded serialized .NET Framework object]</value>
-    </data>
-    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
-        <comment>This is a comment</comment>
-    </data>
-
-    There are any number of "resheader" rows that contain simple
-    name/value pairs.
-
-    Each data row contains a name, and value. The row also contains a
-    type or mimetype. Type corresponds to a .NET class that support
-    text/value conversion through the TypeConverter architecture.
-    Classes that don't support this are serialized and stored with the
-    mimetype set.
-
-    The mimetype is used for serialized objects, and tells the
-    ResXResourceReader how to depersist the object. This is currently not
-    extensible. For a given mimetype the value must be set accordingly:
-
-    Note - application/x-microsoft.net.object.binary.base64 is the format
-    that the ResXResourceWriter will generate, however the reader can
-    read any of the formats listed below.
-
-    mimetype: application/x-microsoft.net.object.binary.base64
-    value   : The object must be serialized with
-            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
-            : and then encoded with base64 encoding.
-    
-    mimetype: application/x-microsoft.net.object.soap.base64
-    value   : The object must be serialized with
-            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
-            : and then encoded with base64 encoding.
-
-    mimetype: application/x-microsoft.net.object.bytearray.base64
-    value   : The object must be serialized into a byte array
-            : using a System.ComponentModel.TypeConverter
-            : and then encoded with base64 encoding.
-    -->
-  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
-    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
-    <xsd:element name="root" msdata:IsDataSet="true">
-      <xsd:complexType>
-        <xsd:choice maxOccurs="unbounded">
-          <xsd:element name="metadata">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" />
-              </xsd:sequence>
-              <xsd:attribute name="name" use="required" type="xsd:string" />
-              <xsd:attribute name="type" type="xsd:string" />
-              <xsd:attribute name="mimetype" type="xsd:string" />
-              <xsd:attribute ref="xml:space" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="assembly">
-            <xsd:complexType>
-              <xsd:attribute name="alias" type="xsd:string" />
-              <xsd:attribute name="name" type="xsd:string" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="data">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
-              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
-              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
-              <xsd:attribute ref="xml:space" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="resheader">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" />
-            </xsd:complexType>
-          </xsd:element>
-        </xsd:choice>
-      </xsd:complexType>
-    </xsd:element>
-  </xsd:schema>
-  <resheader name="resmimetype">
-    <value>text/microsoft-resx</value>
-  </resheader>
-  <resheader name="version">
-    <value>2.0</value>
-  </resheader>
-  <resheader name="reader">
-    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <resheader name="writer">
-    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <data name="drawer1.MapCenter" mimetype="application/x-microsoft.net.object.binary.base64">
-    <value>
-        AAEAAAD/////AQAAAAAAAAAMAgAAAFFTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0
-        dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABVTeXN0ZW0uRHJh
-        d2luZy5Qb2ludEYCAAAAAXgBeQAACwsCAAAAAAAAAAAAAAAL
-</value>
-  </data>
-  <data name="drawer1.mapOption" mimetype="application/x-microsoft.net.object.binary.base64">
-    <value>
-        AAEAAAD/////AQAAAAAAAAAMAgAAAEBZdy5XaW5Gcm1VSS5IeWRyby5RM2QuQ29yZSwgQ3VsdHVyZT1u
-        ZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1udWxsDAMAAABRU3lzdGVtLkRyYXdpbmcsIFZlcnNpb249NC4w
-        LjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iMDNmNWY3ZjExZDUwYTNhBQEAAAAd
-        WXcuV2luRnJtVUkuUTNkLk1hcERpbWVuc2lvbnMNAAAAFzxDZW50ZXI+a19fQmFja2luZ0ZpZWxkFTx6
-        b29tPmtfX0JhY2tpbmdGaWVsZBk8cm90YXRpb24+a19fQmFja2luZ0ZpZWxkCl9yb3RhdGlvbkYaPFNo
-        b3dGbG9vcj5rX19CYWNraW5nRmllbGQaPGlzU2hvd1BpYz5rX19CYWNraW5nRmllbGQVaXNBdXRvQmFj
-        a2dyb3VuZEltYWdlHjxpc1Nob3dVbmZhdm9yPmtfX0JhY2tpbmdGaWVsZBs8TG9jazJEVmlldz5rX19C
-        YWNraW5nRmllbGQbPGlzRWRpdE1vZGU+a19fQmFja2luZ0ZpZWxkGDxJc09ydGhvPmtfX0JhY2tpbmdG
-        aWVsZBs8Q29sb3VyTm9kZT5rX19CYWNraW5nRmllbGQbPENvbG91ckxpbms+a19fQmFja2luZ0ZpZWxk
-        BAAAAAAAAAAAAAAEBBVTeXN0ZW0uRHJhd2luZy5Qb2ludEYDAAAACwYGCAEBAQEBARpZdy5XaW5Gcm1V
-        SS5RM2QuQ29sb3VyVHlwZQIAAAAaWXcuV2luRnJtVUkuUTNkLkNvbG91clR5cGUCAAAAAgAAAAX8////
-        FVN5c3RlbS5EcmF3aW5nLlBvaW50RgIAAAABeAF5AAALCwMAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAA
-        AAAAAAAAAAAAgAEAAQABAQX7////Gll3LldpbkZybVVJLlEzZC5Db2xvdXJUeXBlAQAAAAd2YWx1ZV9f
-        AAgCAAAAAAAAAAH6////+////wAAAAAL
-</value>
-  </data>
-</root>
\ No newline at end of file
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/99-view/02-l2d/HydroL2dViewPage.Designer.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/99-view/02-l2d/HydroL2dViewPage.Designer.cs
deleted file mode 100644
index d7d8d22..0000000
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/99-view/02-l2d/HydroL2dViewPage.Designer.cs
+++ /dev/null
@@ -1,59 +0,0 @@
-锘縩amespace Yw.WinFrmUI
-{
-    partial class HydroL2dViewPage
-    {
-        /// <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()
-        {
-            networkPanel1 = new HydroL2d.NetworkPanel();
-            SuspendLayout();
-            // 
-            // networkPanel1
-            // 
-            networkPanel1.Dock = DockStyle.Fill;
-            networkPanel1.Location = new Point(0, 0);
-            networkPanel1.MinimumSize = new Size(10, 10);
-            networkPanel1.Name = "networkPanel1";
-            networkPanel1.Size = new Size(736, 476);
-            networkPanel1.TabIndex = 0;
-            // 
-            // HydroL2dViewPage
-            // 
-            Appearance.BackColor = SystemColors.Control;
-            Appearance.Options.UseBackColor = true;
-            AutoScaleDimensions = new SizeF(7F, 14F);
-            AutoScaleMode = AutoScaleMode.Font;
-            Controls.Add(networkPanel1);
-            Name = "HydroL2dViewPage";
-            Size = new Size(736, 476);
-            ResumeLayout(false);
-        }
-
-        #endregion
-
-        private HydroL2d.NetworkPanel networkPanel1;
-    }
-}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/99-view/02-l2d/HydroL2dViewPage.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/99-view/02-l2d/HydroL2dViewPage.cs
deleted file mode 100644
index b24e585..0000000
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/99-view/02-l2d/HydroL2dViewPage.cs
+++ /dev/null
@@ -1,32 +0,0 @@
-锘縩amespace Yw.WinFrmUI
-{
-    public partial class HydroL2dViewPage : Yw.WinFrmUI.DocumentPage
-    {
-        public HydroL2dViewPage()
-        {
-            InitializeComponent();
-            this.PageTitle.Caption = "姘村姏妯″瀷";
-        }
-
-
-        /// <summary>
-        /// 缁戝畾鏁版嵁
-        /// </summary>
-        /// <param name="hydroModelId">姘村姏妯″瀷id</param>
-        public async void SetBindingData(Yw.Model.HydroModelInfo rhs)
-        {
-            this.PageTitle.Caption = $"{rhs.Name}\r\nL2d姘村姏妯″瀷";
-
-            var netWork = HydroL2dTransferHelper.ToL2dNetworkViewModel(rhs);
-            this.networkPanel1.Initial(netWork);
-        }
-
-        /// <summary>
-        /// 鍒濆鍖栨暟鎹簮
-        /// </summary>
-        public override void InitialDataSource()
-        {
-            base.InitialDataSource();
-        }
-    }
-}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/99-view/02-l2d/HydroL2dViewPage.resx b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/99-view/02-l2d/HydroL2dViewPage.resx
deleted file mode 100644
index af32865..0000000
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/99-view/02-l2d/HydroL2dViewPage.resx
+++ /dev/null
@@ -1,120 +0,0 @@
-锘�<?xml version="1.0" encoding="utf-8"?>
-<root>
-  <!--
-    Microsoft ResX Schema 
-
-    Version 2.0
-
-    The primary goals of this format is to allow a simple XML format
-    that is mostly human readable. The generation and parsing of the
-    various data types are done through the TypeConverter classes
-    associated with the data types.
-
-    Example:
-
-    ... ado.net/XML headers & schema ...
-    <resheader name="resmimetype">text/microsoft-resx</resheader>
-    <resheader name="version">2.0</resheader>
-    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
-    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
-    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
-    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
-    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
-        <value>[base64 mime encoded serialized .NET Framework object]</value>
-    </data>
-    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
-        <comment>This is a comment</comment>
-    </data>
-
-    There are any number of "resheader" rows that contain simple
-    name/value pairs.
-
-    Each data row contains a name, and value. The row also contains a
-    type or mimetype. Type corresponds to a .NET class that support
-    text/value conversion through the TypeConverter architecture.
-    Classes that don't support this are serialized and stored with the
-    mimetype set.
-
-    The mimetype is used for serialized objects, and tells the
-    ResXResourceReader how to depersist the object. This is currently not
-    extensible. For a given mimetype the value must be set accordingly:
-
-    Note - application/x-microsoft.net.object.binary.base64 is the format
-    that the ResXResourceWriter will generate, however the reader can
-    read any of the formats listed below.
-
-    mimetype: application/x-microsoft.net.object.binary.base64
-    value   : The object must be serialized with
-            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
-            : and then encoded with base64 encoding.
-    
-    mimetype: application/x-microsoft.net.object.soap.base64
-    value   : The object must be serialized with
-            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
-            : and then encoded with base64 encoding.
-
-    mimetype: application/x-microsoft.net.object.bytearray.base64
-    value   : The object must be serialized into a byte array
-            : using a System.ComponentModel.TypeConverter
-            : and then encoded with base64 encoding.
-    -->
-  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
-    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
-    <xsd:element name="root" msdata:IsDataSet="true">
-      <xsd:complexType>
-        <xsd:choice maxOccurs="unbounded">
-          <xsd:element name="metadata">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" />
-              </xsd:sequence>
-              <xsd:attribute name="name" use="required" type="xsd:string" />
-              <xsd:attribute name="type" type="xsd:string" />
-              <xsd:attribute name="mimetype" type="xsd:string" />
-              <xsd:attribute ref="xml:space" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="assembly">
-            <xsd:complexType>
-              <xsd:attribute name="alias" type="xsd:string" />
-              <xsd:attribute name="name" type="xsd:string" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="data">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
-              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
-              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
-              <xsd:attribute ref="xml:space" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="resheader">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" />
-            </xsd:complexType>
-          </xsd:element>
-        </xsd:choice>
-      </xsd:complexType>
-    </xsd:element>
-  </xsd:schema>
-  <resheader name="resmimetype">
-    <value>text/microsoft-resx</value>
-  </resheader>
-  <resheader name="version">
-    <value>2.0</value>
-  </resheader>
-  <resheader name="reader">
-    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <resheader name="writer">
-    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-</root>
\ No newline at end of file
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/99-view/03-l3d/HydroL3dViewPage.Designer.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/99-view/03-l3d/HydroL3dViewPage.Designer.cs
deleted file mode 100644
index 6dce93d..0000000
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/99-view/03-l3d/HydroL3dViewPage.Designer.cs
+++ /dev/null
@@ -1,58 +0,0 @@
-锘縩amespace Yw.WinFrmUI
-{
-    partial class HydroL3dViewPage
-    {
-        /// <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()
-        {
-            networkScenePanel1 = new HydroL3d.NetworkScenePanel();
-            SuspendLayout();
-            // 
-            // networkScenePanel1
-            // 
-            networkScenePanel1.Dock = DockStyle.Fill;
-            networkScenePanel1.Location = new Point(0, 0);
-            networkScenePanel1.Name = "networkScenePanel1";
-            networkScenePanel1.Size = new Size(736, 476);
-            networkScenePanel1.TabIndex = 0;
-            // 
-            // HydroL3dViewPage
-            // 
-            Appearance.BackColor = SystemColors.Control;
-            Appearance.Options.UseBackColor = true;
-            AutoScaleDimensions = new SizeF(7F, 14F);
-            AutoScaleMode = AutoScaleMode.Font;
-            Controls.Add(networkScenePanel1);
-            Name = "HydroL3dViewPage";
-            Size = new Size(736, 476);
-            ResumeLayout(false);
-        }
-
-        #endregion
-
-        private HydroL3d.NetworkScenePanel networkScenePanel1;
-    }
-}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/99-view/03-l3d/HydroL3dViewPage.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/99-view/03-l3d/HydroL3dViewPage.cs
deleted file mode 100644
index 43cddd7..0000000
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/99-view/03-l3d/HydroL3dViewPage.cs
+++ /dev/null
@@ -1,33 +0,0 @@
-锘縩amespace Yw.WinFrmUI
-{
-    public partial class HydroL3dViewPage : Yw.WinFrmUI.DocumentPage
-    {
-        public HydroL3dViewPage()
-        {
-            InitializeComponent();
-            this.PageTitle.Caption = "姘村姏妯″瀷";
-        }
-
-        private Yw.Model.HydroModelInfo _hydroInfo = null;
-
-
-        /// <summary>
-        /// 缁戝畾鏁版嵁
-        /// </summary>
-        public void SetBindingData(Yw.Model.HydroModelInfo rhs)
-        {
-            this.PageTitle.Caption = $"{rhs.Name}\r\nL3d姘村姏妯″瀷";
-
-            var netWork = HydroL3dTransferHelper.ToL3dNetworkViewModel(rhs);
-            //this.networkPanel1.Initial(netWork);
-        }
-
-        /// <summary>
-        /// 鍒濆鍖栨暟鎹簮
-        /// </summary>
-        public override void InitialDataSource()
-        {
-            base.InitialDataSource();
-        }
-    }
-}
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/99-view/03-l3d/HydroL3dViewPage.resx b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/99-view/03-l3d/HydroL3dViewPage.resx
deleted file mode 100644
index af32865..0000000
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/99-view/03-l3d/HydroL3dViewPage.resx
+++ /dev/null
@@ -1,120 +0,0 @@
-锘�<?xml version="1.0" encoding="utf-8"?>
-<root>
-  <!--
-    Microsoft ResX Schema 
-
-    Version 2.0
-
-    The primary goals of this format is to allow a simple XML format
-    that is mostly human readable. The generation and parsing of the
-    various data types are done through the TypeConverter classes
-    associated with the data types.
-
-    Example:
-
-    ... ado.net/XML headers & schema ...
-    <resheader name="resmimetype">text/microsoft-resx</resheader>
-    <resheader name="version">2.0</resheader>
-    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
-    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
-    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
-    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
-    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
-        <value>[base64 mime encoded serialized .NET Framework object]</value>
-    </data>
-    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
-        <comment>This is a comment</comment>
-    </data>
-
-    There are any number of "resheader" rows that contain simple
-    name/value pairs.
-
-    Each data row contains a name, and value. The row also contains a
-    type or mimetype. Type corresponds to a .NET class that support
-    text/value conversion through the TypeConverter architecture.
-    Classes that don't support this are serialized and stored with the
-    mimetype set.
-
-    The mimetype is used for serialized objects, and tells the
-    ResXResourceReader how to depersist the object. This is currently not
-    extensible. For a given mimetype the value must be set accordingly:
-
-    Note - application/x-microsoft.net.object.binary.base64 is the format
-    that the ResXResourceWriter will generate, however the reader can
-    read any of the formats listed below.
-
-    mimetype: application/x-microsoft.net.object.binary.base64
-    value   : The object must be serialized with
-            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
-            : and then encoded with base64 encoding.
-    
-    mimetype: application/x-microsoft.net.object.soap.base64
-    value   : The object must be serialized with
-            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
-            : and then encoded with base64 encoding.
-
-    mimetype: application/x-microsoft.net.object.bytearray.base64
-    value   : The object must be serialized into a byte array
-            : using a System.ComponentModel.TypeConverter
-            : and then encoded with base64 encoding.
-    -->
-  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
-    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
-    <xsd:element name="root" msdata:IsDataSet="true">
-      <xsd:complexType>
-        <xsd:choice maxOccurs="unbounded">
-          <xsd:element name="metadata">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" />
-              </xsd:sequence>
-              <xsd:attribute name="name" use="required" type="xsd:string" />
-              <xsd:attribute name="type" type="xsd:string" />
-              <xsd:attribute name="mimetype" type="xsd:string" />
-              <xsd:attribute ref="xml:space" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="assembly">
-            <xsd:complexType>
-              <xsd:attribute name="alias" type="xsd:string" />
-              <xsd:attribute name="name" type="xsd:string" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="data">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
-              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
-              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
-              <xsd:attribute ref="xml:space" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="resheader">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" />
-            </xsd:complexType>
-          </xsd:element>
-        </xsd:choice>
-      </xsd:complexType>
-    </xsd:element>
-  </xsd:schema>
-  <resheader name="resmimetype">
-    <value>text/microsoft-resx</value>
-  </resheader>
-  <resheader name="version">
-    <value>2.0</value>
-  </resheader>
-  <resheader name="reader">
-    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <resheader name="writer">
-    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-</root>
\ No newline at end of file
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/Yw.WinFrmUI.Hydro.Core.csproj b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/Yw.WinFrmUI.Hydro.Core.csproj
index afa96fb..9548c38 100644
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/Yw.WinFrmUI.Hydro.Core.csproj
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/Yw.WinFrmUI.Hydro.Core.csproj
@@ -53,17 +53,14 @@
 	<ItemGroup>
 		<PackageReference Include="DevExpress.Win.Design" Version="23.2.4" />
 		<PackageReference Include="Yw.BLL.Basic.Core" Version="3.3.7" />
-		<PackageReference Include="Yw.BLL.Hydro.Core" Version="5.0.3" />
+		<PackageReference Include="Yw.BLL.Hydro.Core" Version="5.0.5" />
 		<PackageReference Include="Yw.Pump.Core" Version="3.2.4" />
+		<PackageReference Include="Yw.WinFrmUI.Hydro.L3d2.Core" Version="1.0.2" />
 	</ItemGroup>
 
 	<ItemGroup>
 		<ProjectReference Include="..\..\Hydro\Yw.Hydro.Core\Yw.Hydro.Core.csproj" />
 		<ProjectReference Include="..\Yw.WinFrmUI.Core\Yw.WinFrmUI.Core.csproj" />
-		<ProjectReference Include="..\Yw.WinFrmUI.Hydro.L2d.Core\Yw.WinFrmUI.Hydro.L2d.Core.csproj" />
-		<ProjectReference Include="..\Yw.WinFrmUI.Hydro.L3d.Core\Yw.WinFrmUI.Hydro.L3d.Core.csproj" />
-		<ProjectReference Include="..\Yw.WinFrmUI.Hydro.Q3d.Core\Yw.WinFrmUI.Hydro.Q3d.Core.csproj" />
-		<ProjectReference Include="..\Yw.WinFrmUI.Hydro.W3d.Core\Yw.WinFrmUI.Hydro.W3d.Core.csproj" />
 		<ProjectReference Include="..\Yw.WinFrmUI.Phart.Core\Yw.WinFrmUI.Phart.Core.csproj" />
 	</ItemGroup>
 
@@ -201,7 +198,7 @@
 			<SubType>UserControl</SubType>
 		</Compile>
 		<Compile Update="10-working\10-mgr\HydroWorkingMgrDlg.cs">
-		  <SubType>Form</SubType>
+			<SubType>Form</SubType>
 		</Compile>
 		<Compile Update="11-search\HydroVisualSearchListCtrl.cs">
 			<SubType>UserControl</SubType>
@@ -219,10 +216,10 @@
 			<SubType>Form</SubType>
 		</Compile>
 		<Compile Update="12-monitor\04-set\SetHydroMonitorListDlg.cs">
-		  <SubType>Form</SubType>
+			<SubType>Form</SubType>
 		</Compile>
 		<Compile Update="12-monitor\04-set\SetHydroMonitorListCtrl.cs">
-		  <SubType>UserControl</SubType>
+			<SubType>UserControl</SubType>
 		</Compile>
 		<Compile Update="15-visible\SetHydroVisualVisibleDlg.cs">
 			<SubType>Form</SubType>
@@ -255,22 +252,16 @@
 			<SubType>Form</SubType>
 		</Compile>
 		<Compile Update="21-curve\HydroValveCurveViewDlg.cs">
-		  <SubType>Form</SubType>
+			<SubType>Form</SubType>
 		</Compile>
 		<Compile Update="21-curve\HydroCurveViewDlg.cs">
 			<SubType>Form</SubType>
 		</Compile>
 		<Compile Update="22-evaluation\01-catalog\SelectHydroEvaluationCatalogCtrl.cs">
-		  <SubType>UserControl</SubType>
+			<SubType>UserControl</SubType>
 		</Compile>
 		<Compile Update="22-evaluation\02-list\SetHydroEvaluationModelCtrl.cs" />
 		<Compile Update="22-evaluation\SetHydroEvaluationModelDlg.cs" />
-		<Compile Update="99-view\02-l2d\HydroL2dViewPage.cs">
-			<SubType>UserControl</SubType>
-		</Compile>
-		<Compile Update="99-view\03-l3d\HydroL3dViewPage.cs">
-			<SubType>UserControl</SubType>
-		</Compile>
 		<Compile Update="08-grading\04-tree\SelectHydroGradingPropTreeCtrl.cs">
 			<SubType>UserControl</SubType>
 		</Compile>
@@ -374,76 +365,76 @@
 			<SubType>Form</SubType>
 		</Compile>
 		<Compile Update="accuracy\04-control\HydroAccuracyPressCtrl.cs">
-		  <SubType>UserControl</SubType>
+			<SubType>UserControl</SubType>
 		</Compile>
 		<Compile Update="accuracy\04-control\HydroAccuracyScaleCtrl.cs">
-		  <SubType>UserControl</SubType>
+			<SubType>UserControl</SubType>
 		</Compile>
 		<Compile Update="accuracy\04-control\HydroAccuracyFlowCtrl.cs">
-		  <SubType>UserControl</SubType>
+			<SubType>UserControl</SubType>
 		</Compile>
 		<Compile Update="accuracy\04-control\HydroAccuracyListCtrl.cs">
-		  <SubType>UserControl</SubType>
+			<SubType>UserControl</SubType>
 		</Compile>
 		<Compile Update="accuracy\04-control\HydroAccuracyCtrl.cs">
-		  <SubType>UserControl</SubType>
+			<SubType>UserControl</SubType>
 		</Compile>
 		<Compile Update="accuracy\05-dlg\HydroAccuracyDlg.cs">
-		  <SubType>Form</SubType>
+			<SubType>Form</SubType>
 		</Compile>
 		<Compile Update="accuracy\06-working\HydroAccuracyWorkingDlg.cs">
-		  <SubType>Form</SubType>
+			<SubType>Form</SubType>
 		</Compile>
 		<Compile Update="energy-analy\03-control\HydroEnergyAnalyTotalCtrl.cs">
-		  <SubType>UserControl</SubType>
+			<SubType>UserControl</SubType>
 		</Compile>
 		<Compile Update="energy-analy\03-control\HydroEnergyAnalyListCtrl.cs">
-		  <SubType>UserControl</SubType>
+			<SubType>UserControl</SubType>
 		</Compile>
 		<Compile Update="energy-analy\04-dlg\HydroEnergyAnalyListDlg.cs">
-		  <SubType>Form</SubType>
+			<SubType>Form</SubType>
 		</Compile>
 		<Compile Update="energy-analy\05-working\HydroEnergyAnalyWorkingListCtrl.cs">
-		  <SubType>UserControl</SubType>
+			<SubType>UserControl</SubType>
 		</Compile>
 		<Compile Update="energy-analy\05-working\HydroEnergyAnalyWorkingListDlg.cs">
-		  <SubType>Form</SubType>
+			<SubType>Form</SubType>
 		</Compile>
 		<Compile Update="loss-curve\07-control\HydroLossCurveCtrl.cs">
-		  <SubType>UserControl</SubType>
+			<SubType>UserControl</SubType>
 		</Compile>
 		<Compile Update="loss-curve\07-control\HydroLossCurveInteropCtrl.cs">
-		  <SubType>UserControl</SubType>
+			<SubType>UserControl</SubType>
 		</Compile>
 		<Compile Update="loss-curve\08-dlg\HydroLossCurveDlg.cs">
-		  <SubType>Form</SubType>
+			<SubType>Form</SubType>
 		</Compile>
 		<Compile Update="loss-curve\09-working\HydroLossCurveMultiWorkingDlg.cs">
-		  <SubType>Form</SubType>
+			<SubType>Form</SubType>
 		</Compile>
 		<Compile Update="loss-curve\09-working\HydroLossCurveWorkingDlg.cs">
-		  <SubType>Form</SubType>
+			<SubType>Form</SubType>
 		</Compile>
 		<Compile Update="loss-statistics\06-control\HydroLossStatisticsCategoryCtrl.cs">
-		  <SubType>UserControl</SubType>
+			<SubType>UserControl</SubType>
 		</Compile>
 		<Compile Update="loss-statistics\06-control\HydroLossStatisticsCatalogCtrl.cs">
-		  <SubType>UserControl</SubType>
+			<SubType>UserControl</SubType>
 		</Compile>
 		<Compile Update="loss-statistics\06-control\HydroLossStatisticsInputCtrl.cs">
-		  <SubType>UserControl</SubType>
+			<SubType>UserControl</SubType>
 		</Compile>
 		<Compile Update="loss-statistics\06-control\HydroLossStatisticsCtrl.cs">
-		  <SubType>UserControl</SubType>
+			<SubType>UserControl</SubType>
 		</Compile>
 		<Compile Update="loss-statistics\07-dlg\HydroLossStatisticsDlg.cs">
-		  <SubType>Form</SubType>
+			<SubType>Form</SubType>
 		</Compile>
 		<Compile Update="loss-statistics\08-working\HydroLossStatisticsWorkingDlg.cs">
-		  <SubType>Form</SubType>
+			<SubType>Form</SubType>
 		</Compile>
 		<Compile Update="monitor-analy\02-control\HydroMonitorAnalyListCtrl.cs">
-		  <SubType>UserControl</SubType>
+			<SubType>UserControl</SubType>
 		</Compile>
 		<Compile Update="Properties\Resources.Designer.cs">
 			<DesignTime>True</DesignTime>
@@ -451,10 +442,10 @@
 			<DependentUpon>Resources.resx</DependentUpon>
 		</Compile>
 		<Compile Update="pump-analy\02-working\HydroPumpAnalyWorkingCheckedListCtrl.cs">
-		  <SubType>UserControl</SubType>
+			<SubType>UserControl</SubType>
 		</Compile>
 		<Compile Update="pump-analy\02-working\HydroPumpAnalyWorkingPumpListCtrl.cs">
-		  <SubType>UserControl</SubType>
+			<SubType>UserControl</SubType>
 		</Compile>
 	</ItemGroup>
 
@@ -466,7 +457,7 @@
 	</ItemGroup>
 
 	<ItemGroup>
-	  <Folder Include="19-pump\07-group\" />
+		<Folder Include="19-pump\07-group\" />
 	</ItemGroup>
 
 </Project>
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/Yw.WinFrmUI.Hydro.Core.csproj.user b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/Yw.WinFrmUI.Hydro.Core.csproj.user
index 254e97d..5939b44 100644
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/Yw.WinFrmUI.Hydro.Core.csproj.user
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/Yw.WinFrmUI.Hydro.Core.csproj.user
@@ -73,9 +73,6 @@
     <Compile Update="22-evaluation\SetHydroEvaluationModelDlg.cs">
       <SubType>Form</SubType>
     </Compile>
-    <Compile Update="99-view\01-q3d\HydroQ3dViewPage.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
     <Compile Update="07-mark\02-view\SetHydroMarkDlg.cs">
       <SubType>Form</SubType>
     </Compile>
diff --git a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/energy-analy/05-working/HydroEnergyAnalyWorkingListCtrl.cs b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/energy-analy/05-working/HydroEnergyAnalyWorkingListCtrl.cs
index 7653d17..ab3420c 100644
--- a/WinFrmUI/Yw.WinFrmUI.Hydro.Core/energy-analy/05-working/HydroEnergyAnalyWorkingListCtrl.cs
+++ b/WinFrmUI/Yw.WinFrmUI.Hydro.Core/energy-analy/05-working/HydroEnergyAnalyWorkingListCtrl.cs
@@ -15,7 +15,6 @@
 using System.Threading;
 using System.Threading.Tasks;
 using System.Windows.Forms;
-using Yw.WinFrmUI.Q3d;
 
 namespace Yw.WinFrmUI
 {

--
Gitblit v1.9.3