"""Functions to add text to the Rhino scene and create Grasshopper text objects."""
from ladybug_display.altnumber import Default
from .color import color_to_color, argb_color_to_color
from .fromgeometry import from_plane
from .bakegeometry import _get_attributes, bake_point2d, bake_vector2d, bake_ray2d, \
bake_linesegment2d, bake_arc2d, bake_polygon2d, bake_polyline2d, bake_mesh2d, \
bake_point3d, bake_vector3d, bake_ray3d, bake_linesegment3d, bake_plane, \
bake_arc3d, bake_polyline3d, bake_mesh3d, bake_face3d, bake_polyface3d, \
bake_sphere, bake_cone, bake_cylinder
try:
import Rhino.Display as rd
import Rhino.DocObjects as docobj
from Rhino import RhinoDoc as rhdoc
except ImportError as e:
raise ImportError("Failed to import Rhino document attributes.\n{}".format(e))
TEXT_HORIZ = {
'Left': docobj.TextHorizontalAlignment.Left,
'Center': docobj.TextHorizontalAlignment.Center,
'Right': docobj.TextHorizontalAlignment.Right
}
TEXT_VERT = {
'Top': docobj.TextVerticalAlignment.Top,
'Middle': docobj.TextVerticalAlignment.Middle,
'Bottom': docobj.TextVerticalAlignment.Bottom
}
LINE_WIDTH_FACTOR = 3.779528 # factor to translate pixel width to millimeters
LINE_TYPES = {
'Continuous': -1,
'Dashed': -1,
'Dotted': -1,
'DashDot': -1
}
_display_lts = ('Continuous', 'Dashed', 'Dots', 'DashDot')
for i, lt in enumerate(rhdoc.ActiveDoc.Linetypes):
lt_name = lt.Name
for dlt in _display_lts:
if lt_name == dlt:
dlt = dlt if dlt != 'Dots' else 'Dotted'
LINE_TYPES[dlt] = i
break
"""____________BAKE 2D DISPLAY GEOMETRY TO THE RHINO SCENE____________"""
[docs]
def bake_display_vector2d(vector, z=0, layer_name=None, attributes=None):
"""Add DisplayVector2D to the Rhino scene as a Line with an Arrowhead."""
attrib = _get_attributes(layer_name, attributes)
_color_attribute(attrib, vector)
return bake_vector2d(vector.geometry, z, attributes=attrib)
[docs]
def bake_display_point2d(point, z=0, layer_name=None, attributes=None):
"""Add ladybug Point2D to the Rhino scene as a Point."""
attrib = _get_attributes(layer_name, attributes)
_color_attribute(attrib, point)
return bake_point2d(point.geometry, z, attributes=attrib)
[docs]
def bake_display_ray2d(ray, z=0, layer_name=None, attributes=None):
"""Add DisplayRay2D to the Rhino scene as a Line with an Arrowhead."""
attrib = _get_attributes(layer_name, attributes)
_color_attribute(attrib, ray)
return bake_ray2d(ray.geometry, z, attributes=attrib)
[docs]
def bake_display_linesegment2d(line, z=0, layer_name=None, attributes=None):
"""Add DisplayLineSegment2D to the Rhino scene as a Line."""
attrib = _get_attributes(layer_name, attributes)
_line_like_attributes(attrib, line)
return bake_linesegment2d(line.geometry, z, attributes=attrib)
[docs]
def bake_display_polygon2d(polygon, z=0, layer_name=None, attributes=None):
"""Add DisplayPolygon2D to the Rhino scene as a Polyline."""
attrib = _get_attributes(layer_name, attributes)
_line_like_attributes(attrib, polygon)
return bake_polygon2d(polygon.geometry, z, attributes=attrib)
[docs]
def bake_display_arc2d(arc, z=0, layer_name=None, attributes=None):
"""Add DisplayArc2D to the Rhino scene as an Arc or a Circle."""
attrib = _get_attributes(layer_name, attributes)
_line_like_attributes(attrib, arc)
return bake_arc2d(arc.geometry, z, attributes=attrib)
[docs]
def bake_display_polyline2d(polyline, z=0, layer_name=None, attributes=None):
"""Add DisplayPolyline2D to the Rhino scene as a Curve."""
attrib = _get_attributes(layer_name, attributes)
_line_like_attributes(attrib, polyline)
return bake_polyline2d(polyline.geometry, z, attributes=attrib)
[docs]
def bake_display_mesh2d(mesh, z=0, layer_name=None, attributes=None):
"""Add DisplayMesh2D to the Rhino scene as a Mesh."""
attrib = _get_attributes(layer_name, attributes)
_color_attribute(attrib, mesh)
return bake_mesh2d(mesh.geometry, z, attributes=attrib)
"""____________BAKE 3D DISPLAY GEOMETRY TO THE RHINO SCENE____________"""
[docs]
def bake_display_vector3d(vector, layer_name=None, attributes=None):
"""Add DisplayVector3D to the Rhino scene as a Line with an Arrowhead."""
attrib = _get_attributes(layer_name, attributes)
_color_attribute(attrib, vector)
return bake_vector3d(vector.geometry, attributes=attrib)
[docs]
def bake_display_point3d(point, layer_name=None, attributes=None):
"""Add ladybug Point3D to the Rhino scene as a Point."""
attrib = _get_attributes(layer_name, attributes)
_color_attribute(attrib, point)
return bake_point3d(point.geometry, attributes=attrib)
[docs]
def bake_display_ray3d(ray, layer_name=None, attributes=None):
"""Add DisplayRay3D to the Rhino scene as a Line with an Arrowhead."""
attrib = _get_attributes(layer_name, attributes)
_color_attribute(attrib, ray)
return bake_ray3d(ray.geometry, attributes=attrib)
[docs]
def bake_display_plane(plane, layer_name=None, attributes=None):
"""Add DisplayPlane to the Rhino scene as a Rectangle."""
attrib = _get_attributes(layer_name, attributes)
_color_attribute(attrib, plane)
return bake_plane(plane.geometry, attributes=attrib)
[docs]
def bake_display_linesegment3d(line, layer_name=None, attributes=None):
"""Add DisplayLineSegment3D to the Rhino scene as a Line."""
attrib = _get_attributes(layer_name, attributes)
_line_like_attributes(attrib, line)
return bake_linesegment3d(line.geometry, attributes=attrib)
[docs]
def bake_display_arc3d(arc, layer_name=None, attributes=None):
"""Add DisplayArc3D to the Rhino scene as an Arc or a Circle."""
attrib = _get_attributes(layer_name, attributes)
_line_like_attributes(attrib, arc)
return bake_arc3d(arc.geometry, attributes=attrib)
[docs]
def bake_display_polyline3d(polyline, layer_name=None, attributes=None):
"""Add DisplayPolyline3D to the Rhino scene as a Curve."""
attrib = _get_attributes(layer_name, attributes)
_line_like_attributes(attrib, polyline)
return bake_polyline3d(polyline.geometry, attributes=attrib)
[docs]
def bake_display_mesh3d(mesh, layer_name=None, attributes=None):
"""Add DisplayMesh3D to the Rhino scene as a Mesh."""
attrib = _get_attributes(layer_name, attributes)
_color_attribute(attrib, mesh)
return bake_mesh3d(mesh.geometry, attributes=attrib)
[docs]
def bake_display_face3d(face, layer_name=None, attributes=None):
"""Add DisplayFace3D to the Rhino scene as a Brep."""
attrib = _get_attributes(layer_name, attributes)
_color_attribute(attrib, face)
return bake_face3d(face.geometry, attributes=attrib)
[docs]
def bake_display_polyface3d(polyface, layer_name=None, attributes=None):
"""Add DisplayPolyface3D to the Rhino scene as a Brep."""
attrib = _get_attributes(layer_name, attributes)
_color_attribute(attrib, polyface)
return bake_polyface3d(polyface.geometry, attributes=attrib)
[docs]
def bake_display_sphere(sphere, layer_name=None, attributes=None):
"""Add DisplaySphere to the Rhino scene as a Brep."""
attrib = _get_attributes(layer_name, attributes)
_color_attribute(attrib, sphere)
return bake_sphere(sphere.geometry, attributes=attrib)
[docs]
def bake_display_cone(cone, layer_name=None, attributes=None):
"""Add DisplayCone to the Rhino scene as a Brep."""
attrib = _get_attributes(layer_name, attributes)
_color_attribute(attrib, cone)
return bake_cone(cone.geometry, attributes=attrib)
[docs]
def bake_display_cylinder(cylinder, layer_name=None, attributes=None):
"""Add DisplayCylinder to the Rhino scene as a Brep."""
attrib = _get_attributes(layer_name, attributes)
_color_attribute(attrib, cylinder)
return bake_cylinder(cylinder.geometry, attributes=attrib)
[docs]
def bake_display_text3d(display_text, layer_name=None, attributes=None):
"""Add DisplayText3D to the Rhino scene.
Args:
display_text: A DisplayText3D object to be added to the Rhino scene.
layer_name: Optional text string for the layer name on which to place the
text. If None, text will be added to the current layer.
attributes: Optional Rhino attributes for adding to the Rhino scene.
"""
# extract properties from the text
doc = rhdoc.ActiveDoc
d_txt = display_text.text
nl_count = len(d_txt.split('\n')) - 1
if nl_count > 1 and display_text.vertical_alignment == 'Bottom':
m_vec = display_text.plane.y * (nl_count * display_text.height * -1.5)
t_pln = display_text.plane.move(m_vec)
else:
t_pln = display_text.plane
txt_h = display_text.height
# create the Rhino Display Text object
txt = rd.Text3d(d_txt, from_plane(t_pln), txt_h)
txt.FontFace = display_text.font
txt.HorizontalAlignment = TEXT_HORIZ[display_text.horizontal_alignment]
txt.VerticalAlignment = TEXT_VERT[display_text.vertical_alignment]
attrib = _get_attributes(layer_name, attributes)
attrib.ObjectColor = color_to_color(display_text.color)
# add the text to the document and return the GUID
doc.ModelSpaceAnnotationScalingEnabled = False # disable model scale
txt_guid = doc.Objects.AddText(txt, attrib)
return txt_guid
"""________________EXTRA HELPER FUNCTIONS________________"""
def _color_attribute(attrib, display_obj):
"""Process the attributes of a colored display object."""
attrib.ColorSource = docobj.ObjectColorSource.ColorFromObject
attrib.ObjectColor = argb_color_to_color(display_obj.color)
def _line_like_attributes(attrib, display_obj):
"""Process the attributes of a line-like display object."""
_color_attribute(attrib, display_obj)
if not isinstance(display_obj.line_width, Default):
attrib.PlotWeightSource = docobj.ObjectPlotWeightSource.PlotWeightFromObject
attrib.PlotWeight = display_obj.line_width / LINE_WIDTH_FACTOR
attrib.LinetypeSource = docobj.ObjectLinetypeSource.LinetypeFromObject
attrib.LinetypeIndex = LINE_TYPES[display_obj.line_type]