Example #1
0
        /// <summary>
        /// Convert a GeometryObject to an applicable ProtoGeometry type.
        /// </summary>
        /// <param name="geom"></param>
        /// <param name="reference"></param>
        /// <param name="transform"></param>
        /// <returns>A Geometry type.  Null if there's no suitable conversion.</returns>
        public static object Convert(this Autodesk.Revit.DB.GeometryObject geom, Autodesk.Revit.DB.Reference reference = null,
                                     Autodesk.DesignScript.Geometry.CoordinateSystem transform = null)
        {
            if (geom == null)
            {
                return(null);
            }

            dynamic dynGeom   = geom;
            dynamic protoGeom = null;

            try
            {
                protoGeom = InternalConvert(dynGeom);
                // if protoGeom is null, Transform will be ambiguous between
                // IEnumerable<Autodesk.DesignScript.Geometry.Geometry> Transform(IEnumerable<Autodesk.DesignScript.Geometry.Geometry> geom, CoordinateSystem coordinateSystem)
                // and
                // Autodesk.DesignScript.Geometry.Geometry Transform(Autodesk.DesignScript.Geometry.Geometry geom, CoordinateSystem coordinateSystem)
                if (protoGeom == null)
                {
                    throw new ArgumentNullException();
                }
                return(Tag(Transform(protoGeom, transform), reference));
            }
            catch (Exception e)
            {
                DynamoServices.LogWarningMessageEvents.OnLogWarningMessage(Properties.Resources.GeometryConversionFailure + e.Message);
                return(null);
            }
            finally
            {
                // Dispose the temporary geometry that has been transformed.
                DisposeGeometry(protoGeom, transform);
            }
        }
        /// <summary>
        /// Convert a GeometryObject to an applicable ProtoGeometry type.
        /// </summary>
        /// <param name="geom"></param>
        /// <param name="reference"></param>
        /// <param name="transform"></param>
        /// <returns>A Geometry type.  Null if there's no suitable conversion.</returns>
        public static object Convert(this Autodesk.Revit.DB.GeometryObject geom, Autodesk.Revit.DB.Reference reference = null,
                                     Autodesk.DesignScript.Geometry.CoordinateSystem transform = null)
        {
            if (geom == null)
            {
                return(null);
            }

            dynamic dynGeom   = geom;
            dynamic protoGeom = null;

            try
            {
                protoGeom = InternalConvert(dynGeom);
                return(Tag(Transform(protoGeom, transform), reference));
            }
            catch (Exception e)
            {
                DynamoServices.LogWarningMessageEvents.OnLogWarningMessage(Properties.Resources.GeometryConversionFailure + e.Message);
                return(null);
            }
            finally
            {
                // Dispose the temporary geometry that has been transformed.
                DisposeGeometry(protoGeom, transform);
            }
        }
Example #3
0
        static bool SkipGeometryObject(DB.GeometryObject geometryObject, DB.Document doc)
        {
            if (doc.GetElement(geometryObject.GraphicsStyleId) is DB.GraphicsStyle style)
            {
                return(style.GraphicsStyleCategory.Id.IntegerValue == (int)DB.BuiltInCategory.OST_LightingFixtureSource);
            }

            return(false);
        }
