Table of Contents
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; }