2023-01-31 13:11:39 -05:00
|
|
|
"""
|
|
|
|
Model representation of a city object
|
|
|
|
SPDX - License - Identifier: LGPL - 3.0 - or -later
|
|
|
|
Copyright © 2022 Concordia CERC group
|
|
|
|
Project Coder Guille Gutierrez Guillermo.GutierrezMorote@concordia.ca
|
|
|
|
"""
|
|
|
|
|
|
|
|
import datetime
|
|
|
|
|
|
|
|
from sqlalchemy import Column, Integer, String, Sequence, ForeignKey, Float
|
|
|
|
from sqlalchemy import DateTime
|
2023-05-10 17:06:51 -04:00
|
|
|
|
|
|
|
from hub.city_model_structure.building import Building
|
2023-02-02 06:12:24 -05:00
|
|
|
from hub.persistence.configuration import Models
|
2023-01-31 13:11:39 -05:00
|
|
|
|
2023-05-16 18:06:22 -04:00
|
|
|
|
2023-02-02 06:12:24 -05:00
|
|
|
class CityObject(Models):
|
2023-05-18 12:29:28 -04:00
|
|
|
"""
|
2023-01-31 13:11:39 -05:00
|
|
|
A model representation of an application
|
|
|
|
"""
|
2023-05-18 12:29:28 -04:00
|
|
|
__tablename__ = 'city_object'
|
|
|
|
id = Column(Integer, Sequence('city_object_id_seq'), primary_key=True)
|
|
|
|
city_id = Column(Integer, ForeignKey('city.id'), nullable=False)
|
|
|
|
name = Column(String, nullable=False)
|
2023-05-26 18:21:35 -04:00
|
|
|
aliases = Column(String, nullable=True)
|
2023-05-18 12:29:28 -04:00
|
|
|
type = Column(String, nullable=False)
|
|
|
|
year_of_construction = Column(Integer, nullable=True)
|
|
|
|
function = Column(String, nullable=True)
|
|
|
|
usage = Column(String, nullable=True)
|
|
|
|
volume = Column(Float, nullable=False)
|
|
|
|
area = Column(Float, nullable=False)
|
|
|
|
total_heating_area = Column(Float, nullable=False)
|
|
|
|
wall_area = Column(Float, nullable=False)
|
|
|
|
windows_area = Column(Float, nullable=False)
|
2023-05-29 11:13:49 -04:00
|
|
|
roof_area = Column(Float, nullable=False)
|
2023-05-18 12:29:28 -04:00
|
|
|
system_name = Column(String, nullable=False)
|
|
|
|
created = Column(DateTime, default=datetime.datetime.utcnow)
|
|
|
|
updated = Column(DateTime, default=datetime.datetime.utcnow)
|
2023-01-31 13:11:39 -05:00
|
|
|
|
2023-05-18 12:29:28 -04:00
|
|
|
def __init__(self, city_id, building: Building):
|
|
|
|
self.city_id = city_id
|
|
|
|
self.name = building.name
|
2023-05-26 18:21:35 -04:00
|
|
|
self.aliases = building.aliases
|
2023-05-18 12:29:28 -04:00
|
|
|
self.type = building.type
|
|
|
|
self.year_of_construction = building.year_of_construction
|
|
|
|
self.function = building.function
|
|
|
|
self.usage = building.usages_percentage
|
|
|
|
self.volume = building.volume
|
|
|
|
self.area = building.floor_area
|
2023-05-29 11:13:49 -04:00
|
|
|
self.roof_area = sum(roof.solid_polygon.area for roof in building.roofs)
|
2023-05-18 12:29:28 -04:00
|
|
|
storeys = building.storeys_above_ground
|
|
|
|
if storeys is None:
|
|
|
|
storeys = building.max_height / building.average_storey_height
|
|
|
|
self.total_heating_area = building.floor_area * storeys
|
|
|
|
wall_area = 0
|
|
|
|
for wall in building.walls:
|
|
|
|
wall_area += wall.solid_polygon.area
|
|
|
|
self.wall_area = wall_area
|
|
|
|
window_ratio = 0
|
|
|
|
for internal_zone in building.internal_zones:
|
|
|
|
for thermal_zone in internal_zone.thermal_zones:
|
|
|
|
for thermal_boundary in thermal_zone.thermal_boundaries:
|
|
|
|
window_ratio = thermal_boundary.window_ratio
|
|
|
|
break
|
|
|
|
self.windows_area = wall_area * window_ratio
|
|
|
|
system_name = building.energy_systems_archetype_name
|
|
|
|
if system_name is None:
|
|
|
|
system_name = ''
|
|
|
|
self.system_name = system_name
|