Forced types in attributes

This commit is contained in:
Pilar 2021-09-14 13:46:48 -04:00
parent f4d62bb505
commit 2780dd5b7e
21 changed files with 523 additions and 368 deletions

View File

@ -5,6 +5,7 @@ Copyright © 2021 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.mons
""" """
import uuid import uuid
from typing import Union, List
class Schedule: class Schedule:
@ -31,10 +32,10 @@ class Schedule:
return self._id return self._id
@property @property
def type(self): def type(self) -> Union[None, str]:
""" """
Get schedule type Get schedule type
:return: str :return: None or str
""" """
return self._type return self._type
@ -44,13 +45,14 @@ class Schedule:
Set schedule type Set schedule type
:param: str :param: str
""" """
self._type = str(value) if value is not None:
self._type = str(value)
@property @property
def values(self): def values(self):
""" """
Get schedule values Get schedule values
:return: Union([float], [int]) :return: [Any]
""" """
return self._values return self._values
@ -58,16 +60,16 @@ class Schedule:
def values(self, value): def values(self, value):
""" """
Set schedule values Set schedule values
:param: Union([float], [int]) :param: [Any]
""" """
self._values = value self._values = value
@property @property
def data_type(self): def data_type(self) -> Union[None, str]:
""" """
Get schedule data type from: Get schedule data type from:
['any_number', 'fraction', 'on_off', 'temperature', 'humidity', 'control_type'] ['any_number', 'fraction', 'on_off', 'temperature', 'humidity', 'control_type']
:return: str :return: None or str
""" """
return self._data_type return self._data_type
@ -77,14 +79,15 @@ class Schedule:
Set schedule data type Set schedule data type
:param: str :param: str
""" """
self._data_type = str(value) if value is not None:
self._data_type = str(value)
@property @property
def time_step(self): def time_step(self) -> Union[None, str]:
""" """
Get schedule time step from: Get schedule time step from:
['second', 'minute', 'hour', 'day', 'week', 'month'] ['second', 'minute', 'hour', 'day', 'week', 'month']
:return: str :return: None or str
""" """
return self._time_step return self._time_step
@ -94,14 +97,15 @@ class Schedule:
Set schedule time step Set schedule time step
:param: str :param: str
""" """
self._time_step = str(value) if value is not None:
self._time_step = str(value)
@property @property
def time_range(self): def time_range(self) -> Union[None, str]:
""" """
Get schedule time range from: Get schedule time range from:
['minute', 'hour', 'day', 'week', 'month', 'year'] ['minute', 'hour', 'day', 'week', 'month', 'year']
:return: str :return: None or str
""" """
return self._time_range return self._time_range
@ -111,15 +115,16 @@ class Schedule:
Set schedule time range Set schedule time range
:param: str :param: str
""" """
self._time_range = str(value) if value is not None:
self._time_range = str(value)
@property @property
def day_types(self): def day_types(self) -> Union[None, List[str]]:
""" """
Get schedule day types, as many as needed from: Get schedule day types, as many as needed from:
['monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday', 'holiday', 'winter_design_day', ['monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday', 'holiday', 'winter_design_day',
'summer_design_day'] 'summer_design_day']
:return: [str] :return: None or [str]
""" """
return self._day_types return self._day_types
@ -129,4 +134,5 @@ class Schedule:
Set schedule day types Set schedule day types
:param: [str] :param: [str]
""" """
self._day_types = [str(i) for i in value] if value is not None:
self._day_types = [str(i) for i in value]

View File

@ -5,7 +5,7 @@ Copyright © 2020 Project Author Guille Gutierrez guillermo.gutierrezmorote@conc
contributors: Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca contributors: Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca
""" """
from typing import List from typing import List, Union
import numpy as np import numpy as np
from city_model_structure.building_demand.surface import Surface from city_model_structure.building_demand.surface import Surface
from city_model_structure.building_demand.thermal_zone import ThermalZone from city_model_structure.building_demand.thermal_zone import ThermalZone
@ -124,10 +124,10 @@ class Building(CityObject):
return self._terrains return self._terrains
@property @property
def attic_heated(self): def attic_heated(self) -> Union[None, int]:
""" """
Get if the city object attic is heated Get if the city object attic is heated
:return: Boolean :return: None or int
""" """
return self._attic_heated return self._attic_heated
@ -135,15 +135,16 @@ class Building(CityObject):
def attic_heated(self, value): def attic_heated(self, value):
""" """
Set if the city object attic is heated Set if the city object attic is heated
:param value: Boolean :param value: int
""" """
self._attic_heated = bool(value) if value is not None:
self._attic_heated = int(value)
@property @property
def basement_heated(self): def basement_heated(self) -> Union[None, int]:
""" """
Get if the city object basement is heated Get if the city object basement is heated
:return: Boolean :return: None or int
""" """
return self._basement_heated return self._basement_heated
@ -151,9 +152,10 @@ class Building(CityObject):
def basement_heated(self, value): def basement_heated(self, value):
""" """
Set if the city object basement is heated Set if the city object basement is heated
:param value: Boolean :param value: int
""" """
self._basement_heated = bool(value) if value is not None:
self._basement_heated = int(value)
@property @property
def name(self): def name(self):
@ -191,10 +193,10 @@ class Building(CityObject):
return self._year_of_construction return self._year_of_construction
@property @property
def function(self): def function(self) -> Union[None, str]:
""" """
Get building function Get building function
:return: str :return: None or str
""" """
return self._function return self._function
@ -204,13 +206,14 @@ class Building(CityObject):
Set building function Set building function
:param value: str :param value: str
""" """
self._function = str(value) if value is not None:
self._function = str(value)
@property @property
def average_storey_height(self): def average_storey_height(self) -> Union[None, float]:
""" """
Get building average storey height in meters Get building average storey height in meters
:return: float :return: None or float
""" """
return self._average_storey_height return self._average_storey_height
@ -220,13 +223,14 @@ class Building(CityObject):
Set building average storey height in meters Set building average storey height in meters
:param value: float :param value: float
""" """
self._average_storey_height = float(value) if value is not None:
self._average_storey_height = float(value)
@property @property
def storeys_above_ground(self): def storeys_above_ground(self) -> Union[None, int]:
""" """
Get building storeys number above ground Get building storeys number above ground
:return: int :return: None or int
""" """
return self._storeys_above_ground return self._storeys_above_ground
@ -236,7 +240,8 @@ class Building(CityObject):
Set building storeys number above ground Set building storeys number above ground
:param value: int :param value: int
""" """
self._storeys_above_ground = int(value) if value is not None:
self._storeys_above_ground = int(value)
@staticmethod @staticmethod
def _tuple_to_point(xy_tuple): def _tuple_to_point(xy_tuple):

View File

@ -4,6 +4,8 @@ SPDX - License - Identifier: LGPL - 3.0 - or -later
Copyright © 2020 Project Author Guille Gutierrez guillermo.gutierrezmorote@concordia.ca Copyright © 2020 Project Author Guille Gutierrez guillermo.gutierrezmorote@concordia.ca
""" """
from typing import Union
class InternalGains: class InternalGains:
""" """
@ -17,10 +19,10 @@ class InternalGains:
self._latent_fraction = None self._latent_fraction = None
@property @property
def average_internal_gain(self): def average_internal_gain(self) -> Union[None, float]:
""" """
Get internal gains average internal gain in W/m2 Get internal gains average internal gain in W/m2
:return: float :return: None or float
""" """
return self._average_internal_gain return self._average_internal_gain
@ -28,15 +30,16 @@ class InternalGains:
def average_internal_gain(self, value): def average_internal_gain(self, value):
""" """
Set internal gains average internal gain in W/m2 Set internal gains average internal gain in W/m2
:param value: float :param value:float
""" """
self._average_internal_gain = float(value) if value is not None:
self._average_internal_gain = float(value)
@property @property
def convective_fraction(self): def convective_fraction(self) -> Union[None, float]:
""" """
Get internal gains convective fraction Get internal gains convective fraction
:return: float :return: None or float
""" """
return self._convective_fraction return self._convective_fraction
@ -46,13 +49,14 @@ class InternalGains:
Set internal gains convective fraction Set internal gains convective fraction
:param value: float :param value: float
""" """
self._convective_fraction = float(value) if value is not None:
self._convective_fraction = float(value)
@property @property
def radiative_fraction(self): def radiative_fraction(self) -> Union[None, float]:
""" """
Get internal gains radiative fraction Get internal gains radiative fraction
:return: float :return: None or float
""" """
return self._radiative_fraction return self._radiative_fraction
@ -62,13 +66,14 @@ class InternalGains:
Set internal gains convective fraction Set internal gains convective fraction
:param value: float :param value: float
""" """
self._radiative_fraction = float(value) if value is not None:
self._radiative_fraction = float(value)
@property @property
def latent_fraction(self): def latent_fraction(self) -> Union[None, float]:
""" """
Get internal gains latent fraction Get internal gains latent fraction
:return: float :return: None or float
""" """
return self._latent_fraction return self._latent_fraction
@ -78,4 +83,5 @@ class InternalGains:
Set internal gains latent fraction Set internal gains latent fraction
:param value: float :param value: float
""" """
self._latent_fraction = float(value) if value is not None:
self._latent_fraction = float(value)

