OK … I tried to script this operation for those still using Rhino 5.

```
import rhinoscriptsyntax as rs
def pr2pl( pt, plp, pln, vec ):
dz = ( plp - pt ) * pln
kk = dz / ( vec * pln )
return pt + vec * kk
def main():
cu = rs.GetObject( 'Curve ?', filter = 4, preselect = True )
if not cu:
return
rs.UnselectAllObjects()
su = rs.GetObject( 'Planar surface ?', 8 )
if not su:
return
if not rs.IsSurfacePlanar( su ):
print( 'The surface is not planar' )
return
p0 = rs.GetPoint( 'First point for projection direction ?' )
if not p0:
return
p1 = rs.GetPoint( 'Second point for projection direction ?' )
if not p1:
return
if p0.DistanceTo( p1 ) < 0.001:
print( 'The points are too close' )
return
vec = p1 - p0
vec.Unitize()
dmu = rs.SurfaceDomain( su, 0 )
dmv = rs.SurfaceDomain( su, 1 )
uu = ( dmu[ 0 ] + dmu[ 1 ] ) * 0.5
vv = ( dmv[ 0 ] + dmv[ 1 ] ) * 0.5
pla = rs.SurfaceFrame( su, ( uu, vv ) )
if abs( pla.ZAxis * vec ) < 0.001:
print( 'Projection direction looks parallel to the plane' )
return
cu2 = rs.CopyObject( cu )
rs.EnableObjectGrips( cu2, True )
for ix in range( rs.ObjectGripCount( cu2 ) ):
gr = rs.ObjectGripLocation( cu2, ix )
gr = pr2pl( gr, pla.Origin, pla.ZAxis, vec )
rs.ObjectGripLocation( cu2, ix, gr )
rs.EnableObjectGrips( cu2, False )
main()
```

… Use at your own risk …

Regards