qin
2024-09-28 e358beb08f5be49703009b64f058ecfbcfeefbd9
HStation.RevitDev/RevitDataExport/Utility/DocumentUtil.cs
@@ -6,11 +6,9 @@
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;
namespace HStation.RevitDev.RevitDataExport.Utility
@@ -28,16 +26,16 @@
        private static void App_DocumentChanged(object sender, DocumentChangedEventArgs e)
        {
            //当创建一个新文档时,先执行documentChanged事件,在执行documentCreated事件
            var doc = e.GetDocument();
            GlobalResource.CurrentDocument = doc;
            try
            {
                var addedIds = e.GetAddedElementIds();
                var removeIds = e.GetDeletedElementIds();
                var modifiedIds = e.GetModifiedElementIds();
                AddElements(doc,  addedIds);
                AddElements(doc, addedIds);
                RemoveElements(removeIds);
                ModifyElements(modifiedIds);
                AddUnhandledElements();
                GlobalResource.InstancePanel.UpdateForm();
@@ -48,55 +46,30 @@
            }
        }
        private static void UpdateLinkerInfo(Document doc)
        {
            if (!doc.IsValidObject) { return; }
        //private static void UpdateLinkerInfo(Document doc)
        //{
        //    if (!doc.IsValidObject) { return; }
            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);
                }
            }
        }
        //    foreach (var pair in GlobalResource.RevitModels)
        //    {
        //        foreach (var id in pair.Value)
        //        {
        //            if (id == null) { continue; }
        private static void ModifyElements(ICollection<ElementId> modifiedIds)
        {
            foreach (var id in modifiedIds)
            {
            }
        }
        //            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)
            {
                var strId = id.IntegerValue.ToString();
                if (GlobalResource.RevitModels.Contains(strId))
                {
                    GlobalResource.RevitModels.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]);
                        }
                    }
                }
                GlobalResource.RevitModels.Remove(id.IntegerValue.ToString());
            }
            return;
        }
@@ -133,6 +106,8 @@
                bool isPumpSystemElement = false;
                foreach (var id in addedIds)
                {
                    //手动布置的构件如消火栓、热换器等基本不能自动加入到系统中,能自动布置并连接
                    //系统的基本都是三通、四通、弯头、过渡件、管帽这些
                    if (IsConnectedWithPumpSystem(doc, id))
                    {
                        isPumpSystemElement = true;
@@ -187,7 +162,11 @@
        private static void AddAutoCreated(FamilyInstance fi)
        {
            if (fi.IsWanTou())
            if (fi.IsPipeHat())
            {
                GlobalResource.RevitModels.Add(fi, RevitType.RFT_Blocker);
            }
            else if (fi.IsWanTou())
            {
                GlobalResource.RevitModels.Add(fi, RevitType.RFT_Elbow);
            }
@@ -218,16 +197,22 @@
        private static void Application_ViewActivated(object sender, ViewActivatedEventArgs e)
        {
            GlobalResource.CurrentDocument = e.CurrentActiveView.Document;
            //切换文档时
            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)
        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();
@@ -235,6 +220,8 @@
            var collector2 = new FilteredElementCollector(doc).
                OfClass(typeof(FamilyInstance)).
                WhereElementIsNotElementType();
            var elements1 = collector1.ToElements()?.ToList();
            var elements2 = collector2.ToElements()?.ToList();
@@ -249,7 +236,7 @@
        public static void AddUnhandledElements()
        {
            var elements = GlobalResource.CurrentDocument.GetModelElements();
            foreach (var element in elements)
            foreach (var element in elements)
            {
                var id = element.Id.IntegerValue.ToString();
                if (GlobalResource.RevitModels.Contains(id))
@@ -258,7 +245,7 @@
                }
                RevitMepCategoryService.AddToCache(element);
            }
            UpdateLinkerInfo(GlobalResource.CurrentDocument);
            //UpdateLinkerInfo(GlobalResource.CurrentDocument);
        }
        public static void UpdataDocumentCache(this Document doc)
@@ -270,7 +257,7 @@
            if (!GlobalResource.CurrentDocument.IsValidObject || doc.GetHashCode() != GlobalResource.CurrentDocument.GetHashCode())
            {
                GlobalResource.CurrentDocument = doc;
                GlobalResource.RevitModels = new Dictionary<RevitType, ObservableCollection<ElementModel>>();
                //GlobalResource.RevitModels = new List<Tuple<string, Dictionary<RevitType, List<string>>>>();
            }
            AddUnhandledElements();
        }