Example #4
0
        /// <summary>
        /// Update Context from <see cref="DB.GeometryObject"/> <paramref name="geometryObject"/>
        /// </summary>
        /// <param name="geometryObject"></param>
        static void UpdateGraphicAttributes(DB.GeometryObject geometryObject)
        {
            if (geometryObject is object)
            {
                var context = Context.Peek;
                if (context.Element is object)
                {
                    if (geometryObject is DB.GeometryInstance instance)
                    {
                        context.Element = instance.Symbol;
                    }

                    context.Visibility = geometryObject.Visibility;

                    if (geometryObject.GraphicsStyleId != DB.ElementId.InvalidElementId)
                    {
                        context.GraphicsStyleId = geometryObject.GraphicsStyleId;

                        if (context.Element.Document.GetElement(context.GraphicsStyleId) is DB.GraphicsStyle graphicsStyle)
                        {
                            if (graphicsStyle.GraphicsStyleCategory.Material is DB.Material material)
                            {
                                context.MaterialId = material.Id;
                            }
                        }
                    }

                    if (geometryObject is DB.GeometryElement element)
                    {
                        if (element.MaterialElement is object)
                        {
                            context.MaterialId = element.MaterialElement.Id;
                        }
                    }
                    else if (geometryObject is DB.Solid solid)
                    {
                        if (!solid.Faces.IsEmpty)
                        {
                            var face0 = solid.Faces.get_Item(0);
                            if (face0.MaterialElementId != DB.ElementId.InvalidElementId)
                            {
                                context.MaterialId = face0.MaterialElementId;
                            }
                        }
                    }
                    else if (geometryObject is DB.Mesh mesh)
                    {
                        if (mesh.MaterialElementId != DB.ElementId.InvalidElementId)
                        {
                            context.MaterialId = mesh.MaterialElementId;
                        }
                    }
                }
            }
        }
Example #5
0
        public static IEnumerable <GeometryBase> ToRhino(this DB.GeometryObject geometry)
        {
            var scaleFactor = Revit.ModelUnits;

            switch (geometry)
            {
            case DB.GeometryElement element:
                foreach (var g in element.SelectMany(x => x.ToRhino()))
                {
                    yield return(g);
                }

                break;

            case DB.GeometryInstance instance:
                var xform = instance.Transform.ToRhino().ChangeUnits(scaleFactor);
                foreach (var g in instance.SymbolGeometry.ToRhino())
                {
                    g?.Transform(xform);
                    yield return(g);
                }
                break;

            case DB.Mesh mesh:
                var m = mesh.ToRhino();

                yield return(m?.ChangeUnits(scaleFactor));

                break;

            case DB.Solid solid:
                var s = solid.ToRhino();

                yield return(s?.ChangeUnits(scaleFactor));

                break;

            case DB.Curve curve:
                var c = curve.ToRhino();

                yield return(c?.ChangeUnits(scaleFactor));

                break;

            case DB.PolyLine polyline:
                var p = new PolylineCurve(polyline.GetCoordinates().ToRhino());

                yield return(p?.ChangeUnits(scaleFactor));

                break;
            }
        }
Example #6
0
        public override FScheme.Value Evaluate(FSharpList <FScheme.Value> args)
        {
            double length = 0.0;

            object arg0 = ((FScheme.Value.Container)args[0]).Item;

            Autodesk.Revit.DB.GeometryObject curveOrEdge = null;

            if (arg0 is Reference)
            {
                var curveRef = arg0 as Reference;

                curveOrEdge = dynRevitSettings.Doc.Document.GetElement(curveRef.ElementId)
                              .GetGeometryObjectFromReference(curveRef) as Autodesk.Revit.DB.GeometryObject;
                if (!(curveOrEdge is Autodesk.Revit.DB.Curve || curveOrEdge is Autodesk.Revit.DB.Edge))
                {
                    throw new Exception("Reference is not to curve or edge.");
                }
            }
            else if (arg0 is CurveElement)
            {
                var curveElem = arg0 as CurveElement;
                curveOrEdge = curveElem.GeometryCurve;
            }
            else if (arg0 is Autodesk.Revit.DB.GeometryObject)
            {
                curveOrEdge = arg0 as Autodesk.Revit.DB.GeometryObject;
            }
            else
            {
                throw new Exception("Argument is not a curve or a edge.");
            }
            if (curveOrEdge is Autodesk.Revit.DB.Curve)
            {
                var thisCurve = curveOrEdge as Autodesk.Revit.DB.Curve;
                length = thisCurve.Length;
            }
            else if (curveOrEdge is Autodesk.Revit.DB.Edge)
            {
                var thisEdge = curveOrEdge as Autodesk.Revit.DB.Edge;
                length = thisEdge.AsCurve().Length;
            }
            else
            {
                throw new Exception("Argument is not a curve or a edge.");
            }

            //Fin
            return(FScheme.Value.NewContainer(Units.Length.FromFeet(length, dynSettings.Controller.UnitsManager)));
        }
        public static IEnumerable <GeometryBase> ToGeometryBaseMany(this DB.GeometryObject geometry)
        {
            switch (geometry)
            {
            case DB.GeometryElement element:
                foreach (var g in element.SelectMany(x => x.ToGeometryBaseMany()))
                {
                    yield return(g);
                }

                yield break;

            case DB.GeometryInstance instance:
                var xform = ToTransform(instance.Transform);
                foreach (var g in instance.SymbolGeometry.ToGeometryBaseMany())
                {
                    g?.Transform(xform);
                    yield return(g);
                }
                break;

            case DB.Mesh mesh:

                yield return(mesh.ToMesh());

                yield break;

            case DB.Solid solid:

                yield return(solid.ToBrep());

                yield break;

            case DB.Curve curve:

                yield return(curve.ToCurve());

                yield break;

            case DB.PolyLine polyline:

                yield return(polyline.ToPolylineCurve());

                yield break;
            }
        }
