Revit中射線法的使用

Revit中射線法的使用

參考葉老師的Revit中幾何數據處理的講座,實現了下面的找到梁下面的牆體的功能,視頻中講的是2013的API,我用的是2019的API,很多類和方法都變了,但是思路還是一樣,寫在這裏,記錄一下學習過程。

using System;
using System.Collections.Generic;
using Autodesk.Revit.UI;
using Autodesk.Revit.DB;
using Autodesk.Revit.Attributes;
using Autodesk.Revit.UI.Selection;
using Autodesk.Revit.DB.Mechanical;
using Autodesk.Revit.DB.Plumbing;
using Autodesk.Revit.DB.Electrical;
using System.Threading;
namespace 插件1
{
    [Autodesk.Revit.Attributes.Transaction(TransactionMode.Manual)]
    [Autodesk.Revit.Attributes.Regeneration(RegenerationOption.Manual)]
    [Autodesk.Revit.Attributes.Journaling(JournalingMode.UsingCommandData)]
    public class Command : IExternalCommand
    {
        public readonly double unit = 304.8;

        public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elementSet)
        {
            UIApplication uiapp = new UIApplication(commandData.Application.Application);
            UIDocument uidoc = commandData.Application.ActiveUIDocument;
            Document doc = uidoc.Document;
            Selection selection = uidoc.Selection;

            Reference reff = selection.PickObject(ObjectType.Element, "請選擇一個梁");
            FamilyInstance beam = doc.GetElement(reff) as FamilyInstance;
            LocationCurve lc = beam.Location as LocationCurve;
            double beamLength = (lc.Curve).Length;
            XYZ start = (lc.Curve).GetEndPoint(0);
            XYZ end = (lc.Curve).GetEndPoint(1);
            XYZ offset = new XYZ(0, 0, 0.01);
            start -= offset;
            end -= offset;
            XYZ normal = start - end;
            View3D view3D = doc.ActiveView as View3D;
            elementSet.Clear();
            List<ElementId> ids = new List<ElementId>();
            if(view3D!=null)
            {

            ElementClassFilter classFilter = new ElementClassFilter(typeof(Wall));
                ReferenceIntersector intersect = new ReferenceIntersector(classFilter, FindReferenceTarget.Element, view3D);
               IList<ReferenceWithContext> reffs= intersect.Find(end, normal);
                foreach(ReferenceWithContext rwc in reffs)
                {
                    Reference tempRef = rwc.GetReference();
                    Element elem = doc.GetElement(tempRef);
                    if(elem is Wall)
                    {
                        ids.Add(elem.Id);
                    }
                }
            }
            else
            {
                TaskDialog.Show("Error", "請在三維視圖操作");
            }
            selection.SetElementIds(ids);
            return Result.Succeeded;
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章