developer:sdksamples:solidvolume


Calculating the Volumes of Solid Objects

C++, .NET

Version: Rhino 4.0
Summary: Demonstrates how to calculating the volumes of closed surface, polysurface, and mesh objects using the Rhino 4.0 SDK.

The following sample code demonstrates how to calculating the volumes of closed surface, polysurface, and mesh objects.

C++

CRhinoCommand::result CCommandTest::RunCommand( const CRhinoCommandContext& context )
{
  CRhinoGetObject go;
  go.SetCommandPrompt( L"Select solids for volume calculation" );
  go.SetGeometryFilter( 
        CRhinoGetObject::surface_object | 
        CRhinoGetObject::polysrf_object |
        CRhinoGetObject::mesh_object 
        );
  go.SetGeometryAttributeFddilter( 
        CRhinoGetObject::closed_surface | 
        CRhinoGetObject::closed_polysrf | 
        CRhinoGetObject::closed_mesh 
        );
  go.EnableSubObjectSelect( false );
  go.EnableGroupSelect( true );
  go.GetObjects( 1, 0 );
  if( go.CommandResult() != success )
    return go.CommandResult();
 
  ON_SimpleArray<const ON_Geometry*> geom( go.ObjectCount() );
  int i;
  for( i = 0; i < go.ObjectCount(); i++ ) 
  {
    const ON_Geometry* geo = go.Object(i).Geometry();
    if( 0 == geo )
      return failure;
    geom.Append( geo );
  }
 
  // Get bounding box of all objects
  ON_BoundingBox bbox;
  for( i = 0; i < geom.Count(); i++ )
    geom[i]->GetBoundingBox( bbox, bbox.IsValid() );
 
  ON_3dPoint base_point = bbox.Center();
 
  ON_SimpleArray<ON_MassProperties> MassProp;
  MassProp.Reserve( geom.Count() );
 
  for( i = 0; i < geom.Count(); i++ )
  {
    ON_MassProperties* mp = &MassProp.AppendNew();
 
    if( const ON_Surface* srf = ON_Surface::Cast(geom[i]) )
      srf->VolumeMassProperties( *mp, true, false, false, false, base_point );       
 
    else if( const ON_Brep* brep = ON_Brep::Cast(geom[i]) )
      brep->VolumeMassProperties( *mp, true, false, false, false, base_point );
 
    else if( const ON_Mesh* mesh = ON_Mesh::Cast(geom[i]) )
      mesh->VolumeMassProperties( *mp, true, false, false, false, base_point );
  }
 
  ON_MassProperties results;
  results.Sum( MassProp.Count(), MassProp.Array() ); 
  RhinoApp().Print( L"Volume = %g\n", results.Volume() );
 
  return success;
}

VB.NET

Public Overrides Function RunCommand(ByVal context As RMA.Rhino.IRhinoCommandContext) _
  As RMA.Rhino.IRhinoCommand.result
  Dim go As New MRhinoGetObject()
  go.SetCommandPrompt("Select solids for volume calculation")
  go.SetGeometryFilter(IRhinoGetObject.GEOMETRY_TYPE_FILTER.surface_object Or _
                        IRhinoGetObject.GEOMETRY_TYPE_FILTER.polysrf_object Or _
                        IRhinoGetObject.GEOMETRY_TYPE_FILTER.mesh_object)
  go.SetGeometryAttributeFilter(IRhinoGetObject.GEOMETRY_ATTRIBUTE_FILTER.closed_surface Or _
                                 IRhinoGetObject.GEOMETRY_ATTRIBUTE_FILTER.closed_polysrf Or _
                                 IRhinoGetObject.GEOMETRY_ATTRIBUTE_FILTER.closed_mesh)
  go.EnableSubObjectSelect(False)
  go.EnableGroupSelect(True)
  go.GetObjects(1, 0)
  If (go.CommandResult() <> IRhinoCommand.result.success) Then
    Return go.CommandResult()
  End If
 
  Dim geom As New System.Collections.Generic.List(Of IOnGeometry)()
 
  For i As Integer = 0 To go.ObjectCount() - 1
    Dim geo As IOnGeometry = go.Object(i).Geometry()
    If (geo Is Nothing) Then Return IRhinoCommand.result.failure
    geom.Add(geo)
  Next
 
  ' Get bounding box of all objects
  Dim bbox As New OnBoundingBox()
  For i As Integer = 0 To geom.Count - 1
    geom(i).GetBoundingBox(bbox, 1)
  Next
 
  Dim base_point As On3dPoint = bbox.Center()
 
  Dim MassProp As New System.Collections.Generic.List(Of OnMassProperties)()
 
  For i As Integer = 0 To geom.Count - 1
    Dim mp As New OnMassProperties()
    Dim srf As IOnSurface = OnSurface.ConstCast(geom(i))
    Dim brep As IOnBrep = OnBrep.ConstCast(geom(i))
    Dim mesh As IOnMesh = OnMesh.ConstCast(geom(i))
 
    If (srf IsNot Nothing) Then
      srf.VolumeMassProperties(mp, True, False, False, False, base_point)
    ElseIf (brep IsNot Nothing) Then
      brep.VolumeMassProperties(mp, True, False, False, False, base_point)
    ElseIf (mesh IsNot Nothing) Then
      mesh.VolumeMassProperties(mp, True, False, False, False, base_point)
    Else
      mp = Nothing
    End If
 
    If (mp IsNot Nothing) Then MassProp.Add(mp)
  Next
 
  Dim results As New OnMassProperties()
  results.Sum(MassProp.ToArray())
  RhUtil.RhinoApp().Print(String.Format("Volume = {0}" + vbCrLf, results.Volume()))
  Return IRhinoCommand.result.success