View File

@ -4,6 +4,7 @@ SPDX - License - Identifier: LGPL - 3.0 - or -later
Copyright © 2020 Project Author Guille Gutierrez guillermo.gutierrezmorote@concordia.ca Copyright © 2020 Project Author Guille Gutierrez guillermo.gutierrezmorote@concordia.ca
""" """
import uuid import uuid
from typing import Union
from city_model_structure.building_demand.material import Material from city_model_structure.building_demand.material import Material
@ -43,10 +44,10 @@ class Layer:
self._material = value self._material = value
@property @property
def thickness(self): def thickness(self) -> Union[None, float]:
""" """
Get layer thickness in meters Get layer thickness in meters
:return: float :return: None or float
""" """
return self._thickness return self._thickness
@ -56,4 +57,5 @@ class Layer:
Get layer thickness in meters Get layer thickness in meters
:param value: float :param value: float
""" """
self._thickness = float(value) if value is not None:
self._thickness = float(value)

View File

@ -4,6 +4,9 @@ SPDX - License - Identifier: LGPL - 3.0 - or -later
Copyright © 2020 Project Author Guille Gutierrez guillermo.gutierrezmorote@concordia.ca Copyright © 2020 Project Author Guille Gutierrez guillermo.gutierrezmorote@concordia.ca
""" """
import ast
from typing import Union
class Material: class Material:
""" """
@ -37,10 +40,10 @@ class Material:
self._name = str(value) self._name = str(value)
@property @property
def conductivity(self): def conductivity(self) -> Union[None, float]:
""" """
Get material conductivity in W/mK Get material conductivity in W/mK
:return: float :return: None or float
""" """
return self._conductivity return self._conductivity
@ -50,13 +53,14 @@ class Material:
Set material conductivity in W/mK Set material conductivity in W/mK
:param value: float :param value: float
""" """
self._conductivity = float(value) if value is not None:
self._conductivity = float(value)
@property @property
def specific_heat(self): def specific_heat(self) -> Union[None, float]:
""" """
Get material conductivity in J/kgK Get material conductivity in J/kgK
:return: float :return: None or float
""" """
return self._specific_heat return self._specific_heat
@ -66,13 +70,14 @@ class Material:
Get material conductivity in J/kgK Get material conductivity in J/kgK
:param value: float :param value: float
""" """
self._specific_heat = float(value) if value is not None:
self._specific_heat = float(value)
@property @property
def density(self): def density(self) -> Union[None, float]:
""" """
Get material density in kg/m3 Get material density in kg/m3
:return: float :return: None or float
""" """
return self._density return self._density
@ -82,13 +87,14 @@ class Material:
Set material density in kg/m3 Set material density in kg/m3
:param value: float :param value: float
""" """
self._density = float(value) if value is not None:
self._density = float(value)
@property @property
def solar_absorptance(self): def solar_absorptance(self) -> Union[None, float]:
""" """
Get material solar absorptance Get material solar absorptance
:return: float :return: None or float
""" """
return self._solar_absorptance return self._solar_absorptance
@ -98,13 +104,14 @@ class Material:
Set material solar absorptance Set material solar absorptance
:param value: float :param value: float
""" """
self._solar_absorptance = float(value) if value is not None:
self._solar_absorptance = float(value)
@property @property
def thermal_absorptance(self): def thermal_absorptance(self) -> Union[None, float]:
""" """
Get material thermal absorptance Get material thermal absorptance
:return: float :return: None or float
""" """
return self._thermal_absorptance return self._thermal_absorptance
@ -114,13 +121,14 @@ class Material:
Set material thermal absorptance Set material thermal absorptance
:param value: float :param value: float
""" """
self._thermal_absorptance = float(value) if value is not None:
self._thermal_absorptance = float(value)
@property @property
def visible_absorptance(self): def visible_absorptance(self) -> Union[None, float]:
""" """
Get material visible absorptance Get material visible absorptance
:return: float :return: None or float
""" """
return self._visible_absorptance return self._visible_absorptance
@ -130,13 +138,14 @@ class Material:
Set material visible absorptance Set material visible absorptance
:param value: float :param value: float
""" """
self._visible_absorptance = float(value) if value is not None:
self._visible_absorptance = float(value)
@property @property
def no_mass(self): def no_mass(self) -> Union[None, bool]:
""" """
Get material no mass flag Get material no mass flag
:return: Boolean :return: None or Boolean
""" """
return self._no_mass return self._no_mass
@ -146,13 +155,14 @@ class Material:
Set material no mass flag Set material no mass flag
:param value: Boolean :param value: Boolean
""" """
self._no_mass = bool(value) if value is not None:
self._no_mass = value
@property @property
def thermal_resistance(self): def thermal_resistance(self) -> Union[None, float]:
""" """
Get material thermal resistance in m2K/W Get material thermal resistance in m2K/W
:return: float :return: None or float
""" """
return self._thermal_resistance return self._thermal_resistance
@ -162,4 +172,5 @@ class Material:
Set material thermal resistance in m2K/W Set material thermal resistance in m2K/W
:param value: float :param value: float
""" """
self._thermal_resistance = float(value) if value is not None:
self._thermal_resistance = float(value)

View File

@ -62,6 +62,15 @@ class Surface:
raise ValueError('Undefined surface id') raise ValueError('Undefined surface id')
return self._id return self._id
@id.setter
def id(self, value):
"""
Set the surface id
:param value: str
"""
if value is not None:
self._id = str(value)
@property @property
def share_surfaces(self): def share_surfaces(self):
""" """
@ -69,19 +78,11 @@ class Surface:
""" """
raise NotImplementedError raise NotImplementedError
@id.setter
def id(self, value):
"""
Set the surface id
:param value: str
"""
self._id = str(value)
@property @property
def swr(self): def swr(self) -> Union[None, float]:
""" """
Get surface short wave reflectance Get surface short wave reflectance
:return: float :return: None or float
""" """
return self._swr return self._swr
@ -91,7 +92,8 @@ class Surface:
Set surface short wave reflectance Set surface short wave reflectance
:param value: float :param value: float
""" """
self._swr = float(value) if value is not None:
self._swr = float(value)
def _max_coord(self, axis): def _max_coord(self, axis):
if axis == 'x': if axis == 'x':

View File

