using Autodesk.Revit.DB; using Autodesk.Revit.DB.Plumbing; using Autodesk.Revit.UI; using DevExpress.Internal.WinApi.Windows.UI.Notifications; using HStation.RevitDev.RevitDataExport.Common; using HStation.RevitDev.RevitDataExport.Entity; using HStation.RevitDev.RevitDataExport.Forms; using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Windows.Forms; namespace HStation.RevitDev.RevitDataExport.Utility { public class SystemCheckUtils { public static Dictionary> SystemCheck(ExternalCommandData data) { UIDocument uidoc = data.Application.ActiveUIDocument; Document doc = uidoc.Document; Dictionary> retDict = new Dictionary>(); var ids = new List(); foreach (var id in GlobalResource.RevitModels.GetIds()) { var elemId = new ElementId(int.Parse(id)); var element = doc.GetElement(elemId); if (element == null) { continue; } bool checkResult = CheckElement(element, out CheckResultType errorType); if (!checkResult) { ids.Add(new ElementId(int.Parse(id))); if (!retDict.ContainsKey(errorType)) { retDict.Add(errorType, new List()); } retDict[errorType].Add(elemId); } } //uidoc.Selection.SetElementIds(ids); return retDict; } internal static void ShowCheckResult(UIApplication m_uiapp, Dictionary> checkResult) { var revitHandle = Process.GetCurrentProcess().MainWindowHandle; Form_SystemCheckResult result = new Form_SystemCheckResult(m_uiapp, checkResult); result.Show(new WindowHandle(revitHandle)); } private static bool CheckElement(Element element, out CheckResultType errorType) { errorType = CheckResultType.CRT_Unknown; //管道两端都必须有节点构件连接 if (element is Pipe pipe) { var connectors = pipe.ConnectorManager.Connectors; foreach (Autodesk.Revit.DB.Connector connector in connectors) { var connectElems = connector.GetConnectorElements(); if (connectElems.Count < 1) { errorType = CheckResultType.CRT_PipeConnectorOpen; return false; } var fi = connectElems[0] as FamilyInstance; if (fi == null) { errorType = CheckResultType.CRT_Unknown; return false; } foreach (var elem in connectElems) { var id = elem.Id.IntegerValue.ToString(); if (!GlobalResource.RevitModels.Contains(id)) { errorType = CheckResultType.CRT_PipeConnectorOpen; return false; } } } return true; } //节点不能连接节点 else if (element is FamilyInstance fi) { var mepModel = fi.MEPModel; if (mepModel == null) { return true; } ConnectorSet connectors = mepModel.ConnectorManager?.Connectors; if (connectors == null) { return true; } foreach(Autodesk.Revit.DB.Connector connector in connectors) { var connectElems = connector.GetConnectorElements(); foreach (var connectElem in connectElems) { if (connectElem is FamilyInstance) { errorType = CheckResultType.CRT_NodeConnectNode; return false; } } } return true; } else { errorType = CheckResultType.CRT_Unknown; return false; } } } }