Autodesk.Revit.DB ReferenceIntersector

funtim發表於2024-12-10

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