Source code for ladybug_rhino.config

"""Ladybug_rhino configurations.

Global variables such as tolerances, units and Rhino versions are stored here.
"""
import os

try:
    from ladybug.config import folders as lb_folders
except ImportError as e:
    raise ImportError('\nFailed to import ladybug:\n\t{}'.format(e))

try:
    import Rhino
    rhino_version_str = str(Rhino.RhinoApp.Version)
    rhino_version = tuple(int(n) for n in rhino_version_str.split('.'))
except Exception:  # Rhino is unavailable; just use a placeholder
    rhino_version = (7, 0)

try:  # Try to import tolerance from the active Rhino document
    import scriptcontext
    tolerance = scriptcontext.doc.ModelAbsoluteTolerance
    angle_tolerance = scriptcontext.doc.ModelAngleToleranceDegrees
except ImportError:  # No Rhino doc is available. Use Rhino's default.
    tolerance = 0.01
    angle_tolerance = 1.0  # default is 1 degree

from .ghpath import find_grasshopper_userobjects, find_grasshopper_libraries


[docs]def conversion_to_meters(): """Get the conversion factor to meters based on the current Rhino doc units system. Returns: A number for the conversion factor, which should be multiplied by all distance units taken from Rhino geometry in order to convert them to meters. """ try: # Try to import units from the active Rhino document import scriptcontext units = str(scriptcontext.doc.ModelUnitSystem).split('.')[-1] except ImportError: # No Rhino doc available. Default to the greatest of all units units = 'Meters' if units == 'Meters': return 1.0 elif units == 'Millimeters': return 0.001 elif units == 'Feet': return 0.3048 elif units == 'Inches': return 0.0254 elif units == 'Centimeters': return 0.01 else: raise ValueError( "You're kidding me! What units are you using?" + units + "?\n" "Please use Meters, Millimeters, Centimeters, Feet or Inches.")
[docs]def units_system(): """Get text for the current Rhino doc units system. (eg. 'Meters', 'Feet')""" try: # Try to import units from the active Rhino document import scriptcontext return str(scriptcontext.doc.ModelUnitSystem).split('.')[-1] except ImportError: # No Rhino doc available. Default to the greatest of all units return 'Meters'
[docs]def units_abbreviation(): """Get text for the current Rhino doc units abbreviation (eg. 'm', 'ft')""" try: # Try to import units from the active Rhino document import scriptcontext units = str(scriptcontext.doc.ModelUnitSystem).split('.')[-1] except ImportError: # No Rhino doc available. Default to the greatest of all units units = 'Meters' if units == 'Meters': return 'm' elif units == 'Millimeters': return 'mm' elif units == 'Feet': return 'ft' elif units == 'Inches': return 'in' elif units == 'Centimeters': return 'cm' else: raise ValueError( "You're kidding me! What units are you using?" + units + "?\n" "Please use Meters, Millimeters, Centimeters, Feet or Inches.")
[docs]class Folders(object): """Ladybug-rhino folders. Properties: * uo_folder * gha_folder * lbt_grasshopper_version * lbt_grasshopper_version_str """ def __init__(self): # find the location where the Grasshopper user objects are stored self._uo_folder = find_grasshopper_userobjects()[-1] self._gha_folder = find_grasshopper_libraries()[-1] if os.name == 'nt': # test to see if components live in the core installation lbt_components = os.path.join(lb_folders.ladybug_tools_folder, 'grasshopper') if os.path.isdir(lbt_components): user_dir = os.path.join(self._uo_folder, 'ladybug_grasshopper') if not os.path.isdir(user_dir): self._uo_folder = lbt_components self._gha_folder = lbt_components self._lbt_grasshopper_version = None self._lbt_grasshopper_version_str = None @property def uo_folder(self): """Get the path to the user object folder.""" return self._uo_folder @property def gha_folder(self): """Get the path to the GHA Grasshopper component folder.""" return self._gha_folder @property def lbt_grasshopper_version(self): """Get a tuple for the version of lbt-grasshopper (eg. (3, 8, 2)). This will be None if the version could not be sensed. """ if self._lbt_grasshopper_version is None: self._lbt_grasshopper_version_from_txt() return self._lbt_grasshopper_version @property def lbt_grasshopper_version_str(self): """Get text for the full version of python (eg."3.8.2"). This will be None if the version could not be sensed. """ if self._lbt_grasshopper_version_str is None: self._lbt_grasshopper_version_from_txt() return self._lbt_grasshopper_version_str def _lbt_grasshopper_version_from_txt(self): """Get the LBT-Grasshopper version from the requirements.txt file in uo_folder. """ req_file = os.path.join(self._uo_folder, 'requirements.txt') if os.path.isfile(req_file): with open(req_file) as rf: for row in rf: if row.startswith('lbt-grasshopper=='): lbt_ver = row.split('==')[-1].strip() try: self._lbt_grasshopper_version = \ tuple(int(i) for i in lbt_ver.split('.')) self._lbt_grasshopper_version_str = lbt_ver except Exception: pass # failed to parse the version into values break
"""Object possessing all key folders within the configuration.""" folders = Folders()