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;
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章