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;
}
}
}