lixiaojun
2024-10-25 ba4fd2f2456a3cee97cc90204c9e21505a42b2aa
Service/HStation.Service.Revit.Core/04-service/01-json/RevitJsonHelper.cs
@@ -1,4 +1,6 @@
namespace HStation.Service
using System.Transactions;
namespace HStation.Service
{
    /// <summary>
    /// Revit Json辅助类
@@ -177,6 +179,15 @@
                                }
                            }
                            break;
                        case RevitJsonCatalog.Compressor:
                            {
                                var compressor = ParseCompressor(jobject);
                                if (compressor != null)
                                {
                                    model.Compressors.Add(compressor);
                                }
                            }
                            break;
                        case RevitJsonCatalog.Pump:
                            {
                                var pump = ParsePump(jobject);
@@ -292,6 +303,7 @@
            }
            var junction = new Model.RevitJunction();
            junction.Catalog = RevitJsonCatalog.Junction;
            #region Id 
@@ -524,6 +536,7 @@
            }
            var nozzle = new Model.RevitNozzle();
            nozzle.Catalog = RevitJsonCatalog.Nozzle;
            #region Id 
@@ -786,6 +799,7 @@
            }
            var hydrant = new Model.RevitHydrant();
            hydrant.Catalog = RevitJsonCatalog.Hydrant;
            #region Id 
@@ -1046,6 +1060,7 @@
            }
            var blunthead = new Model.RevitBlunthead();
            blunthead.Catalog = RevitJsonCatalog.Blunthead;
            #region Id 
@@ -1321,6 +1336,7 @@
            }
            var elbow = new Model.RevitElbow();
            elbow.Catalog = RevitJsonCatalog.Elbow;
            #region Id 
@@ -1596,6 +1612,7 @@
            }
            var threelink = new Model.RevitThreelink();
            threelink.Catalog = RevitJsonCatalog.Threelink;
            #region Id 
@@ -1871,6 +1888,7 @@
            }
            var fourlink = new Model.RevitFourlink();
            fourlink.Catalog = RevitJsonCatalog.Fourlink;
            #region Id 
@@ -2146,6 +2164,7 @@
            }
            var meter = new Model.RevitMeter();
            meter.Catalog = RevitJsonCatalog.Meter;
            #region Id 
@@ -2378,6 +2397,7 @@
            }
            var flowmeter = new Model.RevitFlowmeter();
            flowmeter.Catalog = RevitJsonCatalog.Flowmeter;
            #region Id 
@@ -2598,6 +2618,19 @@
            #endregion
            #region Flow
            if (jobject[RevitJsonProp.Flow].MatchNumeric(out double flow))
            {
                flowmeter.CurrentFlow = flow;
            }
            else
            {
                flowmeter.AppendOrUpdatePropStatus(nameof(flowmeter.CurrentFlow), ePropStatus.Abnormal, "[流量]缺少或者数据格式错误");
            }
            #endregion
            return flowmeter;
        }
@@ -2610,6 +2643,7 @@
            }
            var pressmeter = new Model.RevitPressmeter();
            pressmeter.Catalog = RevitJsonCatalog.Pressmeter;
            #region Id 
@@ -2830,6 +2864,19 @@
            #endregion
            #region Press
            if (jobject[RevitJsonProp.Press].MatchNumeric(out double press))
            {
                pressmeter.CurrentPress = Yw.Pump.CalculationHelper.Mpa2M(press);
            }
            else
            {
                pressmeter.AppendOrUpdatePropStatus(nameof(pressmeter.CurrentPress), ePropStatus.Abnormal, "[压力]缺少或者数据格式错误");
            }
            #endregion
            return pressmeter;
        }
@@ -2842,6 +2889,7 @@
            }
            var reservoir = new Model.RevitReservoir();
            reservoir.Catalog = RevitJsonCatalog.Reservoir;
            #region Id 
@@ -3074,6 +3122,7 @@
            }
            var tank = new Model.RevitTank();
            tank.Catalog = RevitJsonCatalog.Tank;
            #region Id 
@@ -3363,6 +3412,7 @@
            }
            var waterbox = new Model.RevitWaterbox();
            waterbox.Catalog = RevitJsonCatalog.Waterbox;
            #region Id 
