Revit 二次开发 Curve陷阱

在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的返回值如图:

null

因为点1可以投影到线段line1上,返回的信息是Distance是点到线段的距离为5。

Parameter是线段Origin到投影点的距离是5。

XYZPoint是投影点的坐标(5,0,0)。

result2的返回值如图:

null

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

result3的返回值如图:

null

因为点1可以投影到直线line2上,返回的信息是Distance是点到线段的距离为5。

Parameter是线段Origin到投影点的距离是5。

XYZPoint是投影点的坐标(5,0,0)。

result4的返回值如图:

null

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

result5的返回值如图:

null

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

Revit翻模工具

WPF 之 简单高效的Revit多语言支持方案

Revit二次开发实战 | 一键批量修改管道直径,效率飙升!

Revit二次开发实战 | 一键打断管道,管道系统分割so easy!

Revit二次开发入门 | 手把手教你用C#代码自动连接两根管道!

Revit-创建管道系统