射线法求交是很多三维模型求碰撞和测量间距最常用的节点,但是再使用射线法将target设置为element的时候会发现会出现两个相同的值。
下面用楼板距离,下图中会出现两个不同的值,在我修改板厚之后发现正好是板厚的距离,可以猜测射线法会对两个face进行判定相交,但是与我们需要的每个element输出一个值不符,这里需要重新做一次判定或者直接取最小值获得净高。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var intersector = new ReferenceIntersector(classFilter, FindReferenceTarget.Element, modelView);
intersector.FindReferencesInRevitLinks = true;

var result = intersector.Find(origin, -XYZ.BasisZ);

foreach (var context in result)
{
var ele = context.GetReference();
var revitLinkInstance = _document.GetElement(ele) as RevitLinkInstance;
var linkDoc = revitLinkInstance.GetLinkDocument();

var eleName = linkDoc.GetElement(ele.LinkedElementId);

var eleNmae = _document.GetElement(ele).Name;


MessageBox.Show(result.Count.ToString() + "-" + eleNmae + $"{eleName.GetType()}" + "-" + context.Proximity * 304.8);
}
![Image Description](https://cdn.bimath.com/blog/pg/Snipaste_2026-01-04_16-18-26.png)
![Image Description](https://cdn.bimath.com/blog/pg/Snipaste_2026-01-04_16-18-31.png)
后面我将方法改为获取最近的面才避免这种情况发生,但是碰到其他情况,可能需要循环一下`context`的值进行重新筛选
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

var result = intersector.FindNearest(origin, -XYZ.BasisZ);


var stringbuild = new StringBuilder();

var ele = result.GetReference();
var revitLinkInstance = _document.GetElement(ele) as RevitLinkInstance;
var linkDoc = revitLinkInstance?.GetLinkDocument();

var eleName = linkDoc?.GetElement(ele.LinkedElementId);

stringbuild.Append(
$"ElementType : {eleName?.GetType()} , ElementLinkId:{ele.LinkedElementId} ,Proximity : {result.Proximity * 304.8} \r\n");

MessageBox.Show(stringbuild.ToString());