Source code for

# coding=utf-8
"""Context Shade Energy Properties."""
from honeybee.shade import Shade
from import ShadeConstruction
from honeybee_energy.schedule.ruleset import ScheduleRuleset
from honeybee_energy.schedule.fixedinterval import ScheduleFixedInterval
from import ShadeEnergyProperties
from import ShadeMeshEnergyProperties

from honeybee_energy.lib.constructions import generic_context

[docs]class ContextShadeEnergyProperties(object): """Energy Properties for Dragonfly ContextShade. Args: host_shade: A dragonfly_core ContextShade object that hosts these properties. construction: An optional ShadeConstruction object to set the reflectance and specularity of the ContextShade. The default is a completely diffuse construction with 0.2 visible and solar reflectance. transmittance_schedule: An optional schedule to set the transmittance of the shade, which can vary throughout the day or year. Default is a completely opaque object. Properties: * host * construction * transmittance_schedule * is_construction_set_by_user """ __slots__ = ('_host', '_construction', '_transmittance_schedule') def __init__(self, host_shade, construction=None, transmittance_schedule=None): """Initialize ContextShade energy properties.""" self._host = host_shade = construction self.transmittance_schedule = transmittance_schedule @property def host(self): """Get the Shade object hosting these properties.""" return self._host @property def construction(self): """Get or set a ShadeConstruction for the context shade.""" if self._construction: # set by user return self._construction else: return generic_context @construction.setter def construction(self, value): if value is not None: assert isinstance(value, ShadeConstruction), \ 'Expected ShadeConstruction. Got {}.'.format(type(value)) value.lock() # lock editing in case construction has multiple references self._construction = value @property def transmittance_schedule(self): """Get or set the transmittance schedule of the shade.""" return self._transmittance_schedule @transmittance_schedule.setter def transmittance_schedule(self, value): if value is not None: assert isinstance(value, (ScheduleRuleset, ScheduleFixedInterval)), \ 'Expected schedule for shade transmittance schedule. ' \ 'Got {}.'.format(type(value)) if value.schedule_type_limit is not None: assert value.schedule_type_limit.unit == 'fraction', 'Transmittance ' \ 'schedule should be fractional [Dimensionless]. Got a schedule ' \ 'of unit_type [{}].'.format(value.schedule_type_limit.unit_type) value.lock() # lock editing in case schedule has multiple references self._transmittance_schedule = value @property def is_construction_set_by_user(self): """Boolean noting if construction is user-set.""" return self._construction is not None
[docs] @classmethod def from_dict(cls, data, host): """Create ContextShadeEnergyProperties from a dictionary. Note that the dictionary must be a non-abridged version for this classmethod to work. Args: data: A dictionary representation of ContextShadeEnergyProperties. host: A ContextShade object that hosts these properties. """ assert data['type'] == 'ContextShadeEnergyProperties', \ 'Expected ContextShadeEnergyProperties. Got {}.'.format(data['type']) new_prop = cls(host) if 'construction' in data and data['construction'] is not None: = ShadeConstruction.from_dict(data['construction']) if 'transmittance_schedule' in data and \ data['transmittance_schedule'] is not None: sch_dict = data['transmittance_schedule'] if sch_dict['type'] == 'ScheduleRuleset': new_prop.transmittance_schedule = \ ScheduleRuleset.from_dict(data['transmittance_schedule']) elif sch_dict['type'] == 'ScheduleFixedInterval': new_prop.transmittance_schedule = \ ScheduleFixedInterval.from_dict(data['transmittance_schedule']) else: raise ValueError( 'Expected non-abridged Schedule dictionary for ContextShade ' 'transmittance_schedule. Got {}.'.format(sch_dict['type'])) return new_prop
[docs] def apply_properties_from_dict(self, abridged_data, constructions, schedules): """Apply properties from a ContextShadeEnergyPropertiesAbridged dictionary. Args: abridged_data: A ContextShadeEnergyPropertiesAbridged dictionary (typically coming from a Model). constructions: A dictionary of constructions with constructions identifiers as keys, which will be used to re-assign constructions. schedules: A dictionary of schedules with schedule identifiers as keys, which will be used to re-assign schedules. """ if 'construction' in abridged_data and abridged_data['construction'] is not None: = constructions[abridged_data['construction']] if 'transmittance_schedule' in abridged_data and \ abridged_data['transmittance_schedule'] is not None: self.transmittance_schedule = \ schedules[abridged_data['transmittance_schedule']]
[docs] def to_dict(self, abridged=False): """Return energy properties as a dictionary. Args: abridged: Boolean to note whether the full dictionary describing the object should be returned (False) or just an abridged version (True). Default: False. """ base = {'energy': {}} base['energy']['type'] = 'ContextShadeEnergyProperties' if not \ abridged else 'ContextShadeEnergyPropertiesAbridged' if self._construction is not None: base['energy']['construction'] = self._construction.identifier if abridged \ else self._construction.to_dict() if self.transmittance_schedule is not None: base['energy']['transmittance_schedule'] = \ self.transmittance_schedule.identifier if abridged else \ self.transmittance_schedule.to_dict() return base
[docs] def to_honeybee(self, new_host): """Get a honeybee version of this object. Args: new_host: A honeybee-core Shade object that will host these properties. """ return ShadeEnergyProperties(new_host, self._construction, self._transmittance_schedule) \ if isinstance(new_host, Shade) else \ ShadeMeshEnergyProperties(new_host, self._construction, self._transmittance_schedule)
[docs] def from_honeybee(self, hb_properties): """Transfer energy attributes from a Honeybee Shade to Dragonfly ContextShade. Args: hb_properties: The ShadeEnergyProperties of the honeybee Shade that is being translated to a Dragonfly ContextShade. """ self._construction = hb_properties._construction self._transmittance_schedule = hb_properties._transmittance_schedule
[docs] def duplicate(self, new_host=None): """Get a copy of this object. new_host: A new ContextShade object that hosts these properties. If None, the properties will be duplicated with the same host. """ _host = new_host or self._host return ContextShadeEnergyProperties(_host, self._construction, self._transmittance_schedule)
[docs] def ToString(self): return self.__repr__()
def __repr__(self): return 'Context Shade Energy Properties: {}'.format(