예제 #1
0
        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));
        }
예제 #2
0
        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));
        }
예제 #3
0
        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);
                }
            }
        }