@ -129,10 +129,10 @@ class ThermalBoundary:
return self._thickness return self._thickness
@property @property
def outside_solar_absorptance(self): def outside_solar_absorptance(self) -> Union[None, float]:
""" """
Get thermal boundary outside solar absorptance Get thermal boundary outside solar absorptance
:return: float :return: None or float
""" """
return self._outside_solar_absorptance return self._outside_solar_absorptance
@ -142,11 +142,12 @@ class ThermalBoundary:
Set thermal boundary outside solar absorptance Set thermal boundary outside solar absorptance
:param value: float :param value: float
""" """
self._outside_solar_absorptance = float(value) if value is not None:
self._shortwave_reflectance = 1.0 - value self._outside_solar_absorptance = float(value)
self._shortwave_reflectance = 1.0 - float(value)
@property @property
def outside_thermal_absorptance(self): def outside_thermal_absorptance(self) -> Union[None, float]:
""" """
Get thermal boundary outside thermal absorptance Get thermal boundary outside thermal absorptance
:return: float :return: float
@ -159,13 +160,14 @@ class ThermalBoundary:
Set thermal boundary outside thermal absorptance Set thermal boundary outside thermal absorptance
:param value: float :param value: float
""" """
self._outside_thermal_absorptance = float(value) if value is not None:
self._outside_thermal_absorptance = float(value)
@property @property
def outside_visible_absorptance(self): def outside_visible_absorptance(self) -> Union[None, float]:
""" """
Get thermal boundary outside visible absorptance Get thermal boundary outside visible absorptance
:return: float :return: None or float
""" """
return self._outside_visible_absorptance return self._outside_visible_absorptance
@ -175,7 +177,8 @@ class ThermalBoundary:
Set thermal boundary outside visible absorptance Set thermal boundary outside visible absorptance
:param value: float :param value: float
""" """
self._outside_visible_absorptance = float(value) if value is not None:
self._outside_visible_absorptance = float(value)
@property @property
def thermal_openings(self) -> List[ThermalOpening]: def thermal_openings(self) -> List[ThermalOpening]:
@ -203,10 +206,10 @@ class ThermalBoundary:
self._thermal_openings = value self._thermal_openings = value
@property @property
def construction_name(self): def construction_name(self) -> Union[None, str]:
""" """
Get construction name Get construction name
:return: str :return: None or str
""" """
return self._construction_name return self._construction_name
@ -216,7 +219,8 @@ class ThermalBoundary:
Set construction name Set construction name
:param value: str :param value: str
""" """
self._construction_name = str(value) if value is not None:
self._construction_name = str(value)
@property @property
def layers(self) -> List[Layer]: def layers(self) -> List[Layer]:
@ -243,10 +247,10 @@ class ThermalBoundary:
return self._surface.type return self._surface.type
@property @property
def window_ratio(self): def window_ratio(self) -> Union[None, float]:
""" """
Get thermal boundary window ratio Get thermal boundary window ratio
:return: float :return: None or float
""" """
return self._window_ratio return self._window_ratio
@ -256,14 +260,15 @@ class ThermalBoundary:
Set thermal boundary window ratio Set thermal boundary window ratio
:param value: float :param value: float
""" """
self._window_ratio = float(value) if value is not None:
self._window_ratio = float(value)
@property @property
def u_value(self): def u_value(self) -> Union[None, float]:
""" """
Get thermal boundary U-value in W/m2K Get thermal boundary U-value in W/m2K
internal and external convective coefficient in W/m2K values, can be configured at configuration.ini internal and external convective coefficient in W/m2K values, can be configured at configuration.ini
:return: float :return: None or float
""" """
if self._u_value is None: if self._u_value is None:
h_i = self.hi h_i = self.hi
@ -286,13 +291,14 @@ class ThermalBoundary:
Set thermal boundary U-value in W/m2K Set thermal boundary U-value in W/m2K
:param value: float :param value: float
""" """
self._u_value = float(value) if value is not None:
self._u_value = float(value)
@property @property
def shortwave_reflectance(self): def shortwave_reflectance(self) -> Union[None, float]:
""" """
Get thermal boundary shortwave reflectance Get thermal boundary shortwave reflectance
:return: float :return: None or float
""" """
return self._shortwave_reflectance return self._shortwave_reflectance
@ -302,14 +308,15 @@ class ThermalBoundary:
Set thermal boundary shortwave reflectance Set thermal boundary shortwave reflectance
:param value: float :param value: float
""" """
self._shortwave_reflectance = float(value) if value is not None:
self._outside_solar_absorptance = 1.0 - value self._shortwave_reflectance = float(value)
self._outside_solar_absorptance = 1.0 - float(value)
@property @property
def hi(self): def hi(self) -> Union[None, float]:
""" """
Get internal convective heat transfer coefficient (W/m2K) Get internal convective heat transfer coefficient (W/m2K)
:return: float :return: None or float
""" """
return self._hi return self._hi
@ -319,13 +326,14 @@ class ThermalBoundary:
Set internal convective heat transfer coefficient (W/m2K) Set internal convective heat transfer coefficient (W/m2K)
:param value: float :param value: float
""" """
self._hi = float(value) if value is not None:
self._hi = float(value)
@property @property
def he(self): def he(self) -> Union[None, float]:
""" """
Get external convective heat transfer coefficient (W/m2K) Get external convective heat transfer coefficient (W/m2K)
:return: float :return: None or float
""" """
return self._he return self._he
@ -335,7 +343,8 @@ class ThermalBoundary:
Set external convective heat transfer coefficient (W/m2K) Set external convective heat transfer coefficient (W/m2K)
:param value: float :param value: float
""" """
self._he = float(value) if value is not None:
self._he = float(value)
@property @property
def surface_geometry(self): def surface_geometry(self):
@ -356,10 +365,10 @@ class ThermalBoundary:
# todo: need extract information from construction library or assume them at the beginning of workflows # todo: need extract information from construction library or assume them at the beginning of workflows
@property @property
def inside_emissivity(self): def inside_emissivity(self) -> Union[None, float]:
""" """
Get the short wave emissivity factor of the thermal boundary's internal surface (-) Get the short wave emissivity factor of the thermal boundary's internal surface (-)
:return: float :return: None or float
""" """
return self._inside_emissivity return self._inside_emissivity
@ -369,13 +378,14 @@ class ThermalBoundary:
Set short wave emissivity factor of the thermal boundary's internal surface (-) Set short wave emissivity factor of the thermal boundary's internal surface (-)
:param value: float :param value: float
""" """
self._inside_emissivity = float(value) if value is not None:
self._inside_emissivity = float(value)
@property @property
def alpha_coefficient(self): def alpha_coefficient(self) -> Union[None, float]:
""" """
Get the long wave emissivity factor of the thermal boundary's internal surface (-) Get the long wave emissivity factor of the thermal boundary's internal surface (-)
:return: float :return: None or float
""" """
return self._alpha_coefficient return self._alpha_coefficient
@ -385,13 +395,14 @@ class ThermalBoundary:
Set long wave emissivity factor of the thermal boundary's internal surface (-) Set long wave emissivity factor of the thermal boundary's internal surface (-)
:param value: float :param value: float
""" """
self._alpha_coefficient = float(value) if value is not None:
self._alpha_coefficient = float(value)
@property @property
def radiative_coefficient(self): def radiative_coefficient(self) -> Union[None, float]:
""" """
Get the radiative coefficient of the thermal boundary's external surface (-) Get the radiative coefficient of the thermal boundary's external surface (-)
:return: float :return: None or float
""" """
return self._radiative_coefficient return self._radiative_coefficient
@ -401,4 +412,5 @@ class ThermalBoundary:
Set radiative coefficient of the thermal boundary's external surface (-) Set radiative coefficient of the thermal boundary's external surface (-)
:param value: float :param value: float
""" """
self._radiative_coefficient = float(value) if value is not None:
self._radiative_coefficient = float(value)

View File

