Line[]から無駄な点を除くDynamoノード

Unionを繰り返して生成したSurfaceをPerimeterCurvesで直線にばらすと、 線分が無駄に細かく刻まれていて面倒な時がある。

まっすぐな線分をつなぐDynamoノードのためのPythonスクリプトを書いた。以下。

# Python 標準ライブラリおよび DesignScript ライブラリをロード
import sys
import clr
clr.AddReference('ProtoGeometry')
from Autodesk.DesignScript.Geometry import *

# このノードへの入力は、リスト形式で IN 変数に格納されます。
dataEnteringNode = IN

# この距離以下の点は同一とみなす
threshold = 0.1

# この行の下にコードを配置します
def main(IN):
    lines = IN[0]
    
    it = iter(lines)

    line0 = next(it)
    d0 = line0.Direction.Normalized()

    ret = []
    debug = []
    while True:
        line = next(it, None)
        if line is None:
            break
        
        d = line.Direction.Normalized()
        if d.IsAlmostEqualTo(d0):
            if line0.EndPoint.DistanceTo(line.StartPoint) < threshold:
                line0 = Line.ByStartPointEndPoint(
                    line0.StartPoint,
                    line.EndPoint
                )
                continue

        ret.append(line0)
        line0 = line
        d0 = d

    ret.append(line0)
    return ret

# 出力を OUT 変数に割り当てます。
OUT = main(IN)