Why does projected curve to planar surface develop many more points?

Hi,
original curve sits between two surfaces (extruded from the two lines).
Projecting curve in side view to these surfaces adds many more points to the resulting curves.

why ?

How can I get the point count back and keep curve shape, I dont see why one needs to rebuild curves every time they are projected to planar surfaces almost in same plane as curve.

Stevecurve projected develops many points.3dm (42.3 KB)

The additional points are needed to keep the new curve within the absolute modeling tolerance setting in the file.
If you’re willing to let the new curve wand more, you can either rebuild it or reduce the tolerance before you project it.

Hi all - there is also the ‘Loose’ option in Project and Pull - those will keep the structure intact at the possible expense of some accuracy (i.e on-the-surface-ness)

-Pascal

Hi,
having tweaked and honed the curve to get a far better curvature graph, the original curve coming from a photogrammetry trace, I dont want to despoil my efforts so maybe I just go with the myriad of points, but I sense calls from folks of too many points, refine it again.

so I try Project Loose = yes and in the posted model it projects, looks ok, I then try for the true model and it fails. only works if loose = no.

see attachedproject loose fails to project.3dm (30.0 KB)

Steve

Yeah… that would be a reason to get V6. If you shorten the curve or expand the target so that none of the curve hangs off of the edge, it should work in V5. Since the target is a plane, you can set a Cplane to the target object and then ProjectToCplane the curve.

-Pascal

The curve is on the centreline of an arm that tapers, so having created a decent centreline curve I now need to project it to the arms edges.
I cant afford V6 at the mo, and never go for new versions until I know all bugs are ironed out.

Steve

You can use the pull command instead of project command to get the same point count and structure. The shape will be the same only if the curve is exactly parallel to the plane.

I don’t know if that is useful for what you want to do since you haven’t explained what you want to do. If you want to match the projected curve shape you might be able to get pretty close by point editing the pulled curve so that it matches the projected curve.

Hi guys.

I’m confused … I seem to remember that Nurbs curves could be projected onto a plane without distortion …
Am I wrong ?

Copying the original curve to the projected CVs seems to work, AFAIK …:

project loose fails to project B.3dm (58.1 KB)

Or am I missing something ? :slight_smile:

Hi Emilio - they can and it works this way in V6…

-Pascal

Hi Pascal.

Thanks, got it.

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