Surface.TryGetPlane Method (Plane, Double)

SurfaceTryGetPlane Method (Plane, Double)

Tests a surface for planarity and return the plane.

Namespace:  Rhino.Geometry
Assembly:  RhinoCommon (in RhinoCommon.dll)
Syntax
public bool TryGetPlane(
	out Plane plane,
	double tolerance
)
Public Function TryGetPlane ( 
	<OutAttribute> ByRef plane As Plane,
	tolerance As Double
) As Boolean

Parameters

plane
Type: Rhino.GeometryPlane
On success, the plane parameters are filled in.
tolerance
Type: SystemDouble
tolerance to use when checking.

Return Value

Type: Boolean
true if there is a plane such that the maximum distance from the surface to the plane is <= tolerance.
Examples
using System;

partial class Examples
{
  public static bool IsBrepBox(Rhino.Geometry.Brep brep)
  {
    const double zero_tolerance = 1.0e-6; // or whatever
    bool rc = brep.IsSolid;
    if( rc )
      rc = brep.Faces.Count == 6;

    var N = new Rhino.Geometry.Vector3d[6];
    for (int i = 0; rc && i < 6; i++)
    {
      Rhino.Geometry.Plane plane;
      rc = brep.Faces[i].TryGetPlane(out plane, zero_tolerance);
      if( rc )
      {
        N[i] = plane.ZAxis;
        N[i].Unitize();
      }
    }

    for (int i = 0; rc && i < 6; i++)
    {
      int count = 0;
      for (int j = 0; rc && j < 6; j++)
      {
        double dot = Math.Abs(N[i] * N[j]);
        if (dot <= zero_tolerance)
          continue;
        if (Math.Abs(dot - 1.0) <= zero_tolerance) 
          count++;
        else
          rc = false;
      }

      if (rc)
      {
        if (2 != count)
          rc = false;
      }
    }
    return rc;
  }

  public static Rhino.Commands.Result TestBrepBox(Rhino.RhinoDoc doc)
  {
    Rhino.DocObjects.ObjRef obj_ref;
    var rc = Rhino.Input.RhinoGet.GetOneObject("Select Brep", true, Rhino.DocObjects.ObjectType.Brep, out obj_ref);
    if (rc == Rhino.Commands.Result.Success)
    {
      var brep = obj_ref.Brep();
      if (brep != null)
      {
        Rhino.RhinoApp.WriteLine(IsBrepBox(brep) ? "Yes it is a box" : "No it is not a box");
      }
    }
    return rc;
  }
}
Partial Class Examples
  Public Shared Function IsBrepBox(brep As Rhino.Geometry.Brep) As Boolean
    Const zero_tolerance As Double = 0.000001 ' or whatever
    Dim rc As Boolean = brep.IsSolid
    If rc Then
      rc = brep.Faces.Count = 6
    End If

    Dim N = New Rhino.Geometry.Vector3d(5) {}
    Dim i As Integer = 0
    While rc AndAlso i < 6
      Dim plane As Rhino.Geometry.Plane
      rc = brep.Faces(i).TryGetPlane(plane, zero_tolerance)
      If rc Then
        N(i) = plane.ZAxis
        N(i).Unitize()
      End If
      i += 1
    End While

    i = 0
    While rc AndAlso i < 6
      Dim count As Integer = 0
      Dim j As Integer = 0
      While rc AndAlso j < 6
        Dim dot As Double = Math.Abs(N(i) * N(j))
        If dot <= zero_tolerance Then
          Continue While
        End If
        If Math.Abs(dot - 1.0) <= zero_tolerance Then
          count += 1
        Else
          rc = False
        End If
        j += 1
      End While

      If rc Then
        If 2 <> count Then
          rc = False
        End If
      End If
      i += 1
    End While
    Return rc
  End Function

  Public Shared Function TestBrepBox(doc As Rhino.RhinoDoc) As Rhino.Commands.Result
    Dim obj_ref As Rhino.DocObjects.ObjRef = Nothing
    Dim rc = Rhino.Input.RhinoGet.GetOneObject("Select Brep", True, Rhino.DocObjects.ObjectType.Brep, obj_ref)
    If rc = Rhino.Commands.Result.Success Then
      Dim brep = obj_ref.Brep()
      If brep IsNot Nothing Then
        If IsBrepBox(brep) Then
          Rhino.RhinoApp.WriteLine("Yes it is a box")
        Else
          Rhino.RhinoApp.WriteLine("No it is not a box")
        End If
      End If
    End If
    Return rc
  End Function
End Class
import Rhino

def IsBrepBox(brep):
    zero_tolerance = 1.0e-6 #or whatever
    rc = brep.IsSolid
    if rc: rc = brep.Faces.Count == 6

    N = []
    for i in range(6):
        if not rc: break
        rc, plane = brep.Faces[i].TryGetPlane(zero_tolerance)
        if rc:
            v = plane.ZAxis
            v.Unitize()
            N.append(v)

    for i in range(6):
        count = 0
        for j in range(6):
            if not rc: break
            dot = abs(N[i] * N[j])
            if dot<=zero_tolerance: continue
            if abs(dot-1.0)<=zero_tolerance:
              count += 1
            else:
              rc = False

    if rc:
        if 2!=count: rc = False
    return rc


if __name__=="__main__":
    rc, objref = Rhino.Input.RhinoGet.GetOneObject("Select Brep", True, Rhino.DocObjects.ObjectType.Brep)
    if rc==Rhino.Commands.Result.Success:
        brep = objref.Brep()
        if brep:
            if IsBrepBox(brep): print "Yes it is a box"
            else: print "No it is not a box"
Version Information

Rhino for Mac

Supported in: 5.4

Rhino for Windows

Supported in: 6.8
See Also