End Function

C#

public override IRhinoCommand.result RunCommand(IRhinoCommandContext context)
{
  MRhinoGetObject go = new MRhinoGetObject();
  go.SetCommandPrompt( "Select solids for volume calculation" );
  go.SetGeometryFilter( IRhinoGetObject.GEOMETRY_TYPE_FILTER.surface_object |
                        IRhinoGetObject.GEOMETRY_TYPE_FILTER.polysrf_object |
                        IRhinoGetObject.GEOMETRY_TYPE_FILTER.mesh_object );
  go.SetGeometryAttributeFilter( IRhinoGetObject.GEOMETRY_ATTRIBUTE_FILTER.closed_surface |
                                 IRhinoGetObject.GEOMETRY_ATTRIBUTE_FILTER.closed_polysrf |
                                 IRhinoGetObject.GEOMETRY_ATTRIBUTE_FILTER.closed_mesh );
  go.EnableSubObjectSelect( false );
  go.EnableGroupSelect( true );
  go.GetObjects( 1, 0 );
  if( go.CommandResult() != IRhinoCommand.result.success )
    return go.CommandResult();
 
  System.Collections.Generic.List<IOnGeometry> geom = new System.Collections.Generic.List<IOnGeometry>();
  for( int i = 0; i < go.ObjectCount(); i++ ) 
  {
    IOnGeometry geo = go.Object(i).Geometry();
    if( geo == null )
      return IRhinoCommand.result.failure;
    geom.Add( geo );
  }
 
  // Get bounding box of all objects
  OnBoundingBox bbox = new OnBoundingBox();
  for( int i=0; i<geom.Count; i++ )
    geom[i].GetBoundingBox(ref bbox, 1);
 
  On3dPoint base_point = bbox.Center();
  System.Collections.Generic.List<OnMassProperties> MassProp =
          new System.Collections.Generic.List<OnMassProperties>();
 
  for( int i = 0; i < geom.Count; i++ )
  {
    OnMassProperties mp = new OnMassProperties();
    IOnSurface srf = OnSurface.ConstCast(geom[i]);
    IOnBrep brep = OnBrep.ConstCast(geom[i]);
    IOnMesh mesh = OnMesh.ConstCast(geom[i]);
 
    if( srf != null )
      srf.VolumeMassProperties( ref mp, true, false, false, false, base_point );
    else if( brep != null )
      brep.VolumeMassProperties( ref mp, true, false, false, false, base_point );
    else if( mesh != null )
      mesh.VolumeMassProperties( ref mp, true, false, false, false, base_point );
    else
      mp = null;
 
    if( mp != null )
      MassProp.Add( mp );
  }
 
  OnMassProperties results = new OnMassProperties();
  results.Sum( MassProp.ToArray() );
  RhUtil.RhinoApp().Print( string.Format("Volume = {0}\n", results.Volume()) );
  return IRhinoCommand.result.success;
}
developer/sdksamples/solidvolume.txt · Last modified: 2010/01/26 16:37 (external edit) Driven by DokuWiki Recent changes RSS feed

 © 1997-2010 

McNeel North America Europe Latin AmericaAsia