""" ThermalZone module SPDX - License - Identifier: LGPL - 3.0 - or -later Copyright © 2020 Project Author Guille Gutierrez guillermo.gutierrezmorote@concordia.ca Contributors Pilar Monsalvete Álvarez de Uribarri pilar.monsalvete@concordia.ca """ import uuid from typing import List, TypeVar from city_model_structure.attributes.surface import Surface from city_model_structure.attributes.usage_zone import UsageZone ThermalBoundary = TypeVar('ThermalBoundary') Polyhedron = TypeVar('Polyhedron') class ThermalZone: """ ThermalZone class """ def __init__(self, surfaces): self._surfaces = surfaces self._floor_area = None self._bounded = None self._is_mechanically_ventilated = None self._additional_thermal_bridge_u_value = None self._effective_thermal_capacity = None self._indirectly_heated_area_ratio = None self._infiltration_rate_system_on = None self._infiltration_rate_system_off = None self._usage_zones = None self._volume = None self._volume_geometry = None self._id = None self._is_heated = False self._is_cooled = False @property def id(self): if self._id is None: self._id = uuid.uuid4() return self._id @property def is_heated(self): """ Get thermal zone heated flag :return: Boolean """ return self._is_heated @is_heated.setter def is_heated(self, value): """ Set thermal zone heated flag :return: Boolean """ self._is_heated = value @property def is_cooled(self): """ Get thermal zone cooled flag :return: Boolean """ return self._is_cooled @is_cooled.setter def is_cooled(self, value): """ Set thermal zone cooled flag :return: Boolean """ self._is_cooled = value @property def is_mechanically_ventilated(self): """ Get thermal zone mechanical ventilation flag :return: Boolean """ return self._is_mechanically_ventilated @property def floor_area(self): """ Get thermal zone floor area in m2 :return: float """ if self._floor_area is None: self._floor_area = 0 for s in self._surfaces: if s.type == 'Ground': self._floor_area += s.perimeter_polygon.area return self._floor_area @property def bounded(self) -> List[ThermalBoundary]: """ Get thermal boundaries bounding with the thermal zone :return: [ThermalBoundary] """ return self._bounded @bounded.setter def bounded(self, value): """ Set thermal boundaries bounding with the thermal zone :param value: [ThermalBoundary] :return: None """ self._bounded = value @property def surfaces(self) -> List[Surface]: # todo: This property should be erased (@Guille: why??) """ Get thermal zone surfaces :return: [Surface] """ return self._surfaces @property def additional_thermal_bridge_u_value(self): """ Get thermal zone additional thermal bridge u value W/m2K :return: float """ return self._additional_thermal_bridge_u_value @additional_thermal_bridge_u_value.setter def additional_thermal_bridge_u_value(self, value): """ Set thermal zone additional thermal bridge u value W/m2K :param value: float :return: None """ self._additional_thermal_bridge_u_value = value @property def effective_thermal_capacity(self): """ Get thermal zone effective thermal capacity in J/m2K :return: float """ return self._effective_thermal_capacity @effective_thermal_capacity.setter def effective_thermal_capacity(self, value): """ Set thermal zone effective thermal capacity in J/m2K :param value: float :return: None """ self._effective_thermal_capacity = value @property def indirectly_heated_area_ratio(self): """ Get thermal zone indirectly heated area ratio :return: float """ return self._indirectly_heated_area_ratio @indirectly_heated_area_ratio.setter def indirectly_heated_area_ratio(self, value): """ Set thermal zone indirectly heated area ratio :param value: float :return: None """ self._indirectly_heated_area_ratio = value @property def infiltration_rate_system_on(self): """ Get thermal zone infiltration rate system on in air changes per hour (ACH) :return: float """ return self._infiltration_rate_system_on @infiltration_rate_system_on.setter def infiltration_rate_system_on(self, value): """ Set thermal zone infiltration rate system on in air changes per hour (ACH) :param value: float :return: None """ self._infiltration_rate_system_on = value @property def infiltration_rate_system_off(self): """ Get thermal zone infiltration rate system off in air changes per hour (ACH) :return: float """ return self._infiltration_rate_system_off @infiltration_rate_system_off.setter def infiltration_rate_system_off(self, value): """ Set thermal zone infiltration rate system on in air changes per hour (ACH) :param value: float :return: None """ self._infiltration_rate_system_off = value @property def usage_zones(self) -> List[UsageZone]: """ Get thermal zone usage zones :return: [UsageZone] """ return self._usage_zones @usage_zones.setter def usage_zones(self, values): """ Set thermal zone usage zones :param values: [UsageZone] :return: None """ self._usage_zones = values @property def volume(self): """ Get thermal zone volume :return: float """ return self._volume @volume.setter def volume(self, value): """ Set thermal zone volume :param value: float :return: None """ self._volume = value @property def volume_geometry(self) -> Polyhedron: """ Get the polyhedron defined by the thermal zone :return: Polyhedron """ return self._volume_geometry