Source code for ladybug_rhino.versioning.userobject
"""Functions for creating user objects."""
import os
try:
import Grasshopper.Folders as Folders
import Grasshopper.Kernel as gh
except ImportError:
raise ImportError("Failed to import Grasshopper.")
try:
from ladybug.config import folders
except ImportError as e:
raise ImportError("Failed to import ladybug.\n{}".format(e))
# find the location where the Grasshopper user objects are stored
UO_FOLDER = Folders.UserObjectFolders[0]
GHA_FOLDER = Folders.DefaultAssemblyFolder
if os.name == 'nt':
# search all assembly folders to see if they live in the core installation
lbt_components = os.path.join(folders.ladybug_tools_folder, 'grasshopper')
if os.path.isdir(lbt_components):
comp_dir = 'C:\\ProgramData\\McNeel\\Rhinoceros\\packages'
for a_fold in Folders.AssemblyFolders:
a_fold = str(a_fold)
if a_fold.startswith(comp_dir) and 'LadybugTools' in a_fold:
# a special plugin loader has been added
UO_FOLDER = lbt_components
GHA_FOLDER = lbt_components
break
# map from the AdditionalHelpFromDocStrings to values for user object exposure
EXPOSURE_MAP = (
gh.GH_Exposure.dropdown,
gh.GH_Exposure.primary,
gh.GH_Exposure.secondary,
gh.GH_Exposure.tertiary,
gh.GH_Exposure.quarternary,
gh.GH_Exposure.quinary,
gh.GH_Exposure.senary,
gh.GH_Exposure.septenary
)
# map from the component category to the plugin package folder
FOLDER_MAP = {
'Ladybug': 'ladybug_grasshopper',
'Honeybee': 'honeybee_grasshopper_core',
'HB-Radiance': 'honeybee_grasshopper_radiance',
'HB-Energy': 'honeybee_grasshopper_energy',
'Dragonfly': 'dragonfly_grasshopper',
'LB-Legacy': 'LB-Legacy',
'HB-Legacy': 'HB-Legacy',
'HoneybeePlus': 'HoneybeePlus'
}
[docs]
def create_userobject(component, move=True):
"""Create UserObject from a component.
Args:
component: A Grasshopper Python component.
move: A Boolean to note whether the component should be moved to a subdirectory
based on FOLDER_MAP. (Default: True).
"""
# initiate userobject
uo = gh.GH_UserObject()
# set attributes
uo.Icon = component.Icon_24x24
try:
exposure = int(component.AdditionalHelpFromDocStrings)
except Exception: # no exposure category specified
exposure = 1
uo.Exposure = EXPOSURE_MAP[exposure]
uo.BaseGuid = component.ComponentGuid
uo.Description.Name = component.Name
uo.Description.Description = component.Description
uo.Description.Category = component.Category
uo.Description.SubCategory = component.SubCategory
# save the userobject to a file
uo.SetDataFromObject(component)
uo.SaveToFile()
# move the user object file to the assigned folder
if move:
ufd = os.path.join(UO_FOLDER, FOLDER_MAP[component.Category], 'user_objects')
ufp = os.path.join(ufd, '%s.ghuser' % component.Name)
if not os.path.isdir(ufd):
# create folder if it is not already created
os.mkdir(ufd)
elif os.path.isfile(ufp):
# remove current userobject
try:
os.remove(ufp)
except Exception:
pass # access is denied to the user object location
uo.Path = ufp
uo.SaveToFile()
return uo