namespace HStation.Service { /// /// Revit Json辅助类 /// public class RevitJsonHelper { /// /// 从json字符串中解析 /// public static HStation.Model.RevitModel FromJsonString ( string revitJsonString, string revitOthersJsonString, out string msg ) { msg = string.Empty; if (string.IsNullOrEmpty(revitJsonString)) { msg = "Revit json 字符串为空"; return default; } try { var model = new Model.RevitModel(); //解析结构json var jarray = JArray.Parse(revitJsonString); for (int i = 0; i < jarray.Count; i++) { var jobject = JObject.Parse(jarray[i].ToString()); var catalog = jobject[RevitJsonProp.Catalog].ToString(); switch (catalog) { case RevitJsonCatalog.Reservoir: { var reservoir = ParseReservoir(jobject); if (reservoir != null) { model.Reservoirs.Add(reservoir); } } break; case RevitJsonCatalog.Tank: { var tank = ParseTank(jobject); if (tank != null) { model.Tanks.Add(tank); } } break; case RevitJsonCatalog.Waterbox: { var waterbox = ParseWaterbox(jobject); if (waterbox != null) { model.Waterboxs.Add(waterbox); } } break; case RevitJsonCatalog.Junction: { var junction = ParseJunction(jobject); if (junction != null) { model.Junctions.Add(junction); } } break; case RevitJsonCatalog.Blunthead: { var blunthead = ParseBlunthead(jobject); if (blunthead != null) { model.Bluntheads.Add(blunthead); } } break; case RevitJsonCatalog.Elbow: { var elbow = ParseElbow(jobject); if (elbow != null) { model.Elbows.Add(elbow); } } break; case RevitJsonCatalog.Threelink: { var threelink = ParseThreelink(jobject); if (threelink != null) { model.Threelinks.Add(threelink); } } break; case RevitJsonCatalog.Fourlink: { var fourlink = ParseFourlink(jobject); if (fourlink != null) { model.Fourlinks.Add(fourlink); } } break; case RevitJsonCatalog.Meter: { var meter = ParseMeter(jobject); if (meter != null) { model.Meters.Add(meter); } } break; case RevitJsonCatalog.Flowmeter: { var flowmeter = ParseFlowmeter(jobject); if (flowmeter != null) { model.Flowmeters.Add(flowmeter); } } break; case RevitJsonCatalog.Pressmeter: { var pressmeter = ParsePressmeter(jobject); if (pressmeter != null) { model.Pressmeters.Add(pressmeter); } } break; case RevitJsonCatalog.Nozzle: { var nozzle = ParseNozzle(jobject); if (nozzle != null) { model.Nozzles.Add(nozzle); } } break; case RevitJsonCatalog.Hydrant: { var hydrant = ParseHydrant(jobject); if (hydrant != null) { model.Hydrants.Add(hydrant); } } break; case RevitJsonCatalog.Pipe: { var pipe = ParsePipe(jobject); if (pipe != null) { model.Pipes.Add(pipe); } } break; case RevitJsonCatalog.Translation: { var translation = ParseTranslation(jobject); if (translation != null) { model.Translations.Add(translation); } } break; case RevitJsonCatalog.Exchanger: { var exchanger = ParseExchanger(jobject); if (exchanger != null) { model.Exchangers.Add(exchanger); } } break; case RevitJsonCatalog.Pump: { var pump = ParsePump(jobject); if (pump != null) { model.Pumps.Add(pump); } } break; case RevitJsonCatalog.Valve: { var valve = ParseValve(jobject); if (valve != null) { model.Valves.Add(valve); } } break; case RevitJsonCatalog.Other: { var decorator = ParseDecorator(jobject); if (decorator != null) { model.Decorators.Add(decorator); } } break; default: break; } } //解析其他json var jothersArray = JArray.Parse(revitOthersJsonString); if (jothersArray != null && jothersArray.Count > 0) { var allParterList = model.GetAllParters(); for (int i = 0; i < jothersArray.Count; i++) { var jobject = jothersArray[i]; var id = jobject[RevitOthersJsonProp.Id]?.ToString(); if (string.IsNullOrEmpty(id)) { continue; } if (allParterList.Exists(x => x.Id == id)) { continue; } if (model.Decorators.Exists(x => x.Id == id)) { continue; } var decorator = new Model.RevitDecorator(); decorator.Id = id; decorator.Code = id; decorator.Name = jobject[RevitOthersJsonProp.Name]?.ToString(); decorator.Category = jobject[RevitOthersJsonProp.CategoryName]?.ToString(); decorator.Decoration = jobject[RevitOthersJsonProp.CategoryID]?.ToString(); model.Decorators.Add(decorator); } } return model; } catch (Exception ex) { msg = ex.Message; return default; } } /// /// 从json文件中解析 /// public static Model.RevitModel FromJsonFile(string revitJsonFile, string revitOthersJsonFile, out string msg) { if (!File.Exists(revitJsonFile)) { msg = "Json 文件不存在"; return default; } var revitJson = File.ReadAllText(revitJsonFile); var revitOthersJson = string.Empty; if (File.Exists(revitOthersJsonFile)) { revitOthersJson = File.ReadAllText(revitOthersJsonFile); } var revitModel = FromJsonString(revitJson, revitOthersJson, out msg); if (revitModel == null) { return default; } revitModel.Name = Path.GetFileNameWithoutExtension(revitJsonFile); revitModel.Description = $"解析【{Path.GetFileName(revitJsonFile)}】文件"; return revitModel; } //解析连接节点 private static HStation.Model.RevitJunction ParseJunction(JToken jobject) { if (jobject == null) { return default; } //基础信息 var junction = new Model.RevitJunction(); junction.Id = jobject[RevitJsonProp.Id].ToString(); junction.Code = jobject[RevitJsonProp.Code].ToString(); if (string.IsNullOrEmpty(junction.Code)) { junction.Code = junction.Id; } junction.Name = jobject[RevitJsonProp.Name].ToString(); junction.ModelType = jobject[RevitJsonProp.ModelType].ToString(); junction.Flags = Yw.Untity.FlagsHelper.ToList(jobject[RevitJsonProp.Flags].ToString()); junction.Description = jobject[RevitJsonProp.Description].ToString(); var connectList = JsonHelper.Json2Object>(jobject[RevitJsonProp.Connects].ToString()); junction.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(); junction.Position = junction.ConnectList.GetCenterPosition(); //初始水质 if (jobject[RevitJsonProp.Quality].MatchNumeric(out double quality)) { junction.Quality = quality; } //标高信息 if (jobject[RevitJsonProp.Elev].MatchNumeric(out double elev)) { junction.Elev = elev / 1000f; } if (junction.Elev <= 0) { //标高中的高程 var jobjectElevOfElevation = jobject[RevitJsonProp.ElevOfElevation]; if (jobjectElevOfElevation != null) { if (jobjectElevOfElevation.MatchNumeric(out double elevOfElevation)) { junction.Elev = elevOfElevation / 1000f; } } } if (junction.Elev <= 0) { //通过z轴自动计算 junction.Elev = junction.Position.Z; } //需水量 if (jobject[RevitJsonProp.Demand].MatchNumeric(out double demand)) { junction.Demand = demand; } //需水模式 junction.DemandPattern = jobject[RevitJsonProp.DemandPattern].ToString(); return junction; } //解析喷头 private static HStation.Model.RevitNozzle ParseNozzle(JToken jobject) { if (jobject == null) { return default; } //基本信息 var nozzle = new Model.RevitNozzle(); nozzle.Id = jobject[RevitJsonProp.Id].ToString(); nozzle.Code = jobject[RevitJsonProp.Code].ToString(); if (string.IsNullOrEmpty(nozzle.Code)) { nozzle.Code = nozzle.Id; } nozzle.Name = jobject[RevitJsonProp.Name].ToString(); nozzle.ModelType = jobject[RevitJsonProp.ModelType].ToString(); nozzle.Flags = Yw.Untity.FlagsHelper.ToList(jobject[RevitJsonProp.Flags].ToString()); nozzle.Description = jobject[RevitJsonProp.Description].ToString(); var connectList = JsonHelper.Json2Object>(jobject[RevitJsonProp.Connects].ToString()); nozzle.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(); nozzle.Position = nozzle.ConnectList.GetCenterPosition(); //初始水质 if (jobject[RevitJsonProp.Quality].MatchNumeric(out double quality)) { nozzle.Quality = quality; } //标高信息 if (jobject[RevitJsonProp.Elev].MatchNumeric(out double elev)) { nozzle.Elev = elev / 1000f; } if (nozzle.Elev <= 0) { //标高中的高程 var jobjectElevOfElevation = jobject[RevitJsonProp.ElevOfElevation]; if (jobjectElevOfElevation != null) { if (jobjectElevOfElevation.MatchNumeric(out double elevOfElevation)) { nozzle.Elev = elevOfElevation / 1000f; } } } if (nozzle.Elev <= 0) { //通过z轴自动计算 nozzle.Elev = nozzle.Position.Z; } //需水量 if (jobject[RevitJsonProp.Demand].MatchNumeric(out double demand)) { nozzle.Demand = demand; } //需水模式 nozzle.DemandPattern = jobject[RevitJsonProp.DemandPattern].ToString(); //喷射系数 if (jobject[RevitJsonProp.CoefficientP].MatchNumeric(out double coeffient)) { nozzle.Coefficient = coeffient; } return nozzle; } //解析消火栓 private static HStation.Model.RevitHydrant ParseHydrant(JToken jobject) { if (jobject == null) { return default; } //基本信息 var hydrant = new Model.RevitHydrant(); hydrant.Id = jobject[RevitJsonProp.Id].ToString(); hydrant.Code = jobject[RevitJsonProp.Code].ToString(); if (string.IsNullOrEmpty(hydrant.Code)) { hydrant.Code = hydrant.Id; } hydrant.Name = jobject[RevitJsonProp.Name].ToString(); hydrant.ModelType = jobject[RevitJsonProp.ModelType].ToString(); hydrant.Flags = Yw.Untity.FlagsHelper.ToList(jobject[RevitJsonProp.Flags].ToString()); hydrant.Description = jobject[RevitJsonProp.Description].ToString(); var connectList = JsonHelper.Json2Object>(jobject[RevitJsonProp.Connects].ToString()); hydrant.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(); hydrant.Position = hydrant.ConnectList.GetCenterPosition(); //初始水质 if (jobject[RevitJsonProp.Quality].MatchNumeric(out double quality)) { hydrant.Quality = quality; } //标高信息 if (jobject[RevitJsonProp.Elev].MatchNumeric(out double elev)) { hydrant.Elev = elev / 1000f; } if (hydrant.Elev <= 0) { //标高中的高程 var jobjectElevOfElevation = jobject[RevitJsonProp.ElevOfElevation]; if (jobjectElevOfElevation != null) { if (jobjectElevOfElevation.MatchNumeric(out double elevOfElevation)) { hydrant.Elev = elevOfElevation / 1000f; } } } if (hydrant.Elev <= 0) { //通过z轴自动计算 hydrant.Elev = hydrant.Position.Z; } //需水量 if (jobject[RevitJsonProp.Demand].MatchNumeric(out double demand)) { hydrant.Demand = demand; } //需水模式 hydrant.DemandPattern = jobject[RevitJsonProp.DemandPattern].ToString(); //流量系数 if (jobject[RevitJsonProp.CoefficientF].MatchNumeric(out double coeffient)) { hydrant.Coefficient = coeffient; } return hydrant; } //解析弯头 private static HStation.Model.RevitElbow ParseElbow(JToken jobject) { if (jobject == null) { return default; } //基本信息 var elbow = new Model.RevitElbow(); elbow.Id = jobject[RevitJsonProp.Id].ToString(); elbow.Code = jobject[RevitJsonProp.Code].ToString(); if (string.IsNullOrEmpty(elbow.Code)) { elbow.Code = elbow.Id; } elbow.Name = jobject[RevitJsonProp.Name].ToString(); elbow.ModelType = jobject[RevitJsonProp.ModelType].ToString(); elbow.Flags = Yw.Untity.FlagsHelper.ToList(jobject[RevitJsonProp.Flags].ToString()); elbow.Description = jobject[RevitJsonProp.Description].ToString(); var connectList = JsonHelper.Json2Object>(jobject[RevitJsonProp.Connects].ToString()); elbow.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(); elbow.Position = elbow.ConnectList.GetCenterPosition(); //初始水质 if (jobject[RevitJsonProp.Quality].MatchNumeric(out double quality)) { elbow.Quality = quality; } //标高信息 if (jobject[RevitJsonProp.Elev].MatchNumeric(out double elev)) { elbow.Elev = elev / 1000f; } if (elbow.Elev <= 0) { //标高中的高程 var jobjectElevOfElevation = jobject[RevitJsonProp.ElevOfElevation]; if (jobjectElevOfElevation != null) { if (jobjectElevOfElevation.MatchNumeric(out double elevOfElevation)) { elbow.Elev = elevOfElevation / 1000f; } } } if (elbow.Elev <= 0) { //通过z轴自动计算 elbow.Elev = elbow.Position.Z; } //需水量 if (jobject[RevitJsonProp.Demand].MatchNumeric(out double demand)) { elbow.Demand = demand; } //需水模式 elbow.DemandPattern = jobject[RevitJsonProp.DemandPattern].ToString(); return elbow; } //解析三通 private static HStation.Model.RevitThreelink ParseThreelink(JToken jobject) { if (jobject == null) { return default; } //基本信息 var threelink = new Model.RevitThreelink(); threelink.Id = jobject[RevitJsonProp.Id].ToString(); threelink.Code = jobject[RevitJsonProp.Code].ToString(); if (string.IsNullOrEmpty(threelink.Code)) { threelink.Code = threelink.Id; } threelink.Name = jobject[RevitJsonProp.Name].ToString(); threelink.ModelType = jobject[RevitJsonProp.ModelType].ToString(); threelink.Flags = Yw.Untity.FlagsHelper.ToList(jobject[RevitJsonProp.Flags].ToString()); threelink.Description = jobject[RevitJsonProp.Description].ToString(); var connectList = JsonHelper.Json2Object>(jobject[RevitJsonProp.Connects].ToString()); threelink.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(); threelink.Position = threelink.ConnectList.GetCenterPosition(); //初始水质 if (jobject[RevitJsonProp.Quality].MatchNumeric(out double quality)) { threelink.Quality = quality; } //标高信息 if (jobject[RevitJsonProp.Elev].MatchNumeric(out double elev)) { threelink.Elev = elev / 1000f; } if (threelink.Elev <= 0) { //标高中的高程 var jobjectElevOfElevation = jobject[RevitJsonProp.ElevOfElevation]; if (jobjectElevOfElevation != null) { if (jobjectElevOfElevation.MatchNumeric(out double elevOfElevation)) { threelink.Elev = elevOfElevation / 1000f; } } } if (threelink.Elev <= 0) { //通过z轴自动计算 threelink.Elev = threelink.Position.Z; } //需水量 if (jobject[RevitJsonProp.Demand].MatchNumeric(out double demand)) { threelink.Demand = demand; } //需水模式 threelink.DemandPattern = jobject[RevitJsonProp.DemandPattern].ToString(); return threelink; } //解析四通 private static HStation.Model.RevitFourlink ParseFourlink(JToken jobject) { if (jobject == null) { return default; } //基本信息 var fourlink = new Model.RevitFourlink(); fourlink.Id = jobject[RevitJsonProp.Id].ToString(); fourlink.Code = jobject[RevitJsonProp.Code].ToString(); if (string.IsNullOrEmpty(fourlink.Code)) { fourlink.Code = fourlink.Id; } fourlink.Name = jobject[RevitJsonProp.Name].ToString(); fourlink.ModelType = jobject[RevitJsonProp.ModelType].ToString(); fourlink.Flags = Yw.Untity.FlagsHelper.ToList(jobject[RevitJsonProp.Flags].ToString()); fourlink.Description = jobject[RevitJsonProp.Description].ToString(); var connectList = JsonHelper.Json2Object>(jobject[RevitJsonProp.Connects].ToString()); fourlink.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(); fourlink.Position = fourlink.ConnectList.GetCenterPosition(); //初始水质 if (jobject[RevitJsonProp.Quality].MatchNumeric(out double quality)) { fourlink.Quality = quality; } //标高信息 if (jobject[RevitJsonProp.Elev].MatchNumeric(out double elev)) { fourlink.Elev = elev / 1000f; } if (fourlink.Elev <= 0) { //标高中的高程 var jobjectElevOfElevation = jobject[RevitJsonProp.ElevOfElevation]; if (jobjectElevOfElevation != null) { if (jobjectElevOfElevation.MatchNumeric(out double elevOfElevation)) { fourlink.Elev = elevOfElevation / 1000f; } } } if (fourlink.Elev <= 0) { //通过z轴自动计算 fourlink.Elev = fourlink.Position.Z; } //需水量 if (jobject[RevitJsonProp.Demand].MatchNumeric(out double demand)) { fourlink.Demand = demand; } //需水模式 fourlink.DemandPattern = jobject[RevitJsonProp.DemandPattern].ToString(); return fourlink; } //解析闷头 private static HStation.Model.RevitBlunthead ParseBlunthead(JToken jobject) { if (jobject == null) { return default; } //基本信息 var blunthead = new Model.RevitBlunthead(); blunthead.Id = jobject[RevitJsonProp.Id].ToString(); blunthead.Code = jobject[RevitJsonProp.Code].ToString(); if (string.IsNullOrEmpty(blunthead.Code)) { blunthead.Code = blunthead.Id; } blunthead.Name = jobject[RevitJsonProp.Name].ToString(); blunthead.ModelType = jobject[RevitJsonProp.ModelType].ToString(); blunthead.Flags = Yw.Untity.FlagsHelper.ToList(jobject[RevitJsonProp.Flags].ToString()); blunthead.Description = jobject[RevitJsonProp.Description].ToString(); var connectList = JsonHelper.Json2Object>(jobject[RevitJsonProp.Connects].ToString()); blunthead.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(); blunthead.Position = blunthead.ConnectList.GetCenterPosition(); //初始水质 if (jobject[RevitJsonProp.Quality].MatchNumeric(out double quality)) { blunthead.Quality = quality; } //标高信息 if (jobject[RevitJsonProp.Elev].MatchNumeric(out double elev)) { blunthead.Elev = elev / 1000f; } if (blunthead.Elev <= 0) { //标高中的高程 var jobjectElevOfElevation = jobject[RevitJsonProp.ElevOfElevation]; if (jobjectElevOfElevation != null) { if (jobjectElevOfElevation.MatchNumeric(out double elevOfElevation)) { blunthead.Elev = elevOfElevation / 1000f; } } } if (blunthead.Elev <= 0) { //通过z轴自动计算 blunthead.Elev = blunthead.Position.Z; } //需水量 if (jobject[RevitJsonProp.Demand].MatchNumeric(out double demand)) { blunthead.Demand = demand; } //需水模式 blunthead.DemandPattern = jobject[RevitJsonProp.DemandPattern].ToString(); return blunthead; } //解析水表 private static HStation.Model.RevitMeter ParseMeter(JToken jobject) { if (jobject == null) { return default; } //基本信息 var meter = new Model.RevitMeter(); meter.Id = jobject[RevitJsonProp.Id].ToString(); meter.Code = jobject[RevitJsonProp.Code].ToString(); if (string.IsNullOrEmpty(meter.Code)) { meter.Code = meter.Id; } meter.Name = jobject[RevitJsonProp.Name].ToString(); meter.ModelType = jobject[RevitJsonProp.ModelType].ToString(); meter.Flags = Yw.Untity.FlagsHelper.ToList(jobject[RevitJsonProp.Flags].ToString()); meter.Description = jobject[RevitJsonProp.Description].ToString(); var connectList = JsonHelper.Json2Object>(jobject[RevitJsonProp.Connects].ToString()); meter.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(); meter.Position = meter.ConnectList.GetCenterPosition(); //初始水质 if (jobject[RevitJsonProp.Quality].MatchNumeric(out double quality)) { meter.Quality = quality; } //标高信息 if (jobject[RevitJsonProp.Elev].MatchNumeric(out double elev)) { meter.Elev = elev / 1000f; } if (meter.Elev <= 0) { //标高中的高程 var jobjectElevOfElevation = jobject[RevitJsonProp.ElevOfElevation]; if (jobjectElevOfElevation != null) { if (jobjectElevOfElevation.MatchNumeric(out double elevOfElevation)) { meter.Elev = elevOfElevation / 1000f; } } } if (meter.Elev <= 0) { //通过z轴自动计算 meter.Elev = meter.Position.Z; } //需水量 if (jobject[RevitJsonProp.Demand].MatchNumeric(out double demand)) { meter.Demand = demand; } //需水模式 meter.DemandPattern = jobject[RevitJsonProp.DemandPattern].ToString(); return meter; } //解析流量计 private static HStation.Model.RevitFlowmeter ParseFlowmeter(JToken jobject) { if (jobject == null) { return default; } //基本信息 var flowmeter = new Model.RevitFlowmeter(); flowmeter.Id = jobject[RevitJsonProp.Id].ToString(); flowmeter.Code = jobject[RevitJsonProp.Code].ToString(); if (string.IsNullOrEmpty(flowmeter.Code)) { flowmeter.Code = flowmeter.Id; } flowmeter.Name = jobject[RevitJsonProp.Name].ToString(); flowmeter.ModelType = jobject[RevitJsonProp.ModelType].ToString(); flowmeter.Flags = Yw.Untity.FlagsHelper.ToList(jobject[RevitJsonProp.Flags].ToString()); flowmeter.Description = jobject[RevitJsonProp.Description].ToString(); var connectList = JsonHelper.Json2Object>(jobject[RevitJsonProp.Connects].ToString()); flowmeter.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(); flowmeter.Position = flowmeter.ConnectList.GetCenterPosition(); //初始水质 if (jobject[RevitJsonProp.Quality].MatchNumeric(out double quality)) { flowmeter.Quality = quality; } //标高信息 if (jobject[RevitJsonProp.Elev].MatchNumeric(out double elev)) { flowmeter.Elev = elev / 1000f; } if (flowmeter.Elev <= 0) { //标高中的高程 var jobjectElevOfElevation = jobject[RevitJsonProp.ElevOfElevation]; if (jobjectElevOfElevation != null) { if (jobjectElevOfElevation.MatchNumeric(out double elevOfElevation)) { flowmeter.Elev = elevOfElevation / 1000f; } } } if (flowmeter.Elev <= 0) { //通过z轴自动计算 flowmeter.Elev = flowmeter.Position.Z; } //需水量 if (jobject[RevitJsonProp.Demand].MatchNumeric(out double demand)) { flowmeter.Demand = demand; } //需水模式 flowmeter.DemandPattern = jobject[RevitJsonProp.DemandPattern].ToString(); return flowmeter; } //解析压力表 private static HStation.Model.RevitPressmeter ParsePressmeter(JToken jobject) { if (jobject == null) { return default; } //基本信息 var pressmeter = new Model.RevitPressmeter(); pressmeter.Id = jobject[RevitJsonProp.Id].ToString(); pressmeter.Code = jobject[RevitJsonProp.Code].ToString(); if (string.IsNullOrEmpty(pressmeter.Code)) { pressmeter.Code = pressmeter.Id; } pressmeter.Name = jobject[RevitJsonProp.Name].ToString(); pressmeter.ModelType = jobject[RevitJsonProp.ModelType].ToString(); pressmeter.Flags = Yw.Untity.FlagsHelper.ToList(jobject[RevitJsonProp.Flags].ToString()); pressmeter.Description = jobject[RevitJsonProp.Description].ToString(); var connectList = JsonHelper.Json2Object>(jobject[RevitJsonProp.Connects].ToString()); pressmeter.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(); pressmeter.Position = pressmeter.ConnectList.GetCenterPosition(); //初始水质 if (jobject[RevitJsonProp.Quality].MatchNumeric(out double quality)) { pressmeter.Quality = quality; } //标高信息 if (jobject[RevitJsonProp.Elev].MatchNumeric(out double elev)) { pressmeter.Elev = elev / 1000f; } if (pressmeter.Elev <= 0) { //标高中的高程 var jobjectElevOfElevation = jobject[RevitJsonProp.ElevOfElevation]; if (jobjectElevOfElevation != null) { if (jobjectElevOfElevation.MatchNumeric(out double elevOfElevation)) { pressmeter.Elev = elevOfElevation / 1000f; } } } if (pressmeter.Elev <= 0) { //通过z轴自动计算 pressmeter.Elev = pressmeter.Position.Z; } //需水量 if (jobject[RevitJsonProp.Demand].MatchNumeric(out double demand)) { pressmeter.Demand = demand; } //需水模式 pressmeter.DemandPattern = jobject[RevitJsonProp.DemandPattern].ToString(); return pressmeter; } //解析水库 private static HStation.Model.RevitReservoir ParseReservoir(JToken jobject) { if (jobject == null) { return default; } var reservoir = new Model.RevitReservoir(); reservoir.Id = jobject[RevitJsonProp.Id].ToString(); reservoir.Code = jobject[RevitJsonProp.Code].ToString(); if (string.IsNullOrEmpty(reservoir.Code)) { reservoir.Code = reservoir.Id; } reservoir.Name = jobject[RevitJsonProp.Name].ToString(); reservoir.ModelType = jobject[RevitJsonProp.ModelType].ToString(); reservoir.Flags = Yw.Untity.FlagsHelper.ToList(jobject[RevitJsonProp.Flags].ToString()); reservoir.Description = jobject[RevitJsonProp.Description].ToString(); var connectList = JsonHelper.Json2Object>(jobject[RevitJsonProp.Connects].ToString()); reservoir.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(); reservoir.Position = reservoir.ConnectList.GetCenterPosition(); //初始水质 if (jobject[RevitJsonProp.Quality].MatchNumeric(out double quality)) { reservoir.Quality = quality; } //池底标高 if (jobject[RevitJsonProp.PoolElev].MatchNumeric(out double poolElev)) { reservoir.PoolElev = poolElev; } //总水头 if (jobject[RevitJsonProp.Head].MatchNumeric(out double head)) { reservoir.Head = head; } //水头模式 reservoir.HeadPattern = jobject[RevitJsonProp.HeadPattern].ToString(); return reservoir; } //解析水池 private static HStation.Model.RevitTank ParseTank(JToken jobject) { if (jobject == null) { return default; } var tank = new Model.RevitTank(); tank.Id = jobject[RevitJsonProp.Id].ToString(); tank.Code = jobject[RevitJsonProp.Code].ToString(); if (string.IsNullOrEmpty(tank.Code)) { tank.Code = tank.Id; } tank.Name = jobject[RevitJsonProp.Name].ToString(); tank.ModelType = jobject[RevitJsonProp.ModelType].ToString(); tank.Flags = Yw.Untity.FlagsHelper.ToList(jobject[RevitJsonProp.Flags].ToString()); tank.Description = jobject[RevitJsonProp.Description].ToString(); var connectList = JsonHelper.Json2Object>(jobject[RevitJsonProp.Connects].ToString()); tank.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(); tank.Position = tank.ConnectList.GetCenterPosition(); //初始水质 if (jobject[RevitJsonProp.Quality].MatchNumeric(out double quality)) { tank.Quality = quality; } //标高信息 if (jobject[RevitJsonProp.PoolElev].MatchNumeric(out double elev)) { tank.PoolElev = elev / 1000f; } if (tank.PoolElev <= 0) { //标高中的高程 var jobjectElevOfElevation = jobject[RevitJsonProp.ElevOfElevation]; if (jobjectElevOfElevation != null) { if (jobjectElevOfElevation.MatchNumeric(out double elevOfElevation)) { tank.PoolElev = elevOfElevation / 1000f; } } } if (tank.PoolElev <= 0) { //通过z轴自动计算 tank.PoolElev = tank.Position.Z; } //初始水位 if (jobject[RevitJsonProp.InitLevel].MatchNumeric(out double initLevel)) { tank.InitLevel = initLevel; } //最低水位 if (jobject[RevitJsonProp.MinLevel].MatchNumeric(out double minLevel)) { tank.MinLevel = minLevel; } //最高水位 if (jobject[RevitJsonProp.MaxLevel].MatchNumeric(out double maxLevel)) { tank.MaxLevel = maxLevel; } //直径 if (jobject[RevitJsonProp.Diameter].MatchNumeric(out double diameter)) { tank.Diameter = diameter; } //最小容积 if (jobject[RevitJsonProp.MinVol].MatchNumeric(out double minVol)) { tank.MinVol = minVol; } //容积曲线 tank.VolCurve = jobject[RevitJsonProp.VolCurve].ToString(); if (!string.IsNullOrEmpty(tank.VolCurve)) { tank.VolCurve = string.Empty; } return tank; } //解析水箱 private static HStation.Model.RevitWaterbox ParseWaterbox(JToken jobject) { if (jobject == null) { return default; } var waterbox = new Model.RevitWaterbox(); waterbox.Id = jobject[RevitJsonProp.Id].ToString(); waterbox.Code = jobject[RevitJsonProp.Code].ToString(); if (string.IsNullOrEmpty(waterbox.Code)) { waterbox.Code = waterbox.Id; } waterbox.Name = jobject[RevitJsonProp.Name].ToString(); waterbox.ModelType = jobject[RevitJsonProp.ModelType].ToString(); waterbox.Flags = Yw.Untity.FlagsHelper.ToList(jobject[RevitJsonProp.Flags].ToString()); waterbox.Description = jobject[RevitJsonProp.Description].ToString(); var connectList = JsonHelper.Json2Object>(jobject[RevitJsonProp.Connects].ToString()); waterbox.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(); waterbox.Position = waterbox.ConnectList.GetCenterPosition(); //初始水质 if (jobject[RevitJsonProp.Quality].MatchNumeric(out double quality)) { waterbox.Quality = quality; } //标高信息 if (jobject[RevitJsonProp.PoolElev].MatchNumeric(out double elev)) { waterbox.PoolElev = elev / 1000f; } if (waterbox.PoolElev <= 0) { //标高中的高程 var jobjectElevOfElevation = jobject[RevitJsonProp.ElevOfElevation]; if (jobjectElevOfElevation != null) { if (jobjectElevOfElevation.MatchNumeric(out double elevOfElevation)) { waterbox.PoolElev = elevOfElevation / 1000f; } } } if (waterbox.PoolElev <= 0) { //通过z轴自动计算 waterbox.PoolElev = waterbox.Position.Z; } //初始水位 if (jobject[RevitJsonProp.InitLevel].MatchNumeric(out double initLevel)) { waterbox.InitLevel = initLevel; } //最低水位 if (jobject[RevitJsonProp.MinLevel].MatchNumeric(out double minLevel)) { waterbox.MinLevel = minLevel; } //最高水位 if (jobject[RevitJsonProp.MaxLevel].MatchNumeric(out double maxLevel)) { waterbox.MaxLevel = maxLevel; } //直径 if (jobject[RevitJsonProp.Diameter].MatchNumeric(out double diameter)) { waterbox.Diameter = diameter; } //最小容积 if (jobject[RevitJsonProp.MinVol].MatchNumeric(out double minVol)) { waterbox.MinVol = minVol; } //容积曲线 waterbox.VolCurve = jobject[RevitJsonProp.VolCurve].ToString(); if (!string.IsNullOrEmpty(waterbox.VolCurve)) { waterbox.VolCurve = string.Empty; } return waterbox; } //解析管道 private static HStation.Model.RevitPipe ParsePipe(JToken jobject) { if (jobject == null) { return default; } var pipe = new Model.RevitPipe(); pipe.Id = jobject[RevitJsonProp.Id].ToString(); pipe.Code = jobject[RevitJsonProp.Code].ToString(); if (string.IsNullOrEmpty(pipe.Code)) { pipe.Code = pipe.Id; } pipe.Name = jobject[RevitJsonProp.Name].ToString(); pipe.ModelType = jobject[RevitJsonProp.ModelType].ToString(); pipe.Flags = Yw.Untity.FlagsHelper.ToList(jobject[RevitJsonProp.Flags].ToString()); pipe.Description = jobject[RevitJsonProp.Description].ToString(); var connectList = JsonHelper.Json2Object>(jobject[RevitJsonProp.Connects].ToString()); pipe.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(); var startConnect = pipe.ConnectList.GetStartConnect(); var endConnect = pipe.ConnectList.GetEndConnect(); pipe.StartCode = startConnect.Id; pipe.EndCode = endConnect.Id; pipe.StartPosition = startConnect.Position; pipe.EndPosition = endConnect.Position; pipe.LinkStatus = jobject[RevitJsonProp.LinkStatusPipe].ToString(); if (string.IsNullOrEmpty(pipe.LinkStatus)) { pipe.LinkStatus = PipeStatus.Open; } if (jobject[RevitJsonProp.StartElev].MatchNumeric(out double startElev)) { pipe.StartElev = startElev; } if (pipe.StartElev <= 0) { pipe.StartElev = pipe.StartPosition.Z; } if (jobject[RevitJsonProp.EndElev].MatchNumeric(out double endElev)) { pipe.EndElev = endElev; } if (pipe.EndElev <= 0) { pipe.EndElev = pipe.EndPosition.Z; } if (jobject[RevitJsonProp.StartQuality].MatchNumeric(out double startQuality)) { pipe.StartQuality = startQuality; } if (jobject[RevitJsonProp.EndQuality].MatchNumeric(out double endQuality)) { pipe.EndQuality = endQuality; } #region 长度 if (jobject[RevitJsonProp.Length].MatchNumeric(out double length)) { pipe.Length = length / 1000f; } if (pipe.Length <= 0) { pipe.Length = pipe.StartPosition.Distance(pipe.EndPosition) / 1000f; } #endregion #region 材质 var jobjectMaterial = jobject[RevitJsonProp.Material]; if (jobjectMaterial != null) { pipe.Material = jobjectMaterial[RevitJsonProp.Name]?.ToString(); } #endregion #region 直径 if (jobject[RevitJsonProp.Diameter].MatchNumeric(out double diameter)) { pipe.Diameter = diameter; } if (pipe.Diameter < 1) { if (jobject[RevitJsonProp.InternalDiameter].MatchNumeric(out double internalDiameter)) { pipe.Diameter = internalDiameter; } } #endregion if (jobject[RevitJsonProp.MinorLoss].MatchNumeric(out double minorLoss)) { pipe.MinorLoss = minorLoss; } if (jobject[RevitJsonProp.Roughness].MatchNumeric(out double roughness)) { pipe.Roughness = roughness; } if (pipe.Diameter < 0.1) { pipe.Diameter = 500; } if (pipe.Roughness < 0.1) { pipe.Roughness = 110; } return pipe; } //解析过渡件 private static HStation.Model.RevitTranslation ParseTranslation(JToken jobject) { if (jobject == null) { return default; } var translation = new Model.RevitTranslation(); translation.Id = jobject[RevitJsonProp.Id].ToString(); translation.Code = jobject[RevitJsonProp.Code].ToString(); if (string.IsNullOrEmpty(translation.Code)) { translation.Code = translation.Id; } translation.Name = jobject[RevitJsonProp.Name].ToString(); translation.ModelType = jobject[RevitJsonProp.ModelType].ToString(); translation.Flags = Yw.Untity.FlagsHelper.ToList(jobject[RevitJsonProp.Flags].ToString()); translation.Description = jobject[RevitJsonProp.Description].ToString(); var connectList = JsonHelper.Json2Object>(jobject[RevitJsonProp.Connects].ToString()); translation.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(); var startConnect = translation.ConnectList.GetStartConnect(); var endConnect = translation.ConnectList.GetEndConnect(); translation.StartCode = startConnect.Id; translation.EndCode = endConnect.Id; translation.StartPosition = startConnect.Position; translation.EndPosition = endConnect.Position; translation.LinkStatus = jobject[RevitJsonProp.LinkStatusPipe].ToString(); if (string.IsNullOrEmpty(translation.LinkStatus)) { translation.LinkStatus = PipeStatus.Open; } if (jobject[RevitJsonProp.StartElev].MatchNumeric(out double startElev)) { translation.StartElev = startElev; } if (translation.StartElev <= 0) { translation.StartElev = translation.StartPosition.Z; } if (jobject[RevitJsonProp.EndElev].MatchNumeric(out double endElev)) { translation.EndElev = endElev; } if (translation.EndElev <= 0) { translation.EndElev = translation.EndPosition.Z; } if (jobject[RevitJsonProp.StartQuality].MatchNumeric(out double startQuality)) { translation.StartQuality = startQuality; } if (jobject[RevitJsonProp.EndQuality].MatchNumeric(out double endQuality)) { translation.EndQuality = endQuality; } #region 长度 if (jobject[RevitJsonProp.Length].MatchNumeric(out double length)) { translation.Length = length / 1000f; } if (translation.Length <= 0) { translation.Length = translation.StartPosition.Distance(translation.EndPosition) / 1000f; } #endregion #region 直径 if (jobject[RevitJsonProp.Diameter].MatchNumeric(out double diameter)) { translation.Diameter = diameter; } if (translation.Diameter <= 0) { var jobjectInternalDiameter = jobject[RevitJsonProp.InternalDiameter]; if (jobjectInternalDiameter != null) { if (jobjectInternalDiameter.MatchNumeric(out double internalDiameter)) { translation.Diameter = internalDiameter; } } } if (translation.Diameter <= 0) { var jobjectNominalDiameter = jobject[RevitJsonProp.NominalDiameter]; if (jobjectNominalDiameter != null) { if (jobjectNominalDiameter.MatchNumeric(out double nominalDiameter)) { translation.Diameter = nominalDiameter; } } } if (translation.Diameter <= 0) { translation.Diameter = 150; } #endregion if (jobject[RevitJsonProp.MinorLoss].MatchNumeric(out double minorLoss)) { translation.MinorLoss = minorLoss; } if (jobject[RevitJsonProp.Roughness].MatchNumeric(out double roughness)) { translation.Roughness = roughness; } if (translation.Roughness < 0.1) { translation.Roughness = 110; } return translation; } //解析换热器 private static HStation.Model.RevitExchanger ParseExchanger(JToken jobject) { if (jobject == null) { return default; } var exchanger = new Model.RevitExchanger(); exchanger.Id = jobject[RevitJsonProp.Id].ToString(); exchanger.Code = jobject[RevitJsonProp.Code].ToString(); if (string.IsNullOrEmpty(exchanger.Code)) { exchanger.Code = exchanger.Id; } exchanger.Name = jobject[RevitJsonProp.Name].ToString(); exchanger.ModelType = jobject[RevitJsonProp.ModelType].ToString(); exchanger.Flags = Yw.Untity.FlagsHelper.ToList(jobject[RevitJsonProp.Flags].ToString()); exchanger.Description = jobject[RevitJsonProp.Description].ToString(); var connectList = JsonHelper.Json2Object>(jobject[RevitJsonProp.Connects].ToString()); exchanger.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(); var startConnect = exchanger.ConnectList.GetStartConnect(); var endConnect = exchanger.ConnectList.GetEndConnect(); exchanger.StartCode = startConnect.Id; exchanger.EndCode = endConnect.Id; exchanger.StartPosition = startConnect.Position; exchanger.EndPosition = endConnect.Position; exchanger.LinkStatus = jobject[RevitJsonProp.LinkStatusPipe].ToString(); if (string.IsNullOrEmpty(exchanger.LinkStatus)) { exchanger.LinkStatus = PipeStatus.Open; } if (jobject[RevitJsonProp.StartElev].MatchNumeric(out double startElev)) { exchanger.StartElev = startElev; } if (exchanger.StartElev <= 0) { exchanger.StartElev = exchanger.StartPosition.Z; } if (jobject[RevitJsonProp.EndElev].MatchNumeric(out double endElev)) { exchanger.EndElev = endElev; } if (exchanger.EndElev <= 0) { exchanger.EndElev = exchanger.EndPosition.Z; } if (jobject[RevitJsonProp.StartQuality].MatchNumeric(out double startQuality)) { exchanger.StartQuality = startQuality; } if (jobject[RevitJsonProp.EndQuality].MatchNumeric(out double endQuality)) { exchanger.EndQuality = endQuality; } if (jobject[RevitJsonProp.Length].MatchNumeric(out double length)) { exchanger.Length = length / 1000f; } if (exchanger.Length <= 0) { exchanger.Length = exchanger.StartPosition.Distance(exchanger.EndPosition) / 1000f; } if (jobject[RevitJsonProp.Diameter].MatchNumeric(out double diameter)) { exchanger.Diameter = diameter; } if (exchanger.Diameter < 1) { if (jobject[RevitJsonProp.InternalDiameter].MatchNumeric(out double internalDiameter)) { exchanger.Diameter = internalDiameter; } } if (jobject[RevitJsonProp.Roughness].MatchNumeric(out double roughness)) { exchanger.Roughness = roughness; } if (exchanger.Roughness < 0.1) { exchanger.Roughness = 110; } if (jobject[RevitJsonProp.MinorLoss].MatchNumeric(out double minorLoss)) { exchanger.MinorLoss = minorLoss; } if (exchanger.Diameter <= 0) { exchanger.Diameter = 150; } return exchanger; } //解析水泵 private static HStation.Model.RevitPump ParsePump(JToken jobject) { if (jobject == null) { return default; } var pump = new Model.RevitPump(); pump.Id = jobject[RevitJsonProp.Id].ToString(); pump.Code = jobject[RevitJsonProp.Code].ToString(); if (string.IsNullOrEmpty(pump.Code)) { pump.Code = pump.Id; } pump.Name = jobject[RevitJsonProp.Name].ToString(); pump.ModelType = jobject[RevitJsonProp.ModelType].ToString(); pump.Flags = Yw.Untity.FlagsHelper.ToList(jobject[RevitJsonProp.Flags].ToString()); pump.Description = jobject[RevitJsonProp.Description].ToString(); var connectList = JsonHelper.Json2Object>(jobject[RevitJsonProp.Connects].ToString()); pump.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(); var startConnect = pump.ConnectList.GetStartConnect(); var endConnect = pump.ConnectList.GetEndConnect(); pump.StartCode = startConnect.Id; pump.EndCode = endConnect.Id; pump.StartPosition = startConnect.Position; pump.EndPosition = endConnect.Position; pump.LinkStatus = jobject[RevitJsonProp.LinkStatusPump].ToString(); if (string.IsNullOrEmpty(pump.LinkStatus)) { pump.LinkStatus = PumpStatus.Open; } if (jobject[RevitJsonProp.StartElev].MatchNumeric(out double startElev)) { pump.StartElev = startElev; } if (pump.StartElev <= 0) { pump.StartElev = pump.StartPosition.Z; } if (jobject[RevitJsonProp.EndElev].MatchNumeric(out double endElev)) { pump.EndElev = endElev; } if (pump.EndElev <= 0) { pump.EndElev = pump.EndPosition.Z; } if (jobject[RevitJsonProp.StartQuality].MatchNumeric(out double startQuality)) { pump.StartQuality = startQuality; } if (jobject[RevitJsonProp.EndQuality].MatchNumeric(out double endQuality)) { pump.EndQuality = endQuality; } if (jobject[RevitJsonProp.RatedPower].MatchNumeric(out double ratedPower)) { pump.RatedPower = ratedPower; } pump.CurveQH = jobject[RevitJsonProp.CurveQH].ToString(); pump.CurveQH = "PumpDefault"; if (jobject[RevitJsonProp.SpeedRatio].MatchNumeric(out double speedRatio)) { pump.SpeedRatio = speedRatio; } pump.SpeedRatioPattern = jobject[RevitJsonProp.SpeedRatioPattern].ToString(); if (!string.IsNullOrEmpty(pump.SpeedRatioPattern)) { pump.SpeedRatioPattern = string.Empty; } if (jobject[RevitJsonProp.Price].MatchNumeric(out double price)) { pump.Price = price; } pump.PricePattern = jobject[RevitJsonProp.PricePattern].ToString(); if (!string.IsNullOrEmpty(pump.PricePattern)) { pump.PricePattern = string.Empty; } pump.CurveQE = jobject[RevitJsonProp.CurveQE].ToString(); if (!string.IsNullOrEmpty(pump.CurveQE)) { pump.CurveQE = string.Empty; } return pump; } //解析阀门 private static HStation.Model.RevitValve ParseValve(JToken jobject) { if (jobject == null) { return default; } var valve = new Model.RevitValve(); #region Id if (jobject.ParseString(RevitJsonProp.Id, out string id)) { valve.Id = id; } else { valve.AppendPropStatus(nameof(valve.Id), ePropStatus.Error, "缺少构件编码"); } #endregion #region Code if (jobject.ParseString(RevitJsonProp.Code, out string code)) { valve.Code = code; } else { valve.AppendPropStatus(nameof(valve.Code), ePropStatus.Error, "缺少编码"); } if (string.IsNullOrEmpty(valve.Code)) { valve.Code = valve.Id; } #endregion #region Name if (jobject.ParseString(RevitJsonProp.Name, out string name)) { valve.Name = name; } else { valve.AppendPropStatus(nameof(valve.Name), ePropStatus.Error, "缺少名称"); } #endregion #region ModelType if (jobject.ParseString(RevitJsonProp.ModelType, out string modelType)) { valve.ModelType = modelType; } else { valve.AppendPropStatus(nameof(valve.ModelType), ePropStatus.Error, "缺少型号信息"); } #endregion #region Flags if (jobject.ParseString(RevitJsonProp.Flags, out string flags)) { valve.Flags = Yw.Untity.FlagsHelper.ToList(flags); } else { valve.AppendPropStatus(nameof(valve.Flags), ePropStatus.Error, "缺少标签"); } #endregion #region Description if (jobject.ParseString(RevitJsonProp.Description, out string description)) { valve.Description = description; } else { valve.AppendPropStatus(nameof(valve.Description), ePropStatus.Error, "缺少说明信息"); } #endregion #region ConnectList if (jobject.ParseString(RevitJsonProp.Connects, out string connectString)) { var connectList = JsonHelper.Json2Object>(connectString); valve.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(); } else { valve.AppendPropStatus(nameof(valve.ConnectList), ePropStatus.Error, "缺少连接列表"); } #endregion #region LinkStatus if (jobject.ParseString(RevitJsonProp.LinkStatusValve, out string linkStatus)) { if (string.IsNullOrEmpty(linkStatus)) { valve.LinkStatus = ValveStatus.Open; valve.AppendPropStatus(nameof(valve.LinkStatus), ePropStatus.Lack, "未配置阀门状态"); } else { valve.LinkStatus = linkStatus; if (linkStatus != ValveStatus.None && linkStatus != ValveStatus.Closed && linkStatus != ValveStatus.Open) { valve.AppendPropStatus(nameof(valve.LinkStatus), ePropStatus.Error, $"阀门状态配置错误:{linkStatus}"); } } } else { valve.AppendPropStatus(nameof(valve.LinkStatus), ePropStatus.Error, "缺少阀门状态"); } #endregion var startConnect = valve.ConnectList.GetStartConnect(); var endConnect = valve.ConnectList.GetEndConnect(); valve.StartCode = startConnect.Id; valve.EndCode = endConnect.Id; valve.StartPosition = startConnect.Position; valve.EndPosition = endConnect.Position; if (string.IsNullOrEmpty(valve.LinkStatus)) { valve.LinkStatus = ValveStatus.Open; } if (jobject[RevitJsonProp.StartElev].MatchNumeric(out double startElev)) { valve.StartElev = startElev; } if (valve.StartElev <= 0) { valve.StartElev = valve.StartPosition.Z; } if (jobject[RevitJsonProp.EndElev].MatchNumeric(out double endElev)) { valve.EndElev = endElev; } if (valve.EndElev <= 0) { valve.EndElev = valve.EndPosition.Z; } if (jobject[RevitJsonProp.StartQuality].MatchNumeric(out double startQuality)) { valve.StartQuality = startQuality; } if (jobject[RevitJsonProp.EndQuality].MatchNumeric(out double endQuality)) { valve.EndQuality = endQuality; } if (jobject[RevitJsonProp.MinorLoss].MatchNumeric(out double minorLoss)) { valve.MinorLoss = minorLoss; } #region 直径 if (jobject[RevitJsonProp.Diameter].MatchNumeric(out double diameter)) { valve.Diameter = diameter; } if (valve.Diameter <= 0) { var jobjectNominalDiameter = jobject[RevitJsonProp.NominalDiameter]; if (jobjectNominalDiameter != null) { if (jobjectNominalDiameter.MatchNumeric(out double nominalDiameter)) { valve.Diameter = nominalDiameter; } } } #endregion valve.ValveType = jobject[RevitJsonProp.ValveType].ToString(); if (string.IsNullOrEmpty(valve.ValveType)) { valve.ValveType = Valve.GPV; } valve.ValveSetting = jobject[RevitJsonProp.ValveSetting].ToString(); if (string.IsNullOrEmpty(valve.ValveSetting)) { valve.ValveSetting = "GPVDefault"; } return valve; } //解析装饰件 private static HStation.Model.RevitDecorator ParseDecorator(JToken jobject) { if (jobject == null) { return default; } var decorator = new Model.RevitDecorator(); decorator.Id = jobject[RevitJsonProp.Id].ToString(); decorator.Code = jobject[RevitJsonProp.Code].ToString(); if (string.IsNullOrEmpty(decorator.Code)) { decorator.Code = decorator.Id; } decorator.Name = string.Empty; decorator.Category = jobject[RevitJsonProp.ClanAndType][RevitJsonProp.ClanName].ToString(); decorator.Decoration = string.Empty; return decorator; } } }