From 1e66b4cc1183f30ff6add72750f3e9e155ff7f9a Mon Sep 17 00:00:00 2001
From: zhangyuekai <zhangyuekai@126.com>
Date: 星期四, 08 八月 2024 11:55:22 +0800
Subject: [PATCH] 导出模块、族库模块等其他模块开发完成

---
 HStation.RevitDev/RevitDataExport/Utility/DocumentUtil.cs |  566 +++++++++++++++++++++++++++++++++++++-------------------
 1 files changed, 371 insertions(+), 195 deletions(-)

diff --git a/HStation.RevitDev/RevitDataExport/Utility/DocumentUtil.cs b/HStation.RevitDev/RevitDataExport/Utility/DocumentUtil.cs
index 3f6efbe..f0ec4f3 100644
--- a/HStation.RevitDev/RevitDataExport/Utility/DocumentUtil.cs
+++ b/HStation.RevitDev/RevitDataExport/Utility/DocumentUtil.cs
@@ -1,195 +1,371 @@
-锘縰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.ApplicationServices;
+using 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.Entity;
+using HStation.RevitDev.RevitDataExport.Service;
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.Linq;
+using static DevExpress.Data.Mask.Internal.RegExMaskMath.CloudOfInts;
+
+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)
+        {
+            var doc = e.GetDocument();
+            try
+            {
+                var addedIds = e.GetAddedElementIds();
+                var removeIds = e.GetDeletedElementIds();
+                var modifiedIds = e.GetModifiedElementIds();
+
+                AddElements(doc,  addedIds);
+                RemoveElements(removeIds);
+                ModifyElements(modifiedIds);
+
+                UpdateLinkerInfo(doc);
+                GlobalResource.InstancePanel.UpdateForm();
+            }
+            catch (Exception ex)
+            {
+                TaskDialog.Show("閿欒", ex.Message);
+            }
+        }
+
+        private static void UpdateLinkerInfo(Document doc)
+        {
+            foreach (var pair in GlobalResource.RevitModels)
+            {
+                foreach (var model in pair.Value) 
+                {
+                    var id = model.Id;
+                    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 ModifyElements(ICollection<ElementId> modifiedIds)
+        {
+            foreach (var id in modifiedIds)
+            {
+                if (GlobalResource.ElementIds.Contains(id.IntegerValue.ToString()))
+                {
+
+                }
+            }
+        }
+
+        private static void RemoveElements(ICollection<ElementId> removeIds)
+        {
+            foreach (var id in removeIds)
+            {
+                var strId = id.IntegerValue.ToString();
+                if (GlobalResource.ElementIds.Contains(strId))
+                {
+                    GlobalResource.ElementIds.Remove(id.IntegerValue.ToString());
+                    foreach (var pair in GlobalResource.RevitModels)
+                    {
+                        var values = pair.Value;
+                        var model = values.Where(x => x.Id == strId)?.ToList();
+                        if (model == null || model.Count() == 0)
+                        {
+                            continue;
+                        }
+                        else
+                        {
+                            values.Remove(model[0]);
+                        }
+                    }
+                }
+            }
+
+            return;
+        }
+
+        private static void AddElements(Document doc, ICollection<ElementId> addedIds)
+        {
+            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;
+                        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())
+                {
+                    //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.IsConverter())
+            {
+                AddToMap(fi, RevitType.RFT_Converter);
+            }
+            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();
+
+            //鏇存柊宸插姞鍏ュ埌缂撳瓨涓殑鏋勪欢鏁版嵁
+            List<string> linkedIds = elem.GetConnectElements().Select(x => x.Id.IntegerValue.ToString()).ToList();
+            //foreach (var linkId in linkedIds)
+            //{
+            //    var model = GlobalResource.GetElementModel(linkId);
+            //    if (!model.LinkIds.Contains(id))
+            //    {
+            //        model.LinkIds += "," + id;
+            //    }
+            //}
+
+            //鎶婃柊澧炴瀯浠跺姞鍏ュ埌缂撳瓨涓�
+            if (!GlobalResource.RevitModels.ContainsKey(GlobalResource.RevitFamilyType))
+            {
+                GlobalResource.RevitModels.Add(GlobalResource.RevitFamilyType, new ObservableCollection<ElementModel>());
+                GlobalResource.RevitModels[GlobalResource.RevitFamilyType].Add(new ElementModel
+                {
+                    Name = elem.Name,
+                    Id = id,
+                    LinkIds = /*string.Join(",", linkedIds)*/string.Empty
+                });
+
+            }
+            else if(!GlobalResource.RevitModels[GlobalResource.RevitFamilyType].Any(x=>x.Id == id))
+            {
+                GlobalResource.RevitModels[GlobalResource.RevitFamilyType].Add(new ElementModel
+                {
+                    Name = elem.Name,
+                    Id = id,
+                    LinkIds = /* string.Join(",", linkedIds)*/string.Empty
+                });
+            }
+        }
+
+        private static void AddToMap(Element elem, RevitType revitType)
+        {
+            var id = elem.Id.IntegerValue.ToString();
+
+            //鏇存柊宸插姞鍏ュ埌缂撳瓨涓殑鏋勪欢鏁版嵁
+            //List<string> linkedIds = elem.GetConnectElements().Select(x => x.Id.IntegerValue.ToString()).ToList();
+            //foreach (var linkId in linkedIds)
+            //{
+            //    var model = GlobalResource.GetElementModel(linkId);
+            //    if (!model.LinkIds.Contains(id))
+            //    {
+            //        model.LinkIds += "," + id;
+            //    }
+            //}
+
+            if (!GlobalResource.RevitModels.ContainsKey(revitType))
+            {
+                GlobalResource.RevitModels.Add(revitType, new ObservableCollection<ElementModel>());
+                GlobalResource.RevitModels[revitType].Add(new ElementModel
+                {
+                    Name = elem.Name,
+                    Id = id,
+                    LinkIds = /*string.Join(",", linkedIds)*/string.Empty
+                });
+            }
+            else if (!GlobalResource.RevitModels[revitType].Any(x => x.Id == id))
+            {
+                GlobalResource.RevitModels[revitType].Add(new ElementModel
+                {
+                    Name = elem.Name,
+                    Id = id,
+                    LinkIds = /*string.Join(",", linkedIds)*/string.Empty
+                });
+            }
+        }
+
+        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)
+        {
+            GlobalResource.CurrentDocument = e.CurrentActiveView.Document;
+        }
+
+        public static List<Element> GetModelElements(this Document doc) 
+        {
+            //FilteredElementCollector collector = null;
+            //foreach (Category cate in doc.Settings.Categories)
+            //{
+            //    if (cate.CategoryType != CategoryType.Model)
+            //    {
+            //        continue;
+            //    }
+            //    var subCollector = new FilteredElementCollector(doc);
+            //    subCollector.OfCategory((BuiltInCategory)(cate.Id.IntegerValue));
+            //    subCollector.WhereElementIsNotElementType();
+            //    if (collector == null)
+            //    {
+            //        collector = subCollector;
+            //    }
+            //    else
+            //    {
+            //        collector.UnionWith(subCollector);
+            //    }
+            //}
+            //
+            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 AddUnhandledElementsToCache()
+        {
+            var elements = GlobalResource.CurrentDocument.GetModelElements();
+            foreach (var element in elements) 
+            {
+                var id = element.Id.IntegerValue.ToString();
+                if (GlobalResource.ElementIds.Contains(id))
+                {
+                    continue;
+                }
+                RevitMepCategoryService.MatchElement(element);
+            }
+            UpdateLinkerInfo(GlobalResource.CurrentDocument);
+        }
+    }
+}

--
Gitblit v1.9.3