@ -5,7 +5,7 @@ Copyright © 2020 Project Author Guille Gutierrez guillermo.gutierrezmorote@conc
Contributors Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca Contributors Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca
""" """
import uuid import uuid
from typing import TypeVar from typing import TypeVar, Union
Polygon = TypeVar('Polygon') Polygon = TypeVar('Polygon')
@ -43,10 +43,10 @@ class ThermalOpening:
return self._id return self._id
@property @property
def area(self): def area(self) -> Union[None, float]:
""" """
Get thermal opening area in square meters Get thermal opening area in square meters
:return: float :return: None or float
""" """
return self._area return self._area
@ -56,7 +56,8 @@ class ThermalOpening:
Set thermal opening area in square meters Set thermal opening area in square meters
:param value: float :param value: float
""" """
self._area = float(value) if value is not None:
self._area = float(value)
@property @property
def openable_ratio(self): def openable_ratio(self):
@ -73,10 +74,10 @@ class ThermalOpening:
raise NotImplementedError raise NotImplementedError
@property @property
def conductivity(self): def conductivity(self) -> Union[None, float]:
""" """
Get thermal opening conductivity in W/mK Get thermal opening conductivity in W/mK
:return: float :return: None or float
""" """
return self._conductivity return self._conductivity
@ -88,18 +89,19 @@ class ThermalOpening:
""" """
# The code to calculate overall_u_value is duplicated here and in thickness_m. # The code to calculate overall_u_value is duplicated here and in thickness_m.
# This ensures a more robust code that returns the overall_u_value regardless the order the parameters are read. # This ensures a more robust code that returns the overall_u_value regardless the order the parameters are read.
self._conductivity = float(value) if value is not None:
if self._overall_u_value is None and self.thickness is not None: self._conductivity = float(value)
h_i = self.hi if self._overall_u_value is None and self.thickness is not None:
h_e = self.he h_i = self.hi
r_value = 1 / h_i + 1 / h_e + float(self.conductivity) / float(self.thickness) h_e = self.he
self._overall_u_value = 1 / r_value r_value = 1 / h_i + 1 / h_e + float(self._conductivity) / float(self.thickness)
self._overall_u_value = 1 / r_value
@property @property
def frame_ratio(self): def frame_ratio(self) -> Union[None, float]:
""" """
Get thermal opening frame ratio Get thermal opening frame ratio
:return: float :return: None or float
""" """
return self._frame_ratio return self._frame_ratio
@ -109,13 +111,14 @@ class ThermalOpening:
Set thermal opening frame ratio Set thermal opening frame ratio
:param value: float :param value: float
""" """
self._frame_ratio = float(value) if value is not None:
self._frame_ratio = float(value)
@property @property
def g_value(self): def g_value(self) -> Union[None, float]:
""" """
Get thermal opening g-value Get thermal opening g-value
:return: float :return: None or float
""" """
return self._g_value return self._g_value
@ -125,13 +128,14 @@ class ThermalOpening:
Set thermal opening g-value Set thermal opening g-value
:param value: float :param value: float
""" """
self._g_value = float(value) if value is not None:
self._g_value = float(value)
@property @property
def thickness(self): def thickness(self) -> Union[None, float]:
""" """
Get thermal opening thickness in meters Get thermal opening thickness in meters
:return: float :return: None or float
""" """
return self._thickness return self._thickness
@ -143,18 +147,19 @@ class ThermalOpening:
""" """
# The code to calculate overall_u_value is duplicated here and in conductivity. # The code to calculate overall_u_value is duplicated here and in conductivity.
# This ensures a more robust code that returns the overall_u_value regardless the order the parameters are read. # This ensures a more robust code that returns the overall_u_value regardless the order the parameters are read.
self._thickness = float(value) if value is not None:
if self._overall_u_value is None and self.conductivity is not None: self._thickness = float(value)
h_i = self.hi if self._overall_u_value is None and self.conductivity is not None:
h_e = self.he h_i = self.hi
r_value = 1 / h_i + 1 / h_e + float(self.conductivity) / float(self.thickness) h_e = self.he
self._overall_u_value = 1 / r_value r_value = 1 / h_i + 1 / h_e + float(self.conductivity) / float(self._thickness)
self._overall_u_value = 1 / r_value
@property @property
def front_side_solar_transmittance_at_normal_incidence(self): def front_side_solar_transmittance_at_normal_incidence(self) -> Union[None, float]:
""" """
Get thermal opening front side solar transmittance at normal incidence Get thermal opening front side solar transmittance at normal incidence
:return: float :return: None or float
""" """
return self._front_side_solar_transmittance_at_normal_incidence return self._front_side_solar_transmittance_at_normal_incidence
@ -164,13 +169,14 @@ class ThermalOpening:
Set thermal opening front side solar transmittance at normal incidence Set thermal opening front side solar transmittance at normal incidence
:param value: float :param value: float
""" """
self._front_side_solar_transmittance_at_normal_incidence = float(value) if value is not None:
self._front_side_solar_transmittance_at_normal_incidence = float(value)
@property @property
def back_side_solar_transmittance_at_normal_incidence(self): def back_side_solar_transmittance_at_normal_incidence(self) -> Union[None, float]:
""" """
Get thermal opening back side solar transmittance at normal incidence Get thermal opening back side solar transmittance at normal incidence
:return: float :return: None or float
""" """
return self._back_side_solar_transmittance_at_normal_incidence return self._back_side_solar_transmittance_at_normal_incidence
@ -180,13 +186,14 @@ class ThermalOpening:
Set thermal opening back side solar transmittance at normal incidence Set thermal opening back side solar transmittance at normal incidence
:param value: float :param value: float
""" """
self._back_side_solar_transmittance_at_normal_incidence = float(value) if value is not None:
self._back_side_solar_transmittance_at_normal_incidence = float(value)
@property @property
def overall_u_value(self): def overall_u_value(self) -> Union[None, float]:
""" """
Get thermal opening overall U-value in W/m2K Get thermal opening overall U-value in W/m2K
:return: float :return: None or float
""" """
return self._overall_u_value return self._overall_u_value
@ -196,13 +203,14 @@ class ThermalOpening:
Set thermal opening overall U-value in W/m2K Set thermal opening overall U-value in W/m2K
:param value: float :param value: float
""" """
self._overall_u_value = float(value) if value is not None:
self._overall_u_value = float(value)
@property @property
def hi(self): def hi(self) -> Union[None, float]:
""" """
Get internal convective heat transfer coefficient (W/m2K) Get internal convective heat transfer coefficient (W/m2K)
:return: float :return: None or float
""" """
return self._hi return self._hi
@ -212,13 +220,14 @@ class ThermalOpening:
Set internal convective heat transfer coefficient (W/m2K) Set internal convective heat transfer coefficient (W/m2K)
:param value: float :param value: float
""" """
self._hi = float(value) if value is not None:
self._hi = float(value)
@property @property
def he(self): def he(self) -> Union[None, float]:
""" """
Get external convective heat transfer coefficient (W/m2K) Get external convective heat transfer coefficient (W/m2K)
:return: float :return: None or float
""" """
return self._he return self._he
@ -228,7 +237,8 @@ class ThermalOpening:
Set external convective heat transfer coefficient (W/m2K) Set external convective heat transfer coefficient (W/m2K)
:param value: float :param value: float
""" """
self._he = float(value) if value is not None:
self._he = float(value)
@property @property
def surface_geometry(self) -> Polygon: def surface_geometry(self) -> Polygon:
@ -240,10 +250,10 @@ class ThermalOpening:
# todo: need extract information from construction library or assume them at the beginning of workflows # todo: need extract information from construction library or assume them at the beginning of workflows
@property @property
def inside_emissivity(self): def inside_emissivity(self) -> Union[None, float]:
""" """
Get the short wave emissivity factor of the thermal opening's internal surface (-) Get the short wave emissivity factor of the thermal opening's internal surface (-)
:return: float :return: None or float
""" """
return self._inside_emissivity return self._inside_emissivity
@ -253,13 +263,14 @@ class ThermalOpening:
Set short wave emissivity factor of the thermal opening's internal surface (-) Set short wave emissivity factor of the thermal opening's internal surface (-)
:param value: float :param value: float
""" """
self._inside_emissivity = float(value) if value is not None:
self._inside_emissivity = float(value)
@property @property
def alpha_coefficient(self): def alpha_coefficient(self) -> Union[None, float]:
""" """
Get the long wave emissivity factor of the thermal opening's internal surface (-) Get the long wave emissivity factor of the thermal opening's internal surface (-)
:return: float :return: None or float
""" """
return self._alpha_coefficient return self._alpha_coefficient
@ -269,13 +280,14 @@ class ThermalOpening:
Set long wave emissivity factor of the thermal opening's internal surface (-) Set long wave emissivity factor of the thermal opening's internal surface (-)
:param value: float :param value: float
""" """
self._alpha_coefficient = float(value) if value is not None:
self._alpha_coefficient = float(value)
@property @property
def radiative_coefficient(self): def radiative_coefficient(self) -> Union[None, float]:
""" """
Get the radiative coefficient of the thermal opening's external surface (-) Get the radiative coefficient of the thermal opening's external surface (-)
:return: float :return: None or float
""" """
return self._radiative_coefficient return self._radiative_coefficient
@ -285,4 +297,5 @@ class ThermalOpening:
Set radiative coefficient of the thermal opening's external surface (-) Set radiative coefficient of the thermal opening's external surface (-)
:param value: float :param value: float
""" """
self._radiative_coefficient = float(value) if value is not None:
self._radiative_coefficient = float(value)

View File

@ -5,8 +5,9 @@ Copyright © 2020 Project Author Guille Gutierrez guillermo.gutierrezmorote@conc
Contributors Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca Contributors Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca
""" """
import uuid import uuid
from typing import List, TypeVar from typing import List, TypeVar, Union
from city_model_structure.building_demand.usage_zone import UsageZone from city_model_structure.building_demand.usage_zone import UsageZone
import ast
ThermalBoundary = TypeVar('ThermalBoundary') ThermalBoundary = TypeVar('ThermalBoundary')
Polyhedron = TypeVar('Polyhedron') Polyhedron = TypeVar('Polyhedron')
@ -42,13 +43,22 @@ class ThermalZone:
return self._id return self._id
@property @property
def is_mechanically_ventilated(self): def is_mechanically_ventilated(self) -> Union[None, bool]:
""" """
Get thermal zone mechanical ventilation flag Get thermal zone mechanical ventilation flag
:return: Boolean :return: None or Boolean
""" """
return self._is_mechanically_ventilated return self._is_mechanically_ventilated
@is_mechanically_ventilated.setter
def is_mechanically_ventilated(self, value):
"""
Set thermal zone mechanical ventilation flag
:param value: Boolean
"""
if value is not None:
self._is_mechanically_ventilated = ast.literal_eval(value)
@property @property
def floor_area(self): def floor_area(self):
""" """
@ -72,10 +82,10 @@ class ThermalZone:
return self._thermal_boundaries return self._thermal_boundaries
@property @property
def additional_thermal_bridge_u_value(self): def additional_thermal_bridge_u_value(self) -> Union[None, float]:
""" """
Get thermal zone additional thermal bridge u value W/m2K Get thermal zone additional thermal bridge u value W/m2K
:return: float :return: None or float
""" """
return self._additional_thermal_bridge_u_value return self._additional_thermal_bridge_u_value
@ -85,13 +95,14 @@ class ThermalZone:
Set thermal zone additional thermal bridge u value W/m2K Set thermal zone additional thermal bridge u value W/m2K
:param value: float :param value: float
""" """
self._additional_thermal_bridge_u_value = float(value) if value is not None:
self._additional_thermal_bridge_u_value = float(value)
@property @property
def effective_thermal_capacity(self): def effective_thermal_capacity(self) -> Union[None, float]:
""" """
Get thermal zone effective thermal capacity in J/m2K Get thermal zone effective thermal capacity in J/m2K
:return: float :return: None or float
""" """
return self._effective_thermal_capacity return self._effective_thermal_capacity
@ -101,13 +112,14 @@ class ThermalZone:
Set thermal zone effective thermal capacity in J/m2K Set thermal zone effective thermal capacity in J/m2K
:param value: float :param value: float
""" """
self._effective_thermal_capacity = float(value) if value is not None:
self._effective_thermal_capacity = float(value)
@property @property
def indirectly_heated_area_ratio(self): def indirectly_heated_area_ratio(self) -> Union[None, float]:
""" """
Get thermal zone indirectly heated area ratio Get thermal zone indirectly heated area ratio
:return: float :return: None or float
""" """
return self._indirectly_heated_area_ratio return self._indirectly_heated_area_ratio
@ -117,13 +129,14 @@ class ThermalZone:
Set thermal zone indirectly heated area ratio Set thermal zone indirectly heated area ratio
:param value: float :param value: float
""" """
self._indirectly_heated_area_ratio = float(value) if value is not None:
self._indirectly_heated_area_ratio = float(value)
@property @property
def infiltration_rate_system_on(self): def infiltration_rate_system_on(self) -> Union[None, float]:
""" """
Get thermal zone infiltration rate system on in air changes per hour (ACH) Get thermal zone infiltration rate system on in air changes per hour (ACH)
:return: float :return: None or float
""" """
return self._infiltration_rate_system_on return self._infiltration_rate_system_on
@ -133,13 +146,14 @@ class ThermalZone:
Set thermal zone infiltration rate system on in air changes per hour (ACH) Set thermal zone infiltration rate system on in air changes per hour (ACH)
:param value: float :param value: float
""" """
self._infiltration_rate_system_on = float(value) if value is not None:
self._infiltration_rate_system_on = float(value)
@property @property
def infiltration_rate_system_off(self): def infiltration_rate_system_off(self) -> Union[None, float]:
""" """
Get thermal zone infiltration rate system off in air changes per hour (ACH) Get thermal zone infiltration rate system off in air changes per hour (ACH)
:return: float :return: None or float
""" """
return self._infiltration_rate_system_off return self._infiltration_rate_system_off
@ -149,7 +163,8 @@ class ThermalZone:
Set thermal zone infiltration rate system on in air changes per hour (ACH) Set thermal zone infiltration rate system on in air changes per hour (ACH)
:param value: float :param value: float
""" """
self._infiltration_rate_system_off = float(value) if value is not None:
self._infiltration_rate_system_off = float(value)
@property @property
def usage_zones(self) -> List[UsageZone]: def usage_zones(self) -> List[UsageZone]:
@ -184,10 +199,10 @@ class ThermalZone:
return self._volume_geometry return self._volume_geometry
@property @property
def ordinate_number(self): def ordinate_number(self) -> Union[None, int]:
""" """
Get the order in which the thermal_zones need to be enumerated Get the order in which the thermal_zones need to be enumerated
:return: int :return: None or int
""" """
return self._ordinate_number return self._ordinate_number
@ -197,4 +212,5 @@ class ThermalZone:
Set a specific order of the zones to be called Set a specific order of the zones to be called
:param value: int :param value: int
""" """
self._ordinate_number = int(value) if value is not None:
self._ordinate_number = int(value)