Example #8
0
        /// <summary>
        /// Update Context from <see cref="DB.GeometryObject"/> <paramref name="geometryObject"/>
        /// </summary>
        /// <param name="geometryObject"></param>
        internal static void UpdateGraphicAttributes(DB.GeometryObject geometryObject)
        {
            if (geometryObject is object)
            {
                var context = Context.Peek;
                if (context.Element is object)
                {
                    context.Visibility = geometryObject.Visibility;

                    if (geometryObject is DB.GeometryInstance instance)
                    {
                        context.Element         = instance.Symbol;
                        context.GraphicsStyleId = instance.Symbol.Category?.GetGraphicsStyle(DB.GraphicsStyleType.Projection)?.Id ?? DB.ElementId.InvalidElementId;
                        context.MaterialId      = instance.Symbol.Category?.Material?.Id ?? DB.ElementId.InvalidElementId;
                    }
                    else if (geometryObject is DB.GeometryElement element)
                    {
                        context.MaterialId = element.MaterialElement?.Id ?? DB.ElementId.InvalidElementId;
                    }
                    else if (geometryObject is DB.Solid solid)
                    {
                        if (!solid.Faces.IsEmpty)
                        {
                            var faces = solid.Faces;
                            var count = faces.Size;

                            context.FaceMaterialId = new DB.ElementId[count];
                            for (int f = 0; f < count; ++f)
                            {
                                context.FaceMaterialId[f] = faces.get_Item(f).MaterialElementId;
                            }
                        }
                    }
                    else if (geometryObject is DB.Mesh mesh)
                    {
                        context.FaceMaterialId = new DB.ElementId[] { mesh.MaterialElementId };
                    }

                    if (geometryObject.GraphicsStyleId != DB.ElementId.InvalidElementId)
                    {
                        context.GraphicsStyleId = geometryObject.GraphicsStyleId;
                    }
                }
            }
        }
Example #9
0
        /// <summary>
        /// Convert a GeometryObject to an applicable ProtoGeometry type.
        /// </summary>
        /// <param name="geom"></param>
        /// <param name="reference"></param>
        /// <returns>A Geometry type.  Null if there's no suitable conversion.</returns>
        public static object Convert(this Autodesk.Revit.DB.GeometryObject geom, Autodesk.Revit.DB.Reference reference = null)
        {
            if (geom == null)
            {
                return(null);
            }

            dynamic dynGeom = geom;

            try
            {
                return(Tag(InternalConvert(dynGeom), reference));
            }
            catch (RuntimeBinderException e)
            {
                return(null);
            }
        }
        /// <summary>
        /// Convert a GeometryObject to an applicable ProtoGeometry type.
        /// </summary>
        /// <param name="geom"></param>
        /// <returns>A Geometry type.  Null if there's no suitable conversion.</returns>
        public static Autodesk.DesignScript.Geometry.Geometry Convert(this Autodesk.Revit.DB.GeometryObject geom)
        {
            if (geom == null)
            {
                return(null);
            }

            dynamic dynGeom = geom;

            try
            {
                return(InternalConvert(dynGeom));
            }
            catch (RuntimeBinderException e)
            {
                // There's no InternalConvert method
                return(null);
            }
        }
