Site Tools


Differences

This shows you the differences between two versions of the page.

Link to this comparison view

developer:sdksamples:extractisocurve [2015/09/14] (current)
Line 1: Line 1:
 +====== Extracting Isoparametric Curves from Surfaces ======
 +====== C++, .NET ======
 +> **Summary:​** //​Demonstrates how to extract isoparametric curves from surfaces using the Rhino SDK.//
 +> **NOTICE:** //The Rhino.NET SDK is deprecated in Rhino 5.  This example adapted for the new RhinoCommon SDK is [[developer:​rhinocommonsamples:​extractisocurve|here]]//​
 +=====Example:​=====
 +The following sample code demonstrates how to extract isoparametric curves from surfaces using the Rhino SDK.
 +
 +===== C++ =====
 +<code 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;
 +}
 +
 +</​code>​
 +===== C# =====
 +<code c#>
 +      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;​
 +      }
 +
 +
 +</​code>​
 +
 +
 +{{tag>​Developer cplusplus dotnet}}
  
developer/sdksamples/extractisocurve.txt ยท Last modified: 2015/09/14 (external edit)