Exemple #1
0
        void CommitInstance
        (
            Document doc, IGH_DataAccess DA, int Iteration,
            Rhino.Geometry.Curve axis,
            GridType gridType
        )
        {
            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)
                    {
                        axis.Scale(scaleFactor);
                    }

                    {
                        if (axis is Rhino.Geometry.PolyCurve polycurve && polycurve.SegmentCount == 1)
                        {
                            axis = polycurve.SegmentCurve(0);
                        }

                        if (axis is Rhino.Geometry.LineCurve line)
                        {
                            element = CopyParametersFrom(Grid.Create(doc, line.ToHost()), element);
                        }
                        else if (axis is Rhino.Geometry.ArcCurve arc)
                        {
                            element = CopyParametersFrom(Grid.Create(doc, arc.ToHost()), element);
                        }
                        else
                        {
                            using (var curveLoop = new CurveLoop())
                                using (var polyline = axis.ToArcsAndLines(Revit.VertexTolerance * 10.0, Revit.AngleTolerance, Revit.ShortCurveTolerance, double.PositiveInfinity))
                                {
                                    int count = polyline.SegmentCount;
                                    for (int s = 0; s < count; ++s)
                                    {
                                        var segment = polyline.SegmentCurve(s);

                                        if (segment is Rhino.Geometry.LineCurve l)
                                        {
                                            curveLoop.Append(l.ToHost());
                                        }
                                        else if (segment is Rhino.Geometry.ArcCurve a)
                                        {
                                            curveLoop.Append(a.ToHost());
                                        }
                                        else
                                        {
                                            throw new ArgumentException();
                                        }
                                    }

                                    axis.TryGetPlane(out var plane);
                                    var sketchPlane = SketchPlane.Create(doc, plane.ToHost());

                                    element = CopyParametersFrom(doc.GetElement(MultiSegmentGrid.Create(doc, gridType.Id, curveLoop, sketchPlane.Id)), element);
                                }
                        }
                    }

                    if (gridType.Id != element.GetTypeId())
                    {
                        var newElmentId = element.ChangeTypeId(gridType.Id);
                        if (newElmentId != ElementId.InvalidElementId)
                        {
                            element = doc.GetElement(newElmentId);
                        }
                    }

                    ReplaceElement(doc, DA, Iteration, element);
                }
                catch (Exception e)
                {
                    AddRuntimeMessage(GH_RuntimeMessageLevel.Error, e.Message);
                    ReplaceElement(doc, DA, Iteration, null);
                }
            }
        }
Exemple #2
0
        /***************************************************/
        /****              Public methods               ****/
        /***************************************************/

        public static Element ToRevitGrid(this oM.Geometry.SettingOut.Grid grid, Document document, RevitSettings settings = null, Dictionary <Guid, List <int> > refObjects = null)
        {
            Element revitGrid = refObjects.GetValue <Grid>(document, grid.BHoM_Guid);

            if (revitGrid != null)
            {
                return(revitGrid);
            }

            settings = settings.DefaultIfNull();

            if (BH.Engine.Geometry.Query.IIsClosed(grid.Curve))
            {
                BH.Engine.Reflection.Compute.RecordError("Element could not be created: Revit allows only open curve-based grids. BHoM_Guid: " + grid.BHoM_Guid);
                return(null);
            }

            List <BH.oM.Geometry.ICurve> gridCurves = BH.Engine.Geometry.Query.ISubParts(grid.Curve).ToList();

            if (gridCurves.Count == 0)
            {
                return(null);
            }
            else if (gridCurves.Count == 1)
            {
                Curve curve = grid.Curve.IToRevit();

                if (curve is Line)
                {
                    revitGrid = Grid.Create(document, (Line)curve);
                }
                else if (curve is Arc)
                {
                    revitGrid = Grid.Create(document, (Arc)curve);
                }
                else
                {
                    BH.Engine.Reflection.Compute.RecordError("Element could not be created: Revit allows only line- and arc-based grids. BHoM_Guid: " + grid.BHoM_Guid);
                    return(null);
                }
            }
            else
            {
                CurveLoop loop = new CurveLoop();
                foreach (BH.oM.Geometry.ICurve curve in gridCurves)
                {
                    Curve revitCurve = curve.IToRevit();
                    if (revitCurve is Line || revitCurve is Arc)
                    {
                        loop.Append(revitCurve);
                    }
                    else
                    {
                        BH.Engine.Reflection.Compute.RecordError("Element could not be created: Revit allows only line- and arc-based grids. BHoM_Guid: " + grid.BHoM_Guid);
                        return(null);
                    }
                }

                Plane plane;
                try
                {
                    plane = loop.GetPlane();
                }
                catch
                {
                    BH.Engine.Reflection.Compute.RecordError("Grid curves need to be coplanar. BHoM_Guid: " + grid.BHoM_Guid);
                    return(null);
                }

                SketchPlane sketchPlane = SketchPlane.Create(document, plane);
                ElementId   gridTypeId  = document.GetDefaultElementTypeId(ElementTypeGroup.GridType);
                ElementId   gridId      = MultiSegmentGrid.Create(document, gridTypeId, loop, sketchPlane.Id);
                revitGrid = document.GetElement(gridId);
            }

            revitGrid.CheckIfNullPush(grid);
            if (revitGrid == null)
            {
                return(null);
            }

            try
            {
                revitGrid.Name = grid.Name;
            }
            catch
            {
                BH.Engine.Reflection.Compute.RecordWarning(String.Format("Grid name '{0}' was not unique, name '{1}' has been assigned instead. BHoM_Guid: {2}", grid.Name, revitGrid.Name, grid.BHoM_Guid));
            }

            // Copy parameters from BHoM object to Revit element
            revitGrid.CopyParameters(grid, settings);

            refObjects.AddOrReplace(grid, revitGrid);
            return(revitGrid);
        }
