From 0620af28fa9b139f07ada0d3cee62210a57648d9 Mon Sep 17 00:00:00 2001 From: James Bradley Date: Tue, 24 Dec 2024 16:37:42 -0500 Subject: [PATCH 1/3] Use representation instances for reducers --- Elements.MEP/src/Fittings/Reducer.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Elements.MEP/src/Fittings/Reducer.cs b/Elements.MEP/src/Fittings/Reducer.cs index 677270214..23adcaf28 100644 --- a/Elements.MEP/src/Fittings/Reducer.cs +++ b/Elements.MEP/src/Fittings/Reducer.cs @@ -72,7 +72,12 @@ public override void UpdateRepresentations() var arrows = this.Start.GetArrow(branchSideTransformInverted.OfPoint(startNodeTransform.Origin)) .Concat(this.End.GetArrow(endNodeTransform.Origin)).Concat(GetExtensions()); - this.Representation = new Representation(new List { sweep1, sweep2 }.Concat(arrows).ToList()); + this.RepresentationInstances.Add(new RepresentationInstance(new SolidRepresentation(sweep1), this.Material)); + this.RepresentationInstances.Add(new RepresentationInstance(new SolidRepresentation(sweep2), this.Material)); + foreach (var arrow in arrows) + { + this.RepresentationInstances.Add(new RepresentationInstance(new SolidRepresentation(arrow), this.Material)); + } } public override void ApplyAdditionalTransform() From 2897b960e4d72722ca891ed52b5fb8e6ae649ee4 Mon Sep 17 00:00:00 2001 From: James Bradley Date: Tue, 31 Dec 2024 09:51:31 -0500 Subject: [PATCH 2/3] use the representationinstances cache --- .../Fittings/FittingRepresentationStorage.cs | 21 ++++++++++++++++--- Elements.MEP/src/Fittings/Reducer.cs | 11 +++++----- 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/Elements.MEP/src/Fittings/FittingRepresentationStorage.cs b/Elements.MEP/src/Fittings/FittingRepresentationStorage.cs index d25c2cd67..fa499f6c5 100644 --- a/Elements.MEP/src/Fittings/FittingRepresentationStorage.cs +++ b/Elements.MEP/src/Fittings/FittingRepresentationStorage.cs @@ -11,17 +11,32 @@ static class FittingRepresentationStorage private static readonly Dictionary> _fittings = new Dictionary>(); public static Dictionary> Fittings => _fittings; - public static void SetFittingRepresentation(Fitting fitting, Func> makeSolids) + public static void SetFittingRepresentation(Fitting fitting, Func> makeSolids, Boolean unioned = true, Boolean updateTransform = true) { var hash = fitting.GetRepresentationHash(); if (!_fittings.ContainsKey(hash)) { var solids = makeSolids(); - _fittings.Add(hash, new List { new RepresentationInstance(new SolidRepresentation(solids), fitting.Material) }); + var representationInstances = new List(); + if (unioned) + { + representationInstances = new List { new RepresentationInstance(new SolidRepresentation(solids), fitting.Material) }; + } + else + { + foreach (var solid in solids) + { + representationInstances.Add(new RepresentationInstance(new SolidRepresentation(solid), fitting.Material)); + } + } + _fittings.Add(hash, representationInstances); } fitting.RepresentationInstances = _fittings[hash]; - fitting.Transform = fitting.GetRotatedTransform().Concatenated(new Transform(fitting.Transform.Origin)); + if (updateTransform) + { + fitting.Transform = fitting.GetRotatedTransform().Concatenated(new Transform(fitting.Transform.Origin)); + } } } } \ No newline at end of file diff --git a/Elements.MEP/src/Fittings/Reducer.cs b/Elements.MEP/src/Fittings/Reducer.cs index 23adcaf28..e4aea1b81 100644 --- a/Elements.MEP/src/Fittings/Reducer.cs +++ b/Elements.MEP/src/Fittings/Reducer.cs @@ -72,12 +72,11 @@ public override void UpdateRepresentations() var arrows = this.Start.GetArrow(branchSideTransformInverted.OfPoint(startNodeTransform.Origin)) .Concat(this.End.GetArrow(endNodeTransform.Origin)).Concat(GetExtensions()); - this.RepresentationInstances.Add(new RepresentationInstance(new SolidRepresentation(sweep1), this.Material)); - this.RepresentationInstances.Add(new RepresentationInstance(new SolidRepresentation(sweep2), this.Material)); - foreach (var arrow in arrows) - { - this.RepresentationInstances.Add(new RepresentationInstance(new SolidRepresentation(arrow), this.Material)); - } + // TODO: Update the Factory pattern for setting representationInstances to work with Reducer transforms. + // It would also be ideal to fully understand the geometry artifacts seen with certain Reducers that result in + // bad boolean graphics which result in invisible or fractured geometry. + var solidOperations = new List { sweep1, sweep2 }.Concat(arrows).ToList(); + FittingRepresentationStorage.SetFittingRepresentation(this, () => solidOperations, false, false); } public override void ApplyAdditionalTransform() From 8355394b8f9f7bfc0146ecf684b469cf9fc4fa95 Mon Sep 17 00:00:00 2001 From: James Bradley Date: Fri, 3 Jan 2025 11:21:48 -0500 Subject: [PATCH 3/3] revert but keep todo --- .../Fittings/FittingRepresentationStorage.cs | 21 +++---------------- Elements.MEP/src/Fittings/Reducer.cs | 5 ++++- 2 files changed, 7 insertions(+), 19 deletions(-) diff --git a/Elements.MEP/src/Fittings/FittingRepresentationStorage.cs b/Elements.MEP/src/Fittings/FittingRepresentationStorage.cs index fa499f6c5..d25c2cd67 100644 --- a/Elements.MEP/src/Fittings/FittingRepresentationStorage.cs +++ b/Elements.MEP/src/Fittings/FittingRepresentationStorage.cs @@ -11,32 +11,17 @@ static class FittingRepresentationStorage private static readonly Dictionary> _fittings = new Dictionary>(); public static Dictionary> Fittings => _fittings; - public static void SetFittingRepresentation(Fitting fitting, Func> makeSolids, Boolean unioned = true, Boolean updateTransform = true) + public static void SetFittingRepresentation(Fitting fitting, Func> makeSolids) { var hash = fitting.GetRepresentationHash(); if (!_fittings.ContainsKey(hash)) { var solids = makeSolids(); - var representationInstances = new List(); - if (unioned) - { - representationInstances = new List { new RepresentationInstance(new SolidRepresentation(solids), fitting.Material) }; - } - else - { - foreach (var solid in solids) - { - representationInstances.Add(new RepresentationInstance(new SolidRepresentation(solid), fitting.Material)); - } - } - _fittings.Add(hash, representationInstances); + _fittings.Add(hash, new List { new RepresentationInstance(new SolidRepresentation(solids), fitting.Material) }); } fitting.RepresentationInstances = _fittings[hash]; - if (updateTransform) - { - fitting.Transform = fitting.GetRotatedTransform().Concatenated(new Transform(fitting.Transform.Origin)); - } + fitting.Transform = fitting.GetRotatedTransform().Concatenated(new Transform(fitting.Transform.Origin)); } } } \ No newline at end of file diff --git a/Elements.MEP/src/Fittings/Reducer.cs b/Elements.MEP/src/Fittings/Reducer.cs index e4aea1b81..e40749f29 100644 --- a/Elements.MEP/src/Fittings/Reducer.cs +++ b/Elements.MEP/src/Fittings/Reducer.cs @@ -76,7 +76,10 @@ public override void UpdateRepresentations() // It would also be ideal to fully understand the geometry artifacts seen with certain Reducers that result in // bad boolean graphics which result in invisible or fractured geometry. var solidOperations = new List { sweep1, sweep2 }.Concat(arrows).ToList(); - FittingRepresentationStorage.SetFittingRepresentation(this, () => solidOperations, false, false); + foreach (var solidOperation in solidOperations) + { + this.RepresentationInstances.Add(new RepresentationInstance(new SolidRepresentation(solidOperation), this.Material)); + } } public override void ApplyAdditionalTransform()