lixiaojun
2025-01-24 7b65f86343ca014b12894f09b7d62e8b5ac1f95d
单工况损失曲线增加上下游追踪和高亮显示
已修改15个文件
已添加5个文件
1149 ■■■■■ 文件已修改
Desktop/HStation.Desktop.Xhs.Core/AutoUpdater/AutoUpdateConfirmDlg.cs 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Entry/HStation.Entry.Xhs.Core/HStation.Entry.Xhs.Core.csproj 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Entry/HStation.Entry.Xhs.Core/Properties/PublishProfiles/FolderProfile.pubxml.user 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Hydro/HStation.Hydro.Core/HStation.Hydro.Core.csproj 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Hydro/Yw.Hydro.Core/Yw.Hydro.Core.csproj 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
WinFrmUI/HStation.WinFrmUI.Xhs.Core/02-project/01-import/00-core/ImportXhsProjectHelper.cs 37 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/02-bimface/SimulationBimfaceCtrl.cs 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/XhsProjectSimulationCorePage.cs 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WinFrmUI/HStation.WinFrmUI.Xhs.Core/Properties/PublishProfiles/FolderProfile.pubxml.user 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
WinFrmUI/Yw.WinFrmUI.Bimface.Core/01-interop/01-interop3d/BimfaceInterop3dContainer.cs 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WinFrmUI/Yw.WinFrmUI.Bimface.Core/01-interop/01-interop3d/IBimfaceInterop3dContainer.cs 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WinFrmUI/Yw.WinFrmUI.Bimface.Core/Yw.WinFrmUI.Bimface.Core.csproj 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WinFrmUI/Yw.WinFrmUI.Bimface.Core/bimface/html/Interop3d.html 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WinFrmUI/Yw.WinFrmUI.Bimface.Core/bimface/js/LogicBodyGlowEffect.js 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WinFrmUI/Yw.WinFrmUI.Bimface.Core/bimface/js/LogicOutlineGlowEffect.js 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/01-curve/HydroSingleWorkingLossCurveCtrl.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/01-curve/HydroSingleWorkingLossCurveInteropCtrl.Designer.cs 347 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/01-curve/HydroSingleWorkingLossCurveInteropCtrl.cs 382 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/01-curve/HydroSingleWorkingLossCurveInteropCtrl.resx 126 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WinFrmUI/Yw.WinFrmUI.Hydro.Core/Yw.WinFrmUI.Hydro.Core.csproj 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Desktop/HStation.Desktop.Xhs.Core/AutoUpdater/AutoUpdateConfirmDlg.cs
@@ -30,10 +30,10 @@
        {
            var description = VersionHelper.GetServerDescription(UpdateConfigHelper.ServerIP, UpdateConfigHelper.ServerPort);
            this.txtDescription.EditValue = description;
            if (string.IsNullOrEmpty(description))
            {
                this.itemForDescription.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Never;
            }
            //if (string.IsNullOrEmpty(description))
            //{
            //    this.itemForDescription.Visibility = DevExpress.XtraLayout.Utils.LayoutVisibility.Never;
            //}
        }
        //确定事件
Entry/HStation.Entry.Xhs.Core/HStation.Entry.Xhs.Core.csproj
@@ -20,7 +20,7 @@
      <PackageReference Include="Yw.Application.Basic.Core" Version="3.3.2" />
      <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.7.9" />
      <PackageReference Include="Yw.Application.Hydro.Core" Version="3.8.0" />
      <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" />
