Source code for honeybee_designbuilder.properties.room
# coding=utf-8
"""Room DesignBuilder Properties."""
import math
from ladybug_geometry.geometry3d import Face3D
[docs]
class RoomDesignBuilderProperties(object):
"""DesignBuilder Properties for Honeybee Room.
Args:
host: A honeybee_core Room object that hosts these properties.
floor_geometry: An optional horizontal Face3D object, which will be used to
compute block partitions and perimeters during export to dsbXML.
If None, floor geometry is auto-calculated from the 3D Room geometry.
Specifying a geometry here can help overcome some limitations of
this auto-calculation and improve performance of dsbXML
translation. (Default: None).
Properties:
* host
* floor_geometry
"""
__slots__ = ('_host', '_floor_geometry')
def __init__(self, host, floor_geometry=None):
"""Initialize Room DesignBuilder properties."""
# set the main properties of the Room
self._host = host
self.floor_geometry = floor_geometry
@property
def host(self):
"""Get the Room object hosting these properties."""
return self._host
@property
def floor_geometry(self):
"""Get or set a horizontal Face3D to set the floor geometry."""
return self._floor_geometry
@floor_geometry.setter
def floor_geometry(self, value):
if value is not None:
assert isinstance(value, Face3D), \
'Expected ladybug_geometry Face3D. Got {}'.format(type(value))
if value.normal.z < 0: # ensure upward-facing Face3D
self._floor_geometry = value.flip()
self._floor_geometry = value
[docs]
def move(self, moving_vec):
"""Move this object along a vector.
Args:
moving_vec: A ladybug_geometry Vector3D with the direction and distance
to move the object.
"""
if self.floor_geometry is not None:
self._floor_geometry = self.floor_geometry.move(moving_vec)
[docs]
def rotate(self, angle, axis, origin):
"""Rotate this object by a certain angle around an axis and origin.
Args:
angle: An angle for rotation in degrees.
axis: Rotation axis as a Vector3D.
origin: A ladybug_geometry Point3D for the origin around which the
object will be rotated.
"""
if self.floor_geometry is not None:
self._floor_geometry = \
self.floor_geometry.rotate(math.radians(angle), axis, origin)
[docs]
def rotate_xy(self, angle, origin):
"""Rotate this object counterclockwise in the world XY plane by a certain angle.
Args:
angle: An angle in degrees.
origin: A ladybug_geometry Point3D for the origin around which the
object will be rotated.
"""
if self.floor_geometry is not None:
self._floor_geometry = \
self.floor_geometry.rotate_xy(math.radians(angle), origin)
[docs]
def reflect(self, plane):
"""Reflect this object across a plane.
Args:
plane: A ladybug_geometry Plane across which the object will
be reflected.
"""
if self.floor_geometry is not None:
self._floor_geometry = self.floor_geometry.reflect(plane)
[docs]
def scale(self, factor, origin=None):
"""Scale this object by a factor from an origin point.
Args:
factor: A number representing how much the object should be scaled.
origin: A ladybug_geometry Point3D representing the origin from which
to scale. If None, it will be scaled from the World origin (0, 0, 0).
"""
if self.floor_geometry is not None:
self._floor_geometry = \
self.floor_geometry.scale(factor, origin)
[docs]
@classmethod
def from_dict(cls, data, host):
"""Create RoomDesignBuilderProperties from a dictionary.
Args:
data: A dictionary representation of RoomDesignBuilderProperties with the
format below.
host: A Room object that hosts these properties.
.. code-block:: python
{
"type": 'RoomDesignBuilderProperties',
"floor_geometry": {} # optional Face3D dictionary
}
"""
assert data['type'] == 'RoomDesignBuilderProperties', \
'Expected RoomDesignBuilderProperties. Got {}.'.format(data['type'])
new_prop = cls(host)
if 'floor_geometry' in data and data['floor_geometry'] is not None:
new_prop.floor_geometry = Face3D.from_dict(data['floor_geometry'])
return new_prop
[docs]
def apply_properties_from_dict(self, data):
"""Apply properties from a RoomDesignBuilderProperties dictionary.
Args:
data: A RoomDesignBuilderProperties dictionary (typically coming from a Model).
"""
if 'floor_geometry' in data and data['floor_geometry'] is not None:
self.floor_geometry = Face3D.from_dict(data['floor_geometry'])
[docs]
def to_dict(self, abridged=False):
"""Return Room DesignBuilder properties as a dictionary."""
base = {'designbuilder': {}}
base['designbuilder']['type'] = 'RoomDesignBuilderProperties'
if self.floor_geometry is not None:
base['designbuilder']['floor_geometry'] = self.floor_geometry.to_dict()
return base
[docs]
def duplicate(self, new_host=None):
"""Get a copy of this object.
Args:
new_host: A new Room object that hosts these properties.
If None, the properties will be duplicated with the same host.
"""
_host = new_host or self._host
new_room = RoomDesignBuilderProperties(_host, self.floor_geometry)
return new_room
[docs]
def ToString(self):
return self.__repr__()
def __repr__(self):
return 'Room DesignBuilder Properties: [host: {}]'.format(self.host.display_name)