通过element.get_Geometry(opt);可以获取对象的几何信息。 参数Option指定参数的限制条件,比如详细程度,哪个视图。 获得的几何信息保存在一个数组中,可以通过遍历得到点,面等信息。


通过element.get_Geometry(opt);可以获取对象的几何信息。

参数Option指定参数的限制条件,比如详细程度,哪个视图。

获得的几何信息保存在一个数组中,可以通过遍历得到点,面等信息。

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;


using WinForm = System.Windows.Forms;


using Autodesk.Revit.UI;

using Autodesk.Revit.DB;

using Autodesk.Revit.Attributes;


using Autodesk.Revit.DB.Mechanical;

using Autodesk.Revit.UI.Selection;

using Autodesk.Revit.ApplicationServices;


using Autodesk.Revit.DB.Structure;


using System.Xml;


namespace RevitCodes

{

    [TransactionAttribute(Autodesk.Revit.Attributes.TransactionMode.Manual)]

    public class GetWallBFace : IExternalCommand

    {

        public Result Execute(ExternalCommandData commandData, ref string messages, ElementSet elements)

        {


            UIApplication app = commandData.Application;

            Document doc = app.ActiveUIDocument.Document;


            //select a wall      

            Reference ref1 = app.ActiveUIDocument.Selection.PickObject(Autodesk.Revit.UI.Selection.ObjectType.Element, "Please pick a wall");

            Element elem = doc.GetElement(ref1);

            Wall wall = elem as Wall;


            Options opt = new Options();

            opt.ComputeReferences = true;

            opt.DetailLevel = Autodesk.Revit.DB.DetailLevels.Medium;


            GeometryElement e = wall.get_Geometry(opt);


            foreach (GeometryObject obj in e.Objects)

            {

                Solid solid = obj as Solid;

                if (solid != null && solid.Faces.Size > 0)

                    FindBottomFace(solid);

            }


            return Result.Succeeded;

        }


        Face FindBottomFace(Solid solid)

        {

            PlanarFace pf = null;

            foreach (Face face in solid.Faces)

            {

                pf = face as PlanarFace;

                if (null != pf)

                {

                    if (Math.Abs(pf.Normal.X) < 0.01 && Math.Abs(pf.Normal.Y) < 0.01 && pf.Normal.Z < 0)

                    {

                        TaskDialog.Show("Wall Bottom Face", "Area is " + pf.Area.ToString() + "; Origin = (" + pf.Origin.X.ToString() + "  " + pf.Origin.Y.ToString() + "  " + pf.Origin.Z.ToString() + ")");


                        break;

                    }

                }

            }

            return pf;

        }


    }



    [TransactionAttribute(Autodesk.Revit.Attributes.TransactionMode.Manual)]

    public class GetColumnBottomFace : IExternalCommand

    {

        public Result Execute(ExternalCommandData commandData, ref string messages, ElementSet elements)

        {


            UIApplication app = commandData.Application;

            Document doc = app.ActiveUIDocument.Document;


            //select a column      

            Reference ref1 = app.ActiveUIDocument.Selection.PickObject(Autodesk.Revit.UI.Selection.ObjectType.Element, "Please pick a column");

            Element elem = doc.GetElement(ref1);

            FamilyInstance column = elem as FamilyInstance;


            Options opt = new Options();

            opt.ComputeReferences = true;

            opt.DetailLevel = Autodesk.Revit.DB.DetailLevels.Medium;


            GeometryElement e = column.get_Geometry(opt);


            foreach (GeometryObject obj in e.Objects)

            {


                if (obj is Solid)

                {

                    Solid solid = obj as Solid;

                    FindBottomFace(solid);

                }

                else if (obj is GeometryInstance)

                {

                    GeometryInstance geoInstance = obj as GeometryInstance;

                    GeometryElement geoElement = geoInstance.GetInstanceGeometry();

                    foreach (GeometryObject obj2 in geoElement.Objects)

                    {

                        if (obj2 is Solid)

                        {

                            Solid solid2 = obj2 as Solid;

                            if (solid2.Faces.Size > 0)

                                FindBottomFace(solid2);

                        }

                    }

                }

            }

            return Result.Succeeded;

        }


        Face FindBottomFace(Solid solid)

        {

            PlanarFace pf = null;

            foreach (Face face in solid.Faces)

            {

                pf = face as PlanarFace;

                if (null != pf)

                {

                    if (Math.Abs(pf.Normal.X) < 0.01 && Math.Abs(pf.Normal.Y) < 0.01 && pf.Normal.Z < 0)

                    {

                        TaskDialog.Show("column Bottom Face", "Area is " + pf.Area.ToString() + "; Origin = (" + pf.Origin.X.ToString() + "  " + pf.Origin.Y.ToString() + "  " + pf.Origin.Z.ToString() + ")");


                        break;

                    }

                }

            }

            return pf;

        }


    }


    [TransactionAttribute(Autodesk.Revit.Attributes.TransactionMode.Manual)]

    public class GetWallBottomFace : IExternalCommand

    {

        public Result Execute(ExternalCommandData commandData, ref string messages, ElementSet elements)

        {

            UIApplication app = commandData.Application;

            Document doc = app.ActiveUIDocument.Document;


            //select a wall

            Reference ref1 = app.ActiveUIDocument.Selection.PickObject(Autodesk.Revit.UI.Selection.ObjectType.Element, "Pick a wall");

            Element elem = doc.GetElement(ref1);

            Wall wall = elem as Wall;


            Options opt = new Options();

            opt.ComputeReferences = true;

            opt.DetailLevel = Autodesk.Revit.DB.DetailLevels.Medium;


            GeometryElement e = wall.get_Geometry(opt);

            foreach (GeometryObject obj in e.Objects)

            {

                Solid solid = obj as Solid;

                if (solid != null && solid.Faces.Size > 0)

                {

                    FindBottomFaces(solid);

                }

            }


            return Result.Succeeded;

        }


        Face FindBottomFaces(Solid solid)

        {

            PlanarFace pf = null;

            foreach (Face face in solid.Faces)

            {

                pf = face as PlanarFace;

                if (null != pf)

                {

                    if (Math.Abs(pf.Normal.X) < 0.01 && Math.Abs(pf.Normal.Y) < 0.01 && pf.Normal.Z < 0)

                    {

                        TaskDialog.Show("the bottom face's area is ", pf.Area.ToString());

                    }

                }

            }

            return pf;

        }

    }

}