Entry/HStation.Entry.Xhs.Core/Properties/PublishProfiles/FolderProfile.pubxml.user
@@ -5,7 +5,7 @@
<Project>
  <PropertyGroup>
    <_PublishTargetUrl>D:\WorkData\git\HStation\XHS\Entry\HStation.Entry.Xhs.Core\bin\Release\net6.0\publish\</_PublishTargetUrl>
    <History>True|2025-01-23T02:54:42.2796686Z;True|2025-01-22T07:53:29.9931150+08:00;True|2025-01-21T11:37:36.9296374+08:00;True|2025-01-20T10:42:21.8992153+08:00;True|2025-01-20T10:41:30.8562468+08:00;True|2025-01-20T10:36:54.9849821+08:00;True|2025-01-20T10:31:16.0442319+08:00;True|2025-01-13T15:07:40.9182715+08:00;True|2025-01-13T12:08:58.0115763+08:00;True|2025-01-13T12:08:44.3187386+08:00;True|2025-01-13T12:07:41.4659157+08:00;True|2025-01-13T11:53:47.1828627+08:00;True|2025-01-13T11:38:53.6150404+08:00;True|2025-01-13T11:37:14.9075336+08:00;True|2025-01-13T11:35:23.3939940+08:00;True|2025-01-13T11:33:41.6199459+08:00;True|2025-01-13T11:32:15.2734783+08:00;True|2025-01-13T11:30:39.9296756+08:00;True|2025-01-13T11:25:02.3605923+08:00;True|2025-01-13T11:21:03.0110309+08:00;True|2025-01-13T11:17:46.3662069+08:00;True|2025-01-08T09:44:09.5132234+08:00;True|2024-09-03T11:22:43.3813050+08:00;True|2024-09-03T11:06:18.0799295+08:00;True|2024-09-03T10:52:25.3198740+08:00;True|2024-09-02T09:16:17.5197059+08:00;False|2024-09-02T09:08:02.4504522+08:00;True|2024-06-20T12:16:07.3854116+08:00;True|2024-06-18T09:13:21.8960491+08:00;True|2024-06-12T18:55:43.2697624+08:00;True|2024-06-12T18:54:42.2191664+08:00;True|2024-06-12T18:37:39.2735086+08:00;True|2024-06-12T18:32:59.2340941+08:00;True|2024-06-12T18:18:57.9018714+08:00;True|2024-06-12T18:13:13.4471521+08:00;True|2024-06-12T18:11:38.4803257+08:00;True|2024-06-12T18:10:00.3753638+08:00;True|2024-06-12T18:03:08.9521607+08:00;True|2024-06-12T17:59:46.2755740+08:00;True|2024-06-12T17:58:01.8017051+08:00;True|2024-06-12T17:56:20.6946001+08:00;True|2024-06-12T17:32:53.8291604+08:00;True|2024-06-12T17:32:38.6492118+08:00;False|2024-06-12T17:32:17.0260105+08:00;True|2024-06-12T17:08:59.9367775+08:00;True|2024-06-12T16:32:42.3320305+08:00;True|2024-06-07T13:34:17.3014803+08:00;True|2024-06-07T13:20:33.5124438+08:00;True|2024-06-07T10:24:47.0351087+08:00;True|2024-06-05T17:04:55.4017239+08:00;True|2024-06-05T16:05:35.1432805+08:00;True|2024-06-05T15:18:06.1797165+08:00;True|2024-06-05T13:53:59.9366676+08:00;True|2024-06-05T13:43:45.7009774+08:00;True|2024-06-05T13:38:18.1415782+08:00;True|2024-06-05T12:14:05.4745826+08:00;True|2024-06-05T12:10:02.8443283+08:00;True|2024-06-02T18:41:28.5233205+08:00;True|2024-06-02T18:21:27.5679625+08:00;True|2024-06-02T17:34:02.6234679+08:00;True|2024-06-02T16:58:23.9422671+08:00;True|2024-06-02T16:16:43.6949096+08:00;True|2024-06-02T14:44:06.8963915+08:00;True|2024-06-02T11:10:51.5587482+08:00;True|2024-06-01T11:30:39.5033584+08:00;True|2024-05-30T16:29:38.0730664+08:00;True|2024-05-30T15:16:14.5429969+08:00;True|2024-05-29T17:31:27.5349115+08:00;True|2024-05-29T16:49:44.3085849+08:00;True|2024-05-29T10:46:15.3071701+08:00;True|2024-05-28T16:21:22.2987178+08:00;True|2024-05-28T11:55:02.0680294+08:00;True|2024-05-24T09:27:50.0479340+08:00;True|2024-05-23T14:16:32.3824342+08:00;True|2024-05-23T10:51:43.4383910+08:00;True|2024-05-22T11:19:10.1709647+08:00;True|2024-05-22T11:12:47.8835237+08:00;True|2024-05-22T10:43:34.7720709+08:00;True|2024-05-21T17:25:46.9831973+08:00;True|2024-05-21T12:11:55.2774332+08:00;True|2024-05-13T10:32:18.9951394+08:00;True|2024-05-09T09:53:09.1673089+08:00;True|2024-05-08T17:18:58.3017566+08:00;True|2024-05-08T11:15:08.3734126+08:00;True|2024-05-07T10:59:04.2016283+08:00;True|2024-05-07T10:58:56.6254107+08:00;True|2024-05-07T10:56:03.7274034+08:00;True|2024-05-07T10:55:53.5496684+08:00;True|2024-05-07T10:55:41.1246352+08:00;True|2024-05-07T09:57:18.3908307+08:00;True|2024-05-06T18:17:15.0427456+08:00;True|2024-05-06T17:38:00.0855585+08:00;True|2024-05-06T14:04:15.4665470+08:00;True|2024-05-06T09:38:06.9447096+08:00;False|2024-05-06T09:37:21.4257032+08:00;True|2024-04-30T10:27:11.6268274+08:00;True|2024-04-29T17:32:47.8657162+08:00;True|2024-04-29T17:26:03.4222331+08:00;True|2024-04-29T15:01:02.7501034+08:00;True|2024-04-29T14:40:23.2902896+08:00;</History>
    <History>True|2025-01-24T01:10:22.0248945Z;True|2025-01-23T10:54:42.2796686+08:00;True|2025-01-22T07:53:29.9931150+08:00;True|2025-01-21T11:37:36.9296374+08:00;True|2025-01-20T10:42:21.8992153+08:00;True|2025-01-20T10:41:30.8562468+08:00;True|2025-01-20T10:36:54.9849821+08:00;True|2025-01-20T10:31:16.0442319+08:00;True|2025-01-13T15:07:40.9182715+08:00;True|2025-01-13T12:08:58.0115763+08:00;True|2025-01-13T12:08:44.3187386+08:00;True|2025-01-13T12:07:41.4659157+08:00;True|2025-01-13T11:53:47.1828627+08:00;True|2025-01-13T11:38:53.6150404+08:00;True|2025-01-13T11:37:14.9075336+08:00;True|2025-01-13T11:35:23.3939940+08:00;True|2025-01-13T11:33:41.6199459+08:00;True|2025-01-13T11:32:15.2734783+08:00;True|2025-01-13T11:30:39.9296756+08:00;True|2025-01-13T11:25:02.3605923+08:00;True|2025-01-13T11:21:03.0110309+08:00;True|2025-01-13T11:17:46.3662069+08:00;True|2025-01-08T09:44:09.5132234+08:00;True|2024-09-03T11:22:43.3813050+08:00;True|2024-09-03T11:06:18.0799295+08:00;True|2024-09-03T10:52:25.3198740+08:00;True|2024-09-02T09:16:17.5197059+08:00;False|2024-09-02T09:08:02.4504522+08:00;True|2024-06-20T12:16:07.3854116+08:00;True|2024-06-18T09:13:21.8960491+08:00;True|2024-06-12T18:55:43.2697624+08:00;True|2024-06-12T18:54:42.2191664+08:00;True|2024-06-12T18:37:39.2735086+08:00;True|2024-06-12T18:32:59.2340941+08:00;True|2024-06-12T18:18:57.9018714+08:00;True|2024-06-12T18:13:13.4471521+08:00;True|2024-06-12T18:11:38.4803257+08:00;True|2024-06-12T18:10:00.3753638+08:00;True|2024-06-12T18:03:08.9521607+08:00;True|2024-06-12T17:59:46.2755740+08:00;True|2024-06-12T17:58:01.8017051+08:00;True|2024-06-12T17:56:20.6946001+08:00;True|2024-06-12T17:32:53.8291604+08:00;True|2024-06-12T17:32:38.6492118+08:00;False|2024-06-12T17:32:17.0260105+08:00;True|2024-06-12T17:08:59.9367775+08:00;True|2024-06-12T16:32:42.3320305+08:00;True|2024-06-07T13:34:17.3014803+08:00;True|2024-06-07T13:20:33.5124438+08:00;True|2024-06-07T10:24:47.0351087+08:00;True|2024-06-05T17:04:55.4017239+08:00;True|2024-06-05T16:05:35.1432805+08:00;True|2024-06-05T15:18:06.1797165+08:00;True|2024-06-05T13:53:59.9366676+08:00;True|2024-06-05T13:43:45.7009774+08:00;True|2024-06-05T13:38:18.1415782+08:00;True|2024-06-05T12:14:05.4745826+08:00;True|2024-06-05T12:10:02.8443283+08:00;True|2024-06-02T18:41:28.5233205+08:00;True|2024-06-02T18:21:27.5679625+08:00;True|2024-06-02T17:34:02.6234679+08:00;True|2024-06-02T16:58:23.9422671+08:00;True|2024-06-02T16:16:43.6949096+08:00;True|2024-06-02T14:44:06.8963915+08:00;True|2024-06-02T11:10:51.5587482+08:00;True|2024-06-01T11:30:39.5033584+08:00;True|2024-05-30T16:29:38.0730664+08:00;True|2024-05-30T15:16:14.5429969+08:00;True|2024-05-29T17:31:27.5349115+08:00;True|2024-05-29T16:49:44.3085849+08:00;True|2024-05-29T10:46:15.3071701+08:00;True|2024-05-28T16:21:22.2987178+08:00;True|2024-05-28T11:55:02.0680294+08:00;True|2024-05-24T09:27:50.0479340+08:00;True|2024-05-23T14:16:32.3824342+08:00;True|2024-05-23T10:51:43.4383910+08:00;True|2024-05-22T11:19:10.1709647+08:00;True|2024-05-22T11:12:47.8835237+08:00;True|2024-05-22T10:43:34.7720709+08:00;True|2024-05-21T17:25:46.9831973+08:00;True|2024-05-21T12:11:55.2774332+08:00;True|2024-05-13T10:32:18.9951394+08:00;True|2024-05-09T09:53:09.1673089+08:00;True|2024-05-08T17:18:58.3017566+08:00;True|2024-05-08T11:15:08.3734126+08:00;True|2024-05-07T10:59:04.2016283+08:00;True|2024-05-07T10:58:56.6254107+08:00;True|2024-05-07T10:56:03.7274034+08:00;True|2024-05-07T10:55:53.5496684+08:00;True|2024-05-07T10:55:41.1246352+08:00;True|2024-05-07T09:57:18.3908307+08:00;True|2024-05-06T18:17:15.0427456+08:00;True|2024-05-06T17:38:00.0855585+08:00;True|2024-05-06T14:04:15.4665470+08:00;True|2024-05-06T09:38:06.9447096+08:00;False|2024-05-06T09:37:21.4257032+08:00;True|2024-04-30T10:27:11.6268274+08:00;True|2024-04-29T17:32:47.8657162+08:00;True|2024-04-29T17:26:03.4222331+08:00;True|2024-04-29T15:01:02.7501034+08:00;</History>
    <LastFailureDetails />
  </PropertyGroup>
</Project>
Hydro/HStation.Hydro.Core/HStation.Hydro.Core.csproj
@@ -7,7 +7,7 @@
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Yw.Service.Hydro.Core" Version="5.0.7" />
    <PackageReference Include="Yw.Service.Hydro.Core" Version="5.0.8" />
  </ItemGroup>
  <ItemGroup>
Hydro/Yw.Hydro.Core/Yw.Hydro.Core.csproj
@@ -8,7 +8,7 @@
  <ItemGroup>
    <PackageReference Include="Yw.Geometry.Core" Version="3.3.2" />
    <PackageReference Include="Yw.Service.Hydro.Core" Version="5.0.7" />
    <PackageReference Include="Yw.Service.Hydro.Core" Version="5.0.8" />
  </ItemGroup>
  <ItemGroup>
