Site Tools


Differences

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

Link to this comparison view

developer:sdksamples:meshbooleandifference [2015/09/14] (current)
Line 1: Line 1:
 +====== Mesh Boolean Difference ======
 +====== C++ ======
 +> **Version:​** //Rhino 4//
 +> **Summary:​** //​Demonstrates how to use the RhinoMeshBooleanDifference SDK function.//
 +
 +=====Example=====
 +
 +<code c++>
 +CRhinoCommand::​result CCommandTest::​RunCommand( const CRhinoCommandContext&​ context )
 +{
 +  CRhinoGetObject go0;
 +  go0.SetCommandPrompt( L"​Select first set of meshes"​ );
 +  go0.SetGeometryFilter( CRhinoGetObject::​mesh_object );
 +  go0.GetObjects( 1, 0 );
 +  if( go0.CommandResult() != success )
 +    return go0.CommandResult();​
 +
 +  CRhinoGetObject go1;
 +  go1.SetCommandPrompt( L"​Select second set of meshes"​ );
 +  go1.SetGeometryFilter( CRhinoGetObject::​mesh_object );
 +  go1.EnablePreSelect( false );
 +  go1.EnableDeselectAllBeforePostSelect( false );
 +  go1.GetObjects( 1, 0 );
 +  if( go1.CommandResult() != success )
 +    return go1.CommandResult();​
 +
 +  ON_SimpleArray<​const CRhinoObject*>​ DeleteList( go0.ObjectCount() + go1.ObjectCount() );
 +  int i = 0;
 +
 +  ON_SimpleArray<​const ON_Mesh*>​ InMeshes0( go0.ObjectCount() );
 +  ON_SimpleArray<​const ON_3dmObjectAttributes*>​ InAttributes0( go0.ObjectCount() );
 +  for( i = 0; i < go0.ObjectCount();​ i++ )
 +  {
 +    const CRhinoObject* p = go0.Object(i).Object();​
 +    if( !p )
 +      return failure;
 +
 +    const ON_Mesh* mesh = ON_Mesh::​Cast( p->​Geometry() );
 +    if( !mesh )
 +      return failure;
 +
 +    InMeshes0.Append( mesh );
 +    InAttributes0.Append( &​p->​Attributes() );
 +
 +    DeleteList.Append( p );
 +  }
 +
 +  ON_SimpleArray<​const ON_Mesh*>​ InMeshes1( go1.ObjectCount() );
 +  for( i = 0; i < go1.ObjectCount();​ i++ )
 +  {
 +    const CRhinoObject* p = go1.Object(i).Object();​
 +    if( !p )
 +      return failure;
 +
 +    const ON_Mesh* mesh = ON_Mesh::​Cast( p->​Geometry() );
 +    if( !mesh )
 +      return failure;
 +
 +    InMeshes1.Append( mesh );
 +
 +    DeleteList.Append( p );
 +  }
 +
 +  ON_SimpleArray<​ON_Mesh*>​ OutMeshes;
 +  ON_SimpleArray<​const ON_3dmObjectAttributes*>​ OutAttributes;​
 +  bool bResult = false;
 +  bool rc = RhinoMeshBooleanDifference(
 +        InMeshes0, ​
 +        InMeshes1,
 +        ON_SQRT_EPSILON*10,​
 +        ON_SQRT_EPSILON*10, ​
 +        &​bResult, ​
 +        OutMeshes,
 +        &​InAttributes0,​
 +        &​OutAttributes
 +        );
 +
 +  if( !rc )
 +    return failure;
 +
 +  for( i = 0; i < OutMeshes.Count();​ i++ )
 +  {
 +    CRhinoMeshObject* pMeshObj = 0;
 +    if( i < OutAttributes.Count() )
 +      pMeshObj = new CRhinoMeshObject( *OutAttributes[i] );
 +    else
 +      pMeshObj = new CRhinoMeshObject();​
 +
 +    if( pMeshObj )
 +    {
 +      pMeshObj->​SetMesh( OutMeshes[i] );
 +      context.m_doc.AddObject( pMeshObj );
 +    }
 +    else
 +    {
 +      delete OutMeshes[i];​
 +    }
 +    OutMeshes[i] = 0;
 +  }
 +
 +  for( i = 0; i < DeleteList.Count();​ i++ )
 +  {
 +    if( DeleteList[i] )
 +      context.m_doc.DeleteObject( DeleteList[i] );
 +  }
 +
 +  context.m_doc.Redraw();​
 +
 +  return success;
 +}
 +
 +</​code>​
 +
 +
 +{{tag>​Developer cplusplus}}
  
developer/sdksamples/meshbooleandifference.txt ยท Last modified: 2015/09/14 (external edit)