使用Revit API選取3D點

使用Revit API選取3D點

using System;
using System.Collections.Generic;
using System.Text;
using Autodesk.Revit;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using Autodesk.Revit.ApplicationServices;
using System.Linq;

namespace Pick3DPoint
{
    [Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)]

    public class Command : IExternalCommand
    {
        public Autodesk.Revit.UI.Result Execute(ExternalCommandData commandData,
            ref string message, Autodesk.Revit.DB.ElementSet elements)
        {
            UIApplication uiapp = commandData.Application;
            UIDocument uidoc = uiapp.ActiveUIDocument;
            Application app = uiapp.Application;
            Document doc = uidoc.Document;

            XYZ point_in_3d;

            if (SetWorkPlaneAndPickObject(uidoc, out point_in_3d))
            {
                TaskDialog.Show("3D Point Selected",
                  "3D point picked on the plane"
                  + " defined by the selected face: "
                  + "X: " + point_in_3d.X.ToString()
                  + ", Y: " + point_in_3d.Y.ToString()
                  + ", Z: " + point_in_3d.Z.ToString());

                return Result.Succeeded;
            }
            else
            {
                message = "3D point selection failed";
                return Result.Failed;
            }
        }

        /// <summary>
        /// Return a 3D point. First, the user is prompted
        /// to pick a face on an element. This defines a
        /// work plane, on which a second point can be
        /// picked.
        /// </summary>
        public bool SetWorkPlaneAndPickObject(
                         UIDocument uidoc,
                        out XYZ point_in_3d)
        {
            point_in_3d = null;
            Document doc = uidoc.Document;

            Reference r = uidoc.Selection.PickObject(
              Autodesk.Revit.UI.Selection.ObjectType.Face,
              "Please select a planar face to define work plane");
            Element e = doc.GetElement(r.ElementId);
            if (null != e)
            {
                PlanarFace face = e.GetGeometryObjectFromReference(r)
                  as PlanarFace;

                GeometryElement geoEle = e.get_Geometry(new Options());
                
                Transform transform = null;

                foreach (GeometryObject gObj in geoEle)
                {
                    GeometryInstance gInst = gObj as GeometryInstance;
                    if (null != gInst)
                        transform = gInst.Transform;
                }

                if (face != null)
                {
                    Plane plane = null;

                    if (null != transform)
                    {
                        plane = new Plane(transform.OfVector(face.Normal),
                          transform.OfPoint(face.Origin));
                    }
                    else
                    {
                        plane = new Plane(face.Normal, face.Origin);
                    }

                    Transaction t = new Transaction(doc);

                    t.Start("Temporarily set work plane"
                      + " to pick point in 3D");

                    SketchPlane sp = SketchPlane.Create(doc,plane);

                    uidoc.ActiveView.SketchPlane = sp;
                    uidoc.ActiveView.ShowActiveWorkPlane();

                    try
                    {
                        point_in_3d = uidoc.Selection.PickPoint(
                          "Please pick a point on the plane"
                          + " defined by the selected face");
                    }
                    catch (OperationCanceledException)
                    {
                    }

                    t.RollBack();
                }
            }
            return null != point_in_3d;
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章