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