From de5a52483de0cbb7f4f1c6fc9c0796161d7a870d Mon Sep 17 00:00:00 2001 From: Alessio Lombardi Date: Tue, 28 Mar 2023 17:48:39 +0100 Subject: [PATCH 1/2] Revit_Engine: fix the copy of the DiffingConfig properties --- Revit_Engine/Compute/RevitDiffing.cs | 32 +++++++++++++++++++--------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/Revit_Engine/Compute/RevitDiffing.cs b/Revit_Engine/Compute/RevitDiffing.cs index caecafafc..b929535a2 100644 --- a/Revit_Engine/Compute/RevitDiffing.cs +++ b/Revit_Engine/Compute/RevitDiffing.cs @@ -144,6 +144,7 @@ private static Diff Diffing(IEnumerable pastObjects, IEnumerable } // Checks and setup of DiffingConfig/ComparisonConfig. + diffConfig = diffConfig ?? new DiffingConfig(); RevitComparisonConfig rcc = diffConfig?.ComparisonConfig as RevitComparisonConfig; if (rcc == null) { @@ -152,11 +153,6 @@ private static Diff Diffing(IEnumerable pastObjects, IEnumerable if (diffConfig != null) BH.Engine.Reflection.Modify.CopyPropertiesFromParent(rcc, diffConfig?.ComparisonConfig); } - DiffingConfig diffConfigClone = GetRevitDiffingConfig(rcc); - - //Add any custom object difference compares on the provided diff config - if (diffConfig.CustomObjectDifferencesComparers != null && diffConfig.CustomObjectDifferencesComparers.Any()) - diffConfigClone.CustomObjectDifferencesComparers.AddRange(diffConfig.CustomObjectDifferencesComparers); // Get the past and following RevitIdentifiers fragments. IEnumerable pastIdFragments = pastObjects.OfType().Select(obj => obj.GetRevitIdentifiers()).Where(x => x != null); @@ -206,12 +202,15 @@ private static Diff Diffing(IEnumerable pastObjects, IEnumerable return null; } + // Get a Revit-customised instance of DiffingConfig. + DiffingConfig diffConfigClone = GetRevitDiffingConfig(rcc, diffConfig); + //Compute the diffing through DiffWithCustomIds making use of the ids extracted from the objects Diff revitDiff = BH.Engine.Diffing.Compute.DiffWithCustomIds(pastObjects.ToList(), pastIds, followingObjects.ToList(), followingIds, diffConfigClone); return revitDiff; } - private static DiffingConfig GetRevitDiffingConfig(RevitComparisonConfig rcc) + private static DiffingConfig GetRevitDiffingConfig(RevitComparisonConfig rcc, DiffingConfig originalDiffConfig = null) { rcc = rcc ?? new RevitComparisonConfig(); @@ -219,7 +218,7 @@ private static DiffingConfig GetRevitDiffingConfig(RevitComparisonConfig rcc) rcc.TypeExceptions.Add(typeof(RevitPulledParameters)); rcc.TypeExceptions.Add(typeof(RevitParametersToPush)); - return new DiffingConfig() + DiffingConfig result = new DiffingConfig() { ComparisonConfig = rcc, CustomObjectDifferencesComparers = new List>>() @@ -228,8 +227,21 @@ private static DiffingConfig GetRevitDiffingConfig(RevitComparisonConfig rcc) (obj1, obj2, baseComparisonConfig) => { return Query.RevitRevitParametersToPushDifferences(obj1, obj2, baseComparisonConfig); } } }; - } - } -} + // If an instance of a diffingConfig was provided, copy its properties. + if (originalDiffConfig != null) + { + //Add any custom object difference compares provided via the original diff config. + if (originalDiffConfig.CustomObjectDifferencesComparers != null && originalDiffConfig.CustomObjectDifferencesComparers.Any()) + result.CustomObjectDifferencesComparers.AddRange(originalDiffConfig.CustomObjectDifferencesComparers.Except(result.CustomObjectDifferencesComparers)); + + result.AllowDuplicateIds = originalDiffConfig.AllowDuplicateIds; + result.EnablePropertyDiffing = originalDiffConfig.EnablePropertyDiffing; + result.IncludeUnchangedObjects = originalDiffConfig.IncludeUnchangedObjects; + result.ComparisonConfig = originalDiffConfig.ComparisonConfig; + } + return result; + } + } +} \ No newline at end of file From 201f54d4ef499ee7729fcdad9098a481e4d79268 Mon Sep 17 00:00:00 2001 From: Alessio Lombardi Date: Thu, 6 Apr 2023 10:53:01 +0100 Subject: [PATCH 2/2] Removed unneded null check. --- Revit_Engine/Compute/RevitDiffing.cs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/Revit_Engine/Compute/RevitDiffing.cs b/Revit_Engine/Compute/RevitDiffing.cs index b929535a2..b2293107b 100644 --- a/Revit_Engine/Compute/RevitDiffing.cs +++ b/Revit_Engine/Compute/RevitDiffing.cs @@ -150,8 +150,7 @@ private static Diff Diffing(IEnumerable pastObjects, IEnumerable { rcc = new RevitComparisonConfig(); - if (diffConfig != null) - BH.Engine.Reflection.Modify.CopyPropertiesFromParent(rcc, diffConfig?.ComparisonConfig); + BH.Engine.Reflection.Modify.CopyPropertiesFromParent(rcc, diffConfig?.ComparisonConfig); } // Get the past and following RevitIdentifiers fragments. @@ -183,7 +182,7 @@ private static Diff Diffing(IEnumerable pastObjects, IEnumerable followingIds = followingIdFragments.Select(x => x.PersistentId.ToString()).ToList(); } - //Check for duplicate ids + //Check for duplicate ids bool dupsInPastIds = pastIds.Count != pastIds.Distinct().Count(); bool dupsInFollIds = followingIds.Count != followingIds.Distinct().Count(); @@ -194,7 +193,7 @@ private static Diff Diffing(IEnumerable pastObjects, IEnumerable if (dupsInFollIds) messageSubjects.Add(nameof(followingObjects)); string message = $"Some of the {string.Join(" and ", messageSubjects)} contain duplicate {revitIdName}s. "; - if((dupsInPastIds && pastObjects.Any(x => x.GetType().Namespace.Contains("Structure"))) || + if ((dupsInPastIds && pastObjects.Any(x => x.GetType().Namespace.Contains("Structure"))) || (dupsInFollIds && followingObjects.Any(x => x.GetType().Namespace.Contains("Structure")))) message += "\nIf trying to diff structural objects, try pulling using the Phsyical discipline rather than Structural discipline, as models containing disjointed floors and walls and/or curved beams lead to one Revit element being converted into multiple structural BHoM elements.";