using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB;
using Autodesk.Revit.DB.Structure;
using Autodesk.Revit.UI;
using Autodesk.Revit.UI.Selection;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Geometry
{
/// <summary>
/// 射线法查找元素
/// </summary>
[Transaction(TransactionMode.Manual)]
class FamillyInstanceRay : IExternalCommand
{
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
//【1】获取当前文档
UIDocument uidoc = commandData.Application.ActiveUIDocument;
Document doc = uidoc.Document;
Selection sel = uidoc.Selection; //让元素高亮选择
//【2】选择墙
Reference refer = uidoc.Selection.PickObject(ObjectType.Element, "请选择一个墙");
Element ele = doc.GetElement(refer);
Wall wall = ele as Wall;
//【3】获取墙的定位线(LocationPoint,LocationCurve)
Location location = wall.Location;
Curve curve = ((LocationCurve)location).Curve;
XYZ startPoint = curve.GetEndPoint(0);
XYZ endPoint = curve.GetEndPoint(1);
//【4】使用射线法
//【4-1】获取三维视图(射线法要在三维视图中使用)
View3D view3d = uidoc.ActiveView as View3D;
//【4-2】设置过滤的元素类型,这里不清楚的看我免费课程中过滤那节课
ElementClassFilter eleFilter = new ElementClassFilter(typeof(Wall));
//【4-3】构造射线
XYZ offset = new XYZ(0, 0, 1);
startPoint = startPoint - offset; //起点
endPoint = endPoint - offset;
XYZ ray = endPoint - startPoint; //射线
//【4-4】收集
Transaction trans = new Transaction(doc, "开始查找");
trans.Start();
ReferenceIntersector refIntersector = new ReferenceIntersector(eleFilter, FindReferenceTarget.All, view3d);
IList<ReferenceWithContext> listReferenceWithContext = refIntersector.Find(startPoint, ray);
List<ElementId> listEle = new List<ElementId>();
foreach (ReferenceWithContext item in listReferenceWithContext)
{
Reference reference = item.GetReference();
listEle.Add(reference.ElementId);
}
//【5】元素高亮显示
sel.SetElementIds(listEle);
trans.Commit();
return Result.Succeeded;
}
}
}
09-04
9309