View File

@ -5,7 +5,8 @@ Copyright © 2020 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.mons
Contributors Guille Gutierrez guillermo.gutierrezmorote@concordia.ca Contributors Guille Gutierrez guillermo.gutierrezmorote@concordia.ca
""" """
import uuid import uuid
from typing import List, TypeVar from typing import List, TypeVar, Union
import ast
InternalGains = TypeVar('InternalGains') InternalGains = TypeVar('InternalGains')
Occupants = TypeVar('Occupants') Occupants = TypeVar('Occupants')
@ -24,6 +25,7 @@ class UsageZone:
self._heating_setpoint = None self._heating_setpoint = None
self._heating_setback = None self._heating_setback = None
self._cooling_setpoint = None self._cooling_setpoint = None
self._occupancy_density = None
self._hours_day = None self._hours_day = None
self._days_year = None self._days_year = None
self._dhw_average_volume_pers_day = None self._dhw_average_volume_pers_day = None
@ -64,10 +66,10 @@ class UsageZone:
self._internal_gains = value self._internal_gains = value
@property @property
def heating_setpoint(self): def heating_setpoint(self) -> Union[None, float]:
""" """
Get usage zone heating set point in Celsius Get usage zone heating set point in Celsius
:return: float :return: None or float
""" """
return self._heating_setpoint return self._heating_setpoint
@ -77,13 +79,14 @@ class UsageZone:
Set usage zone heating set point in Celsius Set usage zone heating set point in Celsius
:param value: float :param value: float
""" """
self._heating_setpoint = float(value) if value is not None:
self._heating_setpoint = float(value)
@property @property
def heating_setback(self): def heating_setback(self) -> Union[None, float]:
""" """
Get usage zone heating setback in Celsius Get usage zone heating setback in Celsius
:return: float :return: None or float
""" """
return self._heating_setback return self._heating_setback
@ -93,13 +96,14 @@ class UsageZone:
Set usage zone heating setback in Celsius Set usage zone heating setback in Celsius
:param value: float :param value: float
""" """
self._heating_setback = float(value) if value is not None:
self._heating_setback = float(value)
@property @property
def cooling_setpoint(self): def cooling_setpoint(self) -> Union[None, float]:
""" """
Get usage zone cooling setpoint in Celsius Get usage zone cooling setpoint in Celsius
:return: float :return: None or float
""" """
return self._cooling_setpoint return self._cooling_setpoint
@ -109,13 +113,14 @@ class UsageZone:
Set usage zone cooling setpoint in Celsius Set usage zone cooling setpoint in Celsius
:param value: float :param value: float
""" """
self._cooling_setpoint = float(value) if value is not None:
self._cooling_setpoint = float(value)
@property @property
def hours_day(self): def hours_day(self) -> Union[None, float]:
""" """
Get usage zone usage hours per day Get usage zone usage hours per day
:return: float :return: None or float
""" """
return self._hours_day return self._hours_day
@ -125,13 +130,14 @@ class UsageZone:
Set usage zone usage hours per day Set usage zone usage hours per day
:param value: float :param value: float
""" """
self._hours_day = float(value) if value is not None:
self._hours_day = float(value)
@property @property
def days_year(self): def days_year(self) -> Union[None, float]:
""" """
Get usage zone usage days per year Get usage zone usage days per year
:return: float :return: None or float
""" """
return self._days_year return self._days_year
@ -141,13 +147,14 @@ class UsageZone:
Set usage zone usage days per year Set usage zone usage days per year
:param value: float :param value: float
""" """
self._days_year = float(value) if value is not None:
self._days_year = float(value)
@property @property
def mechanical_air_change(self): def mechanical_air_change(self) -> Union[None, float]:
""" """
Get usage zone mechanical air change in air change per hour (ACH) Get usage zone mechanical air change in air change per hour (ACH)
:return: float :return: None or float
""" """
return self._mechanical_air_change return self._mechanical_air_change
@ -157,13 +164,14 @@ class UsageZone:
Set usage zone mechanical air change in air change per hour (ACH) Set usage zone mechanical air change in air change per hour (ACH)
:param value: float :param value: float
""" """
self._mechanical_air_change = float(value) if value is not None:
self._mechanical_air_change = float(value)
@property @property
def usage(self): def usage(self) -> Union[None, str]:
""" """
Get usage zone usage Get usage zone usage
:return: str :return: None or str
""" """
return self._usage return self._usage
@ -173,7 +181,8 @@ class UsageZone:
Set usage zone usage Set usage zone usage
:param value: str :param value: str
""" """
self._usage = str(value) if value is not None:
self._usage = str(value)
@property @property
def occupants(self) -> List[Occupants]: def occupants(self) -> List[Occupants]:
@ -208,26 +217,44 @@ class UsageZone:
self._schedules = values self._schedules = values
@property @property
def dhw_average_volume_pers_day(self): def occupancy_density(self) -> Union[None, float]:
"""
Get density in persons per m2
:return: None or float
"""
return self._occupancy_density
@occupancy_density.setter
def occupancy_density(self, value):
"""
Set density in persons per m2
:param value: float
"""
if value is not None:
self._occupancy_density = float(value)
@property
def dhw_average_volume_pers_day(self) -> Union[None, float]:
""" """
Get average DHW consumption in cubic meters per person per day Get average DHW consumption in cubic meters per person per day
:return: float :return: None or float
""" """
return self._dhw_average_volume_pers_day return self._dhw_average_volume_pers_day
@dhw_average_volume_pers_day.setter @dhw_average_volume_pers_day.setter
def dhw_average_volume_pers_day(self, values): def dhw_average_volume_pers_day(self, value):
""" """
Set average DHW consumption in cubic meters per person per day Set average DHW consumption in cubic meters per person per day
:param values: float :param value: float
""" """
self._dhw_average_volume_pers_day = float(values) if value is not None:
self._dhw_average_volume_pers_day = float(value)
@property @property
def dhw_preparation_temperature(self): def dhw_preparation_temperature(self) -> Union[None, float]:
""" """
Get preparation temperature of the DHW in Celsius Get preparation temperature of the DHW in Celsius
:return: float :return: None or float
""" """
return self._dhw_preparation_temperature return self._dhw_preparation_temperature
@ -237,13 +264,14 @@ class UsageZone:
Set preparation temperature of the DHW in Celsius Set preparation temperature of the DHW in Celsius
:param value: float :param value: float
""" """
self._dhw_preparation_temperature = float(value) if value is not None:
self._dhw_preparation_temperature = float(value)
@property @property
def electrical_app_average_consumption_sqm_year(self): def electrical_app_average_consumption_sqm_year(self) -> Union[None, float]:
""" """
Get average consumption of electrical appliances in Joules hour per square meter and year (J/m2yr) Get average consumption of electrical appliances in Joules hour per square meter and year (J/m2yr)
:return: float :return: None or float
""" """
return self._electrical_app_average_consumption_sqm_year return self._electrical_app_average_consumption_sqm_year
@ -253,7 +281,8 @@ class UsageZone:
Set average consumption of electrical appliances in Joules per square meter and year (J/m2yr) Set average consumption of electrical appliances in Joules per square meter and year (J/m2yr)
:param value: float :param value: float
""" """
self._electrical_app_average_consumption_sqm_year = float(value) if value is not None:
self._electrical_app_average_consumption_sqm_year = float(value)
@property @property
def volume_geometry(self) -> Polyhedron: def volume_geometry(self) -> Polyhedron:
@ -264,10 +293,10 @@ class UsageZone:
return self._volume_geometry return self._volume_geometry
@property @property
def volume(self): def volume(self) -> Union[None, float]:
""" """
Get the volume in cubic meters Get the volume in cubic meters
:return: float :return: None or float
""" """
return self._volume return self._volume
@ -277,13 +306,14 @@ class UsageZone:
Set volume in cubic meters Set volume in cubic meters
:param value: float :param value: float
""" """
self._volume = float(value) if value is not None:
self._volume = float(value)
@property @property
def is_heated(self): def is_heated(self) -> Union[None, bool]:
""" """
Get thermal zone heated flag Get thermal zone heated flag
:return: Boolean :return: None or Boolean
""" """
return self._is_heated return self._is_heated
@ -293,13 +323,14 @@ class UsageZone:
Set thermal zone heated flag Set thermal zone heated flag
:param value: Boolean :param value: Boolean
""" """
self._is_heated = bool(value) if value is not None:
self._is_heated = ast.literal_eval(value)
@property @property
def is_cooled(self): def is_cooled(self) -> Union[None, bool]:
""" """
Get thermal zone cooled flag Get thermal zone cooled flag
:return: Boolean :return: None or Boolean
""" """
return self._is_cooled return self._is_cooled
@ -309,4 +340,5 @@ class UsageZone:
Set thermal zone cooled flag Set thermal zone cooled flag
:param value: Boolean :param value: Boolean
""" """
self._is_cooled = bool(value) if value is not None:
self._is_cooled = ast.literal_eval(value)

