namespace HStation.Service { /// /// Revit Json辅助类 /// public class RevitJsonHelper { /// /// 从json字符串中解析 /// /// json字符串 /// 格式错误,会抛出异常 public static HStation.Model.RevitModel FromJsonString(string revitJsonString) { if (string.IsNullOrEmpty(revitJsonString)) { throw new Exception("Json字符串为空"); } var model = new Model.RevitModel(); var jarray = JArray.Parse(revitJsonString); for (int i = 0; i < jarray.Count; i++) { var jobject = JObject.Parse(jarray[i].ToString()); var catalog = jobject["构件类型"].ToString(); switch (catalog) { case Catalog.Reservoir: { var reservoir = new Model.RevitReservoir(); reservoir.Id = jobject["构件编码"].ToString(); reservoir.Code = jobject["编码"].ToString(); if (string.IsNullOrEmpty(reservoir.Code)) { reservoir.Code = reservoir.Id; } reservoir.Name = jobject["名称"].ToString(); reservoir.ModelType = jobject["型号"].ToString(); reservoir.Flags = Yw.Untity.FlagsHelper.ToList(jobject["标签"].ToString()); reservoir.Description = jobject["说明"].ToString(); reservoir.Quality = Convert.ToDouble(jobject["初始水质"]); var linkList = JsonHelper.Json2Object>(jobject["连接列表"].ToString()); var centerPoint = linkList.GetCenterPoint(); reservoir.Position = new Model.RevitPosition() { X = centerPoint.X, Y = centerPoint.Y, Z = centerPoint.Z }; reservoir.Head = Convert.ToDouble(jobject["总水头"]); reservoir.HeadPattern = jobject["水头模式"].ToString(); model.Reservoirs.Add(reservoir); } break; case Catalog.Tank: { var tank = new Model.RevitTank(); tank.Id = jobject["构件编码"].ToString(); tank.Code = jobject["编码"].ToString(); if (string.IsNullOrEmpty(tank.Code)) { tank.Code = tank.Id; } tank.Name = jobject["名称"].ToString(); tank.ModelType = jobject["型号"].ToString(); tank.Flags = Yw.Untity.FlagsHelper.ToList(jobject["标签"].ToString()); tank.Description = jobject["说明"].ToString(); tank.Quality = Convert.ToDouble(jobject["初始水质"]); var linkList = JsonHelper.Json2Object>(jobject["连接列表"].ToString()); var centerPoint = linkList.GetCenterPoint(); tank.Position = new Model.RevitPosition() { X = centerPoint.X, Y = centerPoint.Y, Z = centerPoint.Z }; tank.PoolElev = Convert.ToDouble(jobject["池底标高"]); tank.InitLevel = Convert.ToDouble(jobject["初始水位"]); tank.MinLevel = Convert.ToDouble(jobject["最低水位"]); tank.MaxLevel = Convert.ToDouble(jobject["最高水位"]); tank.Diameter = Convert.ToDouble(jobject["直径"]); tank.MinVol = Convert.ToDouble(jobject["最小容积"]); tank.VolCurve = jobject["容积曲线"].ToString(); model.Tanks.Add(tank); } break; case Catalog.Waterbox: { var waterbox = new Model.RevitWaterbox(); waterbox.Id = jobject["构件编码"].ToString(); waterbox.Code = jobject["编码"].ToString(); if (string.IsNullOrEmpty(waterbox.Code)) { waterbox.Code = waterbox.Id; } waterbox.Name = jobject["名称"].ToString(); waterbox.ModelType = jobject["型号"].ToString(); waterbox.Flags = Yw.Untity.FlagsHelper.ToList(jobject["标签"].ToString()); waterbox.Description = jobject["说明"].ToString(); waterbox.Quality = Convert.ToDouble(jobject["初始水质"]); var linkList = JsonHelper.Json2Object>(jobject["连接列表"].ToString()); var centerPoint = linkList.GetCenterPoint(); waterbox.Position = new Model.RevitPosition() { X = centerPoint.X, Y = centerPoint.Y, Z = centerPoint.Z }; waterbox.PoolElev = Convert.ToDouble(jobject["池底标高"]); waterbox.InitLevel = Convert.ToDouble(jobject["初始水位"]); waterbox.MinLevel = Convert.ToDouble(jobject["最低水位"]); waterbox.MaxLevel = Convert.ToDouble(jobject["最高水位"]); waterbox.Diameter = Convert.ToDouble(jobject["直径"]); waterbox.MinVol = Convert.ToDouble(jobject["最小容积"]); waterbox.VolCurve = jobject["容积曲线"].ToString(); model.Waterboxs.Add(waterbox); } break; case Catalog.Junction: { var junction = new Model.RevitJunction(); junction.Id = jobject["构件编码"].ToString(); junction.Code = jobject["编码"].ToString(); if (string.IsNullOrEmpty(junction.Code)) { junction.Code = junction.Id; } junction.Name = jobject["名称"].ToString(); junction.ModelType = jobject["型号"].ToString(); junction.Flags = Yw.Untity.FlagsHelper.ToList(jobject["标签"].ToString()); junction.Description = jobject["说明"].ToString(); junction.Quality = Convert.ToDouble(jobject["初始水质"]); var linkList = JsonHelper.Json2Object>(jobject["连接列表"].ToString()); var centerPoint = linkList.GetCenterPoint(); junction.Position = new Model.RevitPosition() { X = centerPoint.X, Y = centerPoint.Y, Z = centerPoint.Z }; junction.Elev = Convert.ToDouble(jobject["标高"]); var demand = jobject["需水量"].ToString(); if (!string.IsNullOrEmpty(demand)) { junction.Demand = Convert.ToDouble(demand); } junction.DemandPattern = jobject["需水模式"].ToString(); model.Junctions.Add(junction); } break; case Catalog.Elbow: { var elbow = new Model.RevitElbow(); elbow.Id = jobject["构件编码"].ToString(); elbow.Code = jobject["编码"].ToString(); if (string.IsNullOrEmpty(elbow.Code)) { elbow.Code = elbow.Id; } elbow.Name = jobject["名称"].ToString(); elbow.ModelType = jobject["型号"].ToString(); elbow.Flags = Yw.Untity.FlagsHelper.ToList(jobject["标签"].ToString()); elbow.Description = jobject["说明"].ToString(); elbow.Quality = Convert.ToDouble(jobject["初始水质"]); var linkList = JsonHelper.Json2Object>(jobject["连接列表"].ToString()); var centerPoint = linkList.GetCenterPoint(); elbow.Position = new Model.RevitPosition() { X = centerPoint.X, Y = centerPoint.Y, Z = centerPoint.Z }; elbow.Elev = Convert.ToDouble(jobject["标高"]); var demand = jobject["需水量"].ToString(); if (!string.IsNullOrEmpty(demand)) { elbow.Demand = Convert.ToDouble(demand); } elbow.DemandPattern = jobject["需水模式"].ToString(); model.Elbows.Add(elbow); } break; case Catalog.Threelink: { var threelink = new Model.RevitThreelink(); threelink.Id = jobject["构件编码"].ToString(); threelink.Code = jobject["编码"].ToString(); if (string.IsNullOrEmpty(threelink.Code)) { threelink.Code = threelink.Id; } threelink.Name = jobject["名称"].ToString(); threelink.ModelType = jobject["型号"].ToString(); threelink.Flags = Yw.Untity.FlagsHelper.ToList(jobject["标签"].ToString()); threelink.Description = jobject["说明"].ToString(); threelink.Quality = Convert.ToDouble(jobject["初始水质"]); var linkList = JsonHelper.Json2Object>(jobject["连接列表"].ToString()); var centerPoint = linkList.GetCenterPoint(); threelink.Position = new Model.RevitPosition() { X = centerPoint.X, Y = centerPoint.Y, Z = centerPoint.Z }; threelink.Elev = Convert.ToDouble(jobject["标高"]); var demand = jobject["需水量"].ToString(); if (!string.IsNullOrEmpty(demand)) { threelink.Demand = Convert.ToDouble(demand); } threelink.DemandPattern = jobject["需水模式"].ToString(); model.Threelinks.Add(threelink); } break; case Catalog.Fourlink: { var fourlink = new Model.RevitFourlink(); fourlink.Id = jobject["构件编码"].ToString(); fourlink.Code = jobject["编码"].ToString(); if (string.IsNullOrEmpty(fourlink.Code)) { fourlink.Code = fourlink.Id; } fourlink.Name = jobject["名称"].ToString(); fourlink.ModelType = jobject["型号"].ToString(); fourlink.Flags = Yw.Untity.FlagsHelper.ToList(jobject["标签"].ToString()); fourlink.Description = jobject["说明"].ToString(); fourlink.Quality = Convert.ToDouble(jobject["初始水质"]); var linkList = JsonHelper.Json2Object>(jobject["连接列表"].ToString()); var centerPoint = linkList.GetCenterPoint(); fourlink.Position = new Model.RevitPosition() { X = centerPoint.X, Y = centerPoint.Y, Z = centerPoint.Z }; fourlink.Elev = Convert.ToDouble(jobject["标高"]); var demand = jobject["需水量"].ToString(); if (!string.IsNullOrEmpty(demand)) { fourlink.Demand = Convert.ToDouble(demand); } fourlink.DemandPattern = jobject["需水模式"].ToString(); model.Fourlinks.Add(fourlink); } break; case Catalog.Flowmeter: { var flowmeter = new Model.RevitFlowmeter(); flowmeter.Id = jobject["构件编码"].ToString(); flowmeter.Code = jobject["编码"].ToString(); if (string.IsNullOrEmpty(flowmeter.Code)) { flowmeter.Code = flowmeter.Id; } flowmeter.Name = jobject["名称"].ToString(); flowmeter.ModelType = jobject["型号"].ToString(); flowmeter.Flags = Yw.Untity.FlagsHelper.ToList(jobject["标签"].ToString()); flowmeter.Description = jobject["说明"].ToString(); flowmeter.Quality = Convert.ToDouble(jobject["初始水质"]); var linkList = JsonHelper.Json2Object>(jobject["连接列表"].ToString()); var centerPoint = linkList.GetCenterPoint(); flowmeter.Position = new Model.RevitPosition() { X = centerPoint.X, Y = centerPoint.Y, Z = centerPoint.Z }; flowmeter.Elev = Convert.ToDouble(jobject["标高"]); var demand = jobject["需水量"].ToString(); if (!string.IsNullOrEmpty(demand)) { flowmeter.Demand = Convert.ToDouble(demand); } flowmeter.DemandPattern = jobject["需水模式"].ToString(); model.Flowmeters.Add(flowmeter); } break; case Catalog.Pressmeter: { var pressmeter = new Model.RevitPressmeter(); pressmeter.Id = jobject["构件编码"].ToString(); pressmeter.Code = jobject["编码"].ToString(); if (string.IsNullOrEmpty(pressmeter.Code)) { pressmeter.Code = pressmeter.Id; } pressmeter.Name = jobject["名称"].ToString(); pressmeter.ModelType = jobject["型号"].ToString(); pressmeter.Flags = Yw.Untity.FlagsHelper.ToList(jobject["标签"].ToString()); pressmeter.Description = jobject["说明"].ToString(); pressmeter.Quality = Convert.ToDouble(jobject["初始水质"]); var linkList = JsonHelper.Json2Object>(jobject["连接列表"].ToString()); var centerPoint = linkList.GetCenterPoint(); pressmeter.Position = new Model.RevitPosition() { X = centerPoint.X, Y = centerPoint.Y, Z = centerPoint.Z }; pressmeter.Elev = Convert.ToDouble(jobject["标高"]); var demand = jobject["需水量"].ToString(); if (!string.IsNullOrEmpty(demand)) { pressmeter.Demand = Convert.ToDouble(demand); } pressmeter.DemandPattern = jobject["需水模式"].ToString(); model.Pressmeters.Add(pressmeter); } break; case Catalog.Blunthead: { var blunthead = new Model.RevitBlunthead(); blunthead.Id = jobject["构件编码"].ToString(); blunthead.Code = jobject["编码"].ToString(); if (string.IsNullOrEmpty(blunthead.Code)) { blunthead.Code = blunthead.Id; } blunthead.Name = jobject["名称"].ToString(); blunthead.ModelType = jobject["型号"].ToString(); blunthead.Flags = Yw.Untity.FlagsHelper.ToList(jobject["标签"].ToString()); blunthead.Description = jobject["说明"].ToString(); blunthead.Quality = Convert.ToDouble(jobject["初始水质"]); var linkList = JsonHelper.Json2Object>(jobject["连接列表"].ToString()); var centerPoint = linkList.GetCenterPoint(); blunthead.Position = new Model.RevitPosition() { X = centerPoint.X, Y = centerPoint.Y, Z = centerPoint.Z }; blunthead.Elev = Convert.ToDouble(jobject["标高"]); var demand = jobject["需水量"].ToString(); if (!string.IsNullOrEmpty(demand)) { blunthead.Demand = Convert.ToDouble(demand); } blunthead.DemandPattern = jobject["需水模式"].ToString(); model.Bluntheads.Add(blunthead); } break; case Catalog.Nozzle: { var nozzle = new Model.RevitNozzle(); nozzle.Id = jobject["构件编码"].ToString(); nozzle.Code = jobject["编码"].ToString(); if (string.IsNullOrEmpty(nozzle.Code)) { nozzle.Code = nozzle.Id; } nozzle.Name = jobject["名称"].ToString(); nozzle.ModelType = jobject["型号"].ToString(); nozzle.Flags = Yw.Untity.FlagsHelper.ToList(jobject["标签"].ToString()); nozzle.Description = jobject["说明"].ToString(); nozzle.Quality = Convert.ToDouble(jobject["初始水质"]); var linkList = JsonHelper.Json2Object>(jobject["连接列表"].ToString()); var centerPoint = linkList.GetCenterPoint(); nozzle.Position = new Model.RevitPosition() { X = centerPoint.X, Y = centerPoint.Y, Z = centerPoint.Z }; nozzle.Elev = Convert.ToDouble(jobject["标高"]); nozzle.Coefficient = Convert.ToDouble(jobject["喷射系数"]); var demand = jobject["需水量"].ToString(); if (!string.IsNullOrEmpty(demand)) { nozzle.Demand = Convert.ToDouble(demand); } nozzle.DemandPattern = jobject["需水模式"].ToString(); model.Nozzles.Add(nozzle); } break; case Catalog.Hydrant: { var hydrant = new Model.RevitHydrant(); hydrant.Id = jobject["构件编码"].ToString(); hydrant.Code = jobject["编码"].ToString(); if (string.IsNullOrEmpty(hydrant.Code)) { hydrant.Code = hydrant.Id; } hydrant.Name = jobject["名称"].ToString(); hydrant.ModelType = jobject["型号"].ToString(); hydrant.Flags = Yw.Untity.FlagsHelper.ToList(jobject["标签"].ToString()); hydrant.Description = jobject["说明"].ToString(); hydrant.Quality = Convert.ToDouble(jobject["初始水质"]); var linkList = JsonHelper.Json2Object>(jobject["连接列表"].ToString()); var centerPoint = linkList.GetCenterPoint(); hydrant.Position = new Model.RevitPosition() { X = centerPoint.X, Y = centerPoint.Y, Z = centerPoint.Z }; hydrant.Elev = Convert.ToDouble(jobject["标高"]); hydrant.Coefficient = Convert.ToDouble(jobject["流量系数"]); var demand = jobject["需水量"].ToString(); if (!string.IsNullOrEmpty(demand)) { hydrant.Demand = Convert.ToDouble(demand); } hydrant.DemandPattern = jobject["需水模式"].ToString(); model.Hydrants.Add(hydrant); } break; case Catalog.Pipe: { var pipe = new Model.RevitPipe(); pipe.Id = jobject["构件编码"].ToString(); pipe.Code = jobject["编码"].ToString(); if (string.IsNullOrEmpty(pipe.Code)) { pipe.Code = pipe.Id; } pipe.Name = jobject["名称"].ToString(); pipe.ModelType = jobject["型号"].ToString(); pipe.Flags = Yw.Untity.FlagsHelper.ToList(jobject["标签"].ToString()); pipe.Description = jobject["说明"].ToString(); var linkList = JsonHelper.Json2Object>(jobject["连接列表"].ToString()); var startLinker = linkList.GetStartLinker(); var endLinker = linkList.GetEndLinker(); pipe.StartCode = startLinker.ConnectId; pipe.EndCode = endLinker.ConnectId; pipe.LinkStatus = jobject["管道状态"].ToString(); pipe.StartElev = Convert.ToDouble(jobject["上游标高"]); pipe.EndElev = Convert.ToDouble(jobject["下游标高"]); pipe.StartQuality = Convert.ToDouble(jobject["上游初始水质"]); pipe.EndQuality = Convert.ToDouble(jobject["下游初始水质"]); pipe.StartPosition = new Model.RevitPosition() { X = startLinker.Point.X, Y = startLinker.Point.Y, Z = startLinker.Point.Z }; pipe.EndPosition = new Model.RevitPosition() { X = endLinker.Point.X, Y = endLinker.Point.Y, Z = endLinker.Point.Z }; pipe.Length = Convert.ToDouble(jobject["长度"]); pipe.Diameter = Convert.ToDouble(jobject["直径"]); pipe.MinorLoss = Convert.ToDouble(jobject["局部阻力系数"]); pipe.Roughness = Convert.ToDouble(jobject["粗糙系数"]); model.Pipes.Add(pipe); } break; case Catalog.Translation: { var translation = new Model.RevitTranslation(); translation.Id = jobject["构件编码"].ToString(); translation.Code = jobject["编码"].ToString(); if (string.IsNullOrEmpty(translation.Code)) { translation.Code = translation.Id; } translation.Name = jobject["名称"].ToString(); translation.ModelType = jobject["型号"].ToString(); translation.Flags = Yw.Untity.FlagsHelper.ToList(jobject["标签"].ToString()); translation.Description = jobject["说明"].ToString(); var linkList = JsonHelper.Json2Object>(jobject["连接列表"].ToString()); var startLinker = linkList.GetStartLinker(); var endLinker = linkList.GetEndLinker(); translation.StartCode = startLinker.ConnectId; translation.EndCode = endLinker.ConnectId; translation.LinkStatus = jobject["管道状态"].ToString(); translation.StartElev = Convert.ToDouble(jobject["上游标高"]); translation.EndElev = Convert.ToDouble(jobject["下游标高"]); translation.StartQuality = Convert.ToDouble(jobject["上游初始水质"]); translation.EndQuality = Convert.ToDouble(jobject["下游初始水质"]); translation.StartPosition = new Model.RevitPosition() { X = startLinker.Point.X, Y = startLinker.Point.Y, Z = startLinker.Point.Z }; translation.EndPosition = new Model.RevitPosition() { X = endLinker.Point.X, Y = endLinker.Point.Y, Z = endLinker.Point.Z }; translation.Length = Convert.ToDouble(jobject["长度"]); translation.Diameter = Convert.ToDouble(jobject["直径"]); translation.MinorLoss = Convert.ToDouble(jobject["局部阻力系数"]); translation.Roughness = Convert.ToDouble(jobject["粗糙系数"]); model.Translations.Add(translation); } break; case Catalog.Pump: { var pump = new Model.RevitPump(); pump.Id = jobject["构件编码"].ToString(); pump.Code = jobject["编码"].ToString(); if (string.IsNullOrEmpty(pump.Code)) { pump.Code = pump.Id; } pump.Name = jobject["名称"].ToString(); pump.ModelType = jobject["型号"].ToString(); pump.Flags = Yw.Untity.FlagsHelper.ToList(jobject["标签"].ToString()); pump.Description = jobject["说明"].ToString(); var linkList = JsonHelper.Json2Object>(jobject["连接列表"].ToString()); var startLinker = linkList.GetStartLinker(); var endLinker = linkList.GetEndLinker(); pump.StartCode = startLinker.ConnectId; pump.EndCode = endLinker.ConnectId; pump.LinkStatus = jobject["水泵状态"].ToString(); pump.StartElev = Convert.ToDouble(jobject["上游标高"]); pump.EndElev = Convert.ToDouble(jobject["下游标高"]); pump.StartQuality = Convert.ToDouble(jobject["上游初始水质"]); pump.EndQuality = Convert.ToDouble(jobject["下游初始水质"]); pump.StartPosition = new Model.RevitPosition() { X = startLinker.Point.X, Y = startLinker.Point.Y, Z = startLinker.Point.Z }; pump.EndPosition = new Model.RevitPosition() { X = endLinker.Point.X, Y = endLinker.Point.Y, Z = endLinker.Point.Z }; pump.RatedPower = Convert.ToDouble(jobject["额定功率"]); pump.CurveQH = jobject["流量扬程曲线"].ToString(); var speedRatio = jobject["转速比"].ToString(); if (!string.IsNullOrEmpty(speedRatio)) { pump.SpeedRatio = Convert.ToDouble(speedRatio); } pump.SpeedRatioPattern = jobject["转速比模式"].ToString(); var price = jobject["能耗价格"].ToString(); if (!string.IsNullOrEmpty(price)) { pump.Price = Convert.ToDouble(price); } pump.PricePattern = jobject["价格模式"].ToString(); pump.CurveQE = jobject["流量效率曲线"].ToString(); model.Pumps.Add(pump); } break; case Catalog.Valve: { var valve = new Model.RevitValve(); valve.Id = jobject["构件编码"].ToString(); valve.Code = jobject["编码"].ToString(); if (string.IsNullOrEmpty(valve.Code)) { valve.Code = valve.Id; } valve.Name = jobject["名称"].ToString(); valve.ModelType = jobject["型号"].ToString(); valve.Flags = Yw.Untity.FlagsHelper.ToList(jobject["标签"].ToString()); valve.Description = jobject["说明"].ToString(); var linkList = JsonHelper.Json2Object>(jobject["连接列表"].ToString()); var startLinker = linkList.GetStartLinker(); var endLinker = linkList.GetEndLinker(); valve.StartCode = startLinker.ConnectId; valve.EndCode = endLinker.ConnectId; valve.LinkStatus = jobject["阀门状态"].ToString(); valve.StartElev = Convert.ToDouble(jobject["上游标高"]); valve.EndElev = Convert.ToDouble(jobject["下游标高"]); valve.StartQuality = Convert.ToDouble(jobject["上游初始水质"]); valve.EndQuality = Convert.ToDouble(jobject["下游初始水质"]); valve.StartPosition = new Model.RevitPosition() { X = startLinker.Point.X, Y = startLinker.Point.Y, Z = startLinker.Point.Z }; valve.EndPosition = new Model.RevitPosition() { X = endLinker.Point.X, Y = endLinker.Point.Y, Z = endLinker.Point.Z }; valve.Diameter = Convert.ToDouble(jobject["直径"]); valve.MinorLoss = Convert.ToDouble(jobject["局部阻力系数"]); valve.ValveType = jobject["阀门类型"].ToString(); valve.ValveSetting = jobject["阀门设置"].ToString(); model.Valves.Add(valve); } break; default: break; } } return model; } /// /// 从json文件中解析 /// /// json文件路径 /// public static Model.RevitModel FromJsonFile(string revitJsonFile) { if (!File.Exists(revitJsonFile)) { return default; } var revitJson = File.ReadAllText(revitJsonFile); var revitModel = FromJsonString(revitJson); if (revitModel == null) { return default; } revitModel.Name = Path.GetFileNameWithoutExtension(revitJsonFile); revitModel.Description = $"解析【{Path.GetFileName(revitJsonFile)}】文件"; return revitModel; } } }