void ReconstructFormByGeometry
        (
            Document doc,
            ref Autodesk.Revit.DB.Element element,

            Rhino.Geometry.Brep brep
        )
        {
            if (!doc.IsFamilyDocument)
            {
                throw new InvalidOperationException("This component can only run on a Family document");
            }

            brep.GetUserBoolean(BuiltInParameter.ELEMENT_IS_CUTTING.ToString(), out var cutting);

            if (brep.Faces.Count == 1 && brep.Faces[0].Loops.Count == 1 && brep.Faces[0].TryGetPlane(out var capPlane))
            {
                using (var sketchPlane = SketchPlane.Create(doc, capPlane.ToPlane()))
                    using (var referenceArray = new ReferenceArray())
                    {
                        try
                        {
                            foreach (var curve in brep.Faces[0].OuterLoop.To3dCurve().ToCurveMany())
                            {
                                referenceArray.Append(new Reference(doc.FamilyCreate.NewModelCurve(curve, sketchPlane)));
                            }

                            ReplaceElement
                            (
                                ref element,
                                doc.FamilyCreate.NewFormByCap
                                (
                                    !cutting,
                                    referenceArray
                                )
                            );

                            return;
                        }
                        catch (Autodesk.Revit.Exceptions.InvalidOperationException)
                        {
                            doc.Delete(referenceArray.OfType <Reference>().Select(x => x.ElementId).ToArray());
                        }
                    }
            }
            else if (brep.TryGetExtrusion(out var extrusion) && (extrusion.CapCount == 2 || !extrusion.IsClosed(0)))
            {
                using (var sketchPlane = SketchPlane.Create(doc, extrusion.GetProfilePlane(0.0).ToPlane()))
                    using (var referenceArray = new ReferenceArray())
                    {
                        try
                        {
                            foreach (var curve in extrusion.Profile3d(new Rhino.Geometry.ComponentIndex(Rhino.Geometry.ComponentIndexType.ExtrusionBottomProfile, 0)).ToCurveMany())
                            {
                                referenceArray.Append(new Reference(doc.FamilyCreate.NewModelCurve(curve, sketchPlane)));
                            }

                            ReplaceElement
                            (
                                ref element,
                                doc.FamilyCreate.NewExtrusionForm
                                (
                                    !cutting,
                                    referenceArray,
                                    extrusion.PathLineCurve().Line.Direction.ToXYZ(UnitConverter.ToHostUnits)
                                )
                            );
                            return;
                        }
                        catch (Autodesk.Revit.Exceptions.InvalidOperationException)
                        {
                            doc.Delete(referenceArray.OfType <Reference>().Select(x => x.ElementId).ToArray());
                        }
                    }
            }

            {
                var solid = brep.ToSolid();
                if (solid != null)
                {
                    if (element is FreeFormElement freeFormElement)
                    {
                        freeFormElement.UpdateSolidGeometry(solid);
                    }
                    else
                    {
                        ReplaceElement(ref element, FreeFormElement.Create(doc, solid));

                        if (doc.OwnerFamily.IsConceptualMassFamily)
                        {
                            element.get_Parameter(BuiltInParameter.FAMILY_ELEM_SUBCATEGORY).Set(new ElementId(BuiltInCategory.OST_MassForm));
                        }
                    }

                    element.get_Parameter(BuiltInParameter.ELEMENT_IS_CUTTING)?.Set(cutting ? 1 : 0);
                }
                else
                {
                    AddRuntimeMessage(GH_RuntimeMessageLevel.Error, "Failed to convert Brep to Form");
                }
            }
        }
Exemple #2
0
        void ReconstructFormByGeometry
        (
            Document doc,
            ref Autodesk.Revit.DB.Element element,

            Rhino.Geometry.Brep brep
        )
        {
            if (!doc.IsFamilyDocument)
            {
                throw new InvalidOperationException("This component can only run in Family editor");
            }

            var scaleFactor = 1.0 / Revit.ModelUnits;

            brep = brep.ChangeUnits(scaleFactor);

            if (brep.Faces.Count == 1 && brep.Faces[0].Loops.Count == 1 && brep.Faces[0].TryGetPlane(out var capPlane))
            {
                using (var sketchPlane = SketchPlane.Create(doc, capPlane.ToHost()))
                    using (var referenceArray = new ReferenceArray())
                    {
                        try
                        {
                            foreach (var curve in brep.Faces[0].OuterLoop.To3dCurve().ToHostMultiple())
                            {
                                referenceArray.Append(new Reference(doc.FamilyCreate.NewModelCurve(curve, sketchPlane)));
                            }

                            ReplaceElement
                            (
                                ref element,
                                doc.FamilyCreate.NewFormByCap
                                (
                                    brep.SolidOrientation != Rhino.Geometry.BrepSolidOrientation.Inward,
                                    referenceArray
                                )
                            );

                            return;
                        }
                        catch (Autodesk.Revit.Exceptions.InvalidOperationException)
                        {
                            doc.Delete(referenceArray.OfType <Reference>().Select(x => x.ElementId).ToArray());
                        }
                    }
            }
            else if (brep.TryGetExtrusion(out var extrusion) && (extrusion.CapCount == 2 || !extrusion.IsClosed(0)))
            {
                using (var sketchPlane = SketchPlane.Create(doc, extrusion.GetProfilePlane(0.0).ToHost()))
                    using (var referenceArray = new ReferenceArray())
                    {
                        try
                        {
                            foreach (var curve in extrusion.Profile3d(new Rhino.Geometry.ComponentIndex(Rhino.Geometry.ComponentIndexType.ExtrusionBottomProfile, 0)).ToHostMultiple())
                            {
                                referenceArray.Append(new Reference(doc.FamilyCreate.NewModelCurve(curve, sketchPlane)));
                            }

                            ReplaceElement
                            (
                                ref element,
                                doc.FamilyCreate.NewExtrusionForm
                                (
                                    brep.SolidOrientation != Rhino.Geometry.BrepSolidOrientation.Inward,
                                    referenceArray, extrusion.PathLineCurve().Line.Direction.ToHost()
                                )
                            );
                            return;
                        }
                        catch (Autodesk.Revit.Exceptions.InvalidOperationException)
                        {
                            doc.Delete(referenceArray.OfType <Reference>().Select(x => x.ElementId).ToArray());
                        }
                    }
            }

            {
                var solid = brep.ToHost();
                if (solid != null)
                {
                    if (element is FreeFormElement freeFormElement)
                    {
                        freeFormElement.UpdateSolidGeometry(solid);
                    }
                    else
                    {
                        ReplaceElement(ref element, FreeFormElement.Create(doc, solid));

                        if (doc.OwnerFamily.IsConceptualMassFamily)
                        {
                            element.get_Parameter(BuiltInParameter.FAMILY_ELEM_SUBCATEGORY).Set(new ElementId(BuiltInCategory.OST_MassForm));
                        }
                    }

                    element.get_Parameter(BuiltInParameter.ELEMENT_IS_CUTTING)?.Set
                    (
                        brep.SolidOrientation == Rhino.Geometry.BrepSolidOrientation.Inward ?
                        1 /*VOID*/ :
                        0 /*SOLID*/
                    );
                }
            }
        }