在Revit API中Curve类有一个方法是Project,点到线的投影。对于这个方法,不熟悉的人还真会碰到问题。
go
public IntersectionResult Project(XYZ point);
返回值中包含的属性如下
go
public class IntersectionResult : APIObject
{
public IntersectionResult();
public double EdgeParameter { get; }
public Edge EdgeObject { get; }
public double Distance { get; }
public double Parameter { get; }
public UV UVPoint { get; }
public XYZ XYZPoint { get; }
}
我们通过Line来研究一下此方法:
测试代码如下:

line1是一条线段,有起点(0,0,0)和终点(10,0,0)。
line2是一条直线,Origin是(0,0,0),方向是(1,0,0)。
line3是一条直线,Origin是(0,0,0),方向是(1,0,0)。
result1的返回值如图:

因为点1可以投影到线段line1上,返回的信息是Distance是点到线段的距离为5。
Parameter是线段Origin到投影点的距离是5。
XYZPoint是投影点的坐标(5,0,0)。
result2的返回值如图:

因为点2(15,5,0)投影到线段line1的延长线上,且距离line1的终点(10,0,0)比较近,返回的信息是Distance是点2到线段line1的终点距离为7.071,根据勾股定理可以得到此值。
因此改值不能作为点到线段的的垂线距离。而是点到线段最近端点的距离。
Parameter是线段Origin到终点的距离是10。因为投影点在line1的延长线上。
XYZPoint是投影点的坐标(10,0,0)。因此此点并非真正意义上的投影点。
result3的返回值如图:

因为点1可以投影到直线line2上,返回的信息是Distance是点到线段的距离为5。
Parameter是线段Origin到投影点的距离是5。
XYZPoint是投影点的坐标(5,0,0)。
result4的返回值如图:

因为点2可以投影到直线line2上,返回的信息是Distance是点到线段的距离为5。
Parameter是线段Origin到投影点的距离是15。
XYZPoint是投影点的坐标(15,0,0)。
result5的返回值如图:

因为点2可以投影到直线line3上,返回的信息是Distance是点到线段的距离为5。
Parameter是线段Origin到投影点的距离是5。
XYZPoint是投影点的坐标(15,0,0)。
Revit二次开发实战 | 一键批量修改管道直径,效率飙升!
Revit二次开发实战 | 一键打断管道,管道系统分割so easy!