View File

@ -7,10 +7,10 @@ from __future__ import annotations
import sys import sys
import pickle import pickle
import math import math
from typing import List, Union, TypeVar from typing import List, Union
import pyproj import pyproj
from pyproj import Transformer from pyproj import Transformer
from pathlib import Path
from city_model_structure.building import Building from city_model_structure.building import Building
from city_model_structure.city_object import CityObject from city_model_structure.city_object import CityObject
@ -21,9 +21,6 @@ from helpers.geometry_helper import GeometryHelper
from helpers.location import Location from helpers.location import Location
Path = TypeVar('Path')
class City: class City:
""" """
City class City class
@ -80,10 +77,10 @@ class City:
return self._get_location().city return self._get_location().city
@property @property
def climate_reference_city(self): def climate_reference_city(self) -> Union[None, str]:
""" """
Get the name for the climatic information reference city Get the name for the climatic information reference city
:return: str :return: None or str
""" """
return self._climate_reference_city return self._climate_reference_city
@ -93,13 +90,14 @@ class City:
Set the name for the climatic information reference city Set the name for the climatic information reference city
:param value: str :param value: str
""" """
self._climate_reference_city = str(value) if value is not None:
self._climate_reference_city = str(value)
@property @property
def climate_file(self) -> Path: def climate_file(self) -> Union[None, Path]:
""" """
Get the climate file full path Get the climate file full path
:return: Path :return: None or Path
""" """
return self._climate_file return self._climate_file
@ -109,7 +107,8 @@ class City:
Set the climate file full path Set the climate file full path
:param value: Path :param value: Path
""" """
self._climate_file = Path(value) if value is not None:
self._climate_file = Path(value)
@property @property
def city_objects(self) -> Union[List[CityObject], None]: def city_objects(self) -> Union[List[CityObject], None]:
@ -211,10 +210,10 @@ class City:
self._buildings.remove(city_object) self._buildings.remove(city_object)
@property @property
def srs_name(self): def srs_name(self) -> Union[None, str]:
""" """
Get city srs name Get city srs name
:return: str :return: None or str
""" """
return self._srs_name return self._srs_name
@ -224,7 +223,8 @@ class City:
Set city name Set city name
:param value:str :param value:str
""" """
self._name = str(value) if value is not None:
self._name = str(value)
@staticmethod @staticmethod
def load(city_filename) -> City: def load(city_filename) -> City:
@ -267,10 +267,10 @@ class City:
return selected_region_city return selected_region_city
@property @property
def latitude(self): def latitude(self) -> Union[None, float]:
""" """
Get city latitude in degrees Get city latitude in degrees
:return: float :return: None or float
""" """
return self._latitude return self._latitude
@ -280,13 +280,14 @@ class City:
Set city latitude in degrees Set city latitude in degrees
:parameter value: float :parameter value: float
""" """
self._latitude = float(value) if value is not None:
self._latitude = float(value)
@property @property
def longitude(self): def longitude(self) -> Union[None, float]:
""" """
Get city longitude in degrees Get city longitude in degrees
:return: float :return: None or float
""" """
return self._longitude return self._longitude
@ -296,13 +297,14 @@ class City:
Set city longitude in degrees Set city longitude in degrees
:parameter value: float :parameter value: float
""" """
self._longitude = float(value) if value is not None:
self._longitude = float(value)
@property @property
def time_zone(self): def time_zone(self) -> Union[None, float]:
""" """
Get city time_zone Get city time_zone
:return: float :return: None or float
""" """
return self._time_zone return self._time_zone
@ -312,7 +314,8 @@ class City:
Set city time_zone Set city time_zone
:parameter value: float :parameter value: float
""" """
self._time_zone = float(value) if value is not None:
self._time_zone = float(value)
@property @property
def buildings_clusters(self) -> Union[List[BuildingsCluster], None]: def buildings_clusters(self) -> Union[List[BuildingsCluster], None]:

View File

@ -4,6 +4,8 @@ SPDX - License - Identifier: LGPL - 3.0 - or -later
Copyright © 2020 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca Copyright © 2020 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca
""" """
from typing import Union
class HeatPump: class HeatPump:
""" """
@ -14,10 +16,10 @@ class HeatPump:
self._seasonal_mean_coverage_factor = None self._seasonal_mean_coverage_factor = None
@property @property
def seasonal_mean_cop(self): def seasonal_mean_cop(self) -> Union[None, float]:
""" """
Get seasonal mean COP (-) Get seasonal mean COP (-)
:return: float :return: None or float
""" """
return self._seasonal_mean_cop return self._seasonal_mean_cop
@ -27,13 +29,14 @@ class HeatPump:
Set seasonal mean COP (-) Set seasonal mean COP (-)
:param value: float :param value: float
""" """
self._seasonal_mean_cop = float(value) if value is not None:
self._seasonal_mean_cop = float(value)
@property @property
def seasonal_mean_coverage_factor(self): def seasonal_mean_coverage_factor(self) -> Union[None, float]:
""" """
Get percentage of demand covered by the hp (-) Get percentage of demand covered by the hp (-)
:return: float :return: None or float
""" """
return self._seasonal_mean_coverage_factor return self._seasonal_mean_coverage_factor
@ -43,4 +46,5 @@ class HeatPump:
Set percentage of demand covered by the hp (-) Set percentage of demand covered by the hp (-)
:return: float :return: float
""" """
self._seasonal_mean_coverage_factor = float(value) if value is not None:
self._seasonal_mean_coverage_factor = float(value)

View File

@ -4,6 +4,8 @@ SPDX - License - Identifier: LGPL - 3.0 - or -later
Copyright © 2020 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca Copyright © 2020 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca
""" """
from typing import Union
class PvSystem: class PvSystem:
""" """
@ -18,10 +20,10 @@ class PvSystem:
self._electricity_generation = None self._electricity_generation = None
@property @property
def modules_mean_seasonal_efficiency(self): def modules_mean_seasonal_efficiency(self) -> Union[None, float]:
""" """
Get mean modules efficiency (-) Get mean modules efficiency (-)
:return: float :return: None or float
""" """
return self._modules_mean_seasonal_efficiency return self._modules_mean_seasonal_efficiency
@ -31,13 +33,14 @@ class PvSystem:
Set mean modules efficiency (-) Set mean modules efficiency (-)
:param value: float :param value: float
""" """
self._modules_mean_seasonal_efficiency = float(value) if value is not None:
self._modules_mean_seasonal_efficiency = float(value)
@property @property
def total_area(self): def total_area(self) -> Union[None, float]:
""" """
Get total modules area in square meters Get total modules area in square meters
:return: float :return: None or float
""" """
return self._total_area return self._total_area
@ -47,13 +50,14 @@ class PvSystem:
Set total modules area in square meters Set total modules area in square meters
:param value: float :param value: float
""" """
self._total_area = float(value) if value is not None:
self._total_area = float(value)
@property @property
def module_area(self): def module_area(self) -> Union[None, float]:
""" """
Get module area in square meters Get module area in square meters
:return: float :return: None or float
""" """
return self._module_area return self._module_area
@ -63,13 +67,14 @@ class PvSystem:
Set module area in square meters Set module area in square meters
:param value: float :param value: float
""" """
self._module_area = float(value) if value is not None:
self._module_area = float(value)
@property @property
def number_of_modules(self): def number_of_modules(self) -> Union[None, int]:
""" """
Get number of modules Get number of modules
:return: int :return: None or int
""" """
return self._number_of_modules return self._number_of_modules
@ -79,13 +84,14 @@ class PvSystem:
Set number of modules Set number of modules
:param value: int :param value: int
""" """
self._number_of_modules = int(value) if value is not None:
self._number_of_modules = int(value)
@property @property
def overall_system_performance_ratio(self): def overall_system_performance_ratio(self) -> Union[None, float]:
""" """
Get overall system performance ratio (-) Get overall system performance ratio (-)
:return: float :return: None or float
""" """
return self._overall_system_performance_ratio return self._overall_system_performance_ratio
@ -95,13 +101,14 @@ class PvSystem:
Set overall system performance ratio (-) Set overall system performance ratio (-)
:param value: float :param value: float
""" """
self._overall_system_performance_ratio = float(value) if value is not None:
self._overall_system_performance_ratio = float(value)
@property @property
def electricity_generation(self): def electricity_generation(self) -> Union[None, float]:
""" """
Get electricity generation in J Get electricity generation in J
:return: float :return: None or float
""" """
return self._electricity_generation return self._electricity_generation
@ -111,4 +118,5 @@ class PvSystem:
Set electricity generation in J Set electricity generation in J
:param value: float :param value: float
""" """
self._electricity_generation = float(value) if value is not None:
self._electricity_generation = float(value)

