From 43bd8ee779a4cca7483bdf73c176b9fb8ebed5e2 Mon Sep 17 00:00:00 2001 From: qin <a@163.com> Date: 星期二, 24 九月 2024 17:24:28 +0800 Subject: [PATCH] 水力计算 --- HStation.RevitDev/RevitDataExport/Utility/DocumentUtil.cs | 460 +++++++++++++++++++++++++++++++++------------------------ 1 files changed, 265 insertions(+), 195 deletions(-) diff --git a/HStation.RevitDev/RevitDataExport/Utility/DocumentUtil.cs b/HStation.RevitDev/RevitDataExport/Utility/DocumentUtil.cs index 3f6efbe..14874db 100644 --- a/HStation.RevitDev/RevitDataExport/Utility/DocumentUtil.cs +++ b/HStation.RevitDev/RevitDataExport/Utility/DocumentUtil.cs @@ -1,195 +1,265 @@ -锘縰sing 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()) //鐩存帴鐐瑰嚮绠¢亾杩炴帴鐐瑰垱寤虹閬撴椂锛孯evit浼氳嚜鍔ㄥ垱寤哄集澶达紝閮介渶瑕佸姞鍏ュ埌缂撳瓨 - { - //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<string>()); - 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<string>()); - GlobalResource.RevitModels[revitType].Add(id); - TaskDialog.Show("鎻愮ず", "澧炲姞鏃忓疄渚嬶細" + id); - } - else if (!GlobalResource.RevitModels[revitType].Contains(id)) - { - GlobalResource.RevitModels[revitType].Add(id); - TaskDialog.Show("鎻愮ず", "澧炲姞鏃忓疄渚嬶細" + id); - } - } - } -} +锘縰sing Autodesk.Revit.DB; +using Autodesk.Revit.DB.Events; +using Autodesk.Revit.DB.Plumbing; +using Autodesk.Revit.UI; +using Autodesk.Revit.UI.Events; +using DevExpress.Utils.Extensions; +using HStation.RevitDev.Model.ModelEnum; +using HStation.RevitDev.RevitDataExport.Common; +using HStation.RevitDev.RevitDataExport.Service; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace HStation.RevitDev.RevitDataExport.Utility +{ + public static class DocumentUtil + { + public static void RegistDocumentEvent(ExternalCommandData commandData) + { + commandData.Application.Application.DocumentChanged -= App_DocumentChanged; + commandData.Application.Application.DocumentChanged += App_DocumentChanged; + + GlobalResource.CurrentUIDocument = commandData.Application.ActiveUIDocument; + RegistViewEvent(commandData); + } + + private static void App_DocumentChanged(object sender, DocumentChangedEventArgs e) + { + //褰撳垱寤轰竴涓柊鏂囨。鏃讹紝鍏堟墽琛宒ocumentChanged浜嬩欢锛屽湪鎵цdocumentCreated浜嬩欢 + var doc = e.GetDocument(); + GlobalResource.CurrentDocument = doc; + try + { + var addedIds = e.GetAddedElementIds(); + var removeIds = e.GetDeletedElementIds(); + + AddElements(doc, addedIds); + RemoveElements(removeIds); + + AddUnhandledElements(); + GlobalResource.InstancePanel.UpdateForm(); + } + catch (Exception ex) + { + TaskDialog.Show("閿欒", ex.Message); + } + } + + //private static void UpdateLinkerInfo(Document doc) + //{ + // if (!doc.IsValidObject) { return; } + + // foreach (var pair in GlobalResource.RevitModels) + // { + // foreach (var id in pair.Value) + // { + // if (id == null) { continue; } + + // var element = doc.GetElement(new ElementId(int.Parse(id))); + // var linkedElems = element.GetConnectElements(); + // var linkedIds = linkedElems.Select(x => x.Id.IntegerValue.ToString()); + // model.LinkIds = string.Join(",", linkedIds); + // } + // } + //} + + private static void RemoveElements(ICollection<ElementId> removeIds) + { + foreach (var id in removeIds) + { + GlobalResource.RevitModels.Remove(id.IntegerValue.ToString()); + } + return; + } + + private static void AddElements(Document doc, ICollection<ElementId> addedIds) + { + if (GlobalResource.PlacingType == RevitType.RFT_Pipe) + { + foreach (var id in addedIds) + { + var elem = doc.GetElement(id); + if (elem is FamilyInstance fi) + { + AddAutoCreated(fi); + } + if (elem is Pipe) + { + GlobalResource.RevitModels.Add(elem, RevitType.RFT_Pipe); + } + } + } + else if (GlobalResource.PlacingType != RevitType.RFT_Unknown) + { + foreach (var id in addedIds) + { + var elem = doc.GetElement(id); + if (elem is FamilyInstance) + { + GlobalResource.RevitModels.Add(elem, GlobalResource.PlacingType); + } + } + } + else + { + bool isPumpSystemElement = false; + foreach (var id in addedIds) + { + //鎵嬪姩甯冪疆鐨勬瀯浠跺娑堢伀鏍撱�佺儹鎹㈠櫒绛夊熀鏈笉鑳借嚜鍔ㄥ姞鍏ュ埌绯荤粺涓紝鑳借嚜鍔ㄥ竷缃苟杩炴帴 + //绯荤粺鐨勫熀鏈兘鏄笁閫氥�佸洓閫氥�佸集澶淬�佽繃娓′欢銆佺甯借繖浜� + if (IsConnectedWithPumpSystem(doc, id)) + { + isPumpSystemElement = true; + break; + } + } + + if (isPumpSystemElement) + { + foreach (var id in addedIds) + { + AddToPumpSystem(doc, id); + } + } + } + return; + } + + private static bool IsConnectedWithPumpSystem(Document doc, ElementId id) + { + var elem = doc.GetElement(id); + if (elem is Pipe pipe) //鐩存帴鐐瑰嚮姘存车鐨勮繛鎺ヤ欢鍒涘缓绠¢亾 + { + if (pipe.ConnectWithPumpSystem()) + { + return true; + } + } + else if (elem is FamilyInstance fi) + { + if (fi.ConnectWithPumpSystem()) //鐩存帴鐐瑰嚮绠¢亾杩炴帴鐐瑰垱寤虹閬撴椂锛孯evit浼氳嚜鍔ㄥ垱寤哄集澶达紝閮介渶瑕佸姞鍏ュ埌缂撳瓨 + { + return true; + } + } + return false; + } + + private static void AddToPumpSystem(Document doc, ElementId id) + { + var elem = doc.GetElement(id); + if (elem is Pipe) + { + GlobalResource.RevitModels.Add(elem, RevitType.RFT_Pipe); + } + else if (elem is FamilyInstance fi) + { + AddAutoCreated(fi); + } + return; + } + + private static void AddAutoCreated(FamilyInstance fi) + { + if (fi.IsPipeHat()) + { + GlobalResource.RevitModels.Add(fi, RevitType.RFT_Blocker); + } + else if (fi.IsWanTou()) + { + GlobalResource.RevitModels.Add(fi, RevitType.RFT_Elbow); + } + else if (fi.IsConverter()) + { + GlobalResource.RevitModels.Add(fi, RevitType.RFT_Converter); + } + else if (fi.IsSanTong()) + { + GlobalResource.RevitModels.Add(fi, RevitType.RFT_ThreeJoint); + } + else if (fi.IsSiTong()) + { + GlobalResource.RevitModels.Add(fi, RevitType.RFT_FourJoint); + } + else + { + TaskDialog.Show("璀﹀憡", $"鏈煡绫诲瀷琚坊鍔狅紒id:{fi.Id.IntegerValue}"); + //鎶ラ敊 + } + } + + public static void RegistViewEvent(ExternalCommandData commandData) + { + commandData.Application.ViewActivated -= Application_ViewActivated; + commandData.Application.ViewActivated += Application_ViewActivated; + } + + private static void Application_ViewActivated(object sender, ViewActivatedEventArgs e) + { + //鍒囨崲鏂囨。鏃� + if (GlobalResource.CurrentDocument == null || + GlobalResource.CurrentDocument.GetHashCode() != e.CurrentActiveView.Document.GetHashCode()) + { + GlobalResource.CurrentDocument = e.CurrentActiveView.Document; + GlobalResource.InstancePanel.UpdateForm(); + } + } + + public static List<Element> GetModelElements(this Document doc) + { + if (!doc.IsValidObject) + { + return new List<Element>(); + } + + var collector1 = new FilteredElementCollector(doc). + OfCategory(BuiltInCategory.OST_PipeCurves). + WhereElementIsNotElementType(); + + var collector2 = new FilteredElementCollector(doc). + OfClass(typeof(FamilyInstance)). + WhereElementIsNotElementType(); + + + + var elements1 = collector1.ToElements()?.ToList(); + var elements2 = collector2.ToElements()?.ToList(); + elements1.AddRange(elements2); + + elements1 = elements1.Where(x => x.Category.CategoryType == CategoryType.Model).ToList(); + elements1 = elements1.Where(x => x.get_BoundingBox(null) != null).ToList(); + + return elements1; + } + + public static void AddUnhandledElements() + { + var elements = GlobalResource.CurrentDocument.GetModelElements(); + foreach (var element in elements) + { + var id = element.Id.IntegerValue.ToString(); + if (GlobalResource.RevitModels.Contains(id)) + { + continue; + } + RevitMepCategoryService.AddToCache(element); + } + //UpdateLinkerInfo(GlobalResource.CurrentDocument); + } + + public static void UpdataDocumentCache(this Document doc) + { + if (!doc.IsValidObject) + { + return; + } + if (!GlobalResource.CurrentDocument.IsValidObject || doc.GetHashCode() != GlobalResource.CurrentDocument.GetHashCode()) + { + GlobalResource.CurrentDocument = doc; + //GlobalResource.RevitModels = new List<Tuple<string, Dictionary<RevitType, List<string>>>>(); + } + AddUnhandledElements(); + } + } +} -- Gitblit v1.9.3