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 Yw.Epanet.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 Yw.Epanet.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 Yw.Epanet.Tank(); 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.Tanks.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 Yw.Epanet.Emitter(); 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.Emitters.Add(nozzleModel); } } //冷却塔 if (model.Coolings != null && model.Coolings.Count > 0) { foreach (var cooling in model.Coolings) { var coolingModel = new Yw.Epanet.Emitter(); coolingModel.Id = cooling.Code; coolingModel.Catalog = Yw.Epanet.Catalog.Cooling; 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.Emitters.Add(coolingModel); } } //消火栓 if (model.Hydrants != null && model.Hydrants.Count > 0) { foreach (var hydrant in model.Hydrants) { var hydrantModel = new Yw.Epanet.Emitter(); 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.Emitters.Add(hydrantModel); } } //闷头 if (model.Bluntheads != null && model.Bluntheads.Count > 0) { foreach (var blunthead in model.Bluntheads) { var bluntheadModel = new Yw.Epanet.Junction(); 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.Junctions.Add(bluntheadModel); } } //弯头 if (model.Elbows != null && model.Elbows.Count > 0) { foreach (var elbow in model.Elbows) { var elbowModel = new Yw.Epanet.Junction(); 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; netWork.Junctions.Add(elbowModel); } } //三通 if (model.Threelinks != null && model.Threelinks.Count > 0) { foreach (var threelink in model.Threelinks) { var threelinkModel = new Yw.Epanet.Junction(); 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.RunningThroughLoss + threelink.BranchThroughLoss) / 2; threelinkModel.Demand = 0; threelinkModel.DemandPattern = null; netWork.Junctions.Add(threelinkModel); } } //四通 if (model.Fourlinks != null && model.Fourlinks.Count > 0) { foreach (var fourlink in model.Fourlinks) { var fourlinkModel = new Yw.Epanet.Junction(); 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.Junctions.Add(fourlinkModel); } } //水表 if (model.Meters != null && model.Meters.Count > 0) { foreach (var meter in model.Meters) { var meterModel = new Yw.Epanet.Junction(); 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.Junctions.Add(meterModel); } } //流量计 if (model.Flowmeters != null && model.Flowmeters.Count > 0) { foreach (var flowmeter in model.Flowmeters) { var flowmeterModel = new Yw.Epanet.Junction(); 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.Junctions.Add(flowmeterModel); } } //压力表 if (model.Pressmeters != null && model.Pressmeters.Count > 0) { foreach (var pressmeter in model.Pressmeters) { var pressmeterModel = new Yw.Epanet.Junction(); 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.Junctions.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 Yw.Epanet.Pipe(); pipeModel.Id = pipe.Code; pipeModel.Catalog = Yw.Epanet.Catalog.Pipe; pipeModel.Name = pipe.Name; pipeModel.StartNodeId = pipe.StartCode; pipeModel.EndNodeId = pipe.EndCode; pipeModel.LinkStatus = Yw.Epanet.PipeStatus.Open; pipeModel.Length = pipe.Length; pipeModel.Diameter = pipe.Diameter; pipeModel.Roughness = pipe.Roughness; pipeModel.MinorLoss = pipe.MinorLoss; netWork.Pipes.Add(pipeModel); } } //过渡件 if (model.Translations != null && model.Translations.Count > 0) { foreach (var translation in model.Translations) { var translationModel = new Yw.Epanet.Pipe(); translationModel.Id = translation.Code; translationModel.Catalog = Yw.Epanet.Catalog.Translation; translationModel.Name = translation.Name; translationModel.StartNodeId = translation.StartCode; translationModel.EndNodeId = translation.EndCode; translationModel.LinkStatus = Yw.Epanet.PipeStatus.Open; translationModel.Length = translation.Length; if (translationModel.Length <= 0) { translationModel.Length = 0.1; } translationModel.Diameter = (translation.StartDiameter + translation.EndDiameter) / 2f; translationModel.Roughness = translation.Roughness; translationModel.MinorLoss = translation.MinorLoss; netWork.Pipes.Add(translationModel); } } //水泵 if (model.Pumps != null && model.Pumps.Count > 0) { foreach (var pump in model.Pumps) { var pumpModel = new Yw.Epanet.Pump(); pumpModel.Id = pump.Code; pumpModel.Catalog = Yw.Epanet.Catalog.Pump; pumpModel.Name = pump.Name; pumpModel.StartNodeId = pump.StartCode; pumpModel.EndNodeId = 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.Valve; pipeModel.Name = valve.Name; pipeModel.StartNodeId = valve.StartCode; pipeModel.EndNodeId = valve.EndCode; pipeModel.LinkStatus = Yw.Hydro.PipeStatus.Open; pipeModel.Length = length; pipeModel.Diameter = valve.Diameter; pipeModel.Roughness = valve.Roughness; if (pipeModel.Roughness < 10) { pipeModel.Roughness = 110; } pipeModel.MinorLoss = 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.StartNodeId = valve.StartCode; valveModel.EndNodeId = 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.Active; } } } } break; case Yw.Hydro.ValveType.GPV://常规阀门 { if (valve.LinkStatus == Yw.Hydro.ValveStatus.Open) { valveModel.ValveType = Yw.Epanet.ValveType.TCV; valveModel.ValveSetting = valve.MinorLoss.ToString(); } else { 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 Yw.Epanet.Valve(); exchangerModel.Id = exchanger.Code; exchangerModel.Catalog = Yw.Epanet.Catalog.Exchanger; exchangerModel.Name = exchanger.Name; exchangerModel.StartNodeId = exchanger.StartCode; exchangerModel.EndNodeId = exchanger.EndCode; exchangerModel.Diameter = exchanger.Diameter; exchangerModel.MinorLoss = exchanger.MinorLoss; switch (exchanger.LinkStatus) { case Yw.Hydro.ValveStatus.None: { exchangerModel.LinkStatus = Yw.Epanet.ValveStatus.Open; exchangerModel.ValveType = Yw.Epanet.ValveType.GPV; exchangerModel.ValveSetting = exchanger.CurveQL; } break; case Yw.Hydro.ValveStatus.Open: { exchangerModel.LinkStatus = Yw.Epanet.ValveStatus.Open; exchangerModel.ValveType = Yw.Epanet.ValveType.TCV; exchangerModel.ValveSetting = exchanger.MinorLoss.ToString(); } break; case Yw.Hydro.ValveStatus.Closed: { exchangerModel.LinkStatus = Yw.Epanet.ValveStatus.Closed; exchangerModel.ValveType = Yw.Epanet.ValveType.GPV; exchangerModel.ValveSetting = exchanger.CurveQL; } break; default: break; } netWork.Valves.Add(exchangerModel); } } //压缩机 if (model.Compressors != null && model.Compressors.Count > 0) { foreach (var compressor in model.Compressors) { var compressModel = new Yw.Epanet.Valve(); compressModel.Id = compressor.Code; compressModel.Catalog = Yw.Epanet.Catalog.Compressor; compressModel.Name = compressor.Name; compressModel.StartNodeId = compressor.StartCode; compressModel.EndNodeId = compressor.EndCode; compressModel.LinkStatus = compressor.LinkStatus; compressModel.Diameter = compressor.Diameter; compressModel.MinorLoss = compressor.MinorLoss; compressModel.ValveType = Yw.Epanet.ValveType.GPV; compressModel.ValveSetting = compressor.CurveQL; netWork.Valves.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 netWork.Repair(); return netWork; } } }