Source code for dragonfly.colorobj

# coding=utf-8
"""Module for coloring geometry with attributes."""
from __future__ import division

from .room2d import Room2D

from honeybee.colorobj import _ColorObject
from ladybug_geometry.geometry3d.pointvector import Point3D


[docs]class ColorRoom2D(_ColorObject): """Object for visualizing Room2D-level attributes. Args: room_2ds: An array of honeybee Room2Ds, which will be colored with the attribute. attr_name: A text string of an attribute that the input rooms should have. This can have '.' that separate the nested attributes from one another. For example, 'properties.energy.program_type'. legend_parameters: An optional LegendParameter object to change the display of the ColorRoom2D (Default: None). Properties: * room_2ds * attr_name * legend_parameters * attr_name_end * attributes * attributes_unique * attributes_original * floor_faces * graphic_container * min_point * max_point """ __slots__ = ('_room_2ds',) def __init__(self, room_2ds, attr_name, legend_parameters=None): """Initialize ColorRoom2D.""" try: # check the input room_2ds room_2ds = tuple(room_2ds) except TypeError: raise TypeError( 'Input room_2ds must be an array. Got {}.'.format(type(room_2ds))) assert len(room_2ds) > 0, 'ColorRoom2D must have at least one room.' for room in room_2ds: assert isinstance(room, Room2D), 'Expected dragonfly Room2D for ' \ 'ColorRoom2D room_2ds. Got {}.'.format(type(room)) self._room_2ds = room_2ds self._calculate_min_max(room_2ds) # assign the legend parameters of this object self.legend_parameters = legend_parameters # get the attributes of the input rooms self._process_attribute_name(attr_name) self._process_attributes(room_2ds) @property def room_2ds(self): """Get a tuple of dragonfly Room2Ds assigned to this object.""" return self._room_2ds @property def floor_faces(self): """Get an list with a Face3Ds for each Room2D.""" return [room.floor_geometry for room in self._room_2ds] def _calculate_min_max(self, hb_objs): """Calculate maximum and minimum Point3D for a set of rooms.""" st_rm_min = hb_objs[0].floor_geometry.min st_rm_max = hb_objs[0].floor_geometry.max min_pt = [st_rm_min.x, st_rm_min.y, st_rm_min.z] max_pt = [st_rm_max.x, st_rm_max.y, st_rm_max.z] for room in hb_objs[1:]: rm_min, rm_max = room.floor_geometry.min, room.floor_geometry.max if rm_min.x < min_pt[0]: min_pt[0] = rm_min.x if rm_min.y < min_pt[1]: min_pt[1] = rm_min.y if rm_min.z < min_pt[2]: min_pt[2] = rm_min.z if rm_max.x > max_pt[0]: max_pt[0] = rm_max.x if rm_max.y > max_pt[1]: max_pt[1] = rm_max.y if rm_max.z > max_pt[2]: max_pt[2] = rm_max.z self._min_point = Point3D(min_pt[0], min_pt[1], min_pt[2]) self._max_point = Point3D(max_pt[0], max_pt[1], max_pt[2]) def __repr__(self): """Color Room2D representation.""" return 'Color Room2D: ({} Rooms() ({})'.format( len(self._room_2ds), self.attr_name_end)