using Hydro.Core.Model; using Hydro.Revit.Model; using Hydro.Revit; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using HStation.RevitDev.RevitDataExport.Common; using static Hydro.Core.ObjectEnum; using HStation.RevitDev.Model.ModelEnum; using HStation.RevitDev.RevitDataExport.Entity.ElementModels; using HStation.RevitDev.RevitDataExport.Entity; using HStation.RevitDev.RevitDataExport.Service; using HStation.RevitDev.RevitDataExport.Utility; using Hydro.MapView; using DevExpress.ClipboardSource.SpreadsheetML; using System.Drawing; namespace HStation.RevitDev.RevitDataExport.Common { public static class NetWorkHelper { public static CheckModel Check(RevitNetWork model) { var result = new CheckModel() { Result = true }; var nodes = new List(); nodes.AddRange(model.Pipes.Select(c => c.Node2).ToList()); nodes.AddRange(model.Pipes.Select(c => c.Node1).ToList()); var otherIds = model.Junctions.Select(c => c.ID).ToList(); var pipes = model.Pipes.Where(c => string.IsNullOrEmpty(c.Node1) || string.IsNullOrEmpty(c.Node2)); if (pipes.Any()) { result.Result = false; pipes.ToList().ForEach(c => { result.FailList.Add(new FailModel() { ID = c.ID, Name = c.Name, Type = FailType.缺少Node1或Node2连接属性, ModelName = "管道", FailReason = "缺少Node1或Node2连接属性" }); }); } var nozzles = model.Nozzles.Where(c => !nodes.Contains(c.ID)); if (nozzles.Any()) { result.Result = false; nozzles.ToList().ForEach(c => { result.FailList.Add(new FailModel() { ID = c.ID, Name = c.Name, Type = FailType.喷头只能连接管道, ModelName = "喷淋", FailReason = "喷头只能连接管道" }); }); } var tank = model.Tanks.Any(); var reservos = model.Reservos.Any(); if (!tank) { result.Result = false; result.FailList.Add(new FailModel() { ID = "0", Name = "水箱", ModelName = "水箱", Type = FailType.缺少水箱或水池对象, FailReason = "缺少水箱或水池对象" }); } return result; } public static RevitNetWork GetModelList(System.Windows.Forms.TabControl pageContainer) { var EpaModel = new RevitNetWork(); foreach (TabPage page in pageContainer.TabPages) { var pageTitle = page.Text; var dgv = page.Controls[0] as DataGridView; switch (pageTitle) { case "管道": var pipes = GetPipeModel(dgv); EpaModel.AddPipes(pipes); break; case "阀门": var valves = GetValveModel(dgv); EpaModel.AddValves(valves); break; case "喷淋": var nozzle = GetNozzleModel(dgv); EpaModel.AddNozzles(nozzle); break; case "消火栓": var hydrantBoxes = GetHydrantBoxModel(dgv); EpaModel.AddHydrantBoxs(hydrantBoxes); break; case "水泵": var waterPump = GetWaterPumpModel(dgv); EpaModel.AddPumps(waterPump); break; case "水箱": var watertank = GetWaterTankModel(dgv); EpaModel.AddTanks(watertank); break; case "弯头": case "三通": case "四通": case "其他": var other = GetOtherModel(dgv); EpaModel.AddJunctions(other); break; } } return EpaModel; } public static MapViewNetWork GetModelList() { var EpaModel = new MapViewNetWork(); var values = Enum.GetValues(typeof(RevitType)); foreach (var value in values) { var revitType = (RevitType)value; if (revitType.IsRequired()) { var models = RevitMepElementService.GetElementModels(revitType); switch (revitType) { case RevitType.RFT_Pump: { var subModels = ModelFactory.Convert2Sub(models); foreach (var p in subModels) { var ds = new Dataset(p.编号 + "_Head", null, 2); ds.Data = new List() { new PointF(0f , 45.38f), new PointF(83.33333333f ,45.25f), new PointF(111.1111111f ,45.12f), new PointF(138.8888889f ,44.96f), new PointF(166.6666667f ,44.76f), new PointF(194.4444444f ,44.52f), new PointF(222.2222222f ,44.24f), new PointF(250f ,43.92f), new PointF(277.7777778f ,43.56f), new PointF(305.5555556f ,43.17f), new PointF(333.3333333f ,42.73f), new PointF(361.1111111f ,42.25f), new PointF(388.8888889f ,41.74f), new PointF(416.6666667f ,41.18f), new PointF(444.4444444f ,40.58f), new PointF(472.2222222f ,39.95f), new PointF(500f ,39.28f), new PointF(527.7777778f ,38.56f), new PointF(555.5555556f ,37.81f), new PointF(583.3333333f ,37.02f), new PointF(611.1111111f ,36.19f), new PointF(638.8888889f ,35.32f), new PointF(666.6666667f ,34.41f), new PointF(694.4444444f ,33.46f), new PointF(722.2222222f ,32.47f), new PointF(750f ,31.44f), new PointF(777.7777778f ,30.37f), new PointF(805.5555556f ,29.27f), }; EpaModel.dict_dataset.Add(p.编号 + "_Head", ds); EpaModel.Nodes.Add(new Hydro.MapView.PumpNodeViewModel() { ID = p.编号, Name = p.名称, Floor = p.楼层, Node1 = p.连接构件.Contains(",") ? p.连接构件.Split(',')[0] : p.连接构件, Node2 = p.连接构件.Contains(",") ? p.连接构件.Split(',')[1] : p.连接构件, 额定功率 = 0, HeadCurve = "PumpDefault", 额定扬程 = 0, 额定流量 = 0 }); } break; } case RevitType.RFT_Blocker: { var subModels = ModelFactory.Convert2Sub(models); foreach (var p in subModels) { var op = JsonHelper.ToObject(p.包围框); EpaModel.Nodes.Add(new Hydro.MapView.JunctionViewModel() { ID = p.编号, Name = p.名称, Floor = p.楼层, Elev = op.getCenter.z, X = op.getCenter.x, Y = op.getCenter.y }); } break; } case RevitType.RFT_Converter: { var subModels = ModelFactory.Convert2Sub(models); foreach (var p in subModels) { var op = JsonHelper.ToObject(p.包围框); EpaModel.Nodes.Add(new Hydro.MapView.JunctionViewModel() { ID = p.编号, Name = p.名称, Floor = p.楼层, Elev = op.getCenter.z, X = op.getCenter.x, Y = op.getCenter.y }); } break; } case RevitType.RFT_Elbow: { var subModels = ModelFactory.Convert2Sub(models); foreach (var p in subModels) { var op = JsonHelper.ToObject(p.包围框); EpaModel.Nodes.Add(new Hydro.MapView.JunctionViewModel() { ID = p.编号, Name = p.名称, Floor = p.楼层, Elev = op.getCenter.z, X = op.getCenter.x, Y = op.getCenter.y }); } break; } case RevitType.RFT_FourJoint: { var subModels = ModelFactory.Convert2Sub(models); foreach (var p in subModels) { var op = JsonHelper.ToObject(p.包围框); EpaModel.Nodes.Add(new Hydro.MapView.JunctionViewModel() { ID = p.编号, Name = p.名称, Floor = p.楼层, Elev = op.getCenter.z, X = op.getCenter.x, Y = op.getCenter.y }); } break; } case RevitType.RFT_HeatExchanger: { var subModels = ModelFactory.Convert2Sub(models); break; } case RevitType.RFT_Pipe: { var subModels = ModelFactory.Convert2Sub(models); foreach (var p in subModels) { EpaModel.Links.Add(new Hydro.MapView.PipeViewModel() { ID = p.编号, Name = p.名称, Floor = p.楼层, Diameter = float.Parse(string.IsNullOrEmpty(p.直径) ? "0" : p.直径), Length = float.Parse(string.IsNullOrEmpty(p.长度) ? "0" : p.长度)/1000, MinorLoss = float.Parse(string.IsNullOrEmpty(p.比摩阻) ? "0" : p.比摩阻), Roughness = float.Parse(string.IsNullOrEmpty(p.压力损失) ? "0" : p.压力损失), Node1 = p.连接构件.Contains(",") ? p.连接构件.Split(',')[0] : p.连接构件, Node2 = p.连接构件.Contains(",") ? p.连接构件.Split(',')[1] : p.连接构件, }); } break; } case RevitType.RFT_Shower: { var subModels = ModelFactory.Convert2Sub(models); foreach (var p in subModels) { var op = JsonHelper.ToObject(p.包围框); EpaModel.Nodes.Add(new Hydro.MapView.NozzleViewModel() { ID = p.编号, Name = p.名称, Floor = p.楼层, Elev = op.getCenter.z, X = op.getCenter.x, Y = op.getCenter.y, FlowCoefficient = string.IsNullOrEmpty(p.K系数) ? 0 : float.Parse(p.K系数), }); } break; } case RevitType.RFT_ThreeJoint: { var subModels = ModelFactory.Convert2Sub(models); foreach (var p in subModels) { var op = JsonHelper.ToObject(p.包围框); EpaModel.Nodes.Add(new Hydro.MapView.JunctionViewModel() { ID = p.编号, Name = p.名称, Floor = p.楼层, Elev = op.getCenter.z, X = op.getCenter.x, Y = op.getCenter.y }); } break; } case RevitType.RFT_Valve: { var subModels = ModelFactory.Convert2Sub(models); foreach (var p in subModels) { var op = JsonHelper.ToObject(p.包围框); EpaModel.Nodes.Add(new ValveNodeViewModel() { ID = p.编号, Name = p.名称, Floor = p.楼层, Node1 = p.连接构件.Contains(",") ? p.连接构件.Split(',')[0] : p.连接构件, Node2 = p.连接构件.Contains(",") ? p.连接构件.Split(',')[1] : p.连接构件, }); } break; } case RevitType.RFT_WaterBox: { var subModels = ModelFactory.Convert2Sub(models); foreach (var p in subModels) { var op = JsonHelper.ToObject(p.包围框); EpaModel.Nodes.Add(new TankViewModel() { ID = p.编号, Name = p.名称, Floor = p.楼层, Elev = op.getCenter.z, X = op.getCenter.x, Y = op.getCenter.y, InitLevel = string.IsNullOrEmpty(p.水位) ? 0 : float.Parse(p.水位), MaxLevel = string.IsNullOrEmpty(p.最高水位) ? 0 : float.Parse(p.最高水位), MinLevel = string.IsNullOrEmpty(p.最低水位) ? 0 : float.Parse(p.最低水位) }); } break; } case RevitType.RFT_WaterMeter: { var subModels = ModelFactory.Convert2Sub(models); foreach (var p in subModels) { var op = JsonHelper.ToObject(p.包围框); EpaModel.AddMeter(new MeterModel() { ID = p.编号, Name = p.名称, Elev = op.getCenter.z, X = op.getCenter.x, Y = op.getCenter.y, }); } break; } case RevitType.RFT_WaterPool: { var subModels = ModelFactory.Convert2Sub(models); foreach (var p in subModels) { var op = JsonHelper.ToObject(p.包围框); EpaModel.AddReservos(new ReservoisModel() { ID = p.编号, Name = p.名称, Elev = op.getCenter.z, X = op.getCenter.x, Y = op.getCenter.y, }); } break; } case RevitType.RFT_FireHydrant: { var subModels = ModelFactory.Convert2Sub(models); foreach (var p in subModels) { var op = JsonHelper.ToObject(p.包围框); EpaModel.Nodes.Add(new Hydro.MapView.NozzleViewModel() { ID = p.编号, Name = p.名称, Floor = p.楼层, Elev = op.getCenter.z, X = op.getCenter.x, Y = op.getCenter.y, FlowCoefficient = string.IsNullOrEmpty(p.K系数) ? 0 : float.Parse(p.K系数), }); } break; } //case RevitType.RFT_Unknown: //case RevitType.RFT_Others: default: { var subModels = ModelFactory.Convert2Others(models); foreach (var p in subModels) { var op = JsonHelper.ToObject(p.包围框); EpaModel.Nodes.Add(new Hydro.MapView.JunctionViewModel() { ID = p.编号, Name = p.名称, Floor = p.楼层, Elev = op.getCenter.z, X = op.getCenter.x, Y = op.getCenter.y }); } break; } } } } return EpaModel; } private static List GetPipeModel(DataGridView dgv) { var pipeModels = new List(); if (dgv != null) { for (var i = 0; i < dgv.Rows.Count; i++) { var baseModel = GetBaseLinkModel(dgv, i); var pipeModel = new Hydro.Revit.Model.PipeViewModel(); foreach (var item in typeof(LinkModel).GetProperties()) { item.SetValue(pipeModel, item.GetValue(baseModel)); } pipeModel.Node1 = baseModel.Node1; pipeModel.Node2 = baseModel.Node2; for (var j = 0; j < dgv.Columns.Count; j++) { var col = dgv.Columns[j]; var cell = dgv.Rows[i].Cells[j]; switch (col.HeaderText) { case "系统类型": pipeModel.SystemType = cell.Value.ToString(); break; case "包围框": pipeModel.PositionJson = cell.Value.ToString(); break; case "楼层": pipeModel.Floor = cell.Value.ToString(); break; } } pipeModels.Add(pipeModel); } } return pipeModels; } private static List GetNozzleModel(DataGridView dgv) { var nozzleModels = new List(); if (dgv != null) { for (var i = 0; i < dgv.Rows.Count; i++) { var baseModel = GetBaseNodeModel(dgv, i); if (!baseModel.Name.Contains("喷")) { continue; } var nozzleModel = new Hydro.Revit.Model.NozzleViewModel(); foreach (var item in typeof(NodeModel).GetProperties()) { item.SetValue(nozzleModel, item.GetValue(baseModel)); } for (var j = 0; j < dgv.Columns.Count; j++) { var col = dgv.Columns[j]; var cell = dgv.Rows[i].Cells[j]; switch (col.HeaderText) { case "系统类型": nozzleModel.SystemType = cell.Value.ToString(); break; case "包围框": nozzleModel.PositionJson = cell.Value.ToString(); break; case "K系数": nozzleModel.FlowCoefficient = cell.Value == null ? 0 : float.Parse(cell.Value.ToString()); break; case "连接点1": nozzleModel.Node1 = cell.Value == null ? "" : cell.Value.ToString(); break; case "连接点2": nozzleModel.Node2 = cell.Value == null ? "" : cell.Value.ToString(); break; case "楼层": nozzleModel.Floor = cell.Value.ToString(); break; } } nozzleModels.Add(nozzleModel); } } return nozzleModels; } private static List GetWaterPumpModel(DataGridView dgv) { var waterPumps = new List(); if (dgv != null) { for (var i = 0; i < dgv.Rows.Count; i++) { var baseModel = GetBaseLinkModel(dgv, i); var waterPumpsModel = new WaterPumpViewModel(); foreach (var item in typeof(LinkModel).GetProperties()) { item.SetValue(waterPumpsModel, item.GetValue(baseModel)); } for (var j = 0; j < dgv.Columns.Count; j++) { var col = dgv.Columns[j]; var cell = dgv.Rows[i].Cells[j]; switch (col.HeaderText) { case "系统类型": waterPumpsModel.SystemType = cell.Value.ToString(); break; case "包围框": waterPumpsModel.PositionJson = cell.Value.ToString(); break; case "楼层": waterPumpsModel.Floor = cell.Value.ToString(); break; } } waterPumps.Add(waterPumpsModel); } } return waterPumps; } private static List GetHydrantBoxModel(DataGridView dgv) { var hydrantBox = new List(); if (dgv != null) { for (var i = 0; i < dgv.Rows.Count; i++) { var baseModel = GetBaseNodeModel(dgv, i); var hydrantModel = new HydrantBoxViewModel(); foreach (var item in typeof(NodeModel).GetProperties()) { item.SetValue(hydrantModel, item.GetValue(baseModel)); } for (var j = 0; j < dgv.Columns.Count; j++) { var col = dgv.Columns[j]; var cell = dgv.Rows[i].Cells[j]; switch (col.HeaderText) { case "系统类型": hydrantModel.SystemType = cell.Value.ToString(); break; case "包围框": hydrantModel.PositionJson = cell.Value.ToString(); break; case "楼层": hydrantModel.Floor = cell.Value.ToString(); break; } } hydrantBox.Add(hydrantModel); } } return hydrantBox; } private static List GetWaterTankModel(DataGridView dgv) { var hydrantBox = new List(); if (dgv != null) { for (var i = 0; i < dgv.Rows.Count; i++) { var baseModel = GetBaseNodeModel(dgv, i); var hydrantModel = new WaterTankViewModel(); foreach (var item in typeof(NodeModel).GetProperties()) { item.SetValue(hydrantModel, item.GetValue(baseModel)); } for (var j = 0; j < dgv.Columns.Count; j++) { var col = dgv.Columns[j]; var cell = dgv.Rows[i].Cells[j]; switch (col.HeaderText) { case "系统类型": hydrantModel.SystemType = cell.Value.ToString(); break; case "包围框": hydrantModel.PositionJson = cell.Value.ToString(); break; case "水位": hydrantModel.InitLevel = float.Parse(cell.Value.ToString()); break; case "最低水位": hydrantModel.MinLevel = float.Parse(cell.Value.ToString()); break; case "最高水位": hydrantModel.MaxLevel = float.Parse(cell.Value.ToString()); break; case "楼层": hydrantModel.Floor = cell.Value.ToString(); break; } } hydrantModel.Elev = 0; hydrantBox.Add(hydrantModel); } } return hydrantBox; } private static List GetOtherModel(DataGridView dgv) { var otherModels = new List(); if (dgv != null) { for (var i = 0; i < dgv.Rows.Count; i++) { var baseModel = GetBaseNodeModel(dgv, i); var otherModel = new Hydro.Revit.Model.JunctionViewModel(); foreach (var item in typeof(NodeModel).GetProperties()) { item.SetValue(otherModel, item.GetValue(baseModel)); } for (var j = 0; j < dgv.Columns.Count; j++) { var col = dgv.Columns[j]; var cell = dgv.Rows[i].Cells[j]; switch (col.HeaderText) { case "系统类型": otherModel.SystemType = cell.Value.ToString(); break; case "包围框": otherModel.PositionJson = cell.Value.ToString(); break; case "楼层": otherModel.Floor = cell.Value.ToString(); break; case "连接点1": otherModel.Node1 = cell.Value.ToString(); break; case "连接点2": otherModel.Node2 = cell.Value.ToString(); break; case "连接点3": otherModel.Node1 += "," + cell.Value.ToString(); break; case "连接点4": otherModel.Node1 += "," + cell.Value.ToString(); break; } } otherModels.Add(otherModel); } } return otherModels; } private static List GetValveModel(DataGridView dgv) { var valveModels = new List(); if (dgv != null) { for (var i = 0; i < dgv.Rows.Count; i++) { var baseModel = GetBaseLinkModel(dgv, i); var valveModel = new Hydro.Revit.Model.ValveViewModel(); foreach (var item in typeof(LinkModel).GetProperties()) { item.SetValue(valveModel, item.GetValue(baseModel)); } for (var j = 0; j < dgv.Columns.Count; j++) { var col = dgv.Columns[j]; var cell = dgv.Rows[i].Cells[j]; switch (col.HeaderText) { case "系统类型": valveModel.SystemType = cell.Value.ToString(); break; case "包围框": valveModel.PositionJson = cell.Value.ToString(); break; case "楼层": valveModel.Floor = cell.Value.ToString(); break; case "直径": valveModel.Diameter = float.Parse(cell.Value.ToString()); break; } } valveModels.Add(valveModel); } } return valveModels; } private static NodeModel GetBaseNodeModel(DataGridView dgv, int rowIndex) { var baseModel = new NodeModel(); for (var j = 0; j < dgv.Columns.Count; j++) { var col = dgv.Columns[j]; var cell = dgv.Rows[rowIndex].Cells[j]; switch (col.HeaderText) { case "名称": baseModel.Name = cell.Value.ToString(); break; case "ID": baseModel.ID = cell.Value.ToString(); break; case "包围框": var ps = cell.Value.ToString(); var p = JsonHelper.ToObject(ps); baseModel.Elev = p.getCenter.z / 1000; baseModel.X = p.getCenter.x; baseModel.Y = p.getCenter.y; break; } } return baseModel; } private static LinkModel GetBaseLinkModel(DataGridView dgv, int rowIndex) { var baseModel = new LinkModel(); for (var j = 0; j < dgv.Columns.Count; j++) { var col = dgv.Columns[j]; var cell = dgv.Rows[rowIndex].Cells[j]; switch (col.HeaderText) { case "名称": baseModel.Name = cell.Value.ToString(); break; case "ID": baseModel.ID = cell.Value.ToString(); break; } if (col.HeaderText.Contains("连接点1")) baseModel.Node1 = cell.Value.ToString(); if (col.HeaderText.Contains("连接点2")) baseModel.Node2 = cell.Value.ToString(); if (col.HeaderText.Contains("直径")) baseModel.Diameter = float.Parse(cell.Value.ToString()); if (col.HeaderText.Contains("长度")) baseModel.Length = float.Parse(cell.Value.ToString()); if (col.HeaderText.Contains("比摩阻")) baseModel.Roughness = float.Parse(cell.Value.ToString() == "" ? "0" : cell.Value.ToString()); } return baseModel; } } }