using Microsoft.Extensions.Logging.Abstractions; namespace Yw.Hydro { /// /// 解析辅助类 /// public static class ParseHelper { /// /// /// public static Network ToNetwork(this Yw.Model.HydroModelInfo model) { if (model == null) { return default; } var netWork = new Network(); #region 节点 //水库 if (model.Reservoirs != null && model.Reservoirs.Count > 0) { foreach (var reservoir in model.Reservoirs) { var reservoirModel = new Reservoir(); reservoirModel.Id = reservoir.Code; reservoirModel.Catalog = Yw.EPAnet.Catalog.Reservoir; reservoirModel.Name = reservoir.Name; reservoirModel.Quality = 0; reservoirModel.Position = new Position2d(reservoir.Position2d.X, reservoir.Position2d.Y); reservoirModel.Head = reservoir.Head; reservoirModel.HeadPattern = string.Empty; netWork.Reservoirs.Add(reservoirModel); } } //水池 if (model.Tanks != null && model.Tanks.Count > 0) { foreach (var tank in model.Tanks) { var tankModel = new Tank(); tankModel.Id = tank.Code; tankModel.Catalog = Yw.EPAnet.Catalog.Tank; tankModel.Name = tank.Name; tankModel.Quality = 0; tankModel.Position = new Position2d(tank.Position2d.X, tank.Position2d.Y); tankModel.PoolElev = tank.PoolElev; tankModel.InitLevel = tank.InitLevel; tankModel.MaxLevel = tank.MaxLevel; tankModel.MinLevel = tank.MinLevel; tankModel.Diameter = tank.DN; tankModel.MinVol = tank.MinVol; tankModel.VolCurve = tank.VolCurve; tankModel.Overflow = tank.OverFlow; netWork.Tanks.Add(tankModel); } } //水箱 if (model.Waterboxs != null && model.Waterboxs.Count > 0) { foreach (var waterbox in model.Waterboxs) { var waterboxModel = new Waterbox(); waterboxModel.Id = waterbox.Code; waterboxModel.Catalog = Yw.EPAnet.Catalog.Waterbox; waterboxModel.Name = waterbox.Name; waterboxModel.Quality = 0; waterboxModel.Position = new Position2d(waterbox.Position2d.X, waterbox.Position2d.Y); waterboxModel.PoolElev = waterbox.PoolElev; waterboxModel.InitLevel = waterbox.InitLevel; waterboxModel.MaxLevel = waterbox.MaxLevel; waterboxModel.MinLevel = waterbox.MinLevel; waterboxModel.Diameter = waterbox.DN; waterboxModel.MinVol = waterbox.MinVol; waterboxModel.VolCurve = waterbox.VolCurve; waterboxModel.Overflow = waterbox.OverFlow; netWork.Waterboxs.Add(waterboxModel); } } //连接节点 if (model.Junctions != null && model.Junctions.Count > 0) { foreach (var junction in model.Junctions) { var junctionModel = new Junction(); junctionModel.Id = junction.Code; junctionModel.Catalog = Yw.EPAnet.Catalog.Junction; junctionModel.Name = junction.Name; junctionModel.Quality = 0; junctionModel.Position = new Position2d(junction.Position2d.X, junction.Position2d.Y); junctionModel.Elev = junction.Elev; junctionModel.MinorLoss = junction.MinorLoss; junctionModel.Demand = 0; junctionModel.DemandPattern = null; netWork.Junctions.Add(junctionModel); } } //喷嘴 if (model.Nozzles != null && model.Nozzles.Count > 0) { foreach (var nozzle in model.Nozzles) { var nozzleModel = new Nozzle(); nozzleModel.Id = nozzle.Code; nozzleModel.Catalog = Yw.EPAnet.Catalog.Nozzle; nozzleModel.Name = nozzle.Name; nozzleModel.Quality = 0; nozzleModel.Position = new Position2d(nozzle.Position2d.X, nozzle.Position2d.Y); nozzleModel.Elev = nozzle.Elev; nozzleModel.MinorLoss = nozzle.MinorLoss; nozzleModel.Demand = 0; nozzleModel.DemandPattern = null; nozzleModel.Coefficient = nozzle.Coefficient; netWork.Nozzles.Add(nozzleModel); } } //冷却塔 if (model.Coolings != null && model.Coolings.Count > 0) { foreach (var cooling in model.Coolings) { var coolingModel = new Nozzle(); coolingModel.Id = cooling.Code; coolingModel.Catalog = Yw.EPAnet.Catalog.Nozzle; coolingModel.Name = cooling.Name; coolingModel.Quality = 0; coolingModel.Position = new Position2d(cooling.Position2d.X, cooling.Position2d.Y); coolingModel.Elev = cooling.Elev; coolingModel.MinorLoss = cooling.MinorLoss; coolingModel.Demand = 0; coolingModel.DemandPattern = null; coolingModel.Coefficient = cooling.Coefficient; netWork.Nozzles.Add(coolingModel); } } //消火栓 if (model.Hydrants != null && model.Hydrants.Count > 0) { foreach (var hydrant in model.Hydrants) { var hydrantModel = new Hydrant(); hydrantModel.Id = hydrant.Code; hydrantModel.Catalog = Yw.EPAnet.Catalog.Hydrant; hydrantModel.Name = hydrant.Name; hydrantModel.Quality = 0; hydrantModel.Position = new Position2d(hydrant.Position2d.X, hydrant.Position2d.Y); hydrantModel.Elev = hydrant.Elev; hydrantModel.MinorLoss = hydrant.MinorLoss; hydrantModel.Demand = 0; hydrantModel.DemandPattern = null; hydrantModel.Coefficient = hydrant.Coefficient; netWork.Hydrants.Add(hydrantModel); } } //闷头 if (model.Bluntheads != null && model.Bluntheads.Count > 0) { foreach (var blunthead in model.Bluntheads) { var bluntheadModel = new Blunthead(); bluntheadModel.Id = blunthead.Code; bluntheadModel.Catalog = Yw.EPAnet.Catalog.Blunthead; bluntheadModel.Name = blunthead.Name; bluntheadModel.Quality = 0; bluntheadModel.Position = new Position2d(blunthead.Position2d.X, blunthead.Position2d.Y); bluntheadModel.Elev = blunthead.Elev; bluntheadModel.MinorLoss = blunthead.MinorLoss; bluntheadModel.Demand = 0; bluntheadModel.DemandPattern = null; netWork.Bluntheads.Add(bluntheadModel); } } //弯头 if (model.Elbows != null && model.Elbows.Count > 0) { foreach (var elbow in model.Elbows) { var elbowModel = new Elbow(); elbowModel.Id = elbow.Code; elbowModel.Catalog = Yw.EPAnet.Catalog.Elbow; elbowModel.Name = elbow.Name; elbowModel.Quality = 0; elbowModel.Position = new Position2d(elbow.Position2d.X, elbow.Position2d.Y); elbowModel.Elev = elbow.Elev; elbowModel.MinorLoss = elbow.MinorLoss; elbowModel.Demand = 0; elbowModel.DemandPattern = null; elbowModel.ElbowType = elbow.ElbowType; elbowModel.BendingAngle = elbow.BendingAngle; netWork.Elbows.Add(elbowModel); } } //三通 if (model.Threelinks != null && model.Threelinks.Count > 0) { foreach (var threelink in model.Threelinks) { var threelinkModel = new Threelink(); threelinkModel.Id = threelink.Code; threelinkModel.Catalog = Yw.EPAnet.Catalog.Threelink; threelinkModel.Name = threelink.Name; threelinkModel.Quality = 0; threelinkModel.Position = new Position2d(threelink.Position2d.X, threelink.Position2d.Y); threelinkModel.Elev = threelink.Elev; threelinkModel.MinorLoss = threelink.MinorLoss; threelinkModel.Demand = 0; threelinkModel.DemandPattern = null; threelinkModel.RunningThroughLoss = threelink.RunningThroughLoss; threelinkModel.BranchThroughLoss = threelink.BranchThroughLoss; netWork.Threelinks.Add(threelinkModel); } } //四通 if (model.Fourlinks != null && model.Fourlinks.Count > 0) { foreach (var fourlink in model.Fourlinks) { var fourlinkModel = new Fourlink(); fourlinkModel.Id = fourlink.Code; fourlinkModel.Catalog = Yw.EPAnet.Catalog.Fourlink; fourlinkModel.Name = fourlink.Name; fourlinkModel.Quality = 0; fourlinkModel.Position = new Position2d(fourlink.Position2d.X, fourlink.Position2d.Y); fourlinkModel.Elev = fourlink.Elev; fourlinkModel.MinorLoss = fourlink.MinorLoss; fourlinkModel.Demand = fourlink.Demand; fourlinkModel.DemandPattern = fourlink.DemandPattern; netWork.Fourlinks.Add(fourlinkModel); } } //水表 if (model.Meters != null && model.Meters.Count > 0) { foreach (var meter in model.Meters) { var meterModel = new Meter(); meterModel.Id = meter.Code; meterModel.Catalog = Yw.EPAnet.Catalog.Meter; meterModel.Name = meter.Name; meterModel.Quality = 0; meterModel.Position = new Position2d(meter.Position2d.X, meter.Position2d.Y); meterModel.Elev = meter.Elev; meterModel.MinorLoss = meter.MinorLoss; meterModel.Demand = meter.Demand; meterModel.DemandPattern = meter.DemandPattern; netWork.Meters.Add(meterModel); } } //流量计 if (model.Flowmeters != null && model.Flowmeters.Count > 0) { foreach (var flowmeter in model.Flowmeters) { var flowmeterModel = new Flowmeter(); flowmeterModel.Id = flowmeter.Code; flowmeterModel.Catalog = Yw.EPAnet.Catalog.Flowmeter; flowmeterModel.Name = flowmeter.Name; flowmeterModel.Quality = 0; flowmeterModel.Position = new Position2d(flowmeter.Position2d.X, flowmeter.Position2d.Y); flowmeterModel.Elev = flowmeter.Elev; flowmeterModel.MinorLoss = flowmeter.MinorLoss; flowmeterModel.Demand = flowmeter.Demand; flowmeterModel.DemandPattern = flowmeter.DemandPattern; netWork.Flowmeters.Add(flowmeterModel); } } //压力表 if (model.Pressmeters != null && model.Pressmeters.Count > 0) { foreach (var pressmeter in model.Pressmeters) { var pressmeterModel = new Pressmeter(); pressmeterModel.Id = pressmeter.Code; pressmeterModel.Catalog = Yw.EPAnet.Catalog.Pressmeter; pressmeterModel.Name = pressmeter.Name; pressmeterModel.Quality = 0; pressmeterModel.Position = new Position2d(pressmeter.Position2d.X, pressmeter.Position2d.Y); pressmeterModel.Elev = pressmeter.Elev; pressmeterModel.MinorLoss = pressmeter.MinorLoss; pressmeterModel.Demand = pressmeter.Demand; pressmeterModel.DemandPattern = pressmeter.DemandPattern; netWork.Pressmeters.Add(pressmeterModel); } } #endregion #region 管段 var allNodes = netWork.GetAllNodes(); //管道 if (model.Pipes != null && model.Pipes.Count > 0) { foreach (var pipe in model.Pipes) { var pipeModel = new Pipe(); pipeModel.Id = pipe.Code; pipeModel.Catalog = Yw.EPAnet.Catalog.Pipe; pipeModel.Name = pipe.Name; pipeModel.StartNode = allNodes.Find(x => x.Id == pipe.StartCode); pipeModel.EndNode = allNodes.Find(x => x.Id == pipe.EndCode); pipeModel.LinkStatus = Yw.Hydro.PipeStatus.Open; pipeModel.Length = pipe.Length; pipeModel.Diameter = pipe.Diameter; pipeModel.Roughness = pipe.Roughness; pipeModel.MinorLossCoeff = 0; netWork.Pipes.Add(pipeModel); } } //过渡件 if (model.Translations != null && model.Translations.Count > 0) { foreach (var translation in model.Translations) { var translationModel = new Translation(); translationModel.Id = translation.Code; translationModel.Catalog = Yw.EPAnet.Catalog.Translation; translationModel.Name = translation.Name; translationModel.StartNode = allNodes.Find(x => x.Id == translation.StartCode); translationModel.EndNode = allNodes.Find(x => x.Id == translation.EndCode); translationModel.LinkStatus = Yw.Hydro.LinkStatus.Open; translationModel.Length = translation.Length; if (translation.Length <= 0) { translation.Length = 0.1; } translationModel.Diameter = (translation.StartDiameter + translation.EndDiameter) / 2f; translationModel.Roughness = translation.Roughness; translationModel.MinorLossCoeff = translation.MinorLoss; netWork.Translations.Add(translationModel); } } //水泵 if (model.Pumps != null && model.Pumps.Count > 0) { foreach (var pump in model.Pumps) { var pumpModel = new Pump(); pumpModel.Id = pump.Code; pumpModel.Catalog = Yw.EPAnet.Catalog.Pump; pumpModel.Name = pump.Name; pumpModel.StartNode = allNodes.Find(x => x.Id == pump.StartCode); pumpModel.EndNode = allNodes.Find(x => x.Id == pump.EndCode); pumpModel.LinkStatus = pump.LinkStatus; pumpModel.RatedP = pump.RatedP; pumpModel.CurveQH = pump.CurveQH; if (string.IsNullOrEmpty(pumpModel.CurveQH)) { pumpModel.CurveQH = "PumpDefault";//使用network默认泵曲线 } pumpModel.SpeedRatio = pump.SpeedRatio; pumpModel.SpeedRatioPattern = pump.SpeedRatioPattern; netWork.Pumps.Add(pumpModel); } } //阀门 if (model.Valves != null && model.Valves.Count > 0) { foreach (var valve in model.Valves) { //止回阀被当成管道处理 if (valve.ValveType == Yw.Hydro.ValveType.CV) { double length = 0.01; if (double.TryParse(valve.ValveSetting, out double valveLength)) { length = valveLength; if (length <= 0) { length = 0.01; } } var pipeModel = new Pipe(); pipeModel.Id = valve.Code; pipeModel.Catalog = Yw.EPAnet.Catalog.Pipe; pipeModel.Name = valve.Name; pipeModel.StartNode = allNodes.Find(x => x.Id == valve.StartCode); pipeModel.EndNode = allNodes.Find(x => x.Id == valve.EndCode); pipeModel.LinkStatus = Yw.Hydro.PipeStatus.Open; pipeModel.Length = length; pipeModel.Diameter = valve.Diameter; pipeModel.Roughness = valve.Roughness; if (pipeModel.Roughness < 90) { pipeModel.Roughness = 110; } pipeModel.MinorLossCoeff = valve.MinorLoss; netWork.Pipes.Add(pipeModel); } else { var valveModel = new Yw.EPAnet.Valve(); valveModel.Id = valve.Code; valveModel.Catalog = Yw.EPAnet.Catalog.Valve; valveModel.Name = valve.Name; valveModel.StartNode = allNodes.Find(x => x.Id == valve.StartCode); valveModel.EndNode = allNodes.Find(x => x.Id == valve.EndCode); valveModel.LinkStatus = valve.LinkStatus; valveModel.Diameter = valve.Diameter; valveModel.MinorLoss = valve.MinorLoss; valveModel.ValveType = valve.ValveType; switch (valve.ValveType) { case Yw.Hydro.ValveType.PRV://减压阀 { valveModel.ValveSetting = valve.ValveSetting; } break; case Yw.Hydro.ValveType.PSV://稳压阀 { valveModel.ValveSetting = valve.ValveSetting; } break; case Yw.Hydro.ValveType.PBV://压力制动阀 { valveModel.ValveSetting = valve.ValveSetting; } break; case Yw.Hydro.ValveType.FCV://流量控制阀 { valveModel.ValveSetting = valve.ValveSetting; } break; case Yw.Hydro.ValveType.TCV://节流控制阀 { valveModel.ValveSetting = "0"; var curveol = model.Curves?.Find(x => x.Code == valve.CurveOL); if (curveol != null) { var point2dList = curveol.CurveData.Select(x => new Yw.Geometry.Point2d(x.X, x.Y)).ToList(); var ptCurveOL = new Yw.Geometry.CubicSpline2d(point2dList); valveModel.ValveSetting = ptCurveOL.GetPointY(valve.OpeningDegree).ToString(); if (valve.LinkStatus == Yw.Hydro.LinkStatus.Open) { if (valve.OpeningDegree > 0) { valveModel.LinkStatus = Yw.EPAnet.ValveStatus.None; } } } } break; case Yw.Hydro.ValveType.GPV://常规阀门 { if (valve.Code == "694311") { } var curve_ql_code_list = valve.CurvesQL; if (curve_ql_code_list == null) { curve_ql_code_list = new List(); } var curvesql = model.Curves?.Where(x => curve_ql_code_list.Contains(x.Code)).ToList(); var nearCurveql = curvesql?.OrderBy(x => Math.Abs(valve.OpeningDegree - x.CurveFactor ?? 0)).FirstOrDefault(); if (nearCurveql != null) { valveModel.ValveSetting = nearCurveql.Code; } } break; default: break; } netWork.Valves.Add(valveModel); } } } //换热器 if (model.Exchangers != null && model.Exchangers.Count > 0) { foreach (var exchanger in model.Exchangers) { var exchangerModel = new Exchanger(); exchangerModel.Id = exchanger.Code; exchangerModel.Catalog = Yw.EPAnet.Catalog.Exchanger; exchangerModel.Name = exchanger.Name; exchangerModel.StartNode = allNodes.Find(x => x.Id == exchanger.StartCode); exchangerModel.EndNode = allNodes.Find(x => x.Id == exchanger.EndCode); exchangerModel.LinkStatus = exchanger.LinkStatus; exchangerModel.Diameter = exchanger.Diameter; exchangerModel.MinorLoss = exchanger.MinorLoss; exchangerModel.CurveQL = exchanger.CurveQL; netWork.Exchangers.Add(exchangerModel); } } //压缩机 if (model.Compressors != null && model.Compressors.Count > 0) { foreach (var compressor in model.Compressors) { var compressModel = new Compressor(); compressModel.Id = compressor.Code; compressModel.Catalog = Yw.EPAnet.Catalog.Compressor; compressModel.Name = compressor.Name; compressModel.StartNode = allNodes.Find(x => x.Id == compressor.StartCode); compressModel.EndNode = allNodes.Find(x => x.Id == compressor.EndCode); compressModel.LinkStatus = compressor.LinkStatus; compressModel.Diameter = compressor.Diameter; compressModel.MinorLoss = compressor.MinorLoss; compressModel.CurveQL = compressor.CurveQL; netWork.Compressors.Add(compressModel); } } //曲线 if (model.Curves != null && model.Curves.Count > 0) { foreach (var curve in model.Curves) { var curveModel = new Yw.EPAnet.Curve(); curveModel.Id = curve.Code; curveModel.Catalog = Yw.EPAnet.Catalog.Curve; curveModel.Name = curve.Name; curveModel.CurveType = curve.CurveType; curveModel.CurveData = curve.CurveData?.Select(x => new CurvePoint(x.X, x.Y)).ToList(); netWork.Curves.Add(curveModel); } } #endregion #region 节点连接 var allLinks = netWork.GetAllLinks(); foreach (var node in allNodes) { var links = allLinks.Where(x => x.StartNode.Id == node.Id || x.EndNode.Id == node.Id).ToList(); node.Links = links; } #endregion return netWork; } } }