zhangyuekai
2024-07-01 0e3464b6adf776686e66bb3189441ab1a65a088e
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
using Autodesk.Revit.DB;
using Autodesk.Revit.DB.Electrical;
using Autodesk.Revit.DB.Mechanical;
using Autodesk.Revit.DB.Plumbing;
using Glodon.Revit.Utility;
using HStation.RevitDev.RevitDataExport.Utils;
using System;
using System.Collections.Generic;
using System.Linq;
 
namespace HStation.RevitDev.RevitDataExport.Service
{
    public class RevitMepElementService
    {
        public static IEnumerable<Element> GetSubElements(MEPSystem system)
        {
            var elements = new List<Element>();
            if (system is ElectricalSystem elecSystem)
            {
 
            }
            else if (system is MechanicalSystem mechSystem)
            {
 
            }
            else if (system is PipingSystem pipeSystem)
            {
                var network = pipeSystem.PipingNetwork;
                foreach (Element subElem in network)
                {
                    elements.Add(subElem);
                } 
            }
            else
            {
                
            }
            return elements;
        }
 
        public static List<ElementId> GetSubElementIds(MEPSystem system)
        {
            var elements = GetSubElements(system);
            var elemIds = elements.Select(x => x.Id).ToList();
            return elemIds;
        }
 
        public static List<Element> GetSubElements(MEPSystemType systemType)
        {
            var systemIds = systemType.GetDependentElements(new ElementClassFilter(typeof(PipingSystem),false));
            var elements = new List<Element>();
            foreach (var systemId in systemIds)
            {
                var system = systemType.Document.GetElement(systemId) as PipingSystem;
                if (system == null) { continue; }
                elements.AddRange(GetSubElements(system));
            }
            return elements;
        }
 
        public static List<Element> GetSubElements(Document doc, string sysTypeName)
        {
            var pipingSystems = new FilteredElementCollector(doc)
                   .OfClass(typeof(MEPSystem))
                   .Where(x => x != null && x is PipingSystem && x.Id != ElementId.InvalidElementId && sysTypeName.Any(y => x.Name.Contains(y + " ")))
                   .OfType<PipingSystem>()
                   .ToList();
            var elems = new List<Element>();
            foreach (var system in pipingSystems)
            {
                if (system.PipingNetwork.Size > 0)
                {
                    foreach (Element elem in system.PipingNetwork)
                    {
                        elems.Add(elem);
                    }
                }
                try
                {
                    if (system.Elements.Size > 0)
                    {
                        foreach (Element elem in system.Elements)
                        {
                            if (elems.Any(x => x.Id.IntegerValue == elem.Id.IntegerValue))
                            {
                                continue;
                            }
                            elems.Add(elem);
                        }
                    }
                }
                catch (Exception)
                {
                    continue;
                }
            }
            return elems;
        }
 
        public static List<Element> GetElements(Document doc, string sysTypeName)
        {
            var elems = new List<Element>();
            if (doc == null || string.IsNullOrEmpty(sysTypeName)) { return elems; }
 
            elems = GetElementsByPipeSystemTypeName(doc, sysTypeName);
            return elems;
        }
 
        private static List<Element> GetElementsByPipeSystemTypeName(Document doc, string sysTypeName)
        {
            var result = new List<Element>();
            List<Element> instances = GetInstanceAndPipes(doc);
            foreach (var instance in instances)
            {
                var id = instance.Id.IntegerValue;
                if (id == 3396216)
                {
 
                }
                var systemType = ParameterOperator.GetElementPipingSystemType(instance);
                if (systemType != null && systemType.Name == sysTypeName)
                {
                    result.Add(instance);
                }
            }
            return result;
        }
 
        private static List<Element> FamilyInstanceAndPipesCache = null;
        private static List<Element> GetInstanceAndPipes(Document doc)
        {
            if (FamilyInstanceAndPipesCache != null)
            {
                return FamilyInstanceAndPipesCache;
            }
            var cates = doc.Settings.Categories;
            var itor = cates.GetEnumerator();
            var categories = new List<Category>();
            while (itor.MoveNext())
            {
                var cate = itor.Current as Category;
                categories.Add(cate);
            }
            var types = new List<Type> { typeof(FamilyInstance), typeof(Pipe) };
            var instances = ElementUtil.GetElements(types, isModel: true, categories: categories);
            FamilyInstanceAndPipesCache = instances;
            return instances;
        }
    }
}