@@ -3652,6 +3702,7 @@
            }
            var pipe = new Model.RevitPipe();
            pipe.Catalog = RevitJsonCatalog.Pipe;
            #region Id 
@@ -4054,6 +4105,7 @@
            }
            var translation = new Model.RevitTranslation();
            translation.Catalog = RevitJsonCatalog.Translation;
            #region Id 
@@ -4456,6 +4508,7 @@
            }
            var exchanger = new Model.RevitExchanger();
            exchanger.Catalog = RevitJsonCatalog.Exchanger;
            #region Id 
@@ -4846,7 +4899,436 @@
            #endregion
            #region MinorLossK
            if (jobject[RevitJsonProp.MinorLossK].MatchNumeric(out double minorLossK))
            {
                exchanger.MinorLossK = minorLossK;
            }
            else
            {
                exchanger.AppendOrUpdatePropStatus(nameof(exchanger.MinorLossK), ePropStatus.Abnormal, "[换热器][损失K系数]缺少或者数据格式错误");
            }
            #endregion
            return exchanger;
        }
        //解析空压机
        private static HStation.Model.RevitCompressor ParseCompressor(JToken jobject)
        {
            if (jobject == null)
            {
                return default;
            }
            var compressor = new Model.RevitCompressor();
            compressor.Catalog = RevitJsonCatalog.Compressor;
            #region Id
            if (jobject.ParseString(RevitJsonProp.Id, out string id))
            {
                compressor.Id = id;
            }
            else
            {
                compressor.AppendOrUpdatePropStatus(nameof(compressor.Id), ePropStatus.Error, "[空压机]缺少[构件编码]");
            }
            #endregion
            #region Code
            if (jobject.ParseString(RevitJsonProp.Code, out string code))
            {
                compressor.Code = code;
                if (string.IsNullOrEmpty(compressor.Code))
                {
                    compressor.Code = compressor.Id;
                    compressor.AppendOrUpdatePropStatus(nameof(compressor.Code), ePropStatus.Lack, "[空压机][编码]缺省,使用[构件编码]赋值");
                }
            }
            else
            {
                compressor.AppendOrUpdatePropStatus(nameof(compressor.Code), ePropStatus.Error, "[空压机]缺少[编码]");
            }
            #endregion
            #region Name
            if (jobject.ParseString(RevitJsonProp.Name, out string name))
            {
                compressor.Name = name;
                compressor.AppendOrUpdatePropStatus(nameof(compressor.Name), ePropStatus.Lack, "[空压机][名称]缺省");
            }
            else
            {
                compressor.AppendOrUpdatePropStatus(nameof(compressor.Name), ePropStatus.Error, "[空压机]缺少[名称]");
            }
            #endregion
            #region ModelType
            if (jobject.ParseString(RevitJsonProp.ModelType, out string modelType))
            {
                compressor.ModelType = modelType;
                if (string.IsNullOrEmpty(compressor.ModelType))
                {
                    compressor.AppendOrUpdatePropStatus(nameof(compressor.ModelType), ePropStatus.Lack, "[空压机][型号信息]缺省");
                }
            }
            else
            {
                compressor.AppendOrUpdatePropStatus(nameof(compressor.ModelType), ePropStatus.Error, "[空压机]缺少[型号信息]");
            }
            #endregion
            #region Flags
            if (jobject.ParseString(RevitJsonProp.Flags, out string flags))
            {
                compressor.Flags = Yw.Untity.FlagsHelper.ToList(flags);
                if (!string.IsNullOrEmpty(flags))
                {
                    if (compressor.Flags == null || compressor.Flags.Count < 1)
                    {
                        compressor.AppendOrUpdatePropStatus(nameof(compressor.Flags), ePropStatus.Abnormal, "[空压机][标签]格式错误");
                    }
                }
            }
            else
            {
                compressor.AppendOrUpdatePropStatus(nameof(compressor.Flags), ePropStatus.Error, "[空压机]缺少[标签]");
            }
            #endregion
            #region Description
            if (jobject.ParseString(RevitJsonProp.Description, out string description))
            {
                compressor.Description = description;
            }
            else
            {
                compressor.AppendOrUpdatePropStatus(nameof(compressor.Description), ePropStatus.Error, "[空压机]缺少[说明信息]");
            }
            #endregion
            #region ConnectList
            if (jobject.ParseString(RevitJsonProp.Connects, out string connectString))
            {
                var connectList = JsonHelper.Json2Object<List<RevitJsonConnectModel>>(connectString);
                compressor.ConnectList = connectList?.Select(x => new Model.RevitConnect()
                {
                    Id = x.ConnectId,
                    Direction = x.Dirction,
                    Position = new Model.RevitPosition()
                    {
                        X = x.Point.X / 1000f,
                        Y = x.Point.Y / 1000f,
                        Z = x.Point.Z / 1000f
                    }
                }).ToList();
                if (compressor.ConnectList == null || compressor.ConnectList.Count < 1)
                {
                    compressor.AppendOrUpdatePropStatus(nameof(compressor.ConnectList), ePropStatus.Error, "[空压机][连接列表]解析失败");
                }
            }
            else
            {
                compressor.AppendOrUpdatePropStatus(nameof(compressor.ConnectList), ePropStatus.Error, "[空压机]缺少[连接列表]");
            }
            #endregion
            #region StartCode/StartPosition
            var startConnect = compressor.ConnectList?.GetStartConnect();
            compressor.StartCode = startConnect?.Id;
            if (string.IsNullOrEmpty(compressor.StartCode))
            {
                compressor.AppendOrUpdatePropStatus(nameof(compressor.StartCode), ePropStatus.Error, "[空压机][上游构件]受[连接列表]影响解析错误");
            }
            compressor.StartPosition = startConnect?.Position;
            if (compressor.StartPosition == null)
            {
                compressor.AppendOrUpdatePropStatus(nameof(compressor.StartPosition), ePropStatus.Error, "[空压机][上游构件位置]受[连接列表]影响解析错误");
            }
            #endregion
            #region EndCode/EndPosition
            var endConnect = compressor.ConnectList?.GetEndConnect();
            compressor.EndCode = endConnect?.Id;
            if (string.IsNullOrEmpty(compressor.EndCode))
            {
                compressor.AppendOrUpdatePropStatus(nameof(compressor.EndCode), ePropStatus.Error, "[空压机][下游构件]受[连接列表]影响解析错误");
            }
            compressor.EndPosition = endConnect?.Position;
            if (compressor.EndPosition == null)
            {
                compressor.AppendOrUpdatePropStatus(nameof(compressor.EndPosition), ePropStatus.Error, "[空压机][下游构件位置]受[连接列表]影响解析错误");
            }
            #endregion
            #region LinkStatus
            if (jobject.ParseString(RevitJsonProp.LinkStatusPipe, out string linkStatus))
            {
                compressor.LinkStatus = linkStatus;
                if (string.IsNullOrEmpty(compressor.LinkStatus))
                {
                    compressor.LinkStatus = PipeStatus.Open;
                    compressor.AppendOrUpdatePropStatus(nameof(compressor.LinkStatus), ePropStatus.Lack, "[空压机][管道状态]缺省");
                }
                else
                {
                    if (!PipeStatus.Contains(compressor.LinkStatus))
                    {
                        compressor.LinkStatus = PipeStatus.Open;
                        compressor.AppendOrUpdatePropStatus(nameof(compressor.LinkStatus), ePropStatus.Abnormal, "[空压机][管道状态]设置错误");
                    }
                }
            }
            else
            {
                compressor.LinkStatus = PipeStatus.Open;
                compressor.AppendOrUpdatePropStatus(nameof(compressor.LinkStatus), ePropStatus.Abnormal, "[空压机][管道状态]缺少或格式错误");
            }
            #endregion
            #region StartElev
            if (jobject[RevitJsonProp.StartElev].MatchNumeric(out double startElev))
            {
                compressor.StartElev = startElev / 1000f;
            }
            else
            {
                compressor.AppendOrUpdatePropStatus(nameof(compressor.StartElev), ePropStatus.Abnormal, "[空压机][上游标高]缺少或格式错误");
            }
            if (compressor.StartElev <= 0)
            {
                //通过z轴自动计算
                if (compressor.StartPosition == null)
                {
                    compressor.AppendOrUpdatePropStatus(nameof(compressor.StartElev), ePropStatus.Lack, "[空压机][上游标高]缺省,受[上游构件位置]影响,无法通过Z轴自动计算");
                }
                else
                {
                    compressor.StartElev = compressor.StartPosition.Z;
                    compressor.AppendOrUpdatePropStatus(nameof(compressor.StartElev), ePropStatus.Lack, "[空压机][上游标高]缺省,通过Z轴自动计算");
                }
            }
            #endregion
            #region EndElev
            if (jobject[RevitJsonProp.EndElev].MatchNumeric(out double endElev))
            {
                compressor.EndElev = endElev / 1000f;
            }
            else
            {
                compressor.AppendOrUpdatePropStatus(nameof(compressor.EndElev), ePropStatus.Abnormal, "[空压机][下游标高]缺少或格式错误");
            }
            if (compressor.EndElev <= 0)
            {
                //通过z轴自动计算
                if (compressor.EndPosition == null)
                {
                    compressor.AppendOrUpdatePropStatus(nameof(compressor.EndElev), ePropStatus.Lack, "[空压机][下游标高]缺省,受[下游构件位置]影响,无法通过Z轴自动计算");
                }
                else
                {
                    compressor.EndElev = compressor.EndPosition.Z;
                    compressor.AppendOrUpdatePropStatus(nameof(compressor.EndElev), ePropStatus.Lack, "[空压机][下游标高]缺省,通过Z轴自动计算");
                }
            }
            #endregion
            #region StartQuality
            if (jobject[RevitJsonProp.StartQuality].MatchNumeric(out double startQuality))
            {
                compressor.StartQuality = startQuality;
                if (compressor.StartQuality <= 0)
                {
                    compressor.AppendOrUpdatePropStatus(nameof(compressor.StartQuality), ePropStatus.Lack, "[空压机][上游初始水质]缺省");
                }
            }
            else
            {
                compressor.AppendOrUpdatePropStatus(nameof(compressor.StartQuality), ePropStatus.Abnormal, "[空压机][上游初始水质]缺少或者格式错误");
            }
            #endregion
            #region EndQuality
            if (jobject[RevitJsonProp.EndQuality].MatchNumeric(out double endQuality))
            {
                compressor.EndQuality = endQuality;
                if (compressor.EndQuality <= 0)
                {
                    compressor.AppendOrUpdatePropStatus(nameof(compressor.EndQuality), ePropStatus.Lack, "[空压机][下游初始水质]缺省");
                }
            }
            else
            {
                compressor.AppendOrUpdatePropStatus(nameof(compressor.EndQuality), ePropStatus.Abnormal, "[空压机][下游初始水质]缺少或者格式错误");
            }
            #endregion
            #region Material
            if (jobject.ParseString(RevitJsonProp.Material, out string material))
            {
                compressor.Material = material;
                if (string.IsNullOrEmpty(compressor.Material))
                {
                    compressor.AppendOrUpdatePropStatus(nameof(compressor.Material), ePropStatus.Lack, "[空压机][材质]缺省");
                }
            }
            else
            {
                compressor.AppendOrUpdatePropStatus(nameof(compressor.Material), ePropStatus.Abnormal, "[空压机]缺少[材质]");
            }
            #endregion
            #region Diameter
            if (jobject[RevitJsonProp.Diameter].MatchNumeric(out double diameter))
            {
                compressor.Diameter = diameter;
            }
            else
            {
                compressor.AppendOrUpdatePropStatus(nameof(compressor.Diameter), ePropStatus.Abnormal, "[空压机][直径]缺少或者格式错误");
            }
            if (compressor.Diameter < 1)
            {
                if (jobject[RevitJsonProp.InternalDiameter].MatchNumeric(out double internalDiameter))
                {
                    compressor.Diameter = internalDiameter;
                    compressor.AppendOrUpdatePropStatus(nameof(compressor.Diameter), ePropStatus.Lack, "[空压机][直径]通过[内径]进行修复]");
                }
                else
                {
                    compressor.AppendOrUpdatePropStatus(nameof(compressor.Diameter), ePropStatus.Abnormal, "[空压机][直径]无法通过[内径]进行修复]");
                }
            }
            if (compressor.Diameter < 1)
            {
                if (jobject[RevitJsonProp.DN].MatchNumeric(out double dn))
                {
                    compressor.Diameter = dn;
                    compressor.AppendOrUpdatePropStatus(nameof(compressor.Diameter), ePropStatus.Lack, "[空压机][直径]通过[公称直径]进行修复]");
                }
                else
                {
                    compressor.AppendOrUpdatePropStatus(nameof(compressor.Diameter), ePropStatus.Abnormal, "[空压机][直径]无法通过[公称直径]进行修复]");
                }
            }
            if (compressor.Diameter < 1)
            {
                compressor.Diameter = 1000;
                compressor.AppendOrUpdatePropStatus(nameof(compressor.Diameter), ePropStatus.Lack, "[空压机][直径][内径]解析错误,使用默认值(1000mm)修正]");
            }
            #endregion
            #region Length
            if (jobject[RevitJsonProp.Length].MatchNumeric(out double length))
            {
                compressor.Length = length / 1000f;
            }
            else
            {
                compressor.AppendOrUpdatePropStatus(nameof(compressor.Length), ePropStatus.Abnormal, "[空压机][长度]缺少或者格式错误");
            }
            if (compressor.Length <= 0)
            {
                if (compressor.StartPosition != null && compressor.EndPosition != null)
                {
                    compressor.Length = compressor.StartPosition.Distance(compressor.EndPosition);
                    compressor.AppendOrUpdatePropStatus(nameof(compressor.Length), ePropStatus.Lack, "[空压机][长度]缺省,通过位置自动计算");
                }
                else
                {
                    compressor.AppendOrUpdatePropStatus(nameof(compressor.Length), ePropStatus.Abnormal, "[空压机][长度]受[连接列表]影响无法自动计算");
                }
            }
            #endregion
            #region Roughness
            if (jobject[RevitJsonProp.Roughness].MatchNumeric(out double roughness))
            {
                compressor.Roughness = roughness;
            }
            else
            {
                compressor.AppendOrUpdatePropStatus(nameof(compressor.Roughness), ePropStatus.Abnormal, "[空压机][粗糙系数]缺少或者数据格式错误");
            }
            if (compressor.Roughness < 0.1)
            {
                compressor.Roughness = 110;
                compressor.AppendOrUpdatePropStatus(nameof(compressor.Roughness), ePropStatus.Lack, "[空压机][粗糙系数]解析错误,通过默认值(110)进行修正");
            }
            #endregion
            #region MinorLoss
            if (jobject[RevitJsonProp.MinorLoss].MatchNumeric(out double minorLoss))
            {
                compressor.MinorLoss = minorLoss;
            }
            else
            {
                compressor.AppendOrUpdatePropStatus(nameof(compressor.MinorLoss), ePropStatus.Abnormal, "[空压机][局部阻力系数]缺少或者数据格式错误");
            }
            #endregion
            #region MinorLossK
            if (jobject[RevitJsonProp.MinorLossK].MatchNumeric(out double minorLossK))
            {
                compressor.MinorLossK = minorLossK;
            }
            else
            {
                compressor.AppendOrUpdatePropStatus(nameof(compressor.MinorLossK), ePropStatus.Abnormal, "[空压机][损失K系数]缺少或者数据格式错误");
            }
            #endregion
            return compressor;
        }
        //解析水泵
@@ -4857,6 +5339,7 @@
                return default;
            }
            var pump = new Model.RevitPump();
            pump.Catalog = RevitJsonCatalog.Pump;
            #region Id 
@@ -5347,6 +5830,7 @@
                return default;
            }
            var valve = new Model.RevitValve();
            valve.Catalog = RevitJsonCatalog.Valve;
            #region Id 
@@ -5703,6 +6187,20 @@
            #endregion
            #region OpeningDegree
            if (jobject[RevitJsonProp.ValveOpeningDegree].MatchNumeric(out double openingDegree))
            {
                valve.OpeningDegree = openingDegree;
            }
            else
            {
                valve.OpeningDegree = 100;
                valve.AppendOrUpdatePropStatus(nameof(valve.MinorLoss), ePropStatus.Abnormal, "[阀门开度]缺少或者数据格式错误,使用默认值(100)进行修正");
            }
            #endregion
            #region ValveSetting
            if (jobject.ParseString(RevitJsonProp.ValveSetting, out string valveSetting))