View File

@ -23,6 +23,8 @@ class Sensor:
Get sensor name Get sensor name
:return: str :return: str
""" """
if self._name is None:
raise ValueError('Undefined sensor name')
return self._name return self._name
@name.setter @name.setter
@ -31,7 +33,8 @@ class Sensor:
Set sensor name Set sensor name
:param value: str :param value: str
""" """
self._name = str(value) if value is not None:
self._name = str(value)
@property @property
def type(self): def type(self):

View File

@ -5,6 +5,10 @@ Copyright © 2020 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.mons
Contributor Milad milad.aghamohamadnia@concordia.ca Contributor Milad milad.aghamohamadnia@concordia.ca
Contributor Guille guille.gutierrezmorote@concordia.ca Contributor Guille guille.gutierrezmorote@concordia.ca
""" """
import ast
from typing import Union
from city_model_structure.attributes.edge import Edge from city_model_structure.attributes.edge import Edge
from city_model_structure.transport.lane import Lane from city_model_structure.transport.lane import Lane
@ -87,10 +91,10 @@ class Connection:
self._to_lane = value self._to_lane = value
@property @property
def pass_not_wait(self): def pass_not_wait(self) -> Union[None, bool]:
""" """
Get if the vehicles which pass this (lane to lane) connection will not wait Get if the vehicles which pass this (lane to lane) connection will not wait
:return: Boolean :return: None or Boolean
""" """
return self._pass return self._pass
@ -100,13 +104,14 @@ class Connection:
Set if the vehicles which pass this (lane to lane) connection will not wait Set if the vehicles which pass this (lane to lane) connection will not wait
:param value: Boolean :param value: Boolean
""" """
self._pass = bool(value) if value is not None:
self._pass = ast.literal_eval(value)
@property @property
def keep_clear(self): def keep_clear(self) -> Union[None, bool]:
""" """
Get if vehicles which pass this (lane to lane) connection should keep the intersection clear Get if vehicles which pass this (lane to lane) connection should keep the intersection clear
:return: Boolean :return: None or Boolean
""" """
return self._keep_clear return self._keep_clear
@ -116,4 +121,5 @@ class Connection:
Set if vehicles which pass this (lane to lane) connection should keep the intersection clear Set if vehicles which pass this (lane to lane) connection should keep the intersection clear
:param value: Boolean :param value: Boolean
""" """
self._keep_clear = bool(value) if value is not None:
self._keep_clear = ast.literal_eval(value)

View File

@ -6,7 +6,8 @@ Contributor Milad milad.aghamohamadnia@concordia.ca
Contributor Guille guille.gutierrezmorote@concordia.ca Contributor Guille guille.gutierrezmorote@concordia.ca
""" """
from typing import List import ast
from typing import List, Union
from city_model_structure.transport.traffic_node import TrafficNode from city_model_structure.transport.traffic_node import TrafficNode
@ -22,10 +23,10 @@ class Crossing(TrafficNode):
self._shape = shape self._shape = shape
@property @property
def priority(self): def priority(self) -> Union[None, bool]:
""" """
Get whether the pedestrians have priority over the vehicles Get whether the pedestrians have priority over the vehicles
:return: bool :return: None or bool
""" """
return self._priority return self._priority
@ -35,13 +36,14 @@ class Crossing(TrafficNode):
Set whether the pedestrians have priority over the vehicles Set whether the pedestrians have priority over the vehicles
:param value: bool :param value: bool
""" """
self._priority = bool(value) if value is not None:
self._priority = ast.literal_eval(value)
@property @property
def width(self): def width(self) -> Union[None, float]:
""" """
Get crossing width in meters Get crossing width in meters
:return: float :return: None or float
""" """
return self._width return self._width
@ -51,13 +53,14 @@ class Crossing(TrafficNode):
Set crossing width in meters Set crossing width in meters
:param value: float :param value: float
""" """
self._width = float(value) if value is not None:
self._width = float(value)
@property @property
def shape(self) -> List[List[float]]: def shape(self) -> Union[None, List[List[float]]]:
""" """
Get the list of positions Get the list of positions
:return: [[x, y, (z)]] :return: None or [[x, y, (z)]]
""" """
return self._shape return self._shape
@ -67,4 +70,5 @@ class Crossing(TrafficNode):
Set the list of positions Set the list of positions
:param value: [[x, y, (z)]] :param value: [[x, y, (z)]]
""" """
self._shape = [[float(i) for i in value]] if value is not None:
self._shape = [[float(i) for i in value]]

View File

@ -5,7 +5,7 @@ Copyright © 2020 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.mons
Contributor Milad milad.aghamohamadnia@concordia.ca Contributor Milad milad.aghamohamadnia@concordia.ca
""" """
from typing import List from typing import List, Union
class Lane: class Lane:
@ -23,11 +23,11 @@ class Lane:
self._width = None self._width = None
@property @property
def index(self): def index(self) -> Union[None, int]:
""" """
Get lane index Get lane index
The enumeration index of the lane (0 is the rightmost lane, <NUMBER_LANES>-1 is the leftmost one) The enumeration index of the lane (0 is the rightmost lane, <NUMBER_LANES>-1 is the leftmost one)
:return: int :return: None or int
""" """
return self._index return self._index
@ -38,13 +38,14 @@ class Lane:
The enumeration index of the lane (0 is the rightmost lane, <NUMBER_LANES>-1 is the leftmost one) The enumeration index of the lane (0 is the rightmost lane, <NUMBER_LANES>-1 is the leftmost one)
:param value: int :param value: int
""" """
self._index = int(value) if value is not None:
self._index = int(value)
@property @property
def allow(self) -> List[str]: def allow(self) -> Union[None, List[str]]:
""" """
Get the list of allowed vehicle classes Get the list of allowed vehicle classes
:return: [str] :return: None or [str]
""" """
return self._allow return self._allow
@ -54,13 +55,14 @@ class Lane:
Set the list of allowed vehicle classes setter Set the list of allowed vehicle classes setter
:param value: [str] :param value: [str]
""" """
self._allow = [str(i) for i in value] if value is not None:
self._allow = [str(i) for i in value]
@property @property
def disallow(self) -> List[str]: def disallow(self) -> Union[None, List[str]]:
""" """
Get the list of not allowed vehicle classes Get the list of not allowed vehicle classes
:return: [str] :return: None or [str]
""" """
return self._disallow return self._disallow
@ -70,13 +72,14 @@ class Lane:
Get the list of not allowed vehicle classes setter Get the list of not allowed vehicle classes setter
:param value: [str] :param value: [str]
""" """
self._disallow = [str(i) for i in value] if value is not None:
self._disallow = [str(i) for i in value]
@property @property
def change_left(self) -> List[str]: def change_left(self) -> Union[None, List[str]]:
""" """
Get the list of vehicle classes that may change left from this lane Get the list of vehicle classes that may change left from this lane
:return: [str] :return: None or [str]
""" """
return self._change_left return self._change_left
@ -86,13 +89,14 @@ class Lane:
Set the list of vehicle classes that may change left from this lane Set the list of vehicle classes that may change left from this lane
:param value: [str] :param value: [str]
""" """
self._change_left = [str(i) for i in value] if value is not None:
self._change_left = [str(i) for i in value]
@property @property
def change_right(self) -> List[str]: def change_right(self) -> Union[None, List[str]]:
""" """
Get the list of vehicle classes that may change right from this lane Get the list of vehicle classes that may change right from this lane
:return: [str] :return: None or [str]
""" """
return self._change_right return self._change_right
@ -102,13 +106,14 @@ class Lane:
Set the list of vehicle classes that may change right from this lane Set the list of vehicle classes that may change right from this lane
:param value: [str] :param value: [str]
""" """
self._change_right = [str(i) for i in value] if value is not None:
self._change_right = [str(i) for i in value]
@property @property
def speed(self): def speed(self) -> Union[None, float]:
""" """
Get the lane speed in m/s Get the lane speed in m/s
:return: float :return: None or float
""" """
return self._speed return self._speed
@ -118,13 +123,14 @@ class Lane:
Set the lane speed in m/s Set the lane speed in m/s
:param value: float :param value: float
""" """
self._speed = float(value) if value is not None:
self._speed = float(value)
@property @property
def width(self): def width(self) -> Union[None, float]:
""" """
Get the lane width in meters Get the lane width in meters
:return: float :return: None or float
""" """
return self._width return self._width
@ -134,4 +140,5 @@ class Lane:
Set the lane width in meters Set the lane width in meters
:param value: float :param value: float
""" """
self._width = float(value) if value is not None:
self._width = float(value)

View File

