diff --git a/MACOS_INSTALL.md b/MACOS_INSTALL.md index 1432ac1e..caccd92e 100644 --- a/MACOS_INSTALL.md +++ b/MACOS_INSTALL.md @@ -164,7 +164,7 @@ When all the dependencies are satisfied, you are all set to start importing your Add the following code to your main.py from imports.geometry_factory import GeometryFactory -city = GeometryFactory('citygml', 'myfile.gml').city +city = GeometryFactory('citygml', path='myfile.gml').city Always remember to push your own project changes as the last thing you do before ending your working day! First, commit your changes by clicking on the green check in the top-right corner of Pycharm. Add a comment diff --git a/WINDOWS_INSTALL.md b/WINDOWS_INSTALL.md index d38e41ec..548497f5 100644 --- a/WINDOWS_INSTALL.md +++ b/WINDOWS_INSTALL.md @@ -237,7 +237,7 @@ Add the following code to your main.py from imports.geometry_factory import GeometryFactory -city = GeometryFactory('citygml', 'myfile.gml').city +city = GeometryFactory('citygml', path='myfile.gml').city ``` 9. Always remember to push your own project changes as the last thing you do before ending your working day! diff --git a/catalog_factories/greenery_catalog_factory.py b/catalog_factories/greenery_catalog_factory.py index f9284750..08864c41 100644 --- a/catalog_factories/greenery_catalog_factory.py +++ b/catalog_factories/greenery_catalog_factory.py @@ -12,7 +12,7 @@ Catalog = TypeVar('Catalog') class GreeneryCatalogFactory: """ - GeometryFactory class + GreeneryCatalogFactory class """ def __init__(self, file_type, base_path=None): if base_path is None: diff --git a/exports/formats/obj.py b/exports/formats/obj.py index bf1bee2b..f7237005 100644 --- a/exports/formats/obj.py +++ b/exports/formats/obj.py @@ -26,7 +26,7 @@ class Obj(Triangular): file_name_out = self._city.name + '_ground.' + self._triangular_format file_path_in = (Path(self._path).resolve() / file_name_in).resolve() file_path_out = (Path(self._path).resolve() / file_name_out).resolve() - scene = GeometryFactory('obj', file_path_in).scene + scene = GeometryFactory('obj', path=file_path_in).scene scene.rezero() obj_file = trimesh.exchange.obj.export_obj(scene) with open(file_path_out, 'w') as file: diff --git a/imports/construction/us_physics_parameters.py b/imports/construction/us_physics_parameters.py index 657164bf..2baa6749 100644 --- a/imports/construction/us_physics_parameters.py +++ b/imports/construction/us_physics_parameters.py @@ -74,9 +74,7 @@ class UsPhysicsParameters(NrelPhysicsInterface): if (str(function) == str(building_archetype.function)) and \ (climate_zone == str(building_archetype.climate_zone)): return building_archetype - # Todo: line below is added by Milad as a quick fix for when archetypes search is not found - return building_archetype - # return None + return None @staticmethod def _search_construction_in_archetype(archetype, construction_type): diff --git a/imports/geometry/gpandas.py b/imports/geometry/gpandas.py index d716c8cf..12fa4c95 100644 --- a/imports/geometry/gpandas.py +++ b/imports/geometry/gpandas.py @@ -40,6 +40,7 @@ class GPandas: self._scene = dataframe self._scene = self._scene.to_crs(self._srs_name) min_x, min_y, max_x, max_y = self._scene.total_bounds + print(min_x) self._lower_corner = [min_x, min_y, 0] self._upper_corner = [max_x, max_y, 0] @@ -58,10 +59,10 @@ class GPandas: if self._city is None: self._city = City(self._lower_corner, self._upper_corner, self._srs_name) for scene_index, bldg in self._scene.iterrows(): - geometry = bldg.geometry - # polygon = ShapelyPoly(geometry['coordinates'][0]) + geometry = bldg.geom + polygon = ShapelyPoly(geometry['coordinates'][0]) height = float(bldg['height']) - building_mesh = trimesh.creation.extrude_polygon(geometry, height) + building_mesh = trimesh.creation.extrude_polygon(polygon, height) trimesh.repair.fill_holes(building_mesh) trimesh.repair.fix_winding(building_mesh) year_of_construction = int(bldg['year_built']) diff --git a/imports/geometry_factory.py b/imports/geometry_factory.py index 51683847..22b8df8b 100644 --- a/imports/geometry_factory.py +++ b/imports/geometry_factory.py @@ -17,7 +17,7 @@ class GeometryFactory: """ GeometryFactory class """ - def __init__(self, file_type, path, data_frame=None): + def __init__(self, file_type, path=None, data_frame=None): self._file_type = '_' + file_type.lower() self._path = path self._data_frame = data_frame @@ -46,7 +46,6 @@ class GeometryFactory: """ if self._data_frame is None: self._data_frame = geopandas.read_file(self._path) - print( self._data_frame ) return GPandas(self._data_frame).city @property diff --git a/unittests/test_city_merge.py b/unittests/test_city_merge.py index e1ecaac9..3e087fa0 100644 --- a/unittests/test_city_merge.py +++ b/unittests/test_city_merge.py @@ -23,7 +23,7 @@ class TestCityMerge(TestCase): def _get_citygml(self, file): file_path = (self._example_path / file).resolve() - city = GeometryFactory('citygml', file_path).city + city = GeometryFactory('citygml', path=file_path).city self.assertIsNotNone(city, 'city is none') return city diff --git a/unittests/test_construction_factory.py b/unittests/test_construction_factory.py index 6ca15a2c..e6c6dd50 100644 --- a/unittests/test_construction_factory.py +++ b/unittests/test_construction_factory.py @@ -26,7 +26,7 @@ class TestConstructionFactory(TestCase): def _get_citygml(self, file): file_path = (self._example_path / file).resolve() - self._city = GeometryFactory('citygml', file_path).city + self._city = GeometryFactory('citygml', path=file_path).city self.assertIsNotNone(self._city, 'city is none') return self._city diff --git a/unittests/test_doe_idf.py b/unittests/test_doe_idf.py index b7eddcf7..0afb40b9 100644 --- a/unittests/test_doe_idf.py +++ b/unittests/test_doe_idf.py @@ -27,7 +27,7 @@ class TestBuildings(TestCase): def test_doe_idf(self): city_file = "../unittests/tests_data/one_building_in_kelowna.gml" output_path = Path('../unittests/tests_outputs/').resolve() - city = GeometryFactory('citygml', city_file).city + city = GeometryFactory('citygml', path=city_file).city for building in city.buildings: building.year_of_construction = 2006 ConstructionFactory('nrel', city).enrich() diff --git a/unittests/test_energy_systems_air_source_hp.py b/unittests/test_energy_systems_air_source_hp.py index 6f4edad8..ef06a648 100644 --- a/unittests/test_energy_systems_air_source_hp.py +++ b/unittests/test_energy_systems_air_source_hp.py @@ -25,7 +25,7 @@ class TestEnergySystemsFactory(TestCase): """ city_file = "../unittests/tests_data/C40_Final.gml" self._output_path = "../unittests/tests_data/as_user_output.csv" - self._city = GeometryFactory('citygml', city_file).city + self._city = GeometryFactory('citygml', path=city_file).city EnergySystemsFactory('air source hp', self._city).enrich() def test_air_source_heat_pump_import(self): diff --git a/unittests/test_energy_systems_water_to_water_hp.py b/unittests/test_energy_systems_water_to_water_hp.py index 889f9127..a455834a 100644 --- a/unittests/test_energy_systems_water_to_water_hp.py +++ b/unittests/test_energy_systems_water_to_water_hp.py @@ -26,7 +26,7 @@ class TestEnergySystemsFactory(TestCase): """ city_file = "../unittests/tests_data/C40_Final.gml" self._output_path = "../unittests/tests_data/w2w_user_output.csv" - self._city = GeometryFactory('citygml', city_file).city + self._city = GeometryFactory('citygml', path=city_file).city EnergySystemsFactory('water to water hp', self._city).enrich() def test_water_to_water_heat_pump_import(self): diff --git a/unittests/test_enrichement.py b/unittests/test_enrichement.py index 6ace72d4..4d8ac187 100644 --- a/unittests/test_enrichement.py +++ b/unittests/test_enrichement.py @@ -27,7 +27,7 @@ class TestGeometryFactory(TestCase): def _get_citygml(self, file): file_path = (self._example_path / file).resolve() - self._city = GeometryFactory('citygml', file_path).city + self._city = GeometryFactory('citygml', path=file_path).city self.assertIsNotNone(self._city, 'city is none') return self._city diff --git a/unittests/test_exports.py b/unittests/test_exports.py index 75dc96f0..c33fa715 100644 --- a/unittests/test_exports.py +++ b/unittests/test_exports.py @@ -34,7 +34,7 @@ class TestExports(TestCase): def _get_citygml(self, file): file_path = (self._example_path / file).resolve() - self._city = GeometryFactory('citygml', file_path).city + self._city = GeometryFactory('citygml', path=file_path).city self.assertIsNotNone(self._city, 'city is none') return self._city diff --git a/unittests/test_geometry_factory.py b/unittests/test_geometry_factory.py index dc6381d5..580fd207 100644 --- a/unittests/test_geometry_factory.py +++ b/unittests/test_geometry_factory.py @@ -30,7 +30,7 @@ class TestGeometryFactory(TestCase): def _get_citygml(self, file): file_path = (self._example_path / file).resolve() - self._city = GeometryFactory('citygml', file_path).city + self._city = GeometryFactory('citygml', path=file_path).city self.assertIsNotNone(self._city, 'city is none') return self._city @@ -43,13 +43,13 @@ class TestGeometryFactory(TestCase): def _get_obj(self, file): # todo: solve the incongruities between city and city_debug file_path = (self._example_path / file).resolve() - self._city = GeometryFactory('obj', file_path).city + self._city = GeometryFactory('obj', path=file_path).city self.assertIsNotNone(self._city, 'city is none') return self._city def _get_rhino(self, file): file_path = (self._example_path / file).resolve() - self._city = GeometryFactory('rhino', file_path).city + self._city = GeometryFactory('rhino', path=file_path).city self.assertIsNotNone(self._city, 'city is none') return self._city @@ -178,7 +178,7 @@ class TestGeometryFactory(TestCase): """ file_path = (self._example_path / 'subway.osm').resolve() - city = GeometryFactory('osm_subway', file_path).city + city = GeometryFactory('osm_subway', path=file_path).city self.assertIsNotNone(city, 'subway entrances is none') self.assertEqual(len(city.city_objects), 20, 'Wrong number of subway entrances') diff --git a/unittests/test_greenery_catalog.py b/unittests/test_greenery_catalog.py index 7959b127..efcde06e 100644 --- a/unittests/test_greenery_catalog.py +++ b/unittests/test_greenery_catalog.py @@ -1,5 +1,5 @@ """ -TestGeometryFactory test and validate the city model structure geometric parameters +Test greenery factory test and validate the greenery construction SPDX - License - Identifier: LGPL - 3.0 - or -later Copyright © 2022 Concordia CERC group Project Coder Guille Gutierrez guillermo.gutierrezmorote@concordia.ca diff --git a/unittests/test_greenery_in_idf.py b/unittests/test_greenery_in_idf.py index 216ea390..fe251329 100644 --- a/unittests/test_greenery_in_idf.py +++ b/unittests/test_greenery_in_idf.py @@ -27,7 +27,7 @@ class GreeneryInIdf(TestCase): city_file = "../unittests/tests_data/one_building_in_kelowna.gml" output_path = Path('../unittests/tests_outputs/').resolve() - city = GeometryFactory('citygml', city_file).city + city = GeometryFactory('citygml', path=city_file).city for building in city.buildings: building.year_of_construction = 2006 ConstructionFactory('nrel', city).enrich() @@ -80,7 +80,7 @@ class GreeneryInIdf(TestCase): print('With greenery') print(f'heating: {heating} MWh/yr, cooling: {cooling} MWh/yr') - city = GeometryFactory('citygml', city_file).city + city = GeometryFactory('citygml', path=city_file).city for building in city.buildings: building.year_of_construction = 2006 ConstructionFactory('nrel', city).enrich() diff --git a/unittests/test_life_cycle_assessment_factory.py b/unittests/test_life_cycle_assessment_factory.py index 43ba7feb..ef00cd79 100644 --- a/unittests/test_life_cycle_assessment_factory.py +++ b/unittests/test_life_cycle_assessment_factory.py @@ -24,28 +24,28 @@ class TestLifeCycleAssessment(TestCase): def test_fuel(self): city_file = "../unittests/tests_data/C40_Final.gml" - city = GeometryFactory('citygml', city_file).city + city = GeometryFactory('citygml', path=city_file).city LifeCycleAssessment('fuel', city).enrich() for fuel in city.fuels: self.assertTrue(len(city.fuels) > 0) def test_vehicle(self): city_file = "../unittests/tests_data/C40_Final.gml" - city = GeometryFactory('citygml', city_file).city + city = GeometryFactory('citygml', path=city_file).city LifeCycleAssessment('vehicle', city).enrich() for vehicle in city.vehicles: self.assertTrue(len(city.vehicles) > 0) def test_machine(self): city_file = "../unittests/tests_data/C40_Final.gml" - city = GeometryFactory('citygml', city_file).city + city = GeometryFactory('citygml', path=city_file).city LifeCycleAssessment('machine', city).enrich() for machine in city.machines: self.assertTrue(len(city.machines) > 0) def test_material(self): city_file = "../unittests/tests_data/C40_Final.gml" - city = GeometryFactory('citygml', city_file).city + city = GeometryFactory('citygml', path=city_file).city LifeCycleAssessment('material', city).enrich() for material in city.lca_materials: self.assertTrue(len(city.lca_materials) > 0) diff --git a/unittests/test_schedules_factory.py b/unittests/test_schedules_factory.py new file mode 100644 index 00000000..3d7f5180 --- /dev/null +++ b/unittests/test_schedules_factory.py @@ -0,0 +1,69 @@ +""" +TestSchedulesFactory test and validate the city model structure schedules +SPDX - License - Identifier: LGPL - 3.0 - or -later +Copyright © 2022 Concordia CERC group +Project Coder Pilar Monsalvete Alvarez de Uribarri pilar.monsalvete@concordia.ca +""" +from pathlib import Path +from unittest import TestCase + +from imports.geometry_factory import GeometryFactory +from imports.usage_factory import UsageFactory +from imports.construction_factory import ConstructionFactory +from imports.schedules_factory import SchedulesFactory +from imports.geometry.helpers.geometry_helper import GeometryHelper + + +class TestSchedulesFactory(TestCase): + """ + TestSchedulesFactory TestCase + """ + + def setUp(self) -> None: + """ + Configure test environment + :return: + """ + self._example_path = (Path(__file__).parent / 'tests_data').resolve() + + def _get_citygml(self, file): + file_path = (self._example_path / file).resolve() + _city = GeometryFactory('citygml', path=file_path).city + for building in _city.buildings: + building.year_of_construction = 2006 + ConstructionFactory('nrel', _city).enrich() + self.assertIsNotNone(_city, 'city is none') + for building in _city.buildings: + building.function = GeometryHelper.libs_function_from_hft(building.function) + building.year_of_construction = 2005 + UsageFactory('hft', _city).enrich() + return _city + + def test_doe_idf_archetypes(self): + """ + Enrich the city with doe_idf schedule archetypes and verify it + """ + file = (self._example_path / 'C40_Final.gml').resolve() + city = self._get_citygml(file) + occupancy_handler = 'doe_idf' + SchedulesFactory(occupancy_handler, city).enrich() + for building in city.buildings: + for internal_zone in building.internal_zones: + self.assertTrue(len(internal_zone.usage_zones) > 0) + for usage_zone in internal_zone.usage_zones: + self.assertIsNot(len(usage_zone.occupancy.occupancy_schedules), 0, 'no occupancy schedules defined') + for schedule in usage_zone.occupancy.occupancy_schedules: + self.assertIsNotNone(schedule.type) + self.assertIsNotNone(schedule.values) + self.assertIsNotNone(schedule.data_type) + self.assertIsNotNone(schedule.time_step) + self.assertIsNotNone(schedule.time_range) + self.assertIsNotNone(schedule.day_types) + self.assertIsNot(len(usage_zone.lighting.schedules), 0, 'no lighting schedules defined') + for schedule in usage_zone.lighting.schedules: + self.assertIsNotNone(schedule.type) + self.assertIsNotNone(schedule.values) + self.assertIsNotNone(schedule.data_type) + self.assertIsNotNone(schedule.time_step) + self.assertIsNotNone(schedule.time_range) + self.assertIsNotNone(schedule.day_types) diff --git a/unittests/test_usage_factory.py b/unittests/test_usage_factory.py index 15138579..f4feb04c 100644 --- a/unittests/test_usage_factory.py +++ b/unittests/test_usage_factory.py @@ -26,7 +26,7 @@ class TestUsageFactory(TestCase): def _get_citygml(self, file): file_path = (self._example_path / file).resolve() - self._city = GeometryFactory('citygml', file_path).city + self._city = GeometryFactory('citygml', path=file_path).city self.assertIsNotNone(self._city, 'city is none') return self._city