Mesh Volume

Demonstrates how to calculate the volume of a user-specified closed mesh.

partial class Examples
{
  public static Result MeshVolume(RhinoDoc doc)
  {
    var gm = new GetObject();
    gm.SetCommandPrompt("Select solid meshes for volume calculation");
    gm.GeometryFilter = ObjectType.Mesh;
    gm.GeometryAttributeFilter = GeometryAttributeFilter.ClosedMesh;
    gm.SubObjectSelect = false;
    gm.GroupSelect = true;
    gm.GetMultiple(1, 0);
    if (gm.CommandResult() != Result.Success)
      return gm.CommandResult();

    double volume = 0.0;
    double volume_error = 0.0;
    foreach (var obj_ref in gm.Objects())
    {
      if (obj_ref.Mesh() != null)
      {
        var mass_properties = VolumeMassProperties.Compute(obj_ref.Mesh());
        if (mass_properties != null)
        {
          volume += mass_properties.Volume;
          volume_error += mass_properties.VolumeError;
        }
      }
    }

    RhinoApp.WriteLine("Total volume = {0:f} (+/- {1:f})", volume, volume_error);
    return Result.Success;
  }
}
Partial Friend Class Examples
  Public Shared Function MeshVolume(ByVal doc As RhinoDoc) As Result
	Dim gm = New GetObject()
	gm.SetCommandPrompt("Select solid meshes for volume calculation")
	gm.GeometryFilter = ObjectType.Mesh
	gm.GeometryAttributeFilter = GeometryAttributeFilter.ClosedMesh
	gm.SubObjectSelect = False
	gm.GroupSelect = True
	gm.GetMultiple(1, 0)
	If gm.CommandResult() <> Result.Success Then
	  Return gm.CommandResult()
	End If

	Dim volume As Double = 0.0
	Dim volume_error As Double = 0.0
	For Each obj_ref In gm.Objects()
	  If obj_ref.Mesh() IsNot Nothing Then
		Dim mass_properties = VolumeMassProperties.Compute(obj_ref.Mesh())
		If mass_properties IsNot Nothing Then
		  volume += mass_properties.Volume
		  volume_error += mass_properties.VolumeError
		End If
	  End If
	Next obj_ref

	RhinoApp.WriteLine("Total volume = {0:f} (+/- {1:f})", volume, volume_error)
	Return Result.Success
  End Function
End Class
from Rhino.Input.Custom import *
from Rhino.DocObjects import ObjectType
from Rhino.Geometry import *
from Rhino.Commands import Result

def RunCommand():
    gm = GetObject()
    gm.SetCommandPrompt("Select solid meshes for volume calculation")
    gm.GeometryFilter = ObjectType.Mesh
    gm.GeometryAttributeFilter = GeometryAttributeFilter.ClosedMesh
    gm.SubObjectSelect = False
    gm.GroupSelect = True
    gm.GetMultiple(1, 0)
    if gm.CommandResult() != Result.Success:
        return gm.CommandResult()

    volume = 0.0
    volume_error = 0.0
    for obj_ref in gm.Objects():
        if obj_ref.Mesh() != None:
            mass_properties = VolumeMassProperties.Compute(obj_ref.Mesh())
            if mass_properties != None:
                volume += mass_properties.Volume
                volume_error += mass_properties.VolumeError

    print "Total volume = {0:f} (+/- {1:f})".format(volume, volume_error)
    return Result.Success

if __name__ == "__main__":
    RunCommand()