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
+ }
}