WinFrmUI/HStation.WinFrmUI.Xhs.Core/02-project/01-import/00-core/ImportXhsProjectHelper.cs
@@ -333,8 +333,8 @@
                return true;
            }
            var bimfaceId = await Yw.WinFrmUI.BimfaceHelper.UploadFile(rvtFileInfo.FullName);//正式代码
            //var bimfaceId = 10000899666805;//测试用例  åˆ¶æ°®å¾ªçޝ:10000884893369  10000894297457  10000895957527  10000896316958 10000896755736
            //var bimfaceId = await Yw.WinFrmUI.BimfaceHelper.UploadFile(rvtFileInfo.FullName);//正式代码
            var bimfaceId = 10000884893369;//测试用例  åˆ¶æ°®å¾ªçޝ:10000884893369  10000894297457  10000895957527  10000896316958 10000896755736 10000899666805
            if (bimfaceId < 1)
            {
                feedBackMsg?.Invoke("Revit模型文件上传失败!!!", Color.Red);
@@ -404,39 +404,14 @@
            feedBackProgress?.Invoke(100, 60);
            feedBackMsg?.Invoke("正在进行模型轻量化...", Color.Black);
            var bimfaceTranslateStatus = await Yw.WinFrmUI.BimfaceHelper.TranslateRvtFile(bimfaceId);//发起转换
            //var bimfaceTranslateStatus = Yw.BIMFace.eTranslateStatus.Processing;//测试代码
            //var bimfaceTranslateStatus = await Yw.WinFrmUI.BimfaceHelper.TranslateRvtFile(bimfaceId);//发起转换
            var bimfaceTranslateStatus = Yw.BIMFace.eTranslateStatus.Processing;//测试代码
            if (bimfaceTranslateStatus != Yw.BIMFace.eTranslateStatus.Success)
            {
                var dlgResult = XtraMessageBox.Show("Bimface模型轻量化需要一定的时间,是否继续等待?", "询问", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                if (dlgResult == DialogResult.Yes)
                {
                    await Yw.WinFrmUI.BimfaceHelper.WaitFileTranslateStatusUntilSuccess(bimfaceId, 3000);
                    feedBackMsg?.Invoke("模型轻量化完成。。。", Color.Green);
                }
                else
                {
                    bol = await BLLFactory<Yw.BLL.BimfaceFile>.Instance.UpdateFileStatus(vm.BimfaceFile.ID, (int)Yw.Bimface.eFileStatus.Converting);
                    if (bol)
                    {
                        vm.BimfaceFile.FileStatus = (int)Yw.Bimface.eFileStatus.Converting;
                    }
                    else
                    {
                        feedBackMsg?.Invoke("模型文件状态更新失败!!!", Color.Red);
                    }
                    feedBackMsg?.Invoke("跳过模型轻量化等待。。。", Color.Black);
                    feedBackMsg?.Invoke("项目导入结束。。。", Color.Blue);
                    feedBackProgress?.Invoke(100, 100);
                    return true;
                }
                await Yw.WinFrmUI.BimfaceHelper.WaitFileTranslateStatusUntilSuccess(bimfaceId, 3000);
            }
            else
            {
                feedBackMsg?.Invoke("模型轻量化完成。。。", Color.Green);
            }
            feedBackMsg?.Invoke("模型轻量化完成。。。", Color.Green);
            feedBackProgress?.Invoke(100, 90);
            #endregion
WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/02-bimface/SimulationBimfaceCtrl.cs
@@ -578,5 +578,45 @@
        #endregion
        #region ä¸šåŠ¡æ•´ä½“å‘å…‰æ•ˆæžœ
        /// <summary>
        /// è®¾ç½®ä¸šåŠ¡æ•´ä½“å‘å…‰æ•ˆæžœ
        /// </summary>
        public async Task SetLogicBodyGlowEffect(List<string> obj)
        {
            await _bimfaceInteropContainer?.SetLogicBodyGlowEffect(obj);
        }
        /// <summary>
        /// ç§»é™¤ä¸šåŠ¡æ•´ä½“å‘å…‰æ•ˆæžœ
        /// </summary>
        public async Task RemoveLogicBodyGlowEffect()
        {
            await _bimfaceInteropContainer?.RemoveLogicBodyGlowEffect();
        }
        #endregion
        #region ä¸šåŠ¡è½®å»“çº¿å‘å…‰æ•ˆæžœ
        /// <summary>
        /// è®¾ç½®ä¸šåŠ¡è½®å»“çº¿å‘å…‰æ•ˆæžœ
        /// </summary>
        public async Task SetLogicOutlineGlowEffect(List<string> obj)
        {
            await _bimfaceInteropContainer?.SetLogicOutlineGlowEffect(obj);
        }
        /// <summary>
        /// ç§»é™¤ä¸šåŠ¡è½®å»“çº¿å‘å…‰æ•ˆæžœ
        /// </summary>
        public async Task RemoveLogicOutlineGlowEffect()
        {
            await _bimfaceInteropContainer?.RemoveLogicOutlineGlowEffect();
        }
        #endregion
    }
}
WinFrmUI/HStation.WinFrmUI.Xhs.Core/03-simulation/06-simulation/XhsProjectSimulationCorePage.cs
@@ -2580,7 +2580,7 @@
            Calcu();
        }
        #endregion æ°´åŠ›è®¡ç®—
        #endregion
        #region å¯¼å‡ºæŠ¥å‘Š
@@ -2622,7 +2622,7 @@
            dlg.ShowDialog();
        }
        #endregion å¯¼å‡ºæŠ¥å‘Š
        #endregion
        #region å½“前工况
@@ -3006,19 +3006,27 @@
        #region æŸå¤±æ›²çº¿
        //单工况损失曲线控件
        private HydroSingleWorkingLossCurveCtrl _singleWorkingLossCurveCtrl = null;
        private HydroSingleWorkingLossCurveInteropCtrl _singleWorkingLossCurveCtrl = null;
        //获取单工况损失曲线控件
        private HydroSingleWorkingLossCurveCtrl GetSingleWorkingLossCurveCtrl()
        private HydroSingleWorkingLossCurveInteropCtrl GetSingleWorkingLossCurveCtrl()
        {
            if (_singleWorkingLossCurveCtrl == null)
            {
                _singleWorkingLossCurveCtrl = new HydroSingleWorkingLossCurveCtrl();
                _singleWorkingLossCurveCtrl = new HydroSingleWorkingLossCurveInteropCtrl();
                _singleWorkingLossCurveCtrl.Dock = DockStyle.Fill;
                _singleWorkingLossCurveCtrl.HydroClickEvent += (code) =>
                {
                    var visual = GetVisual(code);
                    SelectVisual(visual, eSimulationVisualSource.None);
                };
                _singleWorkingLossCurveCtrl.HydroSpecialDisplayEvent += (list) =>
                {
                    _bimfaceCtrl?.SetLogicOutlineGlowEffect(list);
                };
                _singleWorkingLossCurveCtrl.HydroCancelSpecialDisplayEvent += () =>
                {
                    _bimfaceCtrl?.RemoveLogicOutlineGlowEffect();
                };
            }
            return _singleWorkingLossCurveCtrl;
@@ -3033,7 +3041,7 @@
                {
                    if (this.controlContainerBottom.Controls.Count > 0)
                    {
                        if (this.controlContainerBottom.Controls[0] is HydroSingleWorkingLossCurveCtrl)
                        if (this.controlContainerBottom.Controls[0] is HydroSingleWorkingLossCurveInteropCtrl)
                        {
                            return true;
                        }
@@ -3101,7 +3109,7 @@
            }
        }
        #endregion æŸå¤±æ›²çº¿
        #endregion
        #region æ–¹æ¡ˆç®¡ç†
@@ -3177,5 +3185,6 @@
        }
        #endregion æ–¹æ¡ˆç®¡ç†
    }
}
WinFrmUI/HStation.WinFrmUI.Xhs.Core/Properties/PublishProfiles/FolderProfile.pubxml.user
@@ -4,7 +4,7 @@
-->
<Project>
  <PropertyGroup>
    <History>True|2025-01-23T05:56:43.0505103Z;</History>
    <History>True|2025-01-23T06:38:49.1770007Z;True|2025-01-23T13:56:43.0505103+08:00;</History>
    <LastFailureDetails />
  </PropertyGroup>
</Project>
WinFrmUI/Yw.WinFrmUI.Bimface.Core/01-interop/01-interop3d/BimfaceInterop3dContainer.cs
@@ -597,5 +597,65 @@
        #endregion
        #region ä¸šåŠ¡æ•´ä½“å‘å…‰
        /// <summary>
        /// è®¾ç½®ä¸šåŠ¡æ•´ä½“å‘å…‰æ•ˆæžœ
        /// </summary>
        public async Task SetLogicBodyGlowEffect(List<string> obj)
        {
            if (!_isViewInitialized)
            {
                return;
            }
            await this.webViewControl1.EvaluateScriptAsync("setLogicBodyGlowEffect", obj);
        }
        /// <summary>
        /// ç§»é™¤ä¸šåŠ¡æ•´ä½“å‘å…‰æ•ˆæžœ
        /// </summary>
        public async Task RemoveLogicBodyGlowEffect()
        {
            if (!_isViewInitialized)
            {
                return;
            }
            await this.webViewControl1.EvaluateScriptAsync("removeLogicBodyGlowEffect()");
        }
        #endregion
        #region ä¸šåŠ¡è½®å»“çº¿å‘å…‰æ•ˆæžœ
        /// <summary>
        /// è®¾ç½®ä¸šåŠ¡è½®å»“çº¿å‘å…‰æ•ˆæžœ
        /// </summary>
        public async Task SetLogicOutlineGlowEffect(List<string> obj)
        {
            if (!_isViewInitialized)
            {
                return;
            }
            await this.webViewControl1.EvaluateScriptAsync("setLogicOutlineGlowEffect", obj);
        }
        /// <summary>
        /// ç§»é™¤ä¸šåŠ¡è½®å»“çº¿å‘å…‰æ•ˆæžœ
        /// </summary>
        public async Task RemoveLogicOutlineGlowEffect()
        {
            if (!_isViewInitialized)
            {
                return;
            }
            await this.webViewControl1.EvaluateScriptAsync("removeLogicOutlineGlowEffect()");
        }
        #endregion
    }
}
WinFrmUI/Yw.WinFrmUI.Bimface.Core/01-interop/01-interop3d/IBimfaceInterop3dContainer.cs
@@ -236,5 +236,36 @@
        #endregion
        #region ä¸šåŠ¡æž„ä»¶æ•´ä½“å‘å…‰
        /// <summary>
        /// è®¾ç½®ä¸šåŠ¡æ•´ä½“å‘å…‰æ•ˆæžœ
        /// </summary>
        Task SetLogicBodyGlowEffect(List<string> obj);
        /// <summary>
        /// ç§»é™¤ä¸šåŠ¡æ•´ä½“å‘å…‰æ•ˆæžœ
        /// </summary>
        Task RemoveLogicBodyGlowEffect();
        #endregion
        #region ä¸šåŠ¡æž„ä»¶è½®å»“çº¿å‘å…‰
        /// <summary>
        /// è®¾ç½®ä¸šåŠ¡è½®å»“çº¿å‘å…‰æ•ˆæžœ
        /// </summary>
        Task SetLogicOutlineGlowEffect(List<string> obj);
        /// <summary>
        /// ç§»é™¤ä¸šåŠ¡è½®å»“çº¿å‘å…‰æ•ˆæžœ
        /// </summary>
        Task RemoveLogicOutlineGlowEffect();
        #endregion
    }
}
WinFrmUI/Yw.WinFrmUI.Bimface.Core/Yw.WinFrmUI.Bimface.Core.csproj
@@ -54,10 +54,12 @@
    <None Remove="bimface\js\DrawableContainer.js" />
    <None Remove="bimface\js\GetComponents.js" />
    <None Remove="bimface\js\Layer.js" />
    <None Remove="bimface\js\LogicBodyGlowEffect.js" />
    <None Remove="bimface\js\LogicCalcuCustomLabel.js" />
    <None Remove="bimface\js\LogicFlowEffect.js" />
    <None Remove="bimface\js\LogicMarkLeadLabel.js" />
    <None Remove="bimface\js\LogicMonitor.js" />
    <None Remove="bimface\js\LogicOutlineGlowEffect.js" />
    <None Remove="bimface\js\Marker3dContainer.js" />
    <None Remove="bimface\js\Panel.js" />
    <None Remove="bimface\js\SelectedComponents.js" />
@@ -157,6 +159,12 @@
    <Content Include="bimface\js\Layer.js">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
    <Content Include="bimface\js\LogicBodyGlowEffect.js">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
    <Content Include="bimface\js\LogicOutlineGlowEffect.js">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
    <Content Include="bimface\js\LogicMonitor.js">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
WinFrmUI/Yw.WinFrmUI.Bimface.Core/bimface/html/Interop3d.html
@@ -102,6 +102,8 @@
                        _callBackObj.ClickOut(JSON.stringify(objectdata));
                    }
                });
                //开启构件发光效果
                _viewer.enableGlowEffect(true);
            }
            else {
                _callBackObj.LoadViewFailed("未定义ViewType:" + viewMetaData.viewType);
@@ -137,6 +139,8 @@
<script src="../js/LogicFlowEffect.js"></script>
<script src="../js/Marker3dContainer.js"></script>
<script src="../js/LogicMonitor.js"></script>
<script src="../js/LogicBodyGlowEffect.js"></script>
<script src="../js/LogicOutlineGlowEffect.js"></script>
<script src="js/CameraStatus.js"></script>
<script src="js/GetComponents.js"></script>
WinFrmUI/Yw.WinFrmUI.Bimface.Core/bimface/js/LogicBodyGlowEffect.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,33 @@
//id列表
let _logicBodyGlowIds = new Set();
//设置物体整体发光效果
//"body"为整体发光,"outline"为轮廓线发光
function setLogicBodyGlowEffect(obj) {
    removeLogicBodyGlowEffect();
    if (obj == null || obj.length < 1) {
        return;
    }
    _modeler.setGlowEffectById(obj, { type: "body", color: new Glodon.Web.Graphics.Color(139, 0, 0, 1), intensity: 0.3, spread: 3 });
    _viewer.render();
    _logicBodyGlowIds = new Set(obj);
}
//移除物体整体发光效果
function removeLogicBodyGlowEffect() {
    if (_logicBodyGlowIds.size > 0) {
        var myArray = Array.from(_logicBodyGlowIds);
        _modeler.removeGlowEffectById(myArray);
        _viewer.render();
        _logicBodyGlowIds.clear();
    }
}
WinFrmUI/Yw.WinFrmUI.Bimface.Core/bimface/js/LogicOutlineGlowEffect.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,33 @@
//id列表
let _logicOutlineGlowIds = new Set();
//设置物体轮廓线发光效果
//"body"为整体发光,"outline"为轮廓线发光
function setLogicOutlineGlowEffect(obj) {
    removeLogicOutlineGlowEffect();
    if (obj == null || obj.length < 1) {
        return;
    }
    _modeler.setGlowEffectById(obj, { type: "outline", color: new Glodon.Web.Graphics.Color(139, 0, 0, 1), intensity: 0.4, spread: 3 });
    _viewer.render();
    _logicOutlineGlowIds = new Set(obj);
}
//移除物体轮廓线发光效果
function removeLogicOutlineGlowEffect() {
    if (_logicOutlineGlowIds.size > 0) {
        var myArray = Array.from(_logicOutlineGlowIds);
        _modeler.removeGlowEffectById(myArray);
        _viewer.render();
        _logicOutlineGlowIds.clear();
    }
}
WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/01-curve/HydroSingleWorkingLossCurveCtrl.cs
@@ -45,7 +45,7 @@
            }
            var allPathList1 = network.AnalyzeUpstreamPath(node, calcuResult.EPAnetCalcuResult);
            var allPathList2 = network.AnalyzeDownstreamPath(node, calcuResult.EPAnetCalcuResult);
            var allPathList= allPathList1.Concat(allPathList2).ToList();
            var allPathList = allPathList1.Concat(allPathList2).ToList();
            var allEpaLossList = network.GetChartNodeByPathLinks(allPathList, calcuResult.EPAnetCalcuResult);
            var allNodeLossList = new List<HydroNodeLossViewModel>();
            allEpaLossList?.ForEach(x =>
WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/01-curve/HydroSingleWorkingLossCurveInteropCtrl.Designer.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,347 @@
namespace Yw.WinFrmUI
{
    partial class HydroSingleWorkingLossCurveInteropCtrl
    {
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;
        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }
        #region Component Designer generated code
        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            components = new Container();
            DevExpress.XtraCharts.TextAnnotation textAnnotation1 = new DevExpress.XtraCharts.TextAnnotation();
            DevExpress.XtraCharts.ChartAnchorPoint chartAnchorPoint1 = new DevExpress.XtraCharts.ChartAnchorPoint();
            DevExpress.XtraCharts.FreePosition freePosition1 = new DevExpress.XtraCharts.FreePosition();
            DevExpress.XtraCharts.XYDiagram xyDiagram1 = new DevExpress.XtraCharts.XYDiagram();
            DevExpress.XtraCharts.Series series1 = new DevExpress.XtraCharts.Series();
            DevExpress.XtraCharts.AreaSeriesView areaSeriesView1 = new DevExpress.XtraCharts.AreaSeriesView();
            DevExpress.XtraCharts.Series series2 = new DevExpress.XtraCharts.Series();
            DevExpress.XtraCharts.AreaSeriesView areaSeriesView2 = new DevExpress.XtraCharts.AreaSeriesView();
            lossBindingSource = new BindingSource(components);
            elevBindingSource = new BindingSource(components);
            chartControl1 = new DevExpress.XtraCharts.ChartControl();
            layoutControl1 = new DevExpress.XtraLayout.LayoutControl();
            ckSpecial = new DevExpress.XtraEditors.CheckEdit();
            ckStart = new DevExpress.XtraEditors.CheckEdit();
            ckEnd = new DevExpress.XtraEditors.CheckEdit();
            Root = new DevExpress.XtraLayout.LayoutControlGroup();
            layoutControlItem1 = new DevExpress.XtraLayout.LayoutControlItem();
            layoutControlItem2 = new DevExpress.XtraLayout.LayoutControlItem();
            layoutControlItem3 = new DevExpress.XtraLayout.LayoutControlItem();
            layoutControlItem4 = new DevExpress.XtraLayout.LayoutControlItem();
            emptySpaceItem1 = new DevExpress.XtraLayout.EmptySpaceItem();
            ((ISupportInitialize)lossBindingSource).BeginInit();
            ((ISupportInitialize)elevBindingSource).BeginInit();
            ((ISupportInitialize)chartControl1).BeginInit();
            ((ISupportInitialize)textAnnotation1).BeginInit();
            ((ISupportInitialize)xyDiagram1).BeginInit();
            ((ISupportInitialize)series1).BeginInit();
            ((ISupportInitialize)areaSeriesView1).BeginInit();
            ((ISupportInitialize)series2).BeginInit();
            ((ISupportInitialize)areaSeriesView2).BeginInit();
            ((ISupportInitialize)layoutControl1).BeginInit();
            layoutControl1.SuspendLayout();
            ((ISupportInitialize)ckSpecial.Properties).BeginInit();
            ((ISupportInitialize)ckStart.Properties).BeginInit();
            ((ISupportInitialize)ckEnd.Properties).BeginInit();
            ((ISupportInitialize)Root).BeginInit();
            ((ISupportInitialize)layoutControlItem1).BeginInit();
            ((ISupportInitialize)layoutControlItem2).BeginInit();
            ((ISupportInitialize)layoutControlItem3).BeginInit();
            ((ISupportInitialize)layoutControlItem4).BeginInit();
            ((ISupportInitialize)emptySpaceItem1).BeginInit();
            SuspendLayout();
            //
            // lossBindingSource
            //
            lossBindingSource.DataSource = typeof(HydroLossCurvePointVieModel);
            //
            // elevBindingSource
            //
            elevBindingSource.DataSource = typeof(HydroLossCurvePointVieModel);
            //
            // chartControl1
            //
            textAnnotation1.AnchorPoint = chartAnchorPoint1;
            textAnnotation1.AnnotationID = 1;
            textAnnotation1.AutoHeight = true;
            textAnnotation1.AutoWidth = true;
            textAnnotation1.ConnectorStyle = DevExpress.XtraCharts.AnnotationConnectorStyle.None;
            textAnnotation1.Name = "Annotation 1";
            freePosition1.DockCorner = DevExpress.XtraCharts.DockCorner.RightTop;
            freePosition1.InnerIndents.Left = 1160;
            freePosition1.InnerIndents.Top = 35;
            textAnnotation1.ShapePosition = freePosition1;
            chartControl1.AnnotationRepository.AddRange(new DevExpress.XtraCharts.Annotation[] { textAnnotation1 });
            chartControl1.CrosshairOptions.ContentShowMode = DevExpress.XtraCharts.CrosshairContentShowMode.Label;
            chartControl1.CrosshairOptions.ShowArgumentLabels = true;
            chartControl1.CrosshairOptions.ShowValueLabels = true;
            chartControl1.CrosshairOptions.ShowValueLine = true;
            chartControl1.DataSource = elevBindingSource;
            xyDiagram1.AxisX.CrosshairAxisLabelOptions.Visibility = DevExpress.Utils.DefaultBoolean.True;
            xyDiagram1.AxisX.GridLines.Visible = true;
            xyDiagram1.AxisX.MinorCount = 1;
            xyDiagram1.AxisX.NumericScaleOptions.AutoGrid = false;
            xyDiagram1.AxisX.Tickmarks.MinorVisible = false;
            xyDiagram1.AxisX.Title.Text = "距离";
            xyDiagram1.AxisX.Visibility = DevExpress.Utils.DefaultBoolean.True;
            xyDiagram1.AxisX.VisibleInPanesSerializable = "-1";
            xyDiagram1.AxisX.WholeRange.EndSideMargin = 0D;
            xyDiagram1.AxisX.WholeRange.StartSideMargin = 0D;
            xyDiagram1.AxisY.GridLines.Visible = false;
            xyDiagram1.AxisY.MinorCount = 1;
            xyDiagram1.AxisY.NumericScaleOptions.AutoGrid = false;
            xyDiagram1.AxisY.Tickmarks.MinorVisible = false;
            xyDiagram1.AxisY.VisibleInPanesSerializable = "-1";
            xyDiagram1.EnableAxisXScrolling = true;
            xyDiagram1.EnableAxisXZooming = true;
            chartControl1.Diagram = xyDiagram1;
            chartControl1.Legend.AlignmentHorizontal = DevExpress.XtraCharts.LegendAlignmentHorizontal.Center;
            chartControl1.Legend.Direction = DevExpress.XtraCharts.LegendDirection.LeftToRight;
            chartControl1.Legend.LegendID = -1;
            chartControl1.Legend.MarkerMode = DevExpress.XtraCharts.LegendMarkerMode.CheckBox;
            chartControl1.Location = new Point(2, 26);
            chartControl1.Name = "chartControl1";
            chartControl1.Padding.Bottom = 10;
            chartControl1.Padding.Left = 20;
            chartControl1.Padding.Right = 10;
            chartControl1.Padding.Top = 10;
            chartControl1.SelectionMode = DevExpress.XtraCharts.ElementSelectionMode.Single;
            series1.ArgumentDataMember = "X";
            series1.CrosshairEnabled = DevExpress.Utils.DefaultBoolean.True;
            series1.CrosshairHighlightPoints = DevExpress.Utils.DefaultBoolean.True;
            series1.CrosshairLabelPattern = "总水头:{V:N1}m";
            series1.CrosshairLabelVisibility = DevExpress.Utils.DefaultBoolean.True;
            series1.CrosshairTextOptions.EnableAntialiasing = DevExpress.Utils.DefaultBoolean.True;
            series1.DataSource = lossBindingSource;
            series1.LabelsVisibility = DevExpress.Utils.DefaultBoolean.False;
            series1.LegendTextPattern = "总水头";
            series1.Name = "SeriesLoss";
            series1.SeriesID = 0;
            series1.ToolTipHintDataMember = "Name";
            series1.ToolTipSeriesPattern = "";
            series1.ValueDataMembersSerializable = "Y";
            areaSeriesView1.Color = Color.FromArgb(255, 192, 0);
            areaSeriesView1.EmptyPointOptions.FillStyle.FillMode = DevExpress.XtraCharts.FillMode.Solid;
            series1.View = areaSeriesView1;
            series2.ArgumentDataMember = "X";
            series2.CrosshairEnabled = DevExpress.Utils.DefaultBoolean.True;
            series2.CrosshairHighlightPoints = DevExpress.Utils.DefaultBoolean.True;
            series2.CrosshairLabelPattern = "高程:{V:N1}m";
            series2.CrosshairLabelVisibility = DevExpress.Utils.DefaultBoolean.True;
            series2.CrosshairTextOptions.EnableAntialiasing = DevExpress.Utils.DefaultBoolean.True;
            series2.DataSource = elevBindingSource;
            series2.LegendTextPattern = "高程";
            series2.Name = "SeriesElev";
            series2.SeriesID = 1;
            series2.ToolTipHintDataMember = "Name";
            series2.ToolTipSeriesPattern = "";
            series2.ValueDataMembersSerializable = "Y";
            areaSeriesView2.Color = Color.FromArgb(79, 129, 189);
            areaSeriesView2.EmptyPointOptions.FillStyle.FillMode = DevExpress.XtraCharts.FillMode.Solid;
            areaSeriesView2.Transparency = 0;
            series2.View = areaSeriesView2;
            chartControl1.SeriesSerializable = new DevExpress.XtraCharts.Series[]
    {
    series1,
    series2
    };
            chartControl1.SeriesTemplate.ArgumentDataMember = "X";
            chartControl1.SeriesTemplate.ToolTipHintDataMember = "Name";
            chartControl1.SeriesTemplate.ValueDataMembersSerializable = "Y";
            chartControl1.Size = new Size(989, 703);
            chartControl1.TabIndex = 0;
            chartControl1.ToolTipEnabled = DevExpress.Utils.DefaultBoolean.True;
            chartControl1.ToolTipOptions.ShowForSeries = true;
            chartControl1.CustomDrawCrosshair += chartControl1_CustomDrawCrosshair;
            chartControl1.MouseClick += chartControl1_MouseClick;
            //
            // layoutControl1
            //
            layoutControl1.Controls.Add(ckSpecial);
            layoutControl1.Controls.Add(ckStart);
            layoutControl1.Controls.Add(ckEnd);
            layoutControl1.Controls.Add(chartControl1);
            layoutControl1.Dock = DockStyle.Fill;
            layoutControl1.Location = new Point(0, 0);
            layoutControl1.Name = "layoutControl1";
            layoutControl1.OptionsCustomizationForm.DesignTimeCustomizationFormPositionAndSize = new Rectangle(1248, 442, 650, 400);
            layoutControl1.Root = Root;
            layoutControl1.Size = new Size(993, 731);
            layoutControl1.TabIndex = 1;
            layoutControl1.Text = "layoutControl1";
            //
            // ckSpecial
            //
            ckSpecial.EditValue = true;
            ckSpecial.Location = new Point(306, 2);
            ckSpecial.Name = "ckSpecial";
            ckSpecial.Properties.AutoWidth = true;
            ckSpecial.Properties.Caption = "";
            ckSpecial.Size = new Size(20, 20);
            ckSpecial.StyleController = layoutControl1;
            ckSpecial.TabIndex = 6;
            ckSpecial.CheckedChanged += ckSpecial_CheckedChanged;
            //
            // ckStart
            //
            ckStart.EditValue = true;
            ckStart.Location = new Point(66, 2);
            ckStart.Name = "ckStart";
            ckStart.Properties.AutoWidth = true;
            ckStart.Properties.Caption = "";
            ckStart.Size = new Size(20, 20);
            ckStart.StyleController = layoutControl1;
            ckStart.TabIndex = 5;
            ckStart.CheckedChanged += ckStart_CheckedChanged;
            //
            // ckEnd
            //
            ckEnd.EditValue = true;
            ckEnd.Location = new Point(186, 2);
            ckEnd.Name = "ckEnd";
            ckEnd.Properties.AutoWidth = true;
            ckEnd.Properties.Caption = "";
            ckEnd.Size = new Size(20, 20);
            ckEnd.StyleController = layoutControl1;
            ckEnd.TabIndex = 4;
            ckEnd.CheckedChanged += ckEnd_CheckedChanged;
            //
            // Root
            //
            Root.EnableIndentsWithoutBorders = DevExpress.Utils.DefaultBoolean.True;
            Root.GroupBordersVisible = false;
            Root.Items.AddRange(new DevExpress.XtraLayout.BaseLayoutItem[] { layoutControlItem1, layoutControlItem2, layoutControlItem3, layoutControlItem4, emptySpaceItem1 });
            Root.Name = "Root";
            Root.Padding = new DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0);
            Root.Size = new Size(993, 731);
            Root.TextVisible = false;
            //
            // layoutControlItem1
            //
            layoutControlItem1.Control = chartControl1;
            layoutControlItem1.Location = new Point(0, 24);
            layoutControlItem1.Name = "layoutControlItem1";
            layoutControlItem1.Size = new Size(993, 707);
            layoutControlItem1.TextSize = new Size(0, 0);
            layoutControlItem1.TextVisible = false;
            //
            // layoutControlItem2
            //
            layoutControlItem2.ContentHorzAlignment = DevExpress.Utils.HorzAlignment.Center;
            layoutControlItem2.ContentVertAlignment = DevExpress.Utils.VertAlignment.Center;
            layoutControlItem2.Control = ckEnd;
            layoutControlItem2.Location = new Point(120, 0);
            layoutControlItem2.MaxSize = new Size(120, 24);
            layoutControlItem2.MinSize = new Size(120, 24);
            layoutControlItem2.Name = "layoutControlItem2";
            layoutControlItem2.Size = new Size(120, 24);
            layoutControlItem2.SizeConstraintsType = DevExpress.XtraLayout.SizeConstraintsType.Custom;
            layoutControlItem2.Text = "下游追踪:";
            layoutControlItem2.TextSize = new Size(52, 14);
            //
            // layoutControlItem3
            //
            layoutControlItem3.ContentHorzAlignment = DevExpress.Utils.HorzAlignment.Center;
            layoutControlItem3.ContentVertAlignment = DevExpress.Utils.VertAlignment.Center;
            layoutControlItem3.Control = ckStart;
            layoutControlItem3.Location = new Point(0, 0);
            layoutControlItem3.MaxSize = new Size(120, 24);
            layoutControlItem3.MinSize = new Size(120, 24);
            layoutControlItem3.Name = "layoutControlItem3";
            layoutControlItem3.Size = new Size(120, 24);
            layoutControlItem3.SizeConstraintsType = DevExpress.XtraLayout.SizeConstraintsType.Custom;
            layoutControlItem3.Text = "上游追踪:";
            layoutControlItem3.TextSize = new Size(52, 14);
            //
            // layoutControlItem4
            //
            layoutControlItem4.ContentHorzAlignment = DevExpress.Utils.HorzAlignment.Center;
            layoutControlItem4.ContentVertAlignment = DevExpress.Utils.VertAlignment.Center;
            layoutControlItem4.Control = ckSpecial;
            layoutControlItem4.Location = new Point(240, 0);
            layoutControlItem4.MaxSize = new Size(120, 24);
            layoutControlItem4.MinSize = new Size(120, 24);
            layoutControlItem4.Name = "layoutControlItem4";
            layoutControlItem4.Size = new Size(120, 24);
            layoutControlItem4.SizeConstraintsType = DevExpress.XtraLayout.SizeConstraintsType.Custom;
            layoutControlItem4.Text = "高亮显示:";
            layoutControlItem4.TextSize = new Size(52, 14);
            //
            // emptySpaceItem1
            //
            emptySpaceItem1.AllowHotTrack = false;
            emptySpaceItem1.Location = new Point(360, 0);
            emptySpaceItem1.MinSize = new Size(1, 1);
            emptySpaceItem1.Name = "emptySpaceItem1";
            emptySpaceItem1.Size = new Size(633, 24);
            emptySpaceItem1.SizeConstraintsType = DevExpress.XtraLayout.SizeConstraintsType.Custom;
            emptySpaceItem1.TextSize = new Size(0, 0);
            //
            // HydroSingleWorkingLossCurveInteropCtrl
            //
            AutoScaleDimensions = new SizeF(7F, 14F);
            AutoScaleMode = AutoScaleMode.Font;
            Controls.Add(layoutControl1);
            Name = "HydroSingleWorkingLossCurveInteropCtrl";
            Size = new Size(993, 731);
            ((ISupportInitialize)lossBindingSource).EndInit();
            ((ISupportInitialize)elevBindingSource).EndInit();
            ((ISupportInitialize)textAnnotation1).EndInit();
            ((ISupportInitialize)xyDiagram1).EndInit();
            ((ISupportInitialize)areaSeriesView1).EndInit();
            ((ISupportInitialize)series1).EndInit();
            ((ISupportInitialize)areaSeriesView2).EndInit();
            ((ISupportInitialize)series2).EndInit();
            ((ISupportInitialize)chartControl1).EndInit();
            ((ISupportInitialize)layoutControl1).EndInit();
            layoutControl1.ResumeLayout(false);
            ((ISupportInitialize)ckSpecial.Properties).EndInit();
            ((ISupportInitialize)ckStart.Properties).EndInit();
            ((ISupportInitialize)ckEnd.Properties).EndInit();
            ((ISupportInitialize)Root).EndInit();
            ((ISupportInitialize)layoutControlItem1).EndInit();
            ((ISupportInitialize)layoutControlItem2).EndInit();
            ((ISupportInitialize)layoutControlItem3).EndInit();
            ((ISupportInitialize)layoutControlItem4).EndInit();
            ((ISupportInitialize)emptySpaceItem1).EndInit();
            ResumeLayout(false);
        }
        #endregion
        private DevExpress.XtraCharts.ChartControl chartControl1;
        private BindingSource lossBindingSource;
        private BindingSource elevBindingSource;
        private DevExpress.XtraLayout.LayoutControl layoutControl1;
        private DevExpress.XtraLayout.LayoutControlGroup Root;
        private DevExpress.XtraLayout.LayoutControlItem layoutControlItem1;
        private DevExpress.XtraEditors.CheckEdit ckSpecial;
        private DevExpress.XtraEditors.CheckEdit ckStart;
        private DevExpress.XtraEditors.CheckEdit ckEnd;
        private DevExpress.XtraLayout.LayoutControlItem layoutControlItem2;
        private DevExpress.XtraLayout.LayoutControlItem layoutControlItem3;
        private DevExpress.XtraLayout.LayoutControlItem layoutControlItem4;
        private DevExpress.XtraLayout.EmptySpaceItem emptySpaceItem1;
    }
}
WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/01-curve/HydroSingleWorkingLossCurveInteropCtrl.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,382 @@
using DevExpress.Drawing;
using DevExpress.Pdf.Native;
using DevExpress.XtraCharts;
using System.Data;
using Yw.DAL.Basic;
using Yw.EPAnet;
using Yw.Hydro;
namespace Yw.WinFrmUI
{
    public partial class HydroSingleWorkingLossCurveInteropCtrl : DevExpress.XtraEditors.XtraUserControl
    {
        public HydroSingleWorkingLossCurveInteropCtrl()
        {
            InitializeComponent();
            this.layoutControl1.SetupLayoutControl();
        }
        /// <summary>
        /// æ°´åŠ›ç‚¹å‡»äº‹ä»¶
        /// </summary>
        public event Action<string> HydroClickEvent;
        /// <summary>
        /// æ°´åŠ›ç‰¹æ®Šæ˜¾ç¤ºäº‹ä»¶
        /// </summary>
        public event Action<List<string>> HydroSpecialDisplayEvent;
        /// <summary>
        /// æ°´åŠ›å–æ¶ˆç‰¹æ®Šæ˜¾ç¤ºäº‹ä»¶
        /// </summary>
        public event Action HydroCancelSpecialDisplayEvent;
        private Yw.Model.HydroModelInfo _hydroInfo = null;//水力信息
        private HydroCalcuResult _calcuResult = null;//计算结果
        private Yw.Model.HydroVisualInfo _visual = null;//可见构件
        /// <summary>
        /// ç»‘定数据
        /// </summary>
        public void SetBindingData
            (
                Yw.Model.HydroModelInfo hydroInfo,
                HydroCalcuResult calcuResult,
                Yw.Model.HydroVisualInfo visual
            )
        {
            _hydroInfo = hydroInfo;
            _calcuResult = calcuResult;
            _visual = visual;
            Analy();
        }
        /// <summary>
        /// ç»‘定数据
        /// </summary>
        public void SetBindingData(List<HydroNodeLossViewModel> allNodeLossList)
        {
            AutoFitAxises(allNodeLossList);
            var allElevList = allNodeLossList?.Select(x => new HydroLossCurvePointVieModel(x.Code, x.Name, x.Distance, x.Elev)).ToList();
            this.elevBindingSource.DataSource = allElevList;
            this.elevBindingSource.ResetBindings(false);
            var allLossList = new List<HydroLossCurvePointVieModel>();
            allNodeLossList?.ForEach(x =>
            {
                allLossList.Add(new HydroLossCurvePointVieModel(x.Code, x.Name, x.Distance, x.StartHead));
                allLossList.Add(new HydroLossCurvePointVieModel(x.Code, x.Name, x.Distance, x.EndHead));
            });
            this.lossBindingSource.DataSource = allLossList;
            this.lossBindingSource.ResetBindings(false);
            if (allNodeLossList != null && allNodeLossList.Count > 0)
            {
                var startHead = allNodeLossList.Max(x => x.StartHead);
                var endHead = allNodeLossList.Min(x => x.EndHead);
                var allHeadLoss = startHead - endHead;
                var allMinorLoss = allNodeLossList.Sum(x => x.MinorLoss);
                var allForLoss = allHeadLoss - allMinorLoss;
                var sb = new StringBuilder();
                sb.AppendLine($"水头损失:{allHeadLoss:N2}m");
                sb.AppendLine($"局部损失:{allMinorLoss:N2}m");
                sb.AppendLine($"沿程损失:{allForLoss:N2}m");
                var anno = this.chartControl1.AnnotationRepository[0] as DevExpress.XtraCharts.TextAnnotation;
                anno.Text = sb.ToString();
                anno.AutoSize = true;
            }
        }
        //自动适应刻度
        private void AutoFitAxises(List<HydroNodeLossViewModel> allNodeLossList)
        {
            if (allNodeLossList == null || allNodeLossList.Count < 1)
            {
                return;
            }
            var diagram = this.chartControl1.Diagram as XYDiagram;
            #region Xè½´
            var allDistances = allNodeLossList.Select(x => x.Distance).Distinct().ToList();
            var distanceMax = allDistances.Max();
            diagram.AxisX.Tickmarks.MinorVisible = false;
            diagram.AxisX.WholeRange.SideMarginsValue = 0;
            if (distanceMax <= 10)
            {
                var maxValue = Math.Ceiling(distanceMax);
                diagram.AxisX.WholeRange.MinValue = 0;
                diagram.AxisX.WholeRange.MaxValue = maxValue;
                diagram.AxisX.NumericScaleOptions.GridSpacing = 1;
            }
            else if (distanceMax <= 50)
            {
                var maxValue = Math.Ceiling(distanceMax / 10);
                diagram.AxisX.WholeRange.MinValue = 0;
                diagram.AxisX.WholeRange.MaxValue = maxValue * 10;
                diagram.AxisX.NumericScaleOptions.GridSpacing = 5;
            }
            else if (distanceMax <= 100)
            {
                var maxValue = Math.Ceiling(distanceMax / 10);
                diagram.AxisX.WholeRange.MinValue = 0;
                diagram.AxisX.WholeRange.MaxValue = maxValue * 10;
                diagram.AxisX.NumericScaleOptions.GridSpacing = 10;
            }
            else if (distanceMax <= 500)
            {
                var maxValue = Math.Ceiling(distanceMax / 100);
                diagram.AxisX.WholeRange.MinValue = 0;
                diagram.AxisX.WholeRange.MaxValue = maxValue * 100;
                diagram.AxisX.NumericScaleOptions.GridSpacing = 50;
            }
            else if (distanceMax <= 3000)
            {
                var maxValue = Math.Ceiling(distanceMax / 100);
                diagram.AxisX.WholeRange.MinValue = 0;
                diagram.AxisX.WholeRange.MaxValue = maxValue * 100;
                diagram.AxisX.NumericScaleOptions.GridSpacing = 100;
            }
            else if (distanceMax <= 5000)
            {
                var maxValue = Math.Ceiling(distanceMax / 1000);
                diagram.AxisX.WholeRange.MinValue = 0;
                diagram.AxisX.WholeRange.MaxValue = maxValue * 1000;
                diagram.AxisX.NumericScaleOptions.GridSpacing = 200;
            }
            else if (distanceMax <= 10000)
            {
                var maxValue = Math.Ceiling(distanceMax / 1000);
                diagram.AxisX.WholeRange.MinValue = 0;
                diagram.AxisX.WholeRange.MaxValue = maxValue * 1000;
                diagram.AxisX.NumericScaleOptions.GridSpacing = 1000;
            }
            else
            {
            }
            #endregion
            #region åŽ‹åŠ›
            var allPressMinList = allNodeLossList.Select(x => Math.Min(Math.Min(x.StartHead, x.EndHead), x.Elev)).ToList();
            var allPressMaxList = allNodeLossList.Select(x => Math.Max(Math.Max(x.StartHead, x.EndHead), x.Elev)).ToList();
            var pressMin = allPressMinList.Min();
            var pressMax = allPressMaxList.Max();
            diagram.AxisY.Tickmarks.MinorVisible = false;
            diagram.AxisY.WholeRange.SideMarginsValue = 0;
            diagram.AxisY.CrosshairAxisLabelOptions.EnableAntialiasing = DevExpress.Utils.DefaultBoolean.True;
            if (pressMax <= 10)
            {
                diagram.AxisY.WholeRange.MinValue = Math.Floor(pressMin);
                diagram.AxisY.WholeRange.MaxValue = 10;
                diagram.AxisY.NumericScaleOptions.GridSpacing = 1;
                diagram.AxisY.VisualRange.SetMinMaxValues(0, 10);
            }
            else if (pressMax <= 100)
            {
                var maxValue = Math.Ceiling(pressMax / 10);
                diagram.AxisY.WholeRange.MinValue = Math.Floor(pressMin);
                diagram.AxisY.WholeRange.MaxValue = maxValue * 10;
                diagram.AxisY.NumericScaleOptions.GridSpacing = 5;
                diagram.AxisY.VisualRange.SetMinMaxValues(0, maxValue * 10);
            }
            else if (pressMax <= 3000)
            {
                var maxValue = Math.Ceiling(pressMax / 100);
                diagram.AxisY.WholeRange.MinValue = Math.Floor(pressMin);
                diagram.AxisY.WholeRange.MaxValue = maxValue * 100;
                diagram.AxisY.NumericScaleOptions.GridSpacing = 50;
                diagram.AxisY.VisualRange.SetMinMaxValues(0, maxValue * 100);
            }
            else if (pressMax <= 6000)
            {
                var maxValue = Math.Ceiling(pressMax / 1000);
                diagram.AxisY.WholeRange.MinValue = Math.Floor(pressMin);
                diagram.AxisY.WholeRange.MaxValue = maxValue * 1000;
                diagram.AxisY.NumericScaleOptions.GridSpacing = 100;
                diagram.AxisY.VisualRange.SetMinMaxValues(0, maxValue * 1000);
            }
            else
            {
            }
            #endregion
        }
        //提示
        private void chartControl1_CustomDrawCrosshair(object sender, CustomDrawCrosshairEventArgs e)
        {
            // Specify the crosshair argument line color, dash style and thickness.
            e.CrosshairLineElement.Color = Color.Green;
            e.CrosshairLineElement.LineStyle.DashStyle = DashStyle.DashDot;
            e.CrosshairLineElement.LineStyle.Thickness = 3;
            // Specify the back color for the crosshair argument axis label.
            foreach (CrosshairAxisLabelElement axisLabelElement in e.CrosshairAxisLabelElements)
            {
                axisLabelElement.BackColor = Color.Blue;
                axisLabelElement.Text = $"{axisLabelElement.AxisValue:N2}";
            }
            foreach (CrosshairElementGroup group in e.CrosshairElementGroups)
            {
                CrosshairGroupHeaderElement groupHeaderElement = group.HeaderElement;
                var pt = group.HeaderElement.SeriesPoints.FirstOrDefault();
                if (pt != null)
                {
                    var model = pt.Tag as HydroLossCurvePointVieModel;
                    if (model != null)
                    {
                        groupHeaderElement.Text = model.Name;
                    }
                }
                // Specify the text, text color and font for the crosshair group header element.
                groupHeaderElement.TextColor = Color.Green;
                groupHeaderElement.DXFont = new DXFont("SegoeUI", 12, DXFontStyle.Bold);
                //groupHeaderElement.Text = group.CrosshairElements[0].AxisLabelElement.Text;
                foreach (var ele in group.CrosshairElements)
                {
                    ele.AxisLabelElement.Text = $"{ele.AxisLabelElement.AxisValue:N1}";
                    ele.AxisLabelElement.DXFont = new DXFont(this.Font.Name, 6);
                    //ele.AxisLabelElement.Visible = false;
                }
                //// Obtain the first series.
                //CrosshairElement element = group.CrosshairElements[0];
                //// Specify the color, dash style and thickness for the crosshair value lines.
                //element.LineElement.Color = Color.DarkViolet;
                //element.LineElement.LineStyle.DashStyle = DashStyle.Dash;
                //element.LineElement.LineStyle.Thickness = 2;
                //// Specify the text color and back color for the crosshair value labels.
                //element.AxisLabelElement.TextColor = Color.Red;
                //element.AxisLabelElement.BackColor = Color.Yellow;
                //// Format the text shown for the series in the crosshair cursor label. Specify the text color and marker size.
                //element.LabelElement.TextColor = Color.Red;
                //element.LabelElement.MarkerSize = new Size(15, 15);
                //element.LabelElement.Text = $"高程:{element.SeriesPoint.Values[0]}m";
            }
        }
        //点击事件
        private void chartControl1_MouseClick(object sender, MouseEventArgs e)
        {
            ChartHitInfo hitInfo = this.chartControl1.CalcHitInfo(e.Location);
            if (hitInfo.Series != null)
            {
                if (hitInfo.SeriesPoint != null)
                {
                    var vm = hitInfo.SeriesPoint.Tag as HydroLossCurvePointVieModel;
                    if (vm != null)
                    {
                        this.HydroClickEvent?.Invoke(vm.Code);
                    }
                }
            }
        }
        /// <summary>
        /// å¯¼å‡ºå›¾ç‰‡
        /// </summary>
        public void ExportToImage(string filePath)
        {
            this.chartControl1.ExportToImage(filePath, DXImageFormat.Png);
        }
        //上游追踪选择
        private void ckStart_CheckedChanged(object sender, EventArgs e)
        {
            Analy();
        }
        //下游追踪选择
        private void ckEnd_CheckedChanged(object sender, EventArgs e)
        {
            Analy();
        }
        //高亮显示
        private void ckSpecial_CheckedChanged(object sender, EventArgs e)
        {
            Analy();
        }
        //分析
        private void Analy()
        {
            if (_hydroInfo == null)
            {
                return;
            }
            var network = _hydroInfo.ToNetwork();
            if (network == null)
            {
                return;
            }
            var node = network.GetAllNodes()?.Find(x => x.Id == _visual?.Code);
            if (node == null)
            {
                return;
            }
            var allStartPathList = new List<Link>();
            if (this.ckStart.Checked)
            {
                allStartPathList = network.AnalyzeUpstreamPath(node, _calcuResult?.EPAnetCalcuResult);
                if (allStartPathList == null)
                {
                    allStartPathList = new List<Link>();
                }
            }
            var allEndPathList = new List<Link>();
            if (this.ckEnd.Checked)
            {
                allEndPathList = network.AnalyzeDownstreamPath(node, _calcuResult?.EPAnetCalcuResult);
                if (allEndPathList == null)
                {
                    allEndPathList = new List<Link>();
                }
            }
            var allPathList = allStartPathList.Concat(allEndPathList).ToList();
            var allEpaLossList = network.GetChartNodeByPathLinks(allPathList, _calcuResult?.EPAnetCalcuResult);
            var allVisualDict = _hydroInfo.GetVisualDict();
            var allNodeLossList = new List<HydroNodeLossViewModel>();
            allEpaLossList?.ForEach(x =>
            {
                var visualNode = allVisualDict?.GetValue(x.Id);
                if (visualNode != null)
                {
                    allNodeLossList.Add(new HydroNodeLossViewModel(x, visualNode));
                }
            });
            SetBindingData(allNodeLossList);
            if (this.ckSpecial.Checked)
            {
                var allCodeList = new List<string>();
                allPathList?.ForEach(x => allCodeList.Add(x.Id));
                allNodeLossList?.ForEach(x => allCodeList.Add(x.Code));
                this.HydroSpecialDisplayEvent?.Invoke(allCodeList);
            }
            else
            {
                this.HydroCancelSpecialDisplayEvent?.Invoke();
            }
        }
    }
}
WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/01-curve/HydroSingleWorkingLossCurveInteropCtrl.resx
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,126 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
  <!--
    Microsoft ResX Schema
    Version 2.0
    The primary goals of this format is to allow a simple XML format
    that is mostly human readable. The generation and parsing of the
    various data types are done through the TypeConverter classes
    associated with the data types.
    Example:
    ... ado.net/XML headers & schema ...
    <resheader name="resmimetype">text/microsoft-resx</resheader>
    <resheader name="version">2.0</resheader>
    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
        <value>[base64 mime encoded serialized .NET Framework object]</value>
    </data>
    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
        <comment>This is a comment</comment>
    </data>
    There are any number of "resheader" rows that contain simple
    name/value pairs.
    Each data row contains a name, and value. The row also contains a
    type or mimetype. Type corresponds to a .NET class that support
    text/value conversion through the TypeConverter architecture.
    Classes that don't support this are serialized and stored with the
    mimetype set.
    The mimetype is used for serialized objects, and tells the
    ResXResourceReader how to depersist the object. This is currently not
    extensible. For a given mimetype the value must be set accordingly:
    Note - application/x-microsoft.net.object.binary.base64 is the format
    that the ResXResourceWriter will generate, however the reader can
    read any of the formats listed below.
    mimetype: application/x-microsoft.net.object.binary.base64
    value   : The object must be serialized with
            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
            : and then encoded with base64 encoding.
    mimetype: application/x-microsoft.net.object.soap.base64
    value   : The object must be serialized with
            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
            : and then encoded with base64 encoding.
    mimetype: application/x-microsoft.net.object.bytearray.base64
    value   : The object must be serialized into a byte array
            : using a System.ComponentModel.TypeConverter
            : and then encoded with base64 encoding.
    -->
  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
    <xsd:element name="root" msdata:IsDataSet="true">
      <xsd:complexType>
        <xsd:choice maxOccurs="unbounded">
          <xsd:element name="metadata">
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element name="value" type="xsd:string" minOccurs="0" />
              </xsd:sequence>
              <xsd:attribute name="name" use="required" type="xsd:string" />
              <xsd:attribute name="type" type="xsd:string" />
              <xsd:attribute name="mimetype" type="xsd:string" />
              <xsd:attribute ref="xml:space" />
            </xsd:complexType>
          </xsd:element>
          <xsd:element name="assembly">
            <xsd:complexType>
              <xsd:attribute name="alias" type="xsd:string" />
              <xsd:attribute name="name" type="xsd:string" />
            </xsd:complexType>
          </xsd:element>
          <xsd:element name="data">
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
              </xsd:sequence>
              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
              <xsd:attribute ref="xml:space" />
            </xsd:complexType>
          </xsd:element>
          <xsd:element name="resheader">
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
              </xsd:sequence>
              <xsd:attribute name="name" type="xsd:string" use="required" />
            </xsd:complexType>
          </xsd:element>
        </xsd:choice>
      </xsd:complexType>
    </xsd:element>
  </xsd:schema>
  <resheader name="resmimetype">
    <value>text/microsoft-resx</value>
  </resheader>
  <resheader name="version">
    <value>2.0</value>
  </resheader>
  <resheader name="reader">
    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
  </resheader>
  <resheader name="writer">
    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
  </resheader>
  <metadata name="lossBindingSource.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
    <value>17, 17</value>
  </metadata>
  <metadata name="elevBindingSource.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
    <value>239, 17</value>
  </metadata>
</root>
WinFrmUI/Yw.WinFrmUI.Hydro.Core/Yw.WinFrmUI.Hydro.Core.csproj
@@ -57,7 +57,7 @@
    <ItemGroup>
        <PackageReference Include="DevExpress.Win.Design" Version="23.2.4" />
        <PackageReference Include="Yw.BLL.Basic.Core" Version="3.3.3" />
        <PackageReference Include="Yw.BLL.Hydro.Core" Version="3.8.6" />
        <PackageReference Include="Yw.BLL.Hydro.Core" Version="3.8.7" />
        <PackageReference Include="Yw.Pump.Core" Version="3.2.4" />
    </ItemGroup>
@@ -237,6 +237,9 @@
        <Compile Update="18-loss\01-curve\HydroMultiWorkingLossCurveDlg.cs">
            <SubType>Form</SubType>
        </Compile>
        <Compile Update="18-loss\01-curve\HydroSingleWorkingLossCurveInteropCtrl.cs">
          <SubType>UserControl</SubType>
        </Compile>
        <Compile Update="18-loss\01-curve\HydroSingleWorkingLossCurveDlg.cs">
            <SubType>Form</SubType>
        </Compile>