diff --git a/.gitignore b/.gitignore index 8d39710..fa4f408 100644 --- a/.gitignore +++ b/.gitignore @@ -349,3 +349,4 @@ MigrationBackup/ # Ionide (cross platform F# VS Code tools) working folder .ionide/ xUnitRevit/config.json +.idea/ diff --git a/SampleLibrary/SampleLibrary.csproj b/SampleLibrary/SampleLibrary.csproj index bbd2dd6..9adb709 100644 --- a/SampleLibrary/SampleLibrary.csproj +++ b/SampleLibrary/SampleLibrary.csproj @@ -41,6 +41,9 @@ ..\packages\ModPlus.Revit.API.2021.1.0.0\lib\RevitAPI.dll + + ..\..\..\..\Program Files\Autodesk\Revit 2021\RevitAPIIFC.dll + ..\packages\ModPlus.Revit.API.2021.1.0.0\lib\RevitAPIUI.dll @@ -64,9 +67,6 @@ ..\packages\xunit.extensibility.execution.2.4.1\lib\net452\xunit.execution.desktop.dll - - ..\packages\xUnitRevitUtils.2021.1.0.1\lib\netstandard2.0\xUnitRevitUtils.dll - @@ -80,6 +80,12 @@ + + + {977e0b63-5706-4c2b-9c01-3c02d9ebe377} + xUnitRevitUtils2021 + + diff --git a/SampleLibrary/SampleTest.cs b/SampleLibrary/SampleTest.cs index af77ca1..a463ba7 100644 --- a/SampleLibrary/SampleTest.cs +++ b/SampleLibrary/SampleTest.cs @@ -1,7 +1,10 @@ using Autodesk.Revit.DB; +using Autodesk.Revit.DB.IFC; using System; +using System.Collections; using System.Collections.Generic; using System.IO; +using System.Linq; using Xunit; using xUnitRevitUtils; @@ -20,7 +23,7 @@ namespace SampleLibrary var walls = new FilteredElementCollector(doc).WhereElementIsNotElementType().OfCategory(BuiltInCategory.OST_Walls).ToElements(); - foreach(var wall in walls) + foreach (var wall in walls) { var volumeParam = wall.get_Parameter(BuiltInParameter.HOST_VOLUME_COMPUTED); Assert.NotNull(volumeParam); @@ -35,6 +38,37 @@ namespace SampleLibrary Assert.Equal(5, feet); } + [Fact] + public void GetWallGrossAreaAndRollBack() + { + var testModel = Utils.GetTestModel("walls.rvt"); + var doc = xru.OpenDoc(testModel); + var walls = new FilteredElementCollector(doc).WhereElementIsNotElementType().OfCategory(BuiltInCategory.OST_Walls).ToElements(); + var wall = walls[0] as Wall; + double grossArea = 0; + + var inserts = wall.FindInserts(true, true, true, true); + xru.Run(() => + { + using (Transaction transaction = new Transaction(doc, "Temporary - only to get gross area")) + { + transaction.Start(); + foreach (ElementId insertId in inserts) { doc.Delete(insertId); } + doc.Regenerate(); + var wallFaceReference = HostObjectUtils.GetSideFaces(wall, ShellLayerType.Exterior); + var face = doc.GetElement(wallFaceReference.First()).GetGeometryObjectFromReference(wallFaceReference.First()) as PlanarFace; + var wallFaceEdges = face.GetEdgesAsCurveLoops(); + grossArea = ExporterIFCUtils.ComputeAreaOfCurveLoops(wallFaceEdges); + transaction.RollBack(); + + } + }, doc).Wait(); + + + + Assert.True(grossArea > 0); + } + } } diff --git a/xUnitRevitUtils2021/xru.cs b/xUnitRevitUtils2021/xru.cs index af84e24..00895b4 100644 --- a/xUnitRevitUtils2021/xru.cs +++ b/xUnitRevitUtils2021/xru.cs @@ -24,7 +24,7 @@ namespace xUnitRevitUtils public static SynchronizationContext UiContext { get; set; } public static void Initialize(UIApplication uiapp, SynchronizationContext uiContext, ExternalEvent eventHandler, List queue) - { + { Uiapp = uiapp; UiContext = uiContext; EventHandler = eventHandler; @@ -99,15 +99,15 @@ namespace xUnitRevitUtils } - /// - /// Runs an Action in a Revit transaction, uses TaskCompletionSource to communicate when done - /// - /// Action to run - /// Revit Document - /// Transaction Name - /// Enable to swallow all warnings generated by the transaction and prevent them from being raised within Revit - /// - public static Task RunInTransaction(Action action, Document doc, string transactionName = "transaction", bool ignoreWarnings = false) + /// + /// Runs an Action in a Revit transaction, uses TaskCompletionSource to communicate when done + /// + /// Action to run + /// Revit Document + /// Transaction Name + /// Enable to swallow all warnings generated by the transaction and prevent them from being raised within Revit + /// + public static Task RunInTransaction(Action action, Document doc, string transactionName = "transaction", bool ignoreWarnings = false) { var tcs = new TaskCompletionSource(); Queue.Add(new Action(() => @@ -118,12 +118,12 @@ namespace xUnitRevitUtils { transaction.Start(); - if (ignoreWarnings) - { - var options = transaction.GetFailureHandlingOptions(); - options.SetFailuresPreprocessor(new IgnoreAllWarnings()); - transaction.SetFailureHandlingOptions(options); - } + if (ignoreWarnings) + { + var options = transaction.GetFailureHandlingOptions(); + options.SetFailuresPreprocessor(new IgnoreAllWarnings()); + transaction.SetFailureHandlingOptions(options); + } action.Invoke(); transaction.Commit(); @@ -142,6 +142,34 @@ namespace xUnitRevitUtils } + /// + /// Runs an Action, uses TaskCompletionSource to communicate when done + /// + /// Action to run + /// Revit Document + /// + public static Task Run(Action action, Document doc) + { + var tcs = new TaskCompletionSource(); + Queue.Add(new Action(() => + { + try + { + action.Invoke(); + } + catch (Exception e) + { + tcs.TrySetException(e); + } + tcs.TrySetResult(""); + })); + + EventHandler.Raise(); + + return tcs.Task; + + } + /// /// A failures preprocesser that clears any failures that occur within a transaction /// @@ -150,17 +178,17 @@ namespace xUnitRevitUtils public FailureProcessingResult PreprocessFailures(FailuresAccessor failuresAccessor) { var failList = failuresAccessor.GetFailureMessages(); - + foreach (FailureMessageAccessor failure in failList) { failuresAccessor.DeleteWarning(failure); } - + return FailureProcessingResult.Continue; } } - #endregion - } + #endregion + } }