Example #11
0
        /// <summary>
        /// Convert a GeometryObject to an applicable ProtoGeometry type.
        /// </summary>
        /// <param name="geom"></param>
        /// <param name="reference"></param>
        /// <param name="transform"></param>
        /// <returns>A Geometry type.  Null if there's no suitable conversion.</returns>
        public static object Convert(this Autodesk.Revit.DB.GeometryObject geom, Autodesk.Revit.DB.Reference reference = null,
                                     Autodesk.DesignScript.Geometry.CoordinateSystem transform = null)
        {
            if (geom == null)
            {
                return(null);
            }

            dynamic dynGeom   = geom;
            dynamic protoGeom = null;

            try
            {
                protoGeom = InternalConvert(dynGeom);
                return(Tag(Transform(protoGeom, transform), reference));
            }
            catch (Exception)
            {
                return(null);
            }
            finally
            {
                // Dispose the temporary geometry that has been transformed.
                if (protoGeom != null && transform != null)
                {
                    if (protoGeom is Autodesk.DesignScript.Geometry.Geometry)
                    {
                        protoGeom.Dispose();
                    }
                    else if (protoGeom is IEnumerable <Autodesk.DesignScript.Geometry.Geometry> )
                    {
                        var geoms = protoGeom as IEnumerable <Autodesk.DesignScript.Geometry.Geometry>;
                        foreach (var g in geoms)
                        {
                            if (g != null)
                            {
                                g.Dispose();
                            }
                        }
                    }
                }
            }
        }
        /// <summary>
        /// Convert a GeometryObject to an applicable ProtoGeometry type.
        /// </summary>
        /// <param name="geom"></param>
        /// <param name="reference"></param>
        /// <param name="transform"></param>
        /// <returns>A Geometry type.  Null if there's no suitable conversion.</returns>
        public static object Convert(this Autodesk.Revit.DB.GeometryObject geom, Autodesk.Revit.DB.Reference reference = null,
                                     Autodesk.DesignScript.Geometry.CoordinateSystem transform = null)
        {
            if (geom == null)
            {
                return(null);
            }

            dynamic dynGeom = geom;

            try
            {
                return(Tag(Transform(InternalConvert(dynGeom), transform), reference));
            }
            catch (RuntimeBinderException)
            {
                return(null);
            }
        }
Example #13
0
        public static IEnumerable <GeometryBase> ToGeometryBaseMany(this DB.GeometryObject geometry)
        {
            UpdateGraphicAttributes(geometry);

            switch (geometry)
            {
            case DB.GeometryElement element:
                foreach (var g in element.SelectMany(x => x.ToGeometryBaseMany()))
                {
                    yield return(g);
                }
                yield break;

            case DB.GeometryInstance instance:
                foreach (var g in instance.GetInstanceGeometry().ToGeometryBaseMany())
                {
                    yield return(g);
                }
                yield break;

            case DB.Mesh mesh:
                yield return(SetGraphicAttributes(mesh.ToMesh()));

                yield break;

            case DB.Solid solid:
                yield return(SetGraphicAttributes(solid.ToBrep()));

                yield break;

            case DB.Curve curve:
                yield return(SetGraphicAttributes(curve.ToCurve()));

                yield break;

            case DB.PolyLine polyline:
                yield return(SetGraphicAttributes(polyline.ToPolylineCurve()));

                yield break;
            }
        }
Example #14
0
 public static IEnumerable <GeometryBase> ToRhino(this DB.GeometryObject geometry) => geometry.ToGeometryBaseMany();