protected override void SolveInstance(IGH_DataAccess DA) { var boundaries = new List <Rhino.Geometry.Curve>(); if (!DA.GetDataList("Boundaries", boundaries)) { return; } Autodesk.Revit.DB.BuildingPadType buildingPadType = null; if (!DA.GetData("Type", ref buildingPadType) && Params.Input[1].Sources.Count == 0) { buildingPadType = Revit.ActiveDBDocument.GetElement(Revit.ActiveDBDocument.GetDefaultElementTypeId(ElementTypeGroup.BuildingPadType)) as BuildingPadType; } Autodesk.Revit.DB.Level level = null; DA.GetData("Level", ref level); if (level == null && boundaries.Count != 0) { var boundaryBBox = Rhino.Geometry.BoundingBox.Empty; foreach (var boundary in boundaries.OfType <Rhino.Geometry.Curve>()) { boundaryBBox.Union(boundary.GetBoundingBox(true)); } level = Revit.ActiveDBDocument.FindLevelByElevation(boundaryBBox.Min.Z / Revit.ModelUnits); } DA.DisableGapLogic(); int Iteration = DA.Iteration; Revit.EnqueueAction((doc) => CommitInstance(doc, DA, Iteration, boundaries, buildingPadType, level)); }
protected override void SolveInstance(IGH_DataAccess DA) { var boundaries = new List <Rhino.Geometry.Curve>(); if (!DA.GetDataList("Boundaries", boundaries)) { return; } Autodesk.Revit.DB.BuildingPadType buildingPadType = null; if (!DA.GetData("Type", ref buildingPadType) && Params.Input[1].Sources.Count == 0) { buildingPadType = Revit.ActiveDBDocument.GetElement(Revit.ActiveDBDocument.GetDefaultElementTypeId(ElementTypeGroup.BuildingPadType)) as BuildingPadType; } Autodesk.Revit.DB.Level level = null; DA.GetData("Level", ref level); if (level == null && boundaries.Count != 0) { foreach (var boundary in boundaries.OfType <Rhino.Geometry.Curve>()) { var boundaryBBox = boundary.GetBoundingBox(true); using (var collector = new FilteredElementCollector(Revit.ActiveDBDocument)) { foreach (var levelN in collector.OfClass(typeof(Level)).ToElements().Cast <Level>().OrderBy(c => c.Elevation)) { if (level == null) { level = levelN; } else if (boundaryBBox.Min.Z >= levelN.Elevation) { level = levelN; } } } } } DA.DisableGapLogic(); int Iteration = DA.Iteration; Revit.EnqueueAction((doc) => CommitInstance(doc, DA, Iteration, boundaries, buildingPadType, level)); }
void CommitInstance ( Document doc, IGH_DataAccess DA, int Iteration, IEnumerable <Rhino.Geometry.Curve> boundaries, Autodesk.Revit.DB.BuildingPadType buildingPadType, Autodesk.Revit.DB.Level level ) { var element = PreviousElement(doc, Iteration); if (!element?.Pinned ?? false) { ReplaceElement(doc, DA, Iteration, element); } else { try { var scaleFactor = 1.0 / Revit.ModelUnits; if (scaleFactor != 1.0) { foreach (var boundary in boundaries) { boundary.Scale(scaleFactor); } } var curveLoops = boundaries.Select(region => CurveLoop.Create(region.ToHost().SelectMany(x => x.ToBoundedCurves()).ToList())); if (buildingPadType == null) { buildingPadType = BuildingPadType.CreateDefault(Revit.ActiveDBDocument); } if (element is BuildingPad && buildingPadType.Id != element.GetTypeId()) { var newElmentId = element.ChangeTypeId(buildingPadType.Id); if (newElmentId != ElementId.InvalidElementId) { element = doc.GetElement(newElmentId); } } if (element is BuildingPad buildingPad) { buildingPad.SetBoundary(curveLoops.ToList()); } else { element = CopyParametersFrom(BuildingPad.Create(doc, buildingPadType.Id, level.Id, curveLoops.ToList()), element); } if (element != null) { var boundaryBBox = Rhino.Geometry.BoundingBox.Empty; foreach (var boundary in boundaries) { boundaryBBox.Union(boundary.GetBoundingBox(true)); } element.get_Parameter(BuiltInParameter.TYPE_WALL_CLOSURE).Set(level.Id); element.get_Parameter(BuiltInParameter.LEVEL_PARAM).Set(level.Id); element.get_Parameter(BuiltInParameter.BUILDINGPAD_HEIGHTABOVELEVEL_PARAM).Set(boundaryBBox.Min.Z - level.Elevation); } ReplaceElement(doc, DA, Iteration, element); } catch (Exception e) { AddRuntimeMessage(GH_RuntimeMessageLevel.Error, e.Message); ReplaceElement(doc, DA, Iteration, null); } } }