qin
2024-09-28 e358beb08f5be49703009b64f058ecfbcfeefbd9
HStation.RevitDev/RevitDataExport/Utility/DocumentUtil.cs
@@ -1,5 +1,4 @@
using Autodesk.Revit.ApplicationServices;
using Autodesk.Revit.DB;
using Autodesk.Revit.DB;
using Autodesk.Revit.DB.Events;
using Autodesk.Revit.DB.Plumbing;
using Autodesk.Revit.UI;
@@ -7,13 +6,10 @@
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
{
@@ -30,18 +26,18 @@
        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);
                UpdateLinkerInfo(doc);
                AddUnhandledElements();
                GlobalResource.InstancePanel.UpdateForm();
            }
            catch (Exception ex)
@@ -50,65 +46,36 @@
            }
        }
        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 UpdateLinkerInfo(Document doc)
        //{
        //    if (!doc.IsValidObject) { return; }
        private static void ModifyElements(ICollection<ElementId> modifiedIds)
        {
            foreach (var id in modifiedIds)
            {
                if (GlobalResource.ElementIds.Contains(id.IntegerValue.ToString()))
                {
        //    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)
            {
                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]);
                        }
                    }
                }
                GlobalResource.RevitModels.Remove(id.IntegerValue.ToString());
            }
            return;
        }
        private static void AddElements(Document doc, ICollection<ElementId> addedIds)
        {
            bool instancePlacing = GlobalResource.InstancePlacing;
            bool pipePlacing = GlobalResource.PipePlacing;
            if (pipePlacing)
            if (GlobalResource.PlacingType == RevitType.RFT_Pipe)
            {
                foreach (var id in addedIds)
                {
@@ -119,20 +86,18 @@
                    }
                    if (elem is Pipe)
                    {
                        GlobalResource.ElementIds.Add(id.IntegerValue.ToString());
                        AddManualCreated(elem);
                        GlobalResource.RevitModels.Add(elem, RevitType.RFT_Pipe);
                    }
                }
            }
            else if (instancePlacing)
            else if (GlobalResource.PlacingType != RevitType.RFT_Unknown)
            {
                foreach (var id in addedIds)
                {
                    var elem = doc.GetElement(id);
                    if (elem is FamilyInstance)
                    {
                        GlobalResource.ElementIds.Add(id.IntegerValue.ToString());
                        AddManualCreated(elem);
                        GlobalResource.RevitModels.Add(elem, GlobalResource.PlacingType);
                    }
                }
            }
@@ -141,6 +106,8 @@
                bool isPumpSystemElement = false;
                foreach (var id in addedIds)
                {
                    //手动布置的构件如消火栓、热换器等基本不能自动加入到系统中,能自动布置并连接
                    //系统的基本都是三通、四通、弯头、过渡件、管帽这些
                    if (IsConnectedWithPumpSystem(doc, id))
                    {
                        isPumpSystemElement = true;
@@ -166,9 +133,6 @@
            {
                if (pipe.ConnectWithPumpSystem())
                {
                    //GlobalResource.ElementIds.Add(id.IntegerValue.ToString());
                    //TaskDialog.Show("提示", "增加管道:" + id.IntegerValue.ToString());
                    //AddManualCreated(elem);
                    return true;
                }
            }
@@ -176,9 +140,6 @@
            {
                if (fi.ConnectWithPumpSystem()) //直接点击管道连接点创建管道时,Revit会自动创建弯头,都需要加入到缓存
                {
                    //GlobalResource.ElementIds.Add(id.IntegerValue.ToString());
                    //TaskDialog.Show("提示", "增加族实例:" + id.IntegerValue.ToString());
                    //AddManualCreated(elem);
                    return true;
                }
            }
@@ -190,12 +151,10 @@
            var elem = doc.GetElement(id);
            if (elem is Pipe)
            {
                GlobalResource.ElementIds.Add(id.IntegerValue.ToString());
                AddToMap(elem, RevitType.RFT_Pipe);
                GlobalResource.RevitModels.Add(elem, RevitType.RFT_Pipe);
            }
            else if (elem is FamilyInstance fi)
            {
                GlobalResource.ElementIds.Add(id.IntegerValue.ToString());
                AddAutoCreated(fi);
            }
            return;
@@ -203,102 +162,30 @@
        private static void AddAutoCreated(FamilyInstance fi)
        {
            var id = fi.Id;
            GlobalResource.ElementIds.Add(id.IntegerValue.ToString());
            if (fi.IsWanTou())
            if (fi.IsPipeHat())
            {
                AddToMap(fi, RevitType.RFT_Elbow);
                GlobalResource.RevitModels.Add(fi, RevitType.RFT_Blocker);
            }
            else if (fi.IsWanTou())
            {
                GlobalResource.RevitModels.Add(fi, RevitType.RFT_Elbow);
            }
            else if (fi.IsConverter())
            {
                AddToMap(fi, RevitType.RFT_Converter);
                GlobalResource.RevitModels.Add(fi, RevitType.RFT_Converter);
            }
            else if (fi.IsSanTong())
            {
                AddToMap(fi, RevitType.RFT_ThreeJoint);
                GlobalResource.RevitModels.Add(fi, RevitType.RFT_ThreeJoint);
            }
            else if (fi.IsSiTong())
            {
                AddToMap(fi, RevitType.RFT_FourJoint);
                GlobalResource.RevitModels.Add(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
                });
            }
        }
@@ -310,31 +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)
        {
            //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);
            //    }
            //}
            //
            if (!doc.IsValidObject)
            {
                return new List<Element>();
            }
            var collector1 = new FilteredElementCollector(doc).
                OfCategory(BuiltInCategory.OST_PipeCurves).
                WhereElementIsNotElementType();
@@ -342,6 +220,8 @@
            var collector2 = new FilteredElementCollector(doc).
                OfClass(typeof(FamilyInstance)).
                WhereElementIsNotElementType();
            var elements1 = collector1.ToElements()?.ToList();
            var elements2 = collector2.ToElements()?.ToList();
@@ -353,19 +233,33 @@
            return elements1;
        }
        public static void AddUnhandledElementsToCache()
        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.ElementIds.Contains(id))
                if (GlobalResource.RevitModels.Contains(id))
                {
                    continue;
                }
                RevitMepCategoryService.MatchElement(element);
                RevitMepCategoryService.AddToCache(element);
            }
            UpdateLinkerInfo(GlobalResource.CurrentDocument);
            //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();
        }
    }
}