namespace Yw.Hydro { /// /// 解析辅助类 /// public class ParseHelper { /// /// /// public static Network ToNetwork(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.Name = reservoir.Name; reservoirModel.Quality = 0; reservoirModel.Position = new Position2d(reservoir.Position2d.X, reservoir.Position2d.Y); reservoirModel.PoolElev = reservoir.PoolElev ?? 0; reservoirModel.Head = reservoir.Head; reservoirModel.HeadPattern = reservoir.HeadPattern; 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.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 Tank(); waterboxModel.Id = waterbox.Code; 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.Name = junction.Name; junctionModel.Quality = 0; junctionModel.Position = new Position2d(junction.Position2d.X, junction.Position2d.Y); junctionModel.Elev = junction.Elev; junctionModel.Demand = junction.Demand; junctionModel.DemandPattern = junction.DemandPattern; 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.Name = nozzle.Name; nozzleModel.Quality = 0; nozzleModel.Position = new Position2d(nozzle.Position2d.X, nozzle.Position2d.Y); nozzleModel.Elev = nozzle.Elev; nozzleModel.Demand = nozzle.Demand; nozzleModel.DemandPattern = nozzle.DemandPattern; nozzleModel.Coefficient = nozzle.Coefficient; netWork.Nozzles.Add(nozzleModel); } } //消火栓 if (model.Hydrants != null && model.Hydrants.Count > 0) { foreach (var hydrant in model.Hydrants) { var hydrantModel = new Hydrant(); hydrantModel.Id = hydrant.Code; hydrantModel.Name = hydrant.Name; hydrantModel.Quality = 0; hydrantModel.Position = new Position2d(hydrant.Position2d.X, hydrant.Position2d.Y); hydrantModel.Elev = hydrant.Elev; hydrantModel.Demand = hydrant.Demand; hydrantModel.DemandPattern = hydrant.DemandPattern; 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 Junction(); bluntheadModel.Id = blunthead.Code; bluntheadModel.Name = blunthead.Name; bluntheadModel.Quality = 0; bluntheadModel.Position = new Position2d(blunthead.Position2d.X, blunthead.Position2d.Y); bluntheadModel.Elev = blunthead.Elev; bluntheadModel.Demand = blunthead.Demand; bluntheadModel.DemandPattern = blunthead.DemandPattern; netWork.Junctions.Add(bluntheadModel); } } //弯头 if (model.Elbows != null && model.Elbows.Count > 0) { foreach (var elbow in model.Elbows) { var elbowModel = new Junction(); elbowModel.Id = elbow.Code; elbowModel.Name = elbow.Name; elbowModel.Quality = 0; elbowModel.Position = new Position2d(elbow.Position2d.X, elbow.Position2d.Y); elbowModel.Elev = elbow.Elev; elbowModel.Demand = elbow.Demand; elbowModel.DemandPattern = elbow.DemandPattern; netWork.Junctions.Add(elbowModel); } } //三通 if (model.Threelinks != null && model.Threelinks.Count > 0) { foreach (var threelink in model.Threelinks) { var threelinkModel = new Junction(); threelinkModel.Id = threelink.Code; threelinkModel.Name = threelink.Name; threelinkModel.Quality = 0; threelinkModel.Position = new Position2d(threelink.Position2d.X, threelink.Position2d.Y); threelinkModel.Elev = threelink.Elev; threelinkModel.Demand = threelink.Demand; threelinkModel.DemandPattern = threelink.DemandPattern; netWork.Junctions.Add(threelinkModel); } } //四通 if (model.Fourlinks != null && model.Fourlinks.Count > 0) { foreach (var fourlink in model.Fourlinks) { var fourlinkModel = new Junction(); fourlinkModel.Id = fourlink.Code; fourlinkModel.Name = fourlink.Name; fourlinkModel.Quality = 0; fourlinkModel.Position = new Position2d(fourlink.Position2d.X, fourlink.Position2d.Y); fourlinkModel.Elev = fourlink.Elev; 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 Meter(); meterModel.Id = meter.Code; meterModel.Name = meter.Name; meterModel.Quality = 0; meterModel.Position = new Position2d(meter.Position2d.X, meter.Position2d.Y); meterModel.Elev = meter.Elev; 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 Junction(); flowmeterModel.Id = flowmeter.Code; flowmeterModel.Name = flowmeter.Name; flowmeterModel.Quality = 0; flowmeterModel.Position = new Position2d(flowmeter.Position2d.X, flowmeter.Position2d.Y); flowmeterModel.Elev = flowmeter.Elev; 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 Junction(); pressmeterModel.Id = pressmeter.Code; pressmeterModel.Name = pressmeter.Name; pressmeterModel.Quality = 0; pressmeterModel.Position = new Position2d(pressmeter.Position2d.X, pressmeter.Position2d.Y); pressmeterModel.Elev = pressmeter.Elev; 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 Pipe(); pipeModel.Id = pipe.Code; pipeModel.Name = pipe.Name; pipeModel.StartNode = allNodes.Find(x => x.Id == pipe.StartCode); pipeModel.EndNode = allNodes.Find(x => x.Id == pipe.EndCode); pipeModel.LinkStatus = pipe.LinkStatus; 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 Pipe(); translationModel.Id = translation.Code; translationModel.Name = translation.Name; translationModel.StartNode = allNodes.Find(x => x.Id == translation.StartCode); translationModel.EndNode = allNodes.Find(x => x.Id == translation.EndCode); translationModel.LinkStatus = translation.LinkStatus; translationModel.Length = translation.Length; translationModel.Diameter = translation.Diameter; translationModel.Roughness = translation.Roughness; translationModel.MinorLoss = translation.MinorLoss; netWork.Pipes.Add(translationModel); } } //换热器 if (model.Exchangers != null && model.Exchangers.Count > 0) { foreach (var exchanger in model.Exchangers) { var exchangerModel = new Exchanger(); exchangerModel.Id = exchanger.Code; 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 = "GPVDefault"; 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.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 = "GPVDefault"; netWork.Compressors.Add(compressModel); } } //水泵 if (model.Pumps != null && model.Pumps.Count > 0) { foreach (var pump in model.Pumps) { var pumpModel = new Pump(); pumpModel.Id = pump.Code; 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) { var pipeModel = new Pipe(); pipeModel.Id = valve.Code; pipeModel.Name = valve.Name; pipeModel.StartNode = allNodes.Find(x => x.Id == valve.StartCode); pipeModel.EndNode = allNodes.Find(x => x.Id == valve.EndCode); pipeModel.LinkStatus = valve.LinkStatus; pipeModel.Length = 0.01; pipeModel.Diameter = valve.Diameter; pipeModel.Roughness = 110; pipeModel.MinorLoss = valve.MinorLoss; netWork.Pipes.Add(pipeModel); } else { var valveModel = new Yw.EPAnet.Valve(); valveModel.Id = valve.Code; 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; valveModel.ValveSetting = valve.ValveSetting; switch (valve.ValveType) { case Yw.Hydro.ValveType.PRV://减压阀 { } break; case Yw.Hydro.ValveType.PSV://稳压阀 { } break; case Yw.Hydro.ValveType.PBV://压力制动阀 { } break; case Yw.Hydro.ValveType.FCV://流量控制阀 { } break; case Yw.Hydro.ValveType.TCV://节流控制阀 { valveModel.ValveSetting = "0"; var curveol = model.Curves?.Find(x => x.Code == valve.ValveSetting); 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(); } } break; case Yw.Hydro.ValveType.GPV://常规阀门 { } break; default: break; } netWork.Valves.Add(valveModel); } } } //曲线 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.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; } } }