M_Rhino_Geometry_Surface_IsPlanar - mcneel/rhinocommon-api-docs GitHub Wiki
Tests a surface to see if it is planar to zero tolerance.
Namespace: Rhino.Geometry
Assembly: RhinoCommon (in RhinoCommon.dll) Version: Rhino 6.0
C#
public bool IsPlanar()
VB
Public Function IsPlanar As Boolean
Type: Boolean
true if the surface is planar (flat) to within RhinoMath.ZeroTolerance units (1e-12).
VB
Imports System.Linq
Imports Rhino
Imports Rhino.DocObjects
Imports Rhino.Geometry
Imports Rhino.Commands
Imports Rhino.Input
Namespace examples_vb
Public Class IsPlanarSurfaceInPlaneCommand
Inherits Command
Public Overrides ReadOnly Property EnglishName() As String
Get
Return "vbIsPlanarSurfaceInPlane"
End Get
End Property
Protected Overrides Function RunCommand(doc As RhinoDoc, mode As RunMode) As Result
Dim obj_ref As ObjRef = Nothing
Dim rc = RhinoGet.GetOneObject("select surface", True, ObjectType.Surface, obj_ref)
If rc <> Result.Success Then
Return rc
End If
Dim surface = obj_ref.Surface()
Dim corners As Point3d() = Nothing
rc = RhinoGet.GetRectangle(corners)
If rc <> Result.Success Then
Return rc
End If
Dim plane = New Plane(corners(0), corners(1), corners(2))
Dim is_or_isnt = If(IsSurfaceInPlane(surface, plane, doc.ModelAbsoluteTolerance), "", " not ")
RhinoApp.WriteLine("Surface is{0} in plane.", is_or_isnt)
Return Result.Success
End Function
Private Function IsSurfaceInPlane(surface As Surface, plane As Plane, tolerance As Double) As Boolean
If Not surface.IsPlanar(tolerance) Then
Return False
End If
Dim bbox = surface.GetBoundingBox(True)
Return bbox.GetCorners().All(Function(corner) Math.Abs(plane.DistanceTo(corner)) <= tolerance)
End Function
End Class
End Namespace
C#
using System.Linq;
using Rhino;
using Rhino.DocObjects;
using Rhino.Geometry;
using Rhino.Commands;
using Rhino.Input;
namespace examples_cs
{
public class IsPlanarSurfaceInPlaneCommand : Command
{
public override string EnglishName { get { return "csIsPlanarSurfaceInPlane"; } }
protected override Result RunCommand(RhinoDoc doc, RunMode mode)
{
ObjRef obj_ref;
var rc = RhinoGet.GetOneObject("select surface", true, ObjectType.Surface, out obj_ref);
if (rc != Result.Success)
return rc;
var surface = obj_ref.Surface();
Point3d[] corners;
rc = RhinoGet.GetRectangle(out corners);
if (rc != Result.Success)
return rc;
var plane = new Plane(corners[0], corners[1], corners[2]);
var is_or_isnt = "";
if (IsSurfaceInPlane(surface, plane, doc.ModelAbsoluteTolerance))
is_or_isnt = " not ";
RhinoApp.WriteLine("Surface is{0} in plane.", is_or_isnt);
return Result.Success;
}
private bool IsSurfaceInPlane(Surface surface, Plane plane, double tolerance)
{
if (!surface.IsPlanar(tolerance))
return false;
var bbox = surface.GetBoundingBox(true);
return bbox.GetCorners().All(
corner => System.Math.Abs(plane.DistanceTo(corner)) <= tolerance);
}
}
}
Python
import Rhino
from Rhino.Geometry import *
import rhinoscriptsyntax as rs
from scriptcontext import doc
import math
def RunCommand():
surface_id = rs.GetSurfaceObject()[0]
if surface_id == None:
return
surface = rs.coercesurface(surface_id)
corners = rs.GetRectangle()
if corners == None:
return
plane = Plane(corners[0], corners[1], corners[2])
is_or_isnt = "" if IsSurfaceInPlane(surface, plane, doc.ModelAbsoluteTolerance) else " not "
print "Surface is{0} in plane.".format(is_or_isnt)
def IsSurfaceInPlane(surface, plane, tolerance):
if not surface.IsPlanar(tolerance):
return False
bbox = surface.GetBoundingBox(True)
rc = True
for corner in bbox.GetCorners():
if math.fabs(plane.DistanceTo(corner)) > tolerance:
rc = False
break
return rc
if __name__ == "__main__":
RunCommand()
Supported in: 6.0.16224.21491, 5D58w