lixiaojun
2024-08-14 eb4679bfe7f2c945f3e03f6927c8fde893f7d33c
Service/HStation.Service.Revit.Core/04-service/02-correct/RevitCorrectHelper.cs
@@ -1,4 +1,6 @@
using HStation.Model;
using Microsoft.VisualBasic;
using System;
namespace HStation.Service
{
@@ -11,36 +13,59 @@
        /// 修正(无法修正会抛出异常)
        /// </summary>
        /// <param name="rhs">RevitModel</param>
        public static void Correct(this Model.RevitModel rhs)
        public static bool Correct(this Model.RevitModel rhs, out string msg)
        {
            if (rhs == null)
            {
                throw new Exception("数据为空");
                msg = "数据为空";
                return false;
            }
            Zero(rhs);
            First(rhs);
            Second(rhs);
            Three(rhs);
            if (!Zero(rhs, out msg))
            {
                return false;
            }
            if (!First(rhs, out msg))
            {
                return false;
            }
            if (!Exchanger(rhs, out msg))
            {
                return false;
            }
            if (!Second(rhs, out msg))
            {
                return false;
            }
            if (!Three(rhs, out msg))
            {
                return false;
            }
            return true;
        }
        //前提:验证合法性
        private static void Zero(Model.RevitModel rhs)
        private static bool Zero(Model.RevitModel rhs, out string msg)
        {
            msg = string.Empty;
            var allWaterSourceList = rhs.GetAllWaterSources();
            if (allWaterSourceList == null || allWaterSourceList.Count < 1)
            {
                throw new Exception("无水源");
                msg = "无水源";
                return false;
            }
            var allJunctionList = rhs.GetAllJunctions();
            if (allJunctionList == null || allJunctionList.Count < 1)
            {
                throw new Exception("无连接节点");
                msg = "无连接节点";
                return false;
            }
            return true;
        }
        //第一步:检查集合初始化
        private static void First(Model.RevitModel rhs)
        private static bool First(Model.RevitModel rhs, out string msg)
        {
            msg = string.Empty;
            if (rhs.Reservoirs == null)
            {
                rhs.Reservoirs = new List<Model.RevitReservoir>();
@@ -68,6 +93,10 @@
            if (rhs.Fourlinks == null)
            {
                rhs.Fourlinks = new List<Model.RevitFourlink>();
            }
            if (rhs.Meters == null)
            {
                rhs.Meters = new List<RevitMeter>();
            }
            if (rhs.Flowmeters == null)
            {
@@ -97,6 +126,10 @@
            {
                rhs.Translations = new List<Model.RevitTranslation>();
            }
            if (rhs.Exchangers == null)
            {
                rhs.Exchangers = new List<RevitExchanger>();
            }
            if (rhs.Pumps == null)
            {
                rhs.Pumps = new List<Model.RevitPump>();
@@ -105,31 +138,145 @@
            {
                rhs.Valves = new List<Model.RevitValve>();
            }
            return true;
        }
        //单独修复换热器
        private static bool Exchanger(Model.RevitModel rhs, out string msg)
        {
            msg = string.Empty;
            if (rhs.Exchangers != null && rhs.Exchangers.Count > 0)
            {
                var allParterList = rhs.GetAllParters();
                foreach (var exchanger in rhs.Exchangers)
                {
                    if (exchanger.ConnectList != null && exchanger.ConnectList.Count > 0)
                    {
                        foreach (var connect in exchanger.ConnectList)
                        {
                            var connectParter = allParterList.Find(x => x.Id == connect.Id);
                            if (connectParter == null)
                            {
                                msg = $"换热器:{exchanger.Id} 连接组件 {connect.Id} 不存在";
                                return false;
                            }
                        }
                        var startConnectList = exchanger.ConnectList.GetStartConnects();
                        if (startConnectList == null || startConnectList.Count < 1)
                        {
                            msg = $"换热器:{exchanger.Id} 上游连接组件不存在";
                            return false;
                        }
                        var startJunction = new Model.RevitJunction();
                        startJunction.Id = Yw.Untity.UniqueHelper.CreateFromFirst("junction", allParterList.Select(x => x.Code).ToList());
                        startJunction.Code = startJunction.Id;
                        startJunction.Name = UniqueHelper.CreateFromFirst("连接节点", allParterList.Select(x => x.Name).Distinct().ToList());
                        startJunction.Flags = null;
                        startJunction.ModelType = null;
                        startJunction.Description = "换热器修正时,自动添加";
                        startJunction.Quality = exchanger.StartQuality;
                        startJunction.Position = startConnectList.GetCenterPosition();
                        startJunction.Elev = exchanger.StartElev;
                        startJunction.Demand = null;
                        startJunction.DemandPattern = null;
                        rhs.Junctions.Add(startJunction);
                        exchanger.StartCode = startJunction.Code;
                        foreach (var startConnect in startConnectList)
                        {
                            var startConnectParter = allParterList.Find(x => x.Id == startConnect.Id);
                            if (startConnectParter is IRevitLink revitLink)
                            {
                                if (revitLink.StartCode == exchanger.Id)
                                {
                                    revitLink.StartCode = startJunction.Id;
                                }
                                else if (revitLink.EndCode == exchanger.Id)
                                {
                                    revitLink.EndCode = startJunction.Id;
                                }
                            }
                        }
                        allParterList.Add(startJunction);
                        var endConnectList = exchanger.ConnectList.GetEndConnects();
                        if (endConnectList == null || endConnectList.Count < 1)
                        {
                            msg = $"换热器:{exchanger.Id} 下游连接组件不存在";
                            return false;
                        }
                        var endJunction = new Model.RevitJunction();
                        endJunction.Id = Yw.Untity.UniqueHelper.CreateFromFirst("junction", allParterList.Select(x => x.Code).ToList());
                        endJunction.Code = endJunction.Id;
                        endJunction.Name = UniqueHelper.CreateFromFirst("连接节点", allParterList.Select(x => x.Name).Distinct().ToList());
                        endJunction.Flags = null;
                        endJunction.ModelType = null;
                        endJunction.Description = "换热器修正时,自动添加";
                        endJunction.Quality = exchanger.EndQuality;
                        endJunction.Position = endConnectList.GetCenterPosition();
                        endJunction.Elev = exchanger.EndElev;
                        endJunction.Demand = null;
                        endJunction.DemandPattern = null;
                        rhs.Junctions.Add(endJunction);
                        exchanger.EndCode = endJunction.Code;
                        foreach (var endConnect in endConnectList)
                        {
                            var endConnectParter = allParterList.Find(x => x.Id == endConnect.Id);
                            if (endConnectParter is IRevitLink revitLink)
                            {
                                if (revitLink.StartCode == exchanger.Id)
                                {
                                    revitLink.StartCode = endJunction.Id;
                                }
                                else if (revitLink.EndCode == exchanger.Id)
                                {
                                    revitLink.EndCode = endJunction.Id;
                                }
                            }
                        }
                        allParterList.Add(endJunction);
                    }
                }
            }
            return true;
        }
        //第二步:检查上下游编码
        private static void Second(Model.RevitModel rhs)
        private static bool Second(Model.RevitModel rhs, out string msg)
        {
            msg = string.Empty;
            var allParterList = rhs.GetAllParters();
            var allLinks = rhs.GetAllLinks();
            foreach (var link in allLinks)
            {
                var startLinkParter = allParterList.Find(x => x.Id == link.StartCode);
                if (startLinkParter == null)
                {
                    msg = $"管段: {link.Id} 上游节点错误";
                    return false;
                }
                link.StartCode = startLinkParter.Code;
                var endLinkParter = allParterList.Find(x => x.Id == link.EndCode);
                if (endLinkParter == null)
                {
                    msg = $"管段: {link.Id} 下游节点错误";
                    return false;
                }
                link.EndCode = endLinkParter.Code;
            }
            return true;
        }
        //第三步:按照水力结构进行修正
        private static void Three(Model.RevitModel rhs)
        private static bool Three(Model.RevitModel rhs, out string msg)
        {
            msg = string.Empty;
            var allParterList = rhs.GetAllParters();
            var allLinks = rhs.GetAllLinks();
            foreach (var link in allLinks)
            {
                var allParterList = rhs.GetAllParters();
                var startLinkParter = allParterList.Find(x => x.Code == link.StartCode);
                if (startLinkParter is IRevitLink)
                if (startLinkParter is IRevitLink startLink)
                {
                    var junction = new Model.RevitJunction();
                    junction.Id = Yw.Untity.UniqueHelper.CreateFromFirst("junction", allParterList.Select(x => x.Code).ToList());
@@ -145,12 +292,20 @@
                    junction.DemandPattern = null;
                    rhs.Junctions.Add(junction);
                    link.StartCode = junction.Code;
                    (startLinkParter as IRevitLink).EndCode = junction.Code;
                    if (startLink.StartCode == link.StartCode)
                    {
                        startLink.StartCode = junction.Code;
                    }
                    else if (startLink.EndCode == link.StartCode)
                    {
                        startLink.EndCode = junction.Code;
                    }
                    allParterList.Add(junction);
                }
                allParterList = rhs.GetAllParters();
                var endLinkParter = allParterList.Find(x => x.Code == link.EndCode);
                if (endLinkParter is IRevitLink)
                if (endLinkParter is IRevitLink endLink)
                {
                    var junction = new Model.RevitJunction();
                    junction.Id = Yw.Untity.UniqueHelper.CreateFromFirst("junction", allParterList.Select(x => x.Code).ToList());
@@ -166,9 +321,18 @@
                    junction.DemandPattern = null;
                    rhs.Junctions.Add(junction);
                    link.EndCode = junction.Code;
                    (endLinkParter as IRevitLink).StartCode = junction.Code;
                    if (endLink.StartCode == link.EndCode)
                    {
                        endLink.StartCode = junction.Code;
                    }
                    else if (endLink.EndCode == link.EndCode)
                    {
                        endLink.EndCode = junction.Code;
                    }
                    allParterList.Add(junction);
                }
            }
            return true;
        }
    }