using Autodesk.Revit.ApplicationServices; using Autodesk.Revit.DB; using Autodesk.Revit.DB.Events; using Autodesk.Revit.DB.Plumbing; using Autodesk.Revit.UI; using HStation.RevitDev.Model.ModelEnum; using HStation.RevitDev.RevitDataExport.Common; using System; using System.Collections.Generic; namespace HStation.RevitDev.RevitDataExport.Utility { public class DocumentUtil { public static void RegistDocumentEvent(Application app) { app.DocumentChanged -= App_DocumentChanged; app.DocumentChanged += App_DocumentChanged; } private static void App_DocumentChanged(object sender, DocumentChangedEventArgs e) { var doc = e.GetDocument(); var addedIds = e.GetAddedElementIds(); var removeIds = e.GetDeletedElementIds(); var modifiedIds = e.GetModifiedElementIds(); bool instancePlacing = GlobalResource.InstancePlacing; bool pipePlacing = GlobalResource.PipePlacing; if (pipePlacing) { foreach (var id in addedIds) { var elem = doc.GetElement(id); if (elem is FamilyInstance fi) { AddAutoCreated(fi); } if (elem is Pipe) { GlobalResource.ElementIds.Add(id.IntegerValue.ToString()); AddManualCreated(elem); } } } else if (instancePlacing) { foreach (var id in addedIds) { var elem = doc.GetElement(id); if (elem is FamilyInstance) { GlobalResource.ElementIds.Add(id.IntegerValue.ToString()); AddManualCreated(elem); } } } else { bool isPumpSystemElement = false; foreach (var id in addedIds) { if (IsConnectedWithPumpSystem(doc, id)) { isPumpSystemElement = true; } } if (isPumpSystemElement) { foreach (var id in addedIds) { AddToPumpSystem(doc, id); } } } foreach (var id in removeIds) { if (GlobalResource.ElementIds.Contains(id.IntegerValue.ToString())) { GlobalResource.ElementIds.Remove(id.IntegerValue.ToString()); TaskDialog.Show("提示", "删除元素:" + id.IntegerValue.ToString()); } } foreach (var id in modifiedIds) { if (GlobalResource.ElementIds.Contains(id.IntegerValue.ToString())) { } } } private static bool IsConnectedWithPumpSystem(Document doc, ElementId id) { var elem = doc.GetElement(id); if (elem is Pipe pipe) //直接点击水泵的连接件创建管道 { if (pipe.ConnectWithPumpSystem()) { //GlobalResource.ElementIds.Add(id.IntegerValue.ToString()); //TaskDialog.Show("提示", "增加管道:" + id.IntegerValue.ToString()); //AddManualCreated(elem); return true; } } else if (elem is FamilyInstance fi) { if (fi.ConnectWithPumpSystem()) //直接点击管道连接点创建管道时,Revit会自动创建弯头,都需要加入到缓存 { //GlobalResource.ElementIds.Add(id.IntegerValue.ToString()); //TaskDialog.Show("提示", "增加族实例:" + id.IntegerValue.ToString()); //AddManualCreated(elem); return true; } } return false; } private static void AddToPumpSystem(Document doc, ElementId id) { var elem = doc.GetElement(id); if (elem is Pipe) { GlobalResource.ElementIds.Add(id.IntegerValue.ToString()); AddToMap(elem, RevitType.RFT_Pipe); } else if (elem is FamilyInstance fi) { GlobalResource.ElementIds.Add(id.IntegerValue.ToString()); AddAutoCreated(fi); } return; } private static void AddAutoCreated(FamilyInstance fi) { var id = fi.Id; GlobalResource.ElementIds.Add(id.IntegerValue.ToString()); if (fi.IsWanTou()) { AddToMap(fi, RevitType.RFT_Elbow); } else if (fi.IsSanTong()) { AddToMap(fi, RevitType.RFT_ThreeJoint); } else if (fi.IsSiTong()) { AddToMap(fi, RevitType.RFT_FourJoint); } else { TaskDialog.Show("警告", $"未知类型被添加!id:{fi.Id.IntegerValue}"); //报错 } } private static void AddManualCreated(Element elem) { var id = elem.Id.IntegerValue.ToString(); if (!GlobalResource.RevitModels.ContainsKey(GlobalResource.RevitFamilyType)) { GlobalResource.RevitModels.Add(GlobalResource.RevitFamilyType, new List()); GlobalResource.RevitModels[GlobalResource.RevitFamilyType].Add(id); TaskDialog.Show("提示", "增加族实例:" + id); } else if(!GlobalResource.RevitModels[GlobalResource.RevitFamilyType].Contains(id)) { GlobalResource.RevitModels[GlobalResource.RevitFamilyType].Add(id); TaskDialog.Show("提示", "增加族实例:" + id); } } private static void AddToMap(Element elem, RevitType revitType) { var id = elem.Id.IntegerValue.ToString(); if (!GlobalResource.RevitModels.ContainsKey(revitType)) { GlobalResource.RevitModels.Add(revitType, new List()); GlobalResource.RevitModels[revitType].Add(id); TaskDialog.Show("提示", "增加族实例:" + id); } else if (!GlobalResource.RevitModels[revitType].Contains(id)) { GlobalResource.RevitModels[revitType].Add(id); TaskDialog.Show("提示", "增加族实例:" + id); } } } }