Exemple #3
0
        void ReconstructGridByCurve
        (
            Document doc,
            ref Autodesk.Revit.DB.Element element,

            Rhino.Geometry.Curve curve,
            Optional <Autodesk.Revit.DB.GridType> type,
            Optional <string> name
        )
        {
            var scaleFactor = 1.0 / Revit.ModelUnits;

            curve = curve.ChangeUnits(scaleFactor);

            SolveOptionalType(ref type, doc, ElementTypeGroup.GridType, nameof(type));

            var parametersMask = name == Optional.Nothig ?
                                 new BuiltInParameter[]
            {
                BuiltInParameter.ELEM_FAMILY_AND_TYPE_PARAM,
                BuiltInParameter.ELEM_FAMILY_PARAM,
                BuiltInParameter.ELEM_TYPE_PARAM
            } :
            new BuiltInParameter[]
            {
                BuiltInParameter.ELEM_FAMILY_AND_TYPE_PARAM,
                BuiltInParameter.ELEM_FAMILY_PARAM,
                BuiltInParameter.ELEM_TYPE_PARAM,
                BuiltInParameter.DATUM_TEXT
            };

            if (curve.TryGetLine(out var line, Revit.VertexTolerance))
            {
                ReplaceElement(ref element, Grid.Create(doc, line.ToHost()), parametersMask);
                ChangeElementTypeId(ref element, type.Value.Id);
            }
            else if (curve.TryGetArc(out var arc, Revit.VertexTolerance))
            {
                ReplaceElement(ref element, Grid.Create(doc, arc.ToHost()), parametersMask);
                ChangeElementTypeId(ref element, type.Value.Id);
            }
            else
            {
                using (var curveLoop = new CurveLoop())
                    using (var polyline = curve.ToArcsAndLines(Revit.VertexTolerance, Revit.AngleTolerance, Revit.ShortCurveTolerance, double.PositiveInfinity))
                    {
                        int count = polyline.SegmentCount;
                        for (int s = 0; s < count; ++s)
                        {
                            var segment = polyline.SegmentCurve(s);

                            if (segment is Rhino.Geometry.LineCurve l)
                            {
                                curveLoop.Append(l.ToHost());
                            }
                            else if (segment is Rhino.Geometry.ArcCurve a)
                            {
                                curveLoop.Append(a.ToHost());
                            }
                            else
                            {
                                ThrowArgumentException(nameof(curve), "Invalid curve type.");
                            }
                        }

                        curve.TryGetPlane(out var plane);
                        var sketchPlane = SketchPlane.Create(doc, plane.ToHost());

                        ReplaceElement(ref element, doc.GetElement(MultiSegmentGrid.Create(doc, type.Value.Id, curveLoop, sketchPlane.Id)), parametersMask);
                    }
            }

            if (name != Optional.Nothig && element != null)
            {
                try { element.Name = name.Value; }
                catch (Autodesk.Revit.Exceptions.ArgumentException e)
                {
                    AddRuntimeMessage(GH_RuntimeMessageLevel.Remark, $"{e.Message.Replace($".{Environment.NewLine}", ". ")}");
                }
            }
        }
Exemple #4
0
        void ReconstructGridByCurve
        (
            Document doc,
            ref Autodesk.Revit.DB.Element element,

            Rhino.Geometry.Curve curve,
            Optional <Autodesk.Revit.DB.GridType> type
        )
        {
            var scaleFactor = 1.0 / Revit.ModelUnits;

            if (scaleFactor != 1.0)
            {
                curve.Scale(scaleFactor);
            }

            SolveOptionalType(ref type, doc, ElementTypeGroup.GridType, nameof(type));

            if (curve.TryGetLine(out var line, Revit.VertexTolerance))
            {
                ReplaceElement(ref element, Grid.Create(doc, line.ToHost()));
                ChangeElementTypeId(ref element, type.Value.Id);
            }
            else if (curve.TryGetArc(out var arc, Revit.VertexTolerance))
            {
                ReplaceElement(ref element, Grid.Create(doc, arc.ToHost()));
                ChangeElementTypeId(ref element, type.Value.Id);
            }
            else
            {
                using (var curveLoop = new CurveLoop())
                    using (var polyline = curve.ToArcsAndLines(Revit.VertexTolerance, Revit.AngleTolerance, Revit.ShortCurveTolerance, double.PositiveInfinity))
                    {
                        int count = polyline.SegmentCount;
                        for (int s = 0; s < count; ++s)
                        {
                            var segment = polyline.SegmentCurve(s);

                            if (segment is Rhino.Geometry.LineCurve l)
                            {
                                curveLoop.Append(l.ToHost());
                            }
                            else if (segment is Rhino.Geometry.ArcCurve a)
                            {
                                curveLoop.Append(a.ToHost());
                            }
                            else
                            {
                                ThrowArgumentException(nameof(curve), "Invalid curve type.");
                            }
                        }

                        curve.TryGetPlane(out var plane);
                        var sketchPlane = SketchPlane.Create(doc, plane.ToHost());

                        var parametersMask = new BuiltInParameter[]
                        {
                            BuiltInParameter.ELEM_FAMILY_AND_TYPE_PARAM,
                            BuiltInParameter.ELEM_FAMILY_PARAM,
                            BuiltInParameter.ELEM_TYPE_PARAM
                        };

                        ReplaceElement(ref element, doc.GetElement(MultiSegmentGrid.Create(doc, type.Value.Id, curveLoop, sketchPlane.Id)), parametersMask);
                    }
            }
        }