diff --git a/city_model_structure/attributes/polygon.py b/city_model_structure/attributes/polygon.py index 126e9ae4..4064ad81 100644 --- a/city_model_structure/attributes/polygon.py +++ b/city_model_structure/attributes/polygon.py @@ -104,7 +104,6 @@ class Polygon: if module != 0: angle = abs(np.arcsin(scalar_product / module)) angle_sum += angle - print(angle_sum) return abs(angle_sum - math.pi*2) < cte.EPSILON def contains_polygon(self, polygon): @@ -112,13 +111,10 @@ class Polygon: Determines if the given polygon is contained by the current polygon :return: boolean """ - print('contains') - for point in polygon.points: - print(point.coordinates, self.contains_point(point)) + for point in polygon.points: if not self.contains_point(point): return False - print('Belong!') return True @property diff --git a/city_model_structure/building_demand/thermal_opening.py b/city_model_structure/building_demand/thermal_opening.py index 101dcffc..ae695187 100644 --- a/city_model_structure/building_demand/thermal_opening.py +++ b/city_model_structure/building_demand/thermal_opening.py @@ -31,6 +31,7 @@ class ThermalOpening: self._inside_emissivity = None self._alpha_coefficient = None self._radiative_coefficient = None + self._construction_name = None @property def id(self): @@ -290,3 +291,17 @@ class ThermalOpening: """ if value is not None: self._radiative_coefficient = float(value) + + @property + def construction_name(self): + """ + Get thermal opening construction name + """ + return self._construction_name + + @construction_name.setter + def construction_name(self, value): + """ + Set thermal opening construction name + """ + self._construction_name = value diff --git a/city_model_structure/city.py b/city_model_structure/city.py index b9f029b3..b0e19e81 100644 --- a/city_model_structure/city.py +++ b/city_model_structure/city.py @@ -8,8 +8,9 @@ from __future__ import annotations import sys import pickle import math -from typing import List, Union +import copy import pyproj +from typing import List, Union from pyproj import Transformer from pathlib import Path @@ -434,3 +435,9 @@ class City: return lca_material return None + @property + def copy(self) -> City: + """ + Get a copy of the current city + """ + return copy.deepcopy(self) diff --git a/city_model_structure/city_object.py b/city_model_structure/city_object.py index d71e3cea..5604f6e0 100644 --- a/city_model_structure/city_object.py +++ b/city_model_structure/city_object.py @@ -44,6 +44,14 @@ class CityObject: """ return self._name + @name.setter + def name(self, value): + """ + Set building name + :return: str + """ + self._name = value + @property def lod(self) -> int: """ diff --git a/data/life_cycle_assessment/lca_data.xml b/data/life_cycle_assessment/lca_data.xml index 29bb356d..c2a55e20 100644 --- a/data/life_cycle_assessment/lca_data.xml +++ b/data/life_cycle_assessment/lca_data.xml @@ -1,559 +1,559 @@ - - 0.32 + + 0.32 - - 0.4 + + 0.4 - - 0.4 + + 0.4 - - 0.5 + + 0.5 - - 0.18 + + 0.18 - - 0.39 + + 0.39 - - 0.27 + + 0.27 - - 4.16 + + 4.16 - - 2.24 + + 2.24 - - 0.2 + + 0.2 - - 3.19 + + 3.19 - - 3.53 + + 3.53 - - 0.27 + + 0.27 - - 0.21 + + 0.21 - - 1.69 + + 1.69 - - 0.21 + + 0.21 - - 0.35 + + 0.35 - - 0.18 + + 0.18 - - 0.81 + + 0.81 - - 1.21 + + 1.21 - - 1.61 + + 1.61 - - 0.11 + + 0.11 - - 0.3 + + 0.3 - - 1.16 + + 1.16 - - 0.61 + + 0.61 - + - - 0.347 - 16.5 - 0.918 + + 0.347 + 16.5 + 0.918 - - 0.033 - 25.2 - 4.16 + + 0.033 + 25.2 + 4.16 - - 0.027 - 16.8 - 2.239 + + 0.027 + 16.8 + 2.239 - - 0.023 - 16.8 - 2.239 + + 0.023 + 16.8 + 2.239 - - 0.109 - 25.2 - 2.239 + + 0.109 + 25.2 + 2.239 - - 0.003 - 16.4 - 4.16 + + 0.003 + 16.4 + 4.16 - - 0.002 - 11 - 0.918 + + 0.002 + 11 + 0.918 - - 0.002 - 90 - 0.918 + + 0.002 + 90 + 0.918 - - 0.002 - 10 - 0.918 + + 0.002 + 10 + 0.918 - - 0.002 - 11 - 0.918 + + 0.002 + 11 + 0.918 - - 0.002 - 132 - 0.918 + + 0.002 + 132 + 0.918 - - 0.002 - 15 - 0.918 + + 0.002 + 15 + 0.918 - - 0.002 - 5.5 - 0.918 + + 0.002 + 5.5 + 0.918 - - 0.002 - 22.5 - 0.918 + + 0.002 + 22.5 + 0.918 - + - - 0.0123 - 2.239 + + 0.0123 + 2.239 - - 0.042 - 0.918 + + 0.042 + 0.918 - - 0.01 - 1.00000 + + 0.01 + 1.00000 - - 1.3 - 1.00000 + + 1.3 + 1.00000 - + - - 1.8 - 560 - 0.8 - 0.3 - 0.7 - 0.2 - .... + + 1.8 + 560 + 0.8 + 0.3 + 0.7 + 0.2 + 0.1 - - 1.2 - 310 - 0.8 - 0.3 - 0.7 - 0.2 - .... + + 1.2 + 310 + 0.8 + 0.3 + 0.7 + 0.2 + 0.1 - - 2 - 3080 - 0.8 - 0.3 - 0.7 - 0.2 - .... + + 2 + 3080 + 0.8 + 0.3 + 0.7 + 0.2 + 0.1 - - 1.4 - 300 - 0.8 - 0.3 - 0.7 - 0.2 - .... + + 1.4 + 300 + 0.8 + 0.3 + 0.7 + 0.2 + 0.1 - - 1.6 - 900 - 0.8 - 0 - 1 - 0.2 - .... + + 1.6 + 900 + 0.8 + 0 + 1 + 0.2 + 0.1 - - 1.6 - 2340 - 0.8 - 0 - 1 - 0.2 - .... + + 1.6 + 2340 + 0.8 + 0 + 1 + 0.2 + 0.1 - - 1.6 - 1570 - 0.8 - 0 - 1 - 0.2 - .... + + 1.6 + 1570 + 0.8 + 0 + 1 + 0.2 + 0.1 - - 1.4 - 1840 - 0.8 - 0 - 1 - 0.2 - .... + + 1.4 + 1840 + 0.8 + 0 + 1 + 0.2 + 0.1 - - 1.3 - 410 - 0.8 - 0 - 1 - 0.2 - .... + + 1.3 + 410 + 0.8 + 0 + 1 + 0.2 + 0.1 - - 2.3 - 160 - 0.8 - 0 - 1 - 0.2 - .... + + 2.3 + 160 + 0.8 + 0 + 1 + 0.2 + 0.1 - - 2.3 - 170 - 0.8 - 0 - 1 - 0.2 - .... + + 2.3 + 170 + 0.8 + 0 + 1 + 0.2 + 0.1 - - 2.3 - 230 - 0.8 - 0 - 1 - 0.2 - .... + + 2.3 + 230 + 0.8 + 0 + 1 + 0.2 + 0.1 - - 2.4 - 240 - 0.8 - 0 - 1 - 0.2 - .... + + 2.4 + 240 + 0.8 + 0 + 1 + 0.2 + 0.1 - - 2.4 - 280 - 0.8 - 0 - 1 - 0.2 - .... + + 2.4 + 280 + 0.8 + 0 + 1 + 0.2 + 0.1 - - 2.3 - 170 - 0.8 - 0 - 1 - 0.2 - .... + + 2.3 + 170 + 0.8 + 0 + 1 + 0.2 + 0.1 - - 1.2 - 440 - 0.8 - 0 - 1 - 0.2 - .... + + 1.2 + 440 + 0.8 + 0 + 1 + 0.2 + 0.1 - - 2.58 - 2660 - 0.95 - 0 - 1 - 0.05 - .... - - - 2.58 - 5260 - 0.95 - 0 - 1 - 0.05 - .... - - - 0.06 - 1760 - 0.9 - 0 - 1 - 0.1 - .... - - - 0.122 - 3080 - 0.9 - 0 - 1 - 0.1 - .... - - - 0.028 - 3180 - 0.9 - 0 - 1 - 0.1 - .... - - - 0.024 - 5140 - 0.9 - 0 - 1 - 0.1 - .... - - - 0.1 - 6040 - 0.9 - 0 - 1 - 0.1 - .... - - - 0.3 - 5380 - 0.9 - 0 - 1 - 0.1 - .... - - - 0.032 - 2150 - 0.9 - 0 - 1 - 0.1 - .... - - - 0.9 - 3420 - 0.6 - 0 - 1 - 0.4 - .... - - - 0.7 - 1430 - 0.6 - 0 - 1 - 0.4 - .... - - - 0.65 - 2780 - 0.6 - 0 - 1 - 0.4 - .... - - - 0.72 - 2190 - 0.6 - 0 - 1 - 0.4 - .... - - - 1.43 - 1070 - 0 - 0 - 0 - 1 - .... - - - 1.43 - 240 - 0 - 0 - 0 - 1 - .... - - - 1.43 - 430 - 0 - 0 - 0 - 1 - .... - - - 1.43 - 340 - 0 - 0 - 0 - 1 - .... - - - 1.2 - 440 - 0.8 - 0 - 1 - 0.2 - .... - - - 2.1 - 1410 - 0.8 - 0 - 1 - 0.2 - .... - - - 1.43 - 250 - 0 - 0 - 0 - 1 - .... - - - 1.44 - 1480 - 0.8 - 0 - 1 - 0.2 - .... - - - 1.44 - 2220 - 0.8 - 0 - 1 - 0.2 - .... - - - 1.27 - 3960 - 0.8 - 0 - 1 - 0.2 - .... - - - 1.15 - 760 - 0.8 - 0 - 1 - 0.2 - .... - - - 8 - 3160 - 0.98 - 0 - 1 - 0.02 - .... - - - 2.7 - 5370 - 0.98 - 0 - 1 - 0.02 - .... - - - 7.85 - 3910 - 0.98 - 0 - 1 - 0.02 - .... + + 2.58 + 2660 + 0.95 + 0 + 1 + 0.05 + 0.1 + + 2.58 + 5260 + 0.95 + 0 + 1 + 0.05 + 0.1 + + + 0.06 + 1760 + 0.9 + 0 + 1 + 0.1 + 0.1 + + + 0.122 + 3080 + 0.9 + 0 + 1 + 0.1 + 0.1 + + + 0.028 + 3180 + 0.9 + 0 + 1 + 0.1 + 0.1 + + + 0.024 + 5140 + 0.9 + 0 + 1 + 0.1 + 0.1 + + + 0.1 + 6040 + 0.9 + 0 + 1 + 0.1 + 0.1 + + + 0.3 + 5380 + 0.9 + 0 + 1 + 0.1 + 0.1 + + + 0.032 + 2150 + 0.9 + 0 + 1 + 0.1 + 0.1 + + + 0.9 + 3420 + 0.6 + 0 + 1 + 0.4 + 0.1 + + + 0.7 + 1430 + 0.6 + 0 + 1 + 0.4 + 0.1 + + + 0.65 + 2780 + 0.6 + 0 + 1 + 0.4 + 0.1 + + + 0.72 + 2190 + 0.6 + 0 + 1 + 0.4 + 0.1 + + + 1.43 + 1070 + 0 + 0 + 0 + 1 + 0.1 + + + 1.43 + 240 + 0 + 0 + 0 + 1 + 0.1 + + + 1.43 + 430 + 0 + 0 + 0 + 1 + 0.1 + + + 1.43 + 340 + 0 + 0 + 0 + 1 + 0.1 + + + 1.2 + 440 + 0.8 + 0 + 1 + 0.2 + 0.1 + + + 2.1 + 1410 + 0.8 + 0 + 1 + 0.2 + 0.1 + + + 1.43 + 250 + 0 + 0 + 0 + 1 + 0.1 + + + 1.44 + 1480 + 0.8 + 0 + 1 + 0.2 + 0.1 + + + 1.44 + 2220 + 0.8 + 0 + 1 + 0.2 + 0.1 + + + 1.27 + 3960 + 0.8 + 0 + 1 + 0.2 + 0.1 + + + 1.15 + 760 + 0.8 + 0 + 1 + 0.2 + 0.1 + + + 8 + 3160 + 0.98 + 0 + 1 + 0.02 + 0.1 + + + 2.7 + 5370 + 0.98 + 0 + 1 + 0.02 + 0.1 + + + 7.85 + 3910 + 0.98 + 0 + 1 + 0.02 + 0.1 + \ No newline at end of file diff --git a/imports/construction/data_classes/thermal_opening_archetype.py b/imports/construction/data_classes/thermal_opening_archetype.py index e1966267..fc729769 100644 --- a/imports/construction/data_classes/thermal_opening_archetype.py +++ b/imports/construction/data_classes/thermal_opening_archetype.py @@ -12,7 +12,8 @@ class ThermalOpeningArchetype: def __init__(self, conductivity=None, frame_ratio=None, g_value=None, thickness=None, back_side_solar_transmittance_at_normal_incidence=None, front_side_solar_transmittance_at_normal_incidence=None, overall_u_value=None, - openable_ratio=None, inside_emissivity=None, alpha_coefficient=None, radiative_coefficient=None): + openable_ratio=None, inside_emissivity=None, alpha_coefficient=None, radiative_coefficient=None, + construction_name=None): self._conductivity = conductivity self._frame_ratio = frame_ratio self._g_value = g_value @@ -24,6 +25,7 @@ class ThermalOpeningArchetype: self._inside_emissivity = inside_emissivity self._alpha_coefficient = alpha_coefficient self._radiative_coefficient = radiative_coefficient + self._construction_name = construction_name @property def conductivity(self): @@ -112,3 +114,17 @@ class ThermalOpeningArchetype: :return: float """ return self._radiative_coefficient + + @property + def construction_name(self): + """ + Get thermal opening construction name + """ + return self._construction_name + + @construction_name.setter + def construction_name(self, value): + """ + Set thermal opening construction name + """ + self._construction_name = value diff --git a/imports/construction/nrel_physics_interface.py b/imports/construction/nrel_physics_interface.py index 6f08e536..1c23b106 100644 --- a/imports/construction/nrel_physics_interface.py +++ b/imports/construction/nrel_physics_interface.py @@ -109,6 +109,7 @@ class NrelPhysicsInterface: if 'window' in construction and construction['window'] is not None: window_ratio = construction['window_ratio']['#text'] w_lib = self._search_construction_type('window', construction['window']) + window_construction_name = w_lib['@name'] frame_ratio = w_lib['frame_ratio']['#text'] if 'conductivity' in w_lib: conductivity = w_lib['conductivity']['#text'] @@ -128,7 +129,8 @@ class NrelPhysicsInterface: thickness=thickness, back_side_solar_transmittance_at_normal_incidence= back_side_solar_transmittance_at_normal_incidence, front_side_solar_transmittance_at_normal_incidence= - front_side_solar_transmittance_at_normal_incidence) + front_side_solar_transmittance_at_normal_incidence, + construction_name=window_construction_name) else: overall_u_value = w_lib['overall_u_value']['#text'] units = w_lib['overall_u_value']['@units'] diff --git a/imports/construction/us_physics_parameters.py b/imports/construction/us_physics_parameters.py index 7a23b318..9673d921 100644 --- a/imports/construction/us_physics_parameters.py +++ b/imports/construction/us_physics_parameters.py @@ -99,6 +99,7 @@ class UsPhysicsParameters(NrelPhysicsInterface): for thermal_opening in thermal_boundary.thermal_openings: if thermal_boundary_archetype.thermal_opening_archetype is not None: thermal_opening_archetype = thermal_boundary_archetype.thermal_opening_archetype + thermal_opening.construction_name = thermal_opening_archetype.construction_name thermal_opening.frame_ratio = thermal_opening_archetype.frame_ratio thermal_opening.g_value = thermal_opening_archetype.g_value thermal_opening.conductivity = thermal_opening_archetype.conductivity diff --git a/imports/geometry/rhino.py b/imports/geometry/rhino.py index 53f21088..1d0b63c0 100644 --- a/imports/geometry/rhino.py +++ b/imports/geometry/rhino.py @@ -7,7 +7,6 @@ from numpy import inf from rhino3dm import * from rhino3dm._rhino3dm import MeshType - from city_model_structure.attributes.point import Point import numpy as np @@ -16,7 +15,6 @@ from city_model_structure.attributes.polygon import Polygon from city_model_structure.building import Building from city_model_structure.city import City from city_model_structure.building_demand.surface import Surface as LibsSurface -from helpers.constants import EPSILON from imports.geometry.helpers.geometry_helper import GeometryHelper @@ -31,7 +29,6 @@ class Rhino: @staticmethod def _in_perimeter(wall, corner): res = wall.contains_point(Point(corner)) - print(f'belong: {res} wall:({wall.coordinates}) corner: ({corner})') return res @staticmethod @@ -98,7 +95,6 @@ class Rhino: windows.append(Polygon(surface.perimeter_polygon.inverse)) else: buildings.append(rhino_object) - print(f'windows: {len(windows)}') # todo: this method will be pretty inefficient for hole in windows: corner = hole.coordinates[0] diff --git a/imports/life_cycle_assessment/lca_material.py b/imports/life_cycle_assessment/lca_material.py index 5044b315..88253871 100644 --- a/imports/life_cycle_assessment/lca_material.py +++ b/imports/life_cycle_assessment/lca_material.py @@ -6,7 +6,7 @@ Contributor Mohammad Reza mohammad.seyedabadi@mail.concordia.ca """ import xmltodict from pathlib import Path -from city_model_structure.building_demand.material import Material +from city_model_structure.lca_material import LcaMaterial as LMaterial class LcaMaterial: def __init__(self, city, base_path): @@ -15,14 +15,14 @@ class LcaMaterial: self._lca = None def enrich(self): - self._city.materials = [] + self._city.lca_materials = [] path = Path(self._base_path / 'lca_data.xml').resolve() with open(path) as xml: self._lca = xmltodict.parse(xml.read()) for material in self._lca["library"]["building_materials"]['material']: - _material = Material() + _material = LMaterial() _material.type = material['@type'] _material.id = material['@id'] _material.name = material['@name'] @@ -37,4 +37,4 @@ class LcaMaterial: _material.cost=material['cost']['#text'] _material._cost_unit=material['cost']['@unit'] - self._city.materials.append(_material) + self._city.lca_materials.append(_material)