From ef3a3fb615d69b9ee1efd7f70b8a052b7ae2cd7d Mon Sep 17 00:00:00 2001 From: wojciech buda Date: Wed, 26 Aug 2026 15:54:01 +0200 Subject: [PATCH 1/2] Subcategory update added --- .../Compute/GeneratePileFoundationType.cs | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/Revit_Core_Engine/Compute/GeneratePileFoundationType.cs b/Revit_Core_Engine/Compute/GeneratePileFoundationType.cs index 7978ffd2b..425683673 100644 --- a/Revit_Core_Engine/Compute/GeneratePileFoundationType.cs +++ b/Revit_Core_Engine/Compute/GeneratePileFoundationType.cs @@ -135,7 +135,7 @@ private static FamilySymbol GenerateFreeformType(PileFoundation pileFoundation, { List takenIndices = freeformFamilies.Select(x => Regex.Match(x.Name, $"{Regex.Escape(prefix)}(\\d+)$")).Select(x => int.Parse(x.Groups[1].Value)).ToList(); int newIndex = takenIndices.Count > 0 ? takenIndices.Max() + 1 : 1; - family = GenerateFreeFormPileFoundationFamilyFromTemplate(document, orientedOutline, layout, diameter, thickness, newIndex); + family = GenerateFreeFormPileFoundationFamilyFromTemplate(document, orientedOutline, layout, diameter, thickness, newIndex, pileFoundation); } if (family == null) @@ -146,7 +146,7 @@ private static FamilySymbol GenerateFreeformType(PileFoundation pileFoundation, /***************************************************/ - private static Family GenerateFreeFormPileFoundationFamilyFromTemplate(this Document document, Polyline orientedOutline, ExplicitLayout layout, double diameter, double thickness, int index) + private static Family GenerateFreeFormPileFoundationFamilyFromTemplate(this Document document, Polyline orientedOutline, ExplicitLayout layout, double diameter, double thickness, int index, PileFoundation pileFoundation) { string templateFamilyName = "StructuralFoundations_PileFoundation-Freeform"; string templatePath = Directory.GetFiles(m_FamilyDirectory, $"*{templateFamilyName}.rfa").FirstOrDefault(); @@ -168,6 +168,13 @@ private static Family GenerateFreeFormPileFoundationFamilyFromTemplate(this Docu if (!PlaceNestedPiles(familyDocument, layout, diameter)) return null; + using (Transaction t = new Transaction(familyDocument, "Update Subcategory")) + { + t.Start(); + SetMaterialSubcategory(familyDocument, (pileFoundation.PileCap?.Construction as oM.Physical.Constructions.Construction)?.Layers?.FirstOrDefault()?.Material); + t.Commit(); + } + return SaveAndLoadFamily(document, familyDocument, $"{Path.GetFileNameWithoutExtension(templatePath)}_{index}"); } catch (Exception ex) From d09da13fe22d204171d8f23536aa193b4b4faeb6 Mon Sep 17 00:00:00 2001 From: wojciech buda Date: Wed, 26 Aug 2026 16:28:31 +0200 Subject: [PATCH 2/2] Read parameters with ending --- .../Compute/GeneratePileFoundationType.cs | 10 +++++++--- .../Convert/Physical/ToRevit/FamilyInstance.cs | 7 ++++++- Revit_Core_Engine/Modify/Update.cs | 6 +++++- .../Query/IsMatchingOutlineAndLayout.cs | 15 +++++++++++---- 4 files changed, 29 insertions(+), 9 deletions(-) diff --git a/Revit_Core_Engine/Compute/GeneratePileFoundationType.cs b/Revit_Core_Engine/Compute/GeneratePileFoundationType.cs index 425683673..6b1f305c8 100644 --- a/Revit_Core_Engine/Compute/GeneratePileFoundationType.cs +++ b/Revit_Core_Engine/Compute/GeneratePileFoundationType.cs @@ -319,7 +319,7 @@ private static bool PlaceNestedPiles(Document familyDocument, ExplicitLayout lay } FamilyManager fm = familyDocument.FamilyManager; - FamilyParameter radiusParam = fm.get_Parameter("Radius"); + FamilyParameter radiusParam = fm.Parameters.Cast().FirstOrDefault(p => p.Definition.Name.EndsWith("Radius")); if (radiusParam != null) fm.Set(radiusParam, (diameter / 2.0).FromSI(SpecTypeId.Length)); @@ -364,7 +364,9 @@ private static FamilySymbol NestedPileSymbol(FamilySymbol pileSymbol, double dia if (nestSymbol == null) return null; - nestSymbol.SetParameter("Radius", diameter / 2.0); + Parameter radiusParam = nestSymbol.Parameters.Cast().FirstOrDefault(x => x.Definition.Name.EndsWith("Radius")); + if (radiusParam != null) + radiusParam.Set((diameter / 2.0).FromSI(radiusParam.Definition.GetDataType())); if (!nestSymbol.IsActive) nestSymbol.Activate(); @@ -390,7 +392,9 @@ private static FamilySymbol FindOrCreateTypeWithDimensions(this Family family, d else result = symbols[0].Duplicate(typeName) as FamilySymbol; - result.SetParameter("Depth", thickness); + Parameter depthParam = result.Parameters.Cast().FirstOrDefault(x => x.Definition.Name.EndsWith("Depth")); + if (depthParam != null) + depthParam.Set(thickness.FromSI(depthParam.Definition.GetDataType())); } result?.Activate(); diff --git a/Revit_Core_Engine/Convert/Physical/ToRevit/FamilyInstance.cs b/Revit_Core_Engine/Convert/Physical/ToRevit/FamilyInstance.cs index e699e07fd..981abe4e5 100644 --- a/Revit_Core_Engine/Convert/Physical/ToRevit/FamilyInstance.cs +++ b/Revit_Core_Engine/Convert/Physical/ToRevit/FamilyInstance.cs @@ -30,6 +30,7 @@ using System; using System.Collections.Generic; using System.ComponentModel; +using System.Linq; namespace BH.Revit.Engine.Core { @@ -312,7 +313,11 @@ public static FamilyInstance ToRevitFamilyInstance(this PileFoundation pileFound double pileDepth = pileFoundation.PileFoundationDepth(settings); if (!double.IsNaN(pileDepth)) - familyInstance.SetParameter("Pile Depth", pileDepth); + { + Parameter depthParam = familyInstance.Parameters.Cast().FirstOrDefault(x => x.Definition.Name.EndsWith("Depth")); + if (depthParam != null) + depthParam.Set(pileDepth.FromSI(depthParam.Definition.GetDataType())); + } familyInstance.SetLocation(pileFoundation, settings); refObjects.AddOrReplace(pileFoundation, familyInstance); diff --git a/Revit_Core_Engine/Modify/Update.cs b/Revit_Core_Engine/Modify/Update.cs index cb99a2718..49e2c2674 100644 --- a/Revit_Core_Engine/Modify/Update.cs +++ b/Revit_Core_Engine/Modify/Update.cs @@ -187,7 +187,11 @@ public static bool Update(this FamilyInstance element, PileFoundation bHoMObject double pileDepth = bHoMObject.PileFoundationDepth(settings); if (!double.IsNaN(pileDepth)) - element.SetParameter("Pile Depth", pileDepth); + { + Parameter depthParam = element.Parameters.Cast().FirstOrDefault(x => x.Definition.Name.EndsWith("Depth")); + if (depthParam != null) + depthParam.Set(pileDepth.FromSI(depthParam.Definition.GetDataType())); + } return result; } diff --git a/Revit_Core_Engine/Query/IsMatchingOutlineAndLayout.cs b/Revit_Core_Engine/Query/IsMatchingOutlineAndLayout.cs index 221778669..7de1f571a 100644 --- a/Revit_Core_Engine/Query/IsMatchingOutlineAndLayout.cs +++ b/Revit_Core_Engine/Query/IsMatchingOutlineAndLayout.cs @@ -99,12 +99,19 @@ private static bool IsMatchingPileDiameter(this Family family, double diameter, FamilySymbol nestSymbol = nest?.Symbol; if (nestSymbol == null) return false; - double radius = nestSymbol.LookupParameterDouble("Radius"); - if (!double.IsNaN(radius)) + Parameter radiusParam = nestSymbol.Parameters.Cast().FirstOrDefault(p => p.Definition.Name.EndsWith("Radius")); + if (radiusParam != null && radiusParam.HasValue) + { + double radius = radiusParam.AsDouble().ToSI(radiusParam.Definition.GetDataType()); return Math.Abs(radius * 2.0 - diameter) <= tol; - double nestDiameter = nestSymbol.LookupParameterDouble("Diameter"); - if (!double.IsNaN(nestDiameter)) + } + + Parameter diameterParam = nestSymbol.Parameters.Cast().FirstOrDefault(p => p.Definition.Name.EndsWith("Diameter")); + if (diameterParam != null && diameterParam.HasValue) + { + double nestDiameter = diameterParam.AsDouble().ToSI(diameterParam.Definition.GetDataType()); return Math.Abs(nestDiameter - diameter) <= tol; + } return false; }