Autodesk.Revit.DB ReferenceIntersector

Autodesk.Revit.DB ReferenceIntersector

用于查找和返回与从原点和方向创建的射线相交的元素的类。

语法

public class ReferenceIntersector : IDisposable

附注

可以构造此类的实例,以返回与由原点和方向创建的射线,或者基于过滤和标志返回元素的子集。 调用者可以选择使用ElementFilter过滤结果,或者通过应用特定的可接受的元素。 调用方还可以指定要返回的对象的类型, 整个元素、几何体对象或其组合。 在所有情况下,要求调用者提供 用于评估的3D视图;输入视图上的视图和可见性设置将确定 返回特定元素(例如,此工具永远不会返回隐藏元素、 和几何图形位于视图剖面框之外的元素)。

该类配置为可以构建单个实例,并用于对多个不同光线进行多次评估。在同一个 ReferenceIntersector 上的调用之间,评估结果不会被保留。

该类还提供了一个选项,用于返回在Revit链接中遇到的图元结果。 当设置 FindReferencesInRevitLinks 标志 则结果可能包括宿主文档和遇到的任何RevitLinkInstance中的元素,具体取决于其他设置的标志。 请参阅 FindReferencesInRevitLinks 的备注,了解标志如何影响从链接获得的结果。

示例

F public class RayProjection : IExternalCommand

{
    public Result Execute(ExternalCommandData revit, ref string message, ElementSet elements)
    {
        Document doc = revit.Application.ActiveUIDocument.Document;

        ICollection<ElementId> selectedIds = revit.Application.ActiveUIDocument.Selection.GetElementIds();
    
        // If skylight is selected, process it.
        FamilyInstance skylight = null;
        if (selectedIds.Count == 1)
        {
            foreach (ElementId id in selectedIds)
            {
                Element e = doc.GetElement(id);
                if (e is FamilyInstance)
                {
                    FamilyInstance instance = e as FamilyInstance;
                    bool isWindow = (instance.Category.Id.IntegerValue == (int)BuiltInCategory.OST_Windows);
                    bool isHostedByRoof = (instance.Host.Category.Id.IntegerValue == (int)BuiltInCategory.OST_Roofs);
    
                    if (isWindow && isHostedByRoof)
                    {
                        skylight = instance;
                    }
                }
            }
        }
    
        if (skylight == null)
        {
            message = "Please select one skylight.";
            return Result.Cancelled;
        }
    
        // Calculate the height
        Line line = CalculateLineAboveFloor(doc, skylight);
    
        // Create a model curve to show the distance
        Plane plane = Plane.CreateByNormalAndOrigin(new XYZ(1, 0, 0), line.GetEndPoint(0));
        SketchPlane sketchPlane = SketchPlane.Create(doc, plane);
    
        ModelCurve curve = doc.Create.NewModelCurve(line, sketchPlane);
    
        // Show a message with the length value
        TaskDialog.Show("Distance", "Distance to floor: " + String.Format("{0:f2}", line.Length));
    
        return Result.Succeeded;
    }
    
    /// <summary>
    /// Determines the line segment that connects the skylight to the nearest floor.
    /// </summary>
    /// <returns>The line segment.</returns>
    private Line CalculateLineAboveFloor(Document doc, FamilyInstance skylight)
    {
        // Find a 3D view to use for the ReferenceIntersector constructor
        FilteredElementCollector collector = new FilteredElementCollector(doc);
        Func<View3D, bool> isNotTemplate = v3 => !(v3.IsTemplate);
        View3D view3D = collector.OfClass(typeof(View3D)).Cast<View3D>().First<View3D>(isNotTemplate);
    
        // Use the center of the skylight bounding box as the start point.
        BoundingBoxXYZ box = skylight.get_BoundingBox(view3D);
        XYZ center = box.Min.Add(box.Max).Multiply(0.5);
    
        // Project in the negative Z direction down to the floor.
        XYZ rayDirection = new XYZ(0, 0, -1);
    
        ElementClassFilter filter = new ElementClassFilter(typeof(Floor));
    
        ReferenceIntersector refIntersector = new ReferenceIntersector(filter, FindReferenceTarget.Face, view3D);
        ReferenceWithContext referenceWithContext = refIntersector.FindNearest(center, rayDirection);
    
        Reference reference = referenceWithContext.GetReference();
        XYZ intersection = reference.GlobalPoint;
    
        // Create line segment from the start point and intersection point.
        Line result = Line.CreateBound(center, intersection);
        return result;
    }

}

继承层次结构

System Object

Autodesk.Revit.DB ReferenceIntersector

构造函数

ReferenceIntersector(View3D)

  • 构造一个ReferenceIntersector,它被设置为返回所有元素的交集,并表示所有引用目标类型。

ReferenceIntersector(ElementFilter, FindReferenceTarget, View3D)

  • 构造一个ReferenceIntersector,它被设置为从任何通过输入过滤器的元素返回交集。

ReferenceIntersector(ElementId, FindReferenceTarget, View3D)

  • 构造一个ReferenceIntersector,它被设置为仅返回来自单个目标元素的交集。

ReferenceIntersector(ICollection ElementId , FindReferenceTarget, View3D)

  • 构造一个ReferenceIntersector,它被设置为返回一组目标元素中任何一个的交集。

方法

Dispose

  • 释放ReferenceIntersector使用的所有资源

Find

  • 从原点沿给定方向投射一条射线,并返回所有与 ReferenceIntersector 标准匹配的相交元素的引用。

FindNearest

  • 从原点沿给定方向投射一条射线,并返回与 ReferenceIntersector 标准匹配的相交元素中最接近的引用。

GetFilter

  • 获取用于交集测试的 ElementFilter。

GetTargetElementIds

  • 从交集测试中获取要测试的 ElementIds 集合。

SetFilter

  • 设置用于交集测试的 ElementFilter。

SetTargetElementIds

  • 设置交集测试中用于测试的 ElementIds 集合。

属性

  • 确定是否应在 Revit 链接内查找引用。

IsValidObject

  • 指定.NET 对象是否表示有效的 Revit 实体。

TargetType

  • 要查找的引用类型。

ViewId

  • 用于评估的 3D 视图的 ID。

注:翻译自Revit Api docs 2018

posted @ 2024-12-10 21:24  funtim  阅读(60)  评论(0)    收藏  举报