Autodesk.Revit.DB ReferenceIntersector

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

语法

1
public class ReferenceIntersector : IDisposable

附注

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

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

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

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
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