Site Tools


Differences

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

Link to this comparison view

developer:sdksamples:loft [2015/09/14] (current)
Line 1: Line 1:
 +====== How To: Loft Surfaces using RhinoSdkLoftSurface ======
 +====== C++, .NET ======
 +> **Version:​** //Rhino 4//
 +> **NOTICE:** //The Rhino.NET SDK is deprecated in Rhino 5.  This example adapted for the new RhinoCommon SDK is [[developer:​rhinocommonsamples:​loft|here]]//​
 +
 +The following sample code demonstrates how to use the CArgsRhinoLoft class and the RhinoSdkLoftSurface function. The definitions of these can be found in rhinoSdkLoft.h.
 +
 +Note, this example does not perform any curve sorting or direction matching. This is the responsibility of the the SDK developer.
 +
 +
 +<code c++>
 +CRhinoCommand::​result CCommandTest::​RunCommand( const CRhinoCommandContext&​ context )
 +{
 +  // Select curves to loft
 +  CRhinoGetObject go;
 +  go.SetCommandPrompt( L"​Select curves to loft" );
 +  go.SetGeometryFilter( CRhinoGetObject::​curve_object );
 +  go.SetGeometryAttributeFilter( CRhinoGetObject::​open_curve );
 +  go.EnableSubObjectSelect( FALSE );
 +  go.GetObjects( 2, 0 );
 +  if( go.CommandResult() != CRhinoCommand::​success )
 +    return go.CommandResult();​
 +
 +  // Fill in loft arguments class
 +  CArgsRhinoLoft args;
 +  args.m_bAllowStartTangent = FALSE;
 +  args.m_bAllowEndTangent = FALSE;
 +  args.m_bUseStartpoint = FALSE;
 +  args.m_bUseEndpoint = FALSE;
 +  args.m_bClosed = FALSE;
 +  args.m_loft_type = CArgsRhinoLoft::​ltTight;​
 +  args.m_simplify_method = CArgsRhinoLoft::​lsNone;​
 +  args.m_start_condition = CArgsRhinoLoft::​leNatural;​
 +  args.m_end_condition = CArgsRhinoLoft::​leNatural;​
 +  args.m_rebuild_point_count = 10;
 +  args.m_refit_tolerance = context.m_doc.AbsoluteTolerance();​
 +
 +  int i, object_count = go.ObjectCount();​
 +  args.m_loftcurves.SetCapacity( object_count );
 +
 +  // Add loft curves
 +  for( i = 0; i < object_count;​ i++ )
 +  {
 +    const ON_Curve* curve = go.Object(i).Curve();​
 +    if( curve )
 +    {
 +      CRhinoLoftCurve* loft_curve = new CRhinoLoftCurve;​
 +      loft_curve->​m_curve = curve->​DuplicateCurve();​
 +      loft_curve->​m_curve->​RemoveShortSegments( ON_ZERO_TOLERANCE,​ true );
 +      loft_curve->​m_pick_point = ON_UNSET_POINT;​
 +      loft_curve->​m_pick_t = ON_UNSET_VALUE;​
 +      loft_curve->​m_trim = 0;
 +      loft_curve->​m_bClosed = 
 +          loft_curve->​m_curve->​IsClosed() ? true : false;
 +      loft_curve->​m_bPlanar =
 +          loft_curve->​m_curve->​IsPlanar(&​loft_curve->​m_plane)?​ true : false;
 +      args.m_loftcurves.Append( loft_curve );
 +    }
 +  }
 +
 +  // Do the loft operation
 +  ON_SimpleArray<​ON_NurbsSurface*>​ surface_list;​
 +  bool rc = RhinoSdkLoftSurface( args, surface_list );
 +
 +  // Delete the loft curves used in the surface calculation
 +  for( i = 0; i < args.m_loftcurves.Count();​ i++ )
 +    delete args.m_loftcurves[i];​
 +  args.m_loftcurves.Empty();​
 +
 +  // If only one surface was calculated, add it to Rhino
 +  if( surface_list.Count() == 1 )
 +  {
 +    CRhinoSurfaceObject* surf_obj = context.m_doc.AddSurfaceObject(*surface_list[0]);​
 +
 +    // AddSurfaceObject make a copy...
 +    delete surface_list[0];​
 +
 +    if( surf_obj )
 +      context.m_doc.Redraw();​
 +
 +    return ( surf_obj ? success : failure );
 +  }
 +
 +  // If more than one surface was calculated, create a list of breps.
 +  ON_SimpleArray<​ON_Brep*>​ brep_list;
 +  for( i = 0; i < surface_list.Count();​ i++)
 +  {
 +    if( surface_list[i]->​IsValid() )
 +    {
 +      ON_Brep* brep = ON_Brep::​New();​
 +      brep->​NewFace( *surface_list[i] );
 +      delete surface_list[i];​
 +      brep_list.Append( brep );
 +    }
 +  }
 +
 +  // Try joining all breps
 +  ON_Brep* brep = RhinoJoinBreps( brep_list, context.m_doc.AbsoluteTolerance() );
 +  if( brep )
 +  {
 +    CRhinoBrepObject* brep_object = context.m_doc.AddBrepObject( *brep );
 +
 +    // AddBrepObject makes a copy...
 +    delete brep;
 +
 +    if( brep_object )
 +      context.m_doc.Redraw();​
 +
 +    return ( brep_object ? success : failure );
 +  }
 +
 +  // Othewise just add the individual breps to Rhino.
 +  for( i = 0; i < brep_list.Count();​ i++ )
 +  {
 +    if( brep_list[i] )
 +    {
 +      CRhinoBrepObject* brep_object = context.m_doc.AddBrepObject( *brep_list[i] );
 +
 +      // AddBrepObject make a copy...
 +      delete brep_list[i];​
 +    }
 +  }
 +
 +  context.m_doc.Redraw();​
 +
 +  return CRhinoCommand::​success;​
 +}
 +
 +</​code>​
 +===== VB.NET =====
 +<code vb>
 +Public Overrides Function RunCommand(ByVal context As IRhinoCommandContext) _
 +  As IRhinoCommand.result
 +  ' Select curves to loft
 +  Dim go As New MRhinoGetObject()
 +  go.SetCommandPrompt("​Select curves to loft")
 +  go.SetGeometryFilter(IRhinoGetObject.GEOMETRY_TYPE_FILTER.curve_object)
 +  go.SetGeometryAttributeFilter(IRhinoGetObject.GEOMETRY_ATTRIBUTE_FILTER.open_curve)
 +  go.EnableSubObjectSelect(False)
 +  go.GetObjects(2,​ 0)
 +  If (go.CommandResult() <> IRhinoCommand.result.success) Then
 +    Return go.CommandResult()
 +  End If
 +
 +  ' Fill in loft arguments class
 +  Dim args As New MArgsRhinoLoft()
 +  args.m_bAllowStartTangent = False
 +  args.m_bAllowEndTangent = False
 +  args.m_bUseStartpoint = False
 +  args.m_bUseEndpoint = False
 +  args.m_bClosed = False
 +  args.m_loft_type = IArgsRhinoLoft.eLoftType.ltTight
 +  args.m_simplify_method = IArgsRhinoLoft.eLoftSimplify.lsNone
 +  args.m_start_condition = IArgsRhinoLoft.eLoftEnds.leNatural
 +  args.m_end_condition = IArgsRhinoLoft.eLoftEnds.leNatural
 +  args.m_rebuild_point_count = 10
 +  args.m_refit_tolerance = context.m_doc.AbsoluteTolerance()
 +
 +  Dim object_count As Integer = go.ObjectCount()
 +  Dim loftcurves(object_count - 1) As MRhinoLoftCurve
 +
 +  ' Add loft curves
 +  For i As Integer = 0 To object_count - 1
 +    Dim curve As IOnCurve = go.Object(i).Curve()
 +    If (curve IsNot Nothing) Then
 +      loftcurves(i) = New MRhinoLoftCurve()
 +      loftcurves(i).m_curve = curve.DuplicateCurve()
 +      loftcurves(i).m_curve.RemoveShortSegments(OnUtil.On_ZERO_TOLERANCE,​ True)
 +      loftcurves(i).m_pick_point = New On3dPoint(OnUtil.On_UNSET_POINT)
 +      loftcurves(i).m_pick_t = OnUtil.On_UNSET_VALUE
 +      loftcurves(i).m_trim = Nothing
 +      loftcurves(i).m_bClosed = loftcurves(i).m_curve.IsClosed()
 +      loftcurves(i).m_bPlanar = loftcurves(i).m_curve.IsPlanar(loftcurves(i).m_plane)
 +    End If
 +  Next
 +  args.m_loftcurves = loftcurves
 +
 +  'Do the loft operation
 +  Dim surface_list(0) As OnNurbsSurface
 +  Dim rc As Boolean = RhUtil.RhinoSdkLoftSurface(args,​ surface_list)
 +
 +  ' If only one surface was calculated, add it to Rhino
 +  If (surface_list.Length = 1) Then
 +    Dim so As MRhinoSurfaceObject = context.m_doc.AddSurfaceObject(surface_list(0))
 +    context.m_doc.Redraw()
 +    If (so IsNot Nothing) Then Return IRhinoCommand.result.success
 +    Return IRhinoCommand.result.failure
 +  End If
 +
 +  ' If more than one surface was calculated, create a list of breps.
 +  Dim brep_list As New System.Collections.Generic.List(Of OnBrep)
 +  For i As Integer = 0 To surface_list.Length
 +    If (surface_list(i).IsValid()) Then
 +      Dim newbrep As New OnBrep()
 +      newbrep.NewFace(surface_list(i))
 +      brep_list.Add(newbrep)
 +    End If
 +  Next
 +
 +  ' Try joining all breps
 +  Dim brep As OnBrep = RhUtil.RhinoJoinBreps(brep_list.ToArray(),​ _
 +                                             ​context.m_doc.AbsoluteTolerance())
 +  If (brep IsNot Nothing) Then
 +    Dim brep_object As MRhinoBrepObject = context.m_doc.AddBrepObject(brep)
 +    context.m_doc.Redraw()
 +    If (brep_object IsNot Nothing) Then Return IRhinoCommand.result.success
 +    Return IRhinoCommand.result.failure
 +  End If
 +
 +  ' Othewise just add the individual breps to Rhino.
 +  For i As Integer = 0 To brep_list.Count - 1
 +    context.m_doc.AddBrepObject(brep_list(i))
 +  Next
 +  context.m_doc.Redraw()
 +  Return IRhinoCommand.result.success
 +End Function
 +
 +</​code>​
 +===== C# =====
 +<code c#>
 +public override IRhinoCommand.result RunCommand(IRhinoCommandContext context)
 +{
 +  // Select curves to loft
 +  MRhinoGetObject go = new MRhinoGetObject();​
 +  go.SetCommandPrompt("​Select curves to loft"​);​
 +  go.SetGeometryFilter(IRhinoGetObject.GEOMETRY_TYPE_FILTER.curve_object);​
 +  go.SetGeometryAttributeFilter(IRhinoGetObject.GEOMETRY_ATTRIBUTE_FILTER.open_curve);​
 +  go.EnableSubObjectSelect(false);​
 +  go.GetObjects(2,​ 0);
 +  if( go.CommandResult() != IRhinoCommand.result.success )
 +    return go.CommandResult();​
 +
 +  // Fill in loft arguments class
 +  MArgsRhinoLoft args = new MArgsRhinoLoft();​
 +  args.m_bAllowStartTangent = false;
 +  args.m_bAllowEndTangent = false;
 +  args.m_bUseStartpoint = false;
 +  args.m_bUseEndpoint = false;
 +  args.m_bClosed = false;
 +  args.m_loft_type = (int)IArgsRhinoLoft.eLoftType.ltTight;​
 +  args.m_simplify_method = (int)IArgsRhinoLoft.eLoftSimplify.lsNone;​
 +  args.m_start_condition = (int)IArgsRhinoLoft.eLoftEnds.leNatural;​
 +  args.m_end_condition = (int)IArgsRhinoLoft.eLoftEnds.leNatural;​
 +  args.m_rebuild_point_count = 10;
 +  args.m_refit_tolerance = context.m_doc.AbsoluteTolerance();​
 +
 +  int object_count = go.ObjectCount();​
 +  MRhinoLoftCurve[] loftcurves = new MRhinoLoftCurve[object_count];​
 +
 +  // Add loft curves
 +  for( int i=0; i<​object_count;​ i++)
 +  {
 +    IOnCurve curve = go.Object(i).Curve();​
 +    if( curve != null )
 +    {
 +      loftcurves[i] = new MRhinoLoftCurve();​
 +      loftcurves[i].m_curve = curve.DuplicateCurve();​
 +      loftcurves[i].m_curve.RemoveShortSegments(OnUtil.On_ZERO_TOLERANCE,​ true);
 +      loftcurves[i].m_pick_point = new On3dPoint(OnUtil.On_UNSET_POINT);​
 +      loftcurves[i].m_pick_t = OnUtil.On_UNSET_VALUE;​
 +      loftcurves[i].m_trim = null;
 +      loftcurves[i].m_bClosed = loftcurves[i].m_curve.IsClosed();​
 +      loftcurves[i].m_bPlanar = loftcurves[i].m_curve.IsPlanar(loftcurves[i].m_plane);​
 +    }
 +  }
 +  args.m_loftcurves = loftcurves;
 +
 +  // Do the loft operation
 +  OnNurbsSurface[] surface_list = null;
 +  bool rc = RhUtil.RhinoSdkLoftSurface( args, out surface_list);​
 +
 +  if( surface_list == null | surface_list.Length == 0 )
 +    return IRhinoCommand.result.cancel;​
 +
 +  // If only one surface was calculated, add it to Rhino
 +  if( surface_list.Length == 1 )
 +  {
 +    MRhinoSurfaceObject so = context.m_doc.AddSurfaceObject( surface_list[0] );
 +    context.m_doc.Redraw();​
 +    if( so == null )
 +      return IRhinoCommand.result.failure;​
 +    return IRhinoCommand.result.success;​
 +  }
 +
 +  // If more than one surface was calculated, create a list of breps.
 +  System.Collections.Generic.List<​OnBrep>​ brep_list =
 +                new System.Collections.Generic.List<​OnBrep>​();​
 +  for( int i=0; i<​surface_list.Length;​ i++ )
 +  {
 +    if( surface_list[i].IsValid() )
 +    {
 +      OnBrep newbrep = new OnBrep();
 +      newbrep.NewFace(surface_list[i]);​
 +      brep_list.Add(newbrep);​
 +    }
 +  }
 +
 +  // Try joining all breps
 +  OnBrep brep = RhUtil.RhinoJoinBreps(brep_list.ToArray(),​
 +                                      context.m_doc.AbsoluteTolerance());​
 +  if( brep != null )
 +  {
 +    MRhinoBrepObject brep_object = context.m_doc.AddBrepObject(brep);​
 +    context.m_doc.Redraw();​
 +    if( brep_object == null )
 +      return IRhinoCommand.result.failure;​
 +    return IRhinoCommand.result.success;​
 +  }
 +
 +  // Othewise just add the individual breps to Rhino.
 +  for( int i=0; i<​brep_list.Count;​ i++ )
 +    context.m_doc.AddBrepObject( brep_list[i] );
 +
 +  context.m_doc.Redraw();​
 +  return IRhinoCommand.result.success;​
 +}
 +
 +</​code>​
 +
 +
 +{{tag>​Developer cplusplus dotnet}}
  
developer/sdksamples/loft.txt ยท Last modified: 2015/09/14 (external edit)