@ -5,7 +5,7 @@ Copyright © 2020 Project Author Pilar Monsalvete Alvarez de Uribarri pilar.mons
Contributor Milad milad.aghamohamadnia@concordia.ca Contributor Milad milad.aghamohamadnia@concordia.ca
""" """
from typing import List from typing import List, Union
class Phase: class Phase:
@ -22,10 +22,10 @@ class Phase:
self._next = None self._next = None
@property @property
def duration(self): def duration(self) -> Union[None, int]:
""" """
Get phase duration in seconds Get phase duration in seconds
:return: int :return: None or int
""" """
return self._duration return self._duration
@ -35,13 +35,14 @@ class Phase:
Set phase duration in seconds Set phase duration in seconds
:param value: int :param value: int
""" """
self._duration = int(value) if value is not None:
self._duration = int(value)
@property @property
def state(self): def state(self) -> Union[None, List[str]]:
""" """
Get the list of signal states Get the list of signal states
:return: [str] :return: None or [str]
""" """
return self._state return self._state
@ -51,13 +52,14 @@ class Phase:
Set the list of signal states Set the list of signal states
:param value: [str] :param value: [str]
""" """
self._state = [str(i) for i in value] if value is not None:
self._state = [str(i) for i in value]
@property @property
def min_duration(self): def min_duration(self) -> Union[None, int]:
""" """
Get phase minimum duration in seconds Get phase minimum duration in seconds
:return: int :return: None or int
""" """
if self._min_duration is None: if self._min_duration is None:
self._min_duration = self._duration self._min_duration = self._duration
@ -69,13 +71,14 @@ class Phase:
Set phase minimum duration in seconds Set phase minimum duration in seconds
:param value: int :param value: int
""" """
self._min_duration = int(value) if value is not None:
self._min_duration = int(value)
@property @property
def max_duration(self): def max_duration(self) -> Union[None, int]:
""" """
Get phase maximum duration in seconds Get phase maximum duration in seconds
:return: int :return: None or int
""" """
if self._max_duration is None: if self._max_duration is None:
self._max_duration = self._duration self._max_duration = self._duration
@ -87,13 +90,14 @@ class Phase:
Set phase maximum duration in seconds Set phase maximum duration in seconds
:param value: int :param value: int
""" """
self._max_duration = int(value) if value is not None:
self._max_duration = int(value)
@property @property
def name(self): def name(self) -> Union[None, str]:
""" """
Get phase name Get phase name
:return: str :return: None or str
""" """
return self._name return self._name
@ -103,16 +107,17 @@ class Phase:
Set phase name Set phase name
:param value: str :param value: str
""" """
self._name = str(value) if value is not None:
self._name = str(value)
@property @property
def next(self) -> List[int]: def next(self) -> Union[None, List[int]]:
""" """
Get the next phase in the cycle after the current. Get the next phase in the cycle after the current.
This is useful when adding extra transition phases to a traffic light plan which are not part of every cycle. This is useful when adding extra transition phases to a traffic light plan which are not part of every cycle.
Traffic lights of type 'actuated' can make use of a list of indices for selecting among alternative Traffic lights of type 'actuated' can make use of a list of indices for selecting among alternative
successor phases. successor phases.
:return: [int] :return: None or [int]
""" """
return self._next return self._next
@ -125,4 +130,5 @@ class Phase:
successor phases. successor phases.
:param value: [int] :param value: [int]
""" """
self._next = [int(i) for i in value] if value is not None:
self._next = [int(i) for i in value]

View File

@ -6,7 +6,7 @@ Contributor Milad milad.aghamohamadnia@concordia.ca
Contributor Guille guille.gutierrezmorote@concordia.ca Contributor Guille guille.gutierrezmorote@concordia.ca
""" """
from typing import List from typing import List, Union
from city_model_structure.attributes.edge import Edge from city_model_structure.attributes.edge import Edge
from city_model_structure.transport.lane import Lane from city_model_structure.transport.lane import Lane
@ -54,11 +54,11 @@ class TrafficEdge(Edge):
self._lanes = value self._lanes = value
@property @property
def priority(self): def priority(self) -> Union[None, int]:
""" """
Get the priority between different road types. Get the priority between different road types.
It starts with one; higher numbers represent more important roads. It starts with one; higher numbers represent more important roads.
:return: int :return: None or int
""" """
return self._priority return self._priority
@ -69,13 +69,14 @@ class TrafficEdge(Edge):
It starts with one; higher numbers represent more important roads. It starts with one; higher numbers represent more important roads.
:param value: int :param value: int
""" """
self._priority = int(value) if value is not None:
self._priority = int(value)
@property @property
def speed(self): def speed(self) -> Union[None, float]:
""" """
Get he speed limit in m/s Get he speed limit in m/s
:return: float :return: None or float
""" """
return self._speed return self._speed
@ -85,13 +86,14 @@ class TrafficEdge(Edge):
Set the speed limit in m/s Set the speed limit in m/s
:param value: float :param value: float
""" """
self._speed = float(value) if value is not None:
self._speed = float(value)
@property @property
def length(self): def length(self) -> Union[None, float]:
""" """
Get the lane length in meters Get the lane length in meters
:return: float :return: None or float
""" """
return self._length return self._length
@ -101,13 +103,14 @@ class TrafficEdge(Edge):
Set the lane length in meters Set the lane length in meters
:param value: float :param value: float
""" """
self._length = float(value) if value is not None:
self._length = float(value)
@property @property
def allows(self) -> List[str]: def allows(self) -> Union[None, List[str]]:
""" """
Get the list of allowed vehicle classes Get the list of allowed vehicle classes
:return: [str] :return: None or [str]
""" """
return self._allows return self._allows
@ -117,13 +120,14 @@ class TrafficEdge(Edge):
Set the list of allowed vehicle classes Set the list of allowed vehicle classes
:param value: [str] :param value: [str]
""" """
self._allows = [str(i) for i in value] if value is not None:
self._allows = [str(i) for i in value]
@property @property
def disallows(self) -> List[str]: def disallows(self) -> Union[None, List[str]]:
""" """
Get the list of not allowed vehicle classes Get the list of not allowed vehicle classes
:return: [str] :return: None or [str]
""" """
return self._disallows return self._disallows
@ -133,4 +137,5 @@ class TrafficEdge(Edge):
Set the list of not allowed vehicle classes Set the list of not allowed vehicle classes
:param value: [str] :param value: [str]
""" """
self._disallows = [str(i) for i in value] if value is not None:
self._disallows = [str(i) for i in value]

View File

@ -6,7 +6,8 @@ Contributor Milad milad.aghamohamadnia@concordia.ca
Contributor Guille guille.gutierrezmorote@concordia.ca Contributor Guille guille.gutierrezmorote@concordia.ca
""" """
from typing import List import ast
from typing import List, Union
from city_model_structure.transport.phase import Phase from city_model_structure.transport.phase import Phase
from city_model_structure.transport.traffic_node import TrafficNode from city_model_structure.transport.traffic_node import TrafficNode
@ -24,10 +25,10 @@ class TrafficLight(TrafficNode):
self._phases = phases self._phases = phases
@property @property
def right_on_red(self): def right_on_red(self) -> Union[None, bool]:
""" """
Get if is possible to turn right when the traffic light is red Get if is possible to turn right when the traffic light is red
:return: Boolean :return: None or Boolean
""" """
return self._right_on_red return self._right_on_red
@ -37,13 +38,14 @@ class TrafficLight(TrafficNode):
Get if is possible to turn right when the traffic light is red Get if is possible to turn right when the traffic light is red
:param value: Boolean :param value: Boolean
""" """
self._right_on_red = bool(value) if value is not None:
self._right_on_red = ast.literal_eval(value)
@property @property
def offset(self): def offset(self) -> Union[None, int]:
""" """
Get program initial time offset Get program initial time offset
:return: int :return: None or int
""" """
return self._offset return self._offset
@ -53,7 +55,8 @@ class TrafficLight(TrafficNode):
Set program initial time offset Set program initial time offset
:param value: int :param value: int
""" """
self._offset = int(value) if value is not None:
self._offset = int(value)
@property @property
def phases(self) -> List[Phase]: def phases(self) -> List[Phase]:

View File

@ -6,7 +6,7 @@ Contributor Milad milad.aghamohamadnia@concordia.ca
Contributor Guille guille.gutierrezmorote@concordia.ca Contributor Guille guille.gutierrezmorote@concordia.ca
""" """
from typing import List from typing import List, Union
from city_model_structure.transport.traffic_node import TrafficNode from city_model_structure.transport.traffic_node import TrafficNode
@ -20,10 +20,10 @@ class WalkwayNode(TrafficNode):
self._shape = shape self._shape = shape
@property @property
def shape(self) -> List[List[float]]: def shape(self) -> Union[None, List[List[float]]]:
""" """
Get the list of positions Get the list of positions
:return: [[x, y, (z)]] :return: None or [[x, y, (z)]]
""" """
return self._shape return self._shape
@ -33,4 +33,5 @@ class WalkwayNode(TrafficNode):
Set the list of positions Set the list of positions
:param value: [[x, y, (z)]] :param value: [[x, y, (z)]]
""" """
self._shape = [[float(i) for i in value]] if value is not None:
self._shape = [[float(i) for i in value]]