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.Utils; using static Hydro.Core.ObjectEnum; 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; } 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 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 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 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 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; } } }