Source code for compas_rhino.geometry.plane
from __future__ import print_function
from __future__ import absolute_import
from __future__ import division
import Rhino
from compas.geometry import Plane
from compas.geometry import Frame
from ._geometry import BaseRhinoGeometry
__all__ = ['RhinoPlane']
[docs]class RhinoPlane(BaseRhinoGeometry):
"""Wrapper for a Rhino plane objects.
Attributes
----------
point (read-only) : :class:`Rhino.Geometry.Point3d`
Base point of the plane.
normal (read-only) : :class:`Rhino.Geometry.Vector3d`
The normal vector of the plane.
xaxis (read-only) : :class:`Rhino.Geometry.Vector3d`
The X axis of the plane.
yaxis (read-only) : :class:`Rhino.Geometry.Vector3d`
The Y axis of the plane.
Notes
-----
In Rhino, a plane and a frame are equivalent.
Therefore, the COMPAS conversion function of this class returns a frame object instead of a plane.
"""
def __init__(self):
super(RhinoPlane, self).__init__()
@property
def point(self):
return self.geometry.Origin
@property
def normal(self):
return self.geometry.Normal
@property
def xaxis(self):
return self.geometry.XAxis
@property
def yaxis(self):
return self.geometry.YAxis
[docs] @classmethod
def from_geometry(cls, geometry):
"""Construct a plane wrapper from an existing geometry object.
Parameters
----------
geometry : tuple of point and normal or :class:`Rhino.Geometry.Plane` or :class:`compas.geometry.Plane` or :class:`compas.geometry.Frame`
The geometry object defining a plane.
Returns
-------
:class:`compas_rhino.geometry.RhinoPlane`
The wrapped plane.
"""
if not isinstance(geometry, Rhino.Geometry.Plane):
if isinstance(geometry, Plane):
point = Rhino.Geometry.Point3d(geometry[0][0], geometry[0][1], geometry[0][2])
normal = Rhino.Geometry.Vector3d(geometry[1][0], geometry[1][1], geometry[1][2])
geometry = Rhino.Geometry.Plane(point, normal)
elif isinstance(geometry, Frame):
point = Rhino.Geometry.Point3d(geometry[0][0], geometry[0][1], geometry[0][2])
xaxis = Rhino.Geometry.Vector3d(geometry[1][0], geometry[1][1], geometry[1][2])
yaxis = Rhino.Geometry.Vector3d(geometry[2][0], geometry[2][1], geometry[2][2])
geometry = Rhino.Geometry.Plane(point, xaxis, yaxis)
else:
point = Rhino.Geometry.Point3d(geometry[0][0], geometry[0][1], geometry[0][2])
normal = Rhino.Geometry.Vector3d(geometry[1][0], geometry[1][1], geometry[1][2])
geometry = Rhino.Geometry.Plane(point, normal)
line = cls()
line.geometry = geometry
return line
[docs] @classmethod
def from_selection(cls):
raise NotImplementedError
[docs] def to_compas(self):
"""Convert to a COMPAS geometry object.
Returns
-------
:class:`compas.geometry.Frame`
A COMPAS frame object.
"""
return Frame(self.point, self.xaxis, self.yaxis)
# ==============================================================================
# Main
# ==============================================================================
if __name__ == '__main__':
pass