duheng
2025-02-19 a5b25c4f314079d293bf159ed6f0d7dcbadadbb7
WinFrmUI/Yw.WinFrmUI.Hydro.Core/loss-curve/07-control/HydroLossCurveInteropCtrl.cs
ÎļþÃû´Ó WinFrmUI/Yw.WinFrmUI.Hydro.Core/18-loss/01-curve/HydroSingleWorkingLossCurveInteropCtrl.cs ÐÞ¸Ä
@@ -5,12 +5,13 @@
using Yw.DAL.Basic;
using Yw.EPAnet;
using Yw.Hydro;
using Yw.Model;
namespace Yw.WinFrmUI
{
    public partial class HydroSingleWorkingLossCurveInteropCtrl : DevExpress.XtraEditors.XtraUserControl
    public partial class HydroLossCurveInteropCtrl : DevExpress.XtraEditors.XtraUserControl
    {
        public HydroSingleWorkingLossCurveInteropCtrl()
        public HydroLossCurveInteropCtrl()
        {
            InitializeComponent();
            this.layoutControl1.SetupLayoutControl();
@@ -31,10 +32,10 @@
        /// </summary>
        public event Action HydroCancelSpecialDisplayEvent;
        private Yw.Model.HydroModelInfo _hydroInfo = null;//水力信息
        private HydroWorkingVmo _working = null;//工况
        private Yw.Model.HydroNodeInfo _node = null;//节点
        private HydroCalcuResult _calcuResult = null;//计算结果
        private Yw.Model.HydroVisualInfo _visual = null;//可见构件
        /// <summary>
        /// ç»‘定数据
@@ -42,46 +43,53 @@
        public void SetBindingData
            (
                Yw.Model.HydroModelInfo hydroInfo,
                HydroCalcuResult calcuResult,
                Yw.Model.HydroVisualInfo visual
                HydroWorkingVmo working,
                HydroNodeInfo node,
                HydroCalcuResult calcuResult = null,
                bool isHead = false,
                List<Yw.Vmo.HydroEvaluationVmo> allEvaluationList = null
            )
        {
            if (hydroInfo == null)
            {
                return;
            }
            if (working == null)
            {
                return;
            }
            if (node == null)
            {
                return;
            }
            _hydroInfo = hydroInfo;
            _working = working;
            _node = node;
            if (calcuResult == null)
            {
                hydroInfo.UpdateWorkingInfo(working.WorkingInfo);
                calcuResult = hydroInfo.Calcu(Yw.EPAnet.CalcuMode.MinorLoss, isHead, allEvaluationList);
            }
            _calcuResult = calcuResult;
            _visual = visual;
            Analy();
        }
        /// <summary>
        /// ç»‘定数据
        /// </summary>
        public void SetBindingData(List<HydroNodeLossViewModel> allNodeLossList)
        private void SetBindingData(HydroLossCurveViewModel vm)
        {
            AutoFitAxises(allNodeLossList);
            var allElevList = allNodeLossList?.Select(x => new HydroLossCurvePointVieModel(x.Code, x.Name, x.Distance, x.Elev)).ToList();
            this.elevBindingSource.DataSource = allElevList;
            AutoFitAxises(vm?.Items);
            this.elevBindingSource.DataSource = vm?.Elev?.Items;
            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.DataSource = vm?.Lower?.Items;
            this.lossBindingSource.ResetBindings(false);
            if (allNodeLossList != null && allNodeLossList.Count > 0)
            if (vm?.Total != null)
            {
                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");
                sb.AppendLine($"水头损失:{vm?.Total.HeadLoss:N2}m");
                sb.AppendLine($"局部损失:{vm?.Total.MinorLoss:N2}m");
                sb.AppendLine($"沿程损失:{vm?.Total.FrictionLoss:N2}m");
                var anno = this.chartControl1.AnnotationRepository[0] as DevExpress.XtraCharts.TextAnnotation;
                anno.Text = sb.ToString();
                anno.AutoSize = true;
@@ -89,9 +97,9 @@
        }
        //自动适应刻度
        private void AutoFitAxises(List<HydroNodeLossViewModel> allNodeLossList)
        private void AutoFitAxises(List<HydroLossCurveItemViewModel> items)
        {
            if (allNodeLossList == null || allNodeLossList.Count < 1)
            if (items == null || items.Count < 1)
            {
                return;
            }
@@ -99,7 +107,7 @@
            #region Xè½´
            var allDistances = allNodeLossList.Select(x => x.Distance).Distinct().ToList();
            var allDistances = items.Select(x => x.Distance).Distinct().ToList();
            var distanceMax = allDistances.Max();
            diagram.AxisX.Tickmarks.MinorVisible = false;
            diagram.AxisX.WholeRange.SideMarginsValue = 0;
@@ -161,8 +169,8 @@
            #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 allPressMinList = items.Select(x => Math.Min(Math.Min(x.StartHead, x.EndHead), x.Elev)).ToList();
            var allPressMaxList = items.Select(x => Math.Max(Math.Max(x.StartHead, x.EndHead), x.Elev)).ToList();
            var pressMin = allPressMinList.Min();
            var pressMax = allPressMaxList.Max();
@@ -224,7 +232,6 @@
            {
                axisLabelElement.BackColor = Color.Blue;
                axisLabelElement.Text = $"{axisLabelElement.AxisValue:N2}";
            }
            foreach (CrosshairElementGroup group in e.CrosshairElementGroups)
@@ -249,7 +256,6 @@
                {
                    ele.AxisLabelElement.Text = $"{ele.AxisLabelElement.AxisValue:N1}";
                    ele.AxisLabelElement.DXFont = new DXFont(this.Font.Name, 6);
                    //ele.AxisLabelElement.Visible = false;
                }
@@ -322,20 +328,32 @@
            {
                return;
            }
            if (_working == null)
            {
                return;
            }
            if (_node == null)
            {
                return;
            }
            if (_calcuResult == null)
            {
                return;
            }
            var network = _hydroInfo.ToNetwork();
            if (network == null)
            {
                return;
            }
            var node = network.GetAllNodes()?.Find(x => x.Id == _visual?.Code);
            if (node == null)
            var epaNode = network.GetAllNodes()?.Find(x => x.Id == _node.Code);
            if (epaNode == null)
            {
                return;
            }
            var allStartPathList = new List<Link>();
            if (this.ckStart.Checked)
            {
                allStartPathList = network.AnalyzeUpstreamPath(node, _calcuResult?.EPAnetCalcuResult);
                allStartPathList = network.AnalyzeUpstreamPath(epaNode, _calcuResult?.EPAnetCalcuResult);
                if (allStartPathList == null)
                {
                    allStartPathList = new List<Link>();
@@ -344,7 +362,7 @@
            var allEndPathList = new List<Link>();
            if (this.ckEnd.Checked)
            {
                allEndPathList = network.AnalyzeDownstreamPath(node, _calcuResult?.EPAnetCalcuResult);
                allEndPathList = network.AnalyzeDownstreamPath(epaNode, _calcuResult?.EPAnetCalcuResult);
                if (allEndPathList == null)
                {
                    allEndPathList = new List<Link>();
@@ -353,22 +371,30 @@
            var allPathList = allStartPathList.Concat(allEndPathList).ToList();
            var allEpaLossList = network.GetChartNodeByPathLinks(allPathList, _calcuResult?.EPAnetCalcuResult);
            var allVisualDict = _hydroInfo.GetVisualDict();
            var allNodeLossList = new List<HydroNodeLossViewModel>();
            var vm = new HydroLossCurveViewModel();
            vm.Items = new List<HydroLossCurveItemViewModel>();
            allEpaLossList?.ForEach(x =>
            {
                var visualNode = allVisualDict?.GetValue(x.Id);
                if (visualNode != null)
                {
                    allNodeLossList.Add(new HydroNodeLossViewModel(x, visualNode));
                    vm.Items.Add(new HydroLossCurveItemViewModel(x, visualNode));
                }
            });
            SetBindingData(allNodeLossList);
            vm.Elev = new HydroLossCurveElevViewModel(vm.Items);
            vm.Start = new HydroLossCurveStartViewModel(vm.Items);
            vm.End = new HydroLossCurveEndViewModel(vm.Items);
            vm.Lower = new HydroLossCurveLowerViewModel(vm.Items);
            vm.Total = new HydroLossCurveTotalViewModel(vm.Items);
            SetBindingData(vm);
            if (this.ckSpecial.Checked)
            {
                var allCodeList = new List<string>();
                allPathList?.ForEach(x => allCodeList.Add(x.Id));
                allNodeLossList?.ForEach(x => allCodeList.Add(x.Code));
                vm.Items?.ForEach(x => allCodeList.Add(x.Code));
                this.HydroSpecialDisplayEvent?.Invoke(allCodeList);
            }
            else