From 4fc3d9e35e7642fef755ca32f7f5c466f45ed2b3 Mon Sep 17 00:00:00 2001
From: chuongmep <31106432+chuongmep@users.noreply.github.com>
Date: Sun, 2 Jul 2023 10:42:51 +0800
Subject: [PATCH] add support wall opening

---
 .../Partial Classes/ConvertWall.cs             | 18 ++++++++++++++++--
 Objects/Objects/BuiltElements/Wall.cs          |  4 ++++
 2 files changed, 20 insertions(+), 2 deletions(-)

diff --git a/Objects/Converters/ConverterRevit/ConverterRevitShared/Partial Classes/ConvertWall.cs b/Objects/Converters/ConverterRevit/ConverterRevitShared/Partial Classes/ConvertWall.cs
index 756d947fa2..56545316b8 100644
--- a/Objects/Converters/ConverterRevit/ConverterRevitShared/Partial Classes/ConvertWall.cs	
+++ b/Objects/Converters/ConverterRevit/ConverterRevitShared/Partial Classes/ConvertWall.cs	
@@ -177,7 +177,7 @@ public Base WallToSpeckle(DB.Wall revitWall, out List<string> notes)
       speckleWall.topOffset = GetParamValue<double>(revitWall, BuiltInParameter.WALL_TOP_OFFSET);
       speckleWall.structural = GetParamValue<bool>(revitWall, BuiltInParameter.WALL_STRUCTURAL_SIGNIFICANT);
       speckleWall.flipped = revitWall.Flipped;
-
+      speckleWall.openings = GetWallOpeningElements(revitWall);
       //CreateVoids(revitWall, speckleWall);
 
       if (revitWall.CurtainGrid == null)
@@ -227,7 +227,21 @@ public Base WallToSpeckle(DB.Wall revitWall, out List<string> notes)
       if (hostedNotes.Any()) notes.AddRange(hostedNotes);
       return speckleWall;
     }
-
+    private List<Base> GetWallOpeningElements(DB.Wall revitWall)
+    {
+      var openings = new List<Base>();
+      IList<ElementId> wallOpenings = revitWall.GetDependentElements(new ElementClassFilter(typeof(Opening)));
+      foreach (var openingId in wallOpenings)
+      {
+        var opening = Doc.GetElement(openingId);
+        if (opening is Opening)
+        {
+          var openingSpeckle = OpeningToSpeckle((Opening)opening);
+          openings.Add(openingSpeckle);
+        }
+      }
+      return openings;
+    }
     private (List<Mesh>, List<Mesh>) GetCurtainWallDisplayMesh(DB.Wall wall)
     {
       var grid = wall.CurtainGrid;
diff --git a/Objects/Objects/BuiltElements/Wall.cs b/Objects/Objects/BuiltElements/Wall.cs
index c15ea576ac..a59827eab4 100644
--- a/Objects/Objects/BuiltElements/Wall.cs
+++ b/Objects/Objects/BuiltElements/Wall.cs
@@ -151,6 +151,10 @@ public RevitWall(
     public Level level { get; set; }
     public Level topLevel { get; set; }
     public Base parameters { get; set; }
+    
+    [DetachProperty]
+    public List<Base> openings { get; set; }
+    
     public string elementId { get; set; }
   }