Project Curves onto Breps

This guide demonstrates how to project a curve onto a brep using C/C++.

Problem

You want to project curves onto a brep, but you do not function any C/C++ function to do this. Is there a solution for this?

Solution

It is true that the Rhino C/C++ SDK does not currently have a function that will project a curve onto a brep. But, using some of the existing functions, you can write your own function without too much effort.

To project a curve onto a brep, you need to do the following:

  1. Extrude the curve through the brep using the RhinoExtrudeCurveStraight() function.
  2. Intersect the two breps using RhinoIntersectBreps() function.
  3. The results of the brep intersection will be the projected curves.

Sample

The following sample code demonstrates how one might write such a function…

/*
Description:
  Projects a curve onto a surface or polysurface
Parameters:
  brep  - [in] The brep to project the curve onto.
  curve - [in] The curve to project.
  dir   - [in] The direction of the projection.
  tol   - [in] The intersection tolerance.
  output_curves - [out] The output curves.
                        NOTE, the caller is responsible
                        for destroying these curves.
Returns:
  true if successful.
  false if unsuccessful.
*/
bool ProjectCurveToBrep(
        const ON_Brep& brep,
        const ON_Curve& curve,
        const ON_3dVector& dir,
        double tolerance,
        ON_SimpleArray<ON_Curve*>& output_curves
        )
{
  ON_3dVector n = dir;
  if( !n.Unitize() )
    return false;

  ON_BoundingBox bbox = brep.BoundingBox();
  bbox.Union( curve.BoundingBox() );

  ON_Surface* pExtrusion = RhinoExtrudeCurveStraight( &curve, dir, bbox.Diagonal().Length() );
  if( 0 == pExtrusion )
    return false;

  ON_Brep* pBrep = ON_Brep::New();
  pBrep->Create( pExtrusion );

  BOOL rc = RhinoIntersectBreps( *pBrep, brep, tolerance, output_curves );
  delete pBrep; // Don't leak...

  return ( rc ) ? true : false;
}