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;
}
}
}