McNeel Wiki
Extracting Isoparametric Curves from Surfaces
edit · print · help · all topics
Main Pages

AccuRender

Bongo

Brazil r/s

Developer

Flamingo

Penguin

Rhino Blogs

Rhino

Search

Languages

Česky

Deutsch

English

Español

Français

Italiano

Polish

日本語

한국어

中文(繁體)

 
.
DeveloperC++, .NET
SummaryDemonstrates how to extract isoparametric curves from surfaces using the Rhino SDK.

Example:

The following sample code demonstrates how to extract isoparametric curves from surfaces using the Rhino SDK.

C++

  CRhinoCommand::result CCommandTest::RunCommand( const CRhinoCommandContext& context )
  {
    // Select the surface to extract isocurve
    CRhinoGetObject go;
    go.SetCommandPrompt( L"Select surface" );
    go.SetGeometryFilter( CRhinoGetObject::surface_object );
    go.GetObjects( 1, 1 );
    if( go.CommandResult() != success )
      return go.CommandResult();


    // Validate selection
    const CRhinoObjRef& ref = go.Object(0);
    const ON_Surface* srf = ref.Surface();
    if( !srf )
      return failure;


    ON_3dPoint pt( ON_UNSET_POINT );
    BOOL dir = FALSE;


    // Pick a point on the surface
    CRhinoGetPoint gp;
    gp.SetCommandPrompt( L"Point on surface" );
    gp.AddCommandOptionToggle( 
              RHCMDOPTNAME(L"Direction"), 
              RHCMDOPTVALUE(L"U"), 
              RHCMDOPTVALUE(L"V"), 
              dir, &dir );
    gp.Constrain( *srf );
    for(;;)
    {
      CRhinoGet::result res = gp.GetPoint();
      if( res == CRhinoGet::point )
      {
        pt = gp.Point();
        break;
      }
      else if( res == CRhinoGet::option )
        continue;
      else
        return cancel;
    }


    // Get the parameters of the point on
    // the surface that is closest to pt.
    double u, v;
    if( srf->GetClosestPoint(pt, &u, &v) )
    {
      // Get the isoparametric curve. ON_Surface::IsoCurve
      // allocates memory for the resulting curve that we
      // will be responsible for.
      ON_Curve* crv = srf->IsoCurve( dir, dir ? u : v );
      if( crv )
      {
        context.m_doc.AddCurveObject( *crv );


        // CRhinoDoc::AddCurveObject make a copy of the input curve.
        // So, we need to delete crv otherwise we will leak memory.
        delete crv;
        crv = 0;


        context.m_doc.Redraw();
      }
    }


    return success;
  }

C# (Rhino 4)

        public override IRhinoCommand.result RunCommand(IRhinoCommandContext context)
        {
            // Select the surface to extract isocurve
            MRhinoGetObject go = new MRhinoGetObject ();
            go.SetCommandPrompt("Select surface" );
            go.SetGeometryFilter( IRhinoGetObject.GEOMETRY_TYPE_FILTER.surface_object );
            go.GetObjects( 1, 1 );
            if( go.CommandResult() != IRhinoCommand.result.success )
              return go.CommandResult();


            // Validate selection
            IRhinoObjRef objref = go.Object(0);
            IOnSurface srf = objref.Surface();
            if(srf == null)
            {
              RhUtil.RhinoApp().Print("Null Surface selected.\n");
              return IRhinoCommand.result.nothing;
            }
            On3dPoint pt = new On3dPoint ();


            // Pick a point on the surface
            MRhinoGetPoint gp= new MRhinoGetPoint ();
            gp.SetCommandPrompt( "Point on surface" );
            MRhinoGet.BooleanOption bDir = new MRhinoGet.BooleanOption(false);
            int index =gp.AddCommandOptionToggle(
                      new MRhinoCommandOptionName("Direction"), 
                      new MRhinoCommandOptionValue("U"), 
                      new MRhinoCommandOptionValue("V"),
                      bDir.Value, bDir);
            gp.Constrain(srf);
            for(;;)
            {
              IRhinoGet.result res=gp.GetPoint();
              if (res==IRhinoGet.result.point) 
              {
                pt = gp.Point();
                break;
              }
              else{
                  if( res == IRhinoGet.result.option )
                       continue;
                  else
                       return IRhinoCommand.result.cancel;
              }
            }


            // Get the parameters of the point on
            // the surface that is closest to pt.
            double u = 0;
            double v=0;
            if( srf.GetClosestPoint(pt, ref u, ref v) )
            {
                // Get the isoparametric curve. OnSurface.IsoCurve
                // input the direction in which the parameter varies (0,1)(the other parameter is held constant) then input the value of the constant parameter 
                OnCurve crv = srf.IsoCurve(bDir.Value ? 1 : 0, bDir.Value ? u : v);
                if (crv != null)
                  {
                    context.m_doc.AddCurveObject(crv);
                    context.m_doc.Redraw();
                  }
            }
            return IRhinoCommand.result.success;
        }
rename · changes · history · subscriptions · lost and found · references · file upload