def test_building_footprint_courtyard(): """Test the building footprint method with courtyard geometry.""" pts_1 = (Point3D(0, 0, 3), Point3D(0, 5, 3), Point3D(15, 5, 3), Point3D(15, 0, 3)) pts_2 = (Point3D(15, 0, 3), Point3D(15, 15, 3), Point3D(20, 15, 3), Point3D(20, 0, 3)) pts_3 = (Point3D(0, 5, 3), Point3D(0, 20, 3), Point3D(5, 20, 3), Point3D(5, 5, 3)) pts_4 = (Point3D(5, 15, 3), Point3D(5, 20, 3), Point3D(20, 20, 3), Point3D(20, 15, 3)) room2d_1 = Room2D('Office1', Face3D(pts_1), 3) room2d_2 = Room2D('Office2', Face3D(pts_2), 3) room2d_3 = Room2D('Office3', Face3D(pts_3), 3) room2d_4 = Room2D('Office4', Face3D(pts_4), 3) int_rms = Room2D.intersect_adjacency( [room2d_1, room2d_2, room2d_3, room2d_4], 0.01) story = Story('Office_Floor', int_rms) story.rotate_xy(5, Point3D(0, 0, 0)) story.solve_room_2d_adjacency(0.01) story.set_outdoor_window_parameters(SimpleWindowRatio(0.4)) story.multiplier = 4 building = Building('Office_Building', [story]) footprint = building.footprint(0.01) assert len(footprint) == 1 assert isinstance(footprint[0], Face3D) assert len(footprint[0].boundary) == 8 assert len(footprint[0].holes) == 1 assert len(footprint[0].holes[0]) == 4
def test_story_set_outdoor_window_shading_parameters(): """Test the Story set_outdoor_window_parameters method.""" pts_1 = (Point3D(0, 0, 3), Point3D(0, 10, 3), Point3D(10, 10, 3), Point3D(10, 0, 3)) pts_2 = (Point3D(10, 0, 3), Point3D(10, 10, 3), Point3D(20, 10, 3), Point3D(20, 0, 3)) pts_3 = (Point3D(0, 10, 3), Point3D(0, 20, 3), Point3D(10, 20, 3), Point3D(10, 10, 3)) pts_4 = (Point3D(10, 10, 3), Point3D(10, 20, 3), Point3D(20, 20, 3), Point3D(20, 10, 3)) room2d_1 = Room2D('Office1', Face3D(pts_1), 3) room2d_2 = Room2D('Office2', Face3D(pts_2), 3) room2d_3 = Room2D('Office3', Face3D(pts_3), 3) room2d_4 = Room2D('Office4', Face3D(pts_4), 3) story = Story('OfficeFloor', [room2d_1, room2d_2, room2d_3, room2d_4]) story.solve_room_2d_adjacency(0.01) ashrae_base = SimpleWindowRatio(0.4) overhang = Overhang(1) story.set_outdoor_window_parameters(ashrae_base) story.set_outdoor_shading_parameters(overhang) assert story.room_2ds[0].window_parameters[1] is None assert story.room_2ds[0].window_parameters[2] == ashrae_base assert story.room_2ds[0].shading_parameters[1] is None assert story.room_2ds[0].shading_parameters[2] == overhang assert story.exterior_wall_area == 60 * 4 assert story.exterior_aperture_area == 60 * 4 * 0.4
def test_building_footprint_simple(): """Test the building footprint method with simple geometry.""" pts_1 = (Point3D(0, 0, 3), Point3D(0, 10, 3), Point3D(10, 10, 3), Point3D(10, 0, 3)) pts_2 = (Point3D(10, 0, 3), Point3D(10, 10, 3), Point3D(20, 10, 3), Point3D(20, 0, 3)) pts_3 = (Point3D(0, 10, 3), Point3D(0, 20, 3), Point3D(10, 20, 3), Point3D(10, 10, 3)) pts_4 = (Point3D(10, 10, 3), Point3D(10, 20, 3), Point3D(20, 20, 3), Point3D(20, 10, 3)) room2d_1 = Room2D('Office1', Face3D(pts_1), 3) room2d_2 = Room2D('Office2', Face3D(pts_2), 3) room2d_3 = Room2D('Office3', Face3D(pts_3), 3) room2d_4 = Room2D('Office4', Face3D(pts_4), 3) story = Story('Office_Floor', [room2d_1, room2d_2, room2d_3, room2d_4]) story.solve_room_2d_adjacency(0.01) story.set_outdoor_window_parameters(SimpleWindowRatio(0.4)) story.multiplier = 4 building = Building('Office_Building', [story]) footprint = building.footprint(0.01) assert len(footprint) == 1 assert isinstance(footprint[0], Face3D) assert footprint[0].holes is None assert len(footprint[0].vertices) == 8 assert footprint[0].min == Point3D(0, 0, 3) assert footprint[0].max == Point3D(20, 20, 3)
def test_to_dict(): """Test the Building to_dict method.""" pts_1 = (Point3D(0, 0, 2), Point3D(10, 0, 2), Point3D(10, 10, 2), Point3D(0, 10, 2)) pts_2 = (Point3D(10, 0, 3), Point3D(20, 0, 3), Point3D(20, 10, 3), Point3D(10, 10, 3)) room2d_1 = Room2D('Office1', Face3D(pts_1), 5) room2d_2 = Room2D('Office2', Face3D(pts_2), 3) story = Story('Office_Floor', [room2d_1, room2d_2]) story.solve_room_2d_adjacency(0.01) story.set_outdoor_window_parameters(SimpleWindowRatio(0.4)) story.set_outdoor_shading_parameters(Overhang(1)) story.multiplier = 4 building = Building('Office_Building', [story]) building.separate_top_bottom_floors() bd = building.to_dict() assert bd['type'] == 'Building' assert bd['identifier'] == 'Office_Building' assert bd['display_name'] == 'Office_Building' assert 'unique_stories' in bd assert len(bd['unique_stories']) == 3 assert 'properties' in bd assert bd['properties']['type'] == 'BuildingProperties'
def test_to_honeybee(): """Test the to_honeybee method.""" pts_1 = (Point3D(0, 0, 3), Point3D(10, 0, 3), Point3D(10, 10, 3), Point3D(0, 10, 3)) pts_2 = (Point3D(10, 0, 3), Point3D(20, 0, 3), Point3D(20, 10, 3), Point3D(10, 10, 3)) room2d_1 = Room2D('Office1', Face3D(pts_1), 3) room2d_2 = Room2D('Office2', Face3D(pts_2), 3) story = Story('OfficeFloor', [room2d_1, room2d_2]) story.solve_room_2d_adjacency(0.01) story.set_outdoor_window_parameters(SimpleWindowRatio(0.4)) rooms = story.to_honeybee(0.01) assert len(rooms) == 2 assert len(rooms[0]) == 6 assert rooms[0].story == story.identifier assert rooms[0].multiplier == story.multiplier assert rooms[0].volume == 300 assert rooms[0].floor_area == 100 assert rooms[0].exterior_wall_area == 90 assert rooms[0].exterior_aperture_area == pytest.approx(90 * 0.4, rel=1e-3) assert rooms[0].average_floor_height == 3 assert rooms[0].check_solid(0.01, 1) assert isinstance(rooms[0][1].boundary_condition, Outdoors) assert isinstance(rooms[0][2].boundary_condition, Surface) assert rooms[0][2].boundary_condition.boundary_condition_object == \ rooms[1][4].identifier assert len(rooms[0][1].apertures) == 1 assert len(rooms[0][2].apertures) == 0
def test_to_from_dfpkl_methods(): """Test the to/from dfpkl methods.""" pts_1 = (Point3D(0, 0, 3), Point3D(0, 10, 3), Point3D(10, 10, 3), Point3D(10, 0, 3)) pts_2 = (Point3D(10, 0, 3), Point3D(10, 10, 3), Point3D(20, 10, 3), Point3D(20, 0, 3)) pts_3 = (Point3D(0, 10, 3), Point3D(0, 20, 3), Point3D(10, 20, 3), Point3D(10, 10, 3)) pts_4 = (Point3D(10, 10, 3), Point3D(10, 20, 3), Point3D(20, 20, 3), Point3D(20, 10, 3)) room2d_1 = Room2D('Office1', Face3D(pts_1), 3) room2d_2 = Room2D('Office2', Face3D(pts_2), 3) room2d_3 = Room2D('Office3', Face3D(pts_3), 3) room2d_4 = Room2D('Office4', Face3D(pts_4), 3) story = Story('OfficeFloor', [room2d_1, room2d_2, room2d_3, room2d_4]) story.solve_room_2d_adjacency(0.01) story.set_outdoor_window_parameters(SimpleWindowRatio(0.4)) story.multiplier = 4 building = Building('OfficeBuilding', [story]) tree_canopy_geo1 = Face3D.from_regular_polygon(6, 6, Plane(o=Point3D(5, -10, 6))) tree_canopy_geo2 = Face3D.from_regular_polygon(6, 2, Plane(o=Point3D(-5, -10, 3))) tree_canopy = ContextShade('TreeCanopy', [tree_canopy_geo1, tree_canopy_geo2]) model = Model('NewDevelopment', [building], [tree_canopy]) model_dfpkl = model.to_dfpkl('test') assert os.path.isfile(model_dfpkl) new_model = Model.from_dfpkl(model_dfpkl) assert isinstance(new_model, Model) os.remove(model_dfpkl)
def test_set_all_room_2d_hvac(): """Test the set_all_room_2d_hvac method on a Building.""" pts_1 = (Point3D(0, 0, 3), Point3D(0, 10, 3), Point3D(10, 10, 3), Point3D(10, 0, 3)) pts_2 = (Point3D(10, 0, 3), Point3D(10, 10, 3), Point3D(20, 10, 3), Point3D(20, 0, 3)) pts_3 = (Point3D(0, 10, 3), Point3D(0, 20, 3), Point3D(10, 20, 3), Point3D(10, 10, 3)) pts_4 = (Point3D(10, 10, 3), Point3D(10, 20, 3), Point3D(20, 20, 3), Point3D(20, 10, 3)) room2d_1 = Room2D('Office1', Face3D(pts_1), 3) room2d_2 = Room2D('Office2', Face3D(pts_2), 3) room2d_3 = Room2D('Office3', Face3D(pts_3), 3) room2d_4 = Room2D('Office4', Face3D(pts_4), 3) story = Story('OfficeFloor', [room2d_1, room2d_2, room2d_3, room2d_4]) story.solve_room_2d_adjacency(0.01) story.set_outdoor_window_parameters(SimpleWindowRatio(0.4)) story.multiplier = 4 building = Building('OfficeBuilding', [story]) sensible = 0.8 latent = 0.7 ideal_air_sys = IdealAirSystem('Office Ideal Air', sensible_heat_recovery=sensible, latent_heat_recovery=latent) building.properties.energy.set_all_room_2d_hvac(ideal_air_sys, False) assert all(isinstance(room.properties.energy.hvac, IdealAirSystem) for room in building.unique_room_2ds) assert all(room.properties.energy.hvac.sensible_heat_recovery == sensible for room in building.unique_room_2ds) assert all(room.properties.energy.hvac.latent_heat_recovery == latent for room in building.unique_room_2ds)
def test_energy_properties(): """Test the existence of the Story energy properties.""" pts_1 = (Point3D(0, 0, 3), Point3D(0, 10, 3), Point3D(10, 10, 3), Point3D(10, 0, 3)) pts_2 = (Point3D(10, 0, 3), Point3D(10, 10, 3), Point3D(20, 10, 3), Point3D(20, 0, 3)) pts_3 = (Point3D(0, 10, 3), Point3D(0, 20, 3), Point3D(10, 20, 3), Point3D(10, 10, 3)) pts_4 = (Point3D(10, 10, 3), Point3D(10, 20, 3), Point3D(20, 20, 3), Point3D(20, 10, 3)) room2d_1 = Room2D('Office1', Face3D(pts_1), 3) room2d_2 = Room2D('Office2', Face3D(pts_2), 3) room2d_3 = Room2D('Office3', Face3D(pts_3), 3) room2d_4 = Room2D('Office4', Face3D(pts_4), 3) story = Story('OfficeFloor', [room2d_1, room2d_2, room2d_3, room2d_4]) story.solve_room_2d_adjacency(0.01) story.set_outdoor_window_parameters(SimpleWindowRatio(0.4)) assert hasattr(story.properties, 'energy') assert isinstance(story.properties.energy, StoryEnergyProperties) assert isinstance(story.properties.energy.construction_set, ConstructionSet)
def test_to_honeybee_multiple_models(): """Test to_honeybee with multiple honeybee models.""" pts_1 = (Point3D(0, 0, 3), Point3D(10, 0, 3), Point3D(10, 10, 3), Point3D(0, 10, 3)) pts_2 = (Point3D(10, 0, 3), Point3D(20, 0, 3), Point3D(20, 10, 3), Point3D(10, 10, 3)) pts_3 = (Point3D(0, 20, 3), Point3D(20, 20, 3), Point3D(20, 30, 3), Point3D(0, 30, 3)) room2d_1 = Room2D('Office1', Face3D(pts_1), 3) room2d_2 = Room2D('Office2', Face3D(pts_2), 3) room2d_3 = Room2D('Office3', Face3D(pts_3), 3) story_big = Story('OfficeFloorBig', [room2d_3]) story = Story('OfficeFloor', [room2d_1, room2d_2]) story.solve_room_2d_adjacency(0.01) story.set_outdoor_window_parameters(SimpleWindowRatio(0.4)) story.multiplier = 4 building = Building('OfficeBuilding', [story]) story_big.set_outdoor_window_parameters(SimpleWindowRatio(0.4)) story_big.multiplier = 4 building_big = Building('OfficeBuildingBig', [story_big]) tree_canopy_geo1 = Face3D.from_regular_polygon(6, 6, Plane(o=Point3D(5, -10, 6))) tree_canopy_geo2 = Face3D.from_regular_polygon(6, 2, Plane(o=Point3D(-5, -10, 3))) tree_canopy = ContextShade('TreeCanopy', [tree_canopy_geo1, tree_canopy_geo2]) model = Model('NewDevelopment', [building, building_big], [tree_canopy]) hb_models = model.to_honeybee('Building', 10, False, tolerance=0.01) assert len(hb_models) == 2 assert isinstance(hb_models[0], hb_model.Model) assert isinstance(hb_models[-1], hb_model.Model) assert len(hb_models[-1].rooms) == 4 assert len(hb_models[-1].rooms[-1]) == 6 assert hb_models[-1].rooms[-1].volume == 600 assert hb_models[-1].rooms[-1].floor_area == 200 assert hb_models[-1].rooms[-1].exterior_wall_area == 180 assert len(hb_models[0].orphaned_shades) == 6 assert len(hb_models[-1].orphaned_shades) == 6
def test_model_properties_setability(): """Test the setting of properties on the Model.""" pts_1 = (Point3D(0, 0, 3), Point3D(0, 10, 3), Point3D(10, 10, 3), Point3D(10, 0, 3)) pts_2 = (Point3D(10, 0, 3), Point3D(10, 10, 3), Point3D(20, 10, 3), Point3D(20, 0, 3)) pts_3 = (Point3D(0, 10, 3), Point3D(0, 20, 3), Point3D(10, 20, 3), Point3D(10, 10, 3)) pts_4 = (Point3D(10, 10, 3), Point3D(10, 20, 3), Point3D(20, 20, 3), Point3D(20, 10, 3)) room2d_1 = Room2D('Office1', Face3D(pts_1), 3) room2d_2 = Room2D('Office2', Face3D(pts_2), 3) room2d_3 = Room2D('Office3', Face3D(pts_3), 3) room2d_4 = Room2D('Office4', Face3D(pts_4), 3) story = Story('OfficeFloor', [room2d_1, room2d_2, room2d_3, room2d_4]) story.solve_room_2d_adjacency(0.01) story.set_outdoor_window_parameters(SimpleWindowRatio(0.4)) story.multiplier = 4 building = Building('OfficeBuilding', [story]) model = Model('NewDevelopment', [building]) model.to_rectangular_windows() model.display_name = 'TestBuilding' assert model.display_name == 'TestBuilding' model.units = 'Feet' assert model.units == 'Feet' model.tolerance = 0.1 assert model.tolerance == 0.1 model.angle_tolerance = 0.01 assert model.angle_tolerance == 0.01 model.tolerance = 0.01 assert model.tolerance == 0.01
def test_to_dict(): """Test the Story to_dict method with energy properties.""" mass_set = ConstructionSet('Thermal Mass Construction Set') pts_1 = (Point3D(0, 0, 3), Point3D(0, 10, 3), Point3D(10, 10, 3), Point3D(10, 0, 3)) pts_2 = (Point3D(10, 0, 3), Point3D(10, 10, 3), Point3D(20, 10, 3), Point3D(20, 0, 3)) pts_3 = (Point3D(0, 10, 3), Point3D(0, 20, 3), Point3D(10, 20, 3), Point3D(10, 10, 3)) pts_4 = (Point3D(10, 10, 3), Point3D(10, 20, 3), Point3D(20, 20, 3), Point3D(20, 10, 3)) room2d_1 = Room2D('Office1', Face3D(pts_1), 3) room2d_2 = Room2D('Office2', Face3D(pts_2), 3) room2d_3 = Room2D('Office3', Face3D(pts_3), 3) room2d_4 = Room2D('Office4', Face3D(pts_4), 3) story = Story('OfficeFloor', [room2d_1, room2d_2, room2d_3, room2d_4]) story.solve_room_2d_adjacency(0.01) story.set_outdoor_window_parameters(SimpleWindowRatio(0.4)) sd = story.to_dict() assert 'properties' in sd assert sd['properties']['type'] == 'StoryProperties' assert 'energy' in sd['properties'] assert sd['properties']['energy']['type'] == 'StoryEnergyProperties' assert 'construction_set' not in sd['properties']['energy'] or \ sd['properties']['energy']['construction_set'] is None story.properties.energy.construction_set = mass_set sd = story.to_dict() assert sd['properties']['energy']['construction_set'] is not None
def test_to_honeybee_different_heights(): """Test the to_honeybee method with different floor and ceiling heights.""" pts_1 = (Point3D(0, 0, 2), Point3D(10, 0, 2), Point3D(10, 10, 2), Point3D(0, 10, 2)) pts_2 = (Point3D(10, 0, 3), Point3D(20, 0, 3), Point3D(20, 10, 3), Point3D(10, 10, 3)) room2d_1 = Room2D('Office1', Face3D(pts_1), 5) room2d_2 = Room2D('Office2', Face3D(pts_2), 3) story = Story('OfficeFloor', [room2d_1, room2d_2]) story.set_outdoor_window_parameters(SimpleWindowRatio(0.4)) story.solve_room_2d_adjacency(0.01) rooms = story.to_honeybee(True, tolerance=0.01) assert len(rooms) == 2 assert len(rooms[0]) == 8 assert rooms[0].volume == 500 assert rooms[0].floor_area == 100 assert rooms[0].exterior_wall_area >= 150 assert rooms[0].exterior_aperture_area == pytest.approx(150 * 0.4, rel=1e-3) assert rooms[0].average_floor_height == 2 assert rooms[0].check_solid(0.01, 1) assert isinstance(rooms[0][1].boundary_condition, Outdoors) assert not isinstance(rooms[0][2].boundary_condition, Surface) # bottom assert isinstance(rooms[0][3].boundary_condition, Surface) # middle assert not isinstance(rooms[0][4].boundary_condition, Surface) # top assert len(rooms[0][3].apertures) == 1 assert len(rooms[1][4].apertures) == 1 rm1_ap = rooms[0][3].apertures[0] rm2_ap = rooms[1][4].apertures[0] assert isinstance(rm1_ap.boundary_condition, Surface) assert isinstance(rm2_ap.boundary_condition, Surface) assert rm1_ap.area == pytest.approx(rm2_ap.area, rel=1e-3)
def test_from_dict(): """Test the Story from_dict method with energy properties.""" pts_1 = (Point3D(0, 0, 3), Point3D(0, 10, 3), Point3D(10, 10, 3), Point3D(10, 0, 3)) pts_2 = (Point3D(10, 0, 3), Point3D(10, 10, 3), Point3D(20, 10, 3), Point3D(20, 0, 3)) pts_3 = (Point3D(0, 10, 3), Point3D(0, 20, 3), Point3D(10, 20, 3), Point3D(10, 10, 3)) pts_4 = (Point3D(10, 10, 3), Point3D(10, 20, 3), Point3D(20, 20, 3), Point3D(20, 10, 3)) room2d_1 = Room2D('Office1', Face3D(pts_1), 3) room2d_2 = Room2D('Office2', Face3D(pts_2), 3) room2d_3 = Room2D('Office3', Face3D(pts_3), 3) room2d_4 = Room2D('Office4', Face3D(pts_4), 3) story = Story('OfficeFloor', [room2d_1, room2d_2, room2d_3, room2d_4]) story.solve_room_2d_adjacency(0.01) story.set_outdoor_window_parameters(SimpleWindowRatio(0.4)) mass_set = ConstructionSet('Thermal Mass Construction Set') story.properties.energy.construction_set = mass_set sd = story.to_dict() new_story = Story.from_dict(sd) assert new_story.properties.energy.construction_set.identifier == \ 'Thermal Mass Construction Set' assert new_story.to_dict() == sd
def test_set_all_room_2d_program_type(): """Test the set_all_room_2d_program_type method on a Story.""" pts_1 = (Point3D(0, 0, 3), Point3D(0, 10, 3), Point3D(10, 10, 3), Point3D(10, 0, 3)) pts_2 = (Point3D(10, 0, 3), Point3D(10, 10, 3), Point3D(20, 10, 3), Point3D(20, 0, 3)) pts_3 = (Point3D(0, 10, 3), Point3D(0, 20, 3), Point3D(10, 20, 3), Point3D(10, 10, 3)) pts_4 = (Point3D(10, 10, 3), Point3D(10, 20, 3), Point3D(20, 20, 3), Point3D(20, 10, 3)) room2d_1 = Room2D('Office1', Face3D(pts_1), 3) room2d_2 = Room2D('Office2', Face3D(pts_2), 3) room2d_3 = Room2D('Office3', Face3D(pts_3), 3) room2d_4 = Room2D('Office4', Face3D(pts_4), 3) story = Story('OfficeFloor', [room2d_1, room2d_2, room2d_3, room2d_4]) story.solve_room_2d_adjacency(0.01) story.set_outdoor_window_parameters(SimpleWindowRatio(0.4)) lab_program = office_program.duplicate() lab_program.identifier = 'Bio Laboratory' lab_program.electric_equipment.watts_per_area = 50 lab_program.ventilation.flow_per_person = 0 lab_program.ventilation.flow_per_area = 0 lab_program.ventilation.air_changes_per_hour = 6 story.properties.energy.set_all_room_2d_program_type(lab_program) assert all(room_2d.properties.energy.program_type == lab_program for room_2d in story.room_2ds)
def test_story_init(): """Test the initialization of Story objects and basic properties.""" pts_1 = (Point3D(0, 0, 3), Point3D(0, 10, 3), Point3D(10, 10, 3), Point3D(10, 0, 3)) pts_2 = (Point3D(10, 0, 3), Point3D(10, 10, 3), Point3D(20, 10, 3), Point3D(20, 0, 3)) pts_3 = (Point3D(0, 10, 3), Point3D(0, 20, 3), Point3D(10, 20, 3), Point3D(10, 10, 3)) pts_4 = (Point3D(10, 10, 3), Point3D(10, 20, 3), Point3D(20, 20, 3), Point3D(20, 10, 3)) room2d_1 = Room2D('Office1', Face3D(pts_1), 3) room2d_2 = Room2D('Office2', Face3D(pts_2), 3) room2d_3 = Room2D('Office3', Face3D(pts_3), 3) room2d_4 = Room2D('Office4', Face3D(pts_4), 3) story = Story('OfficeFloor', [room2d_1, room2d_2, room2d_3, room2d_4]) story.solve_room_2d_adjacency(0.01) story.set_outdoor_window_parameters(SimpleWindowRatio(0.4)) str(story) # test the string representation assert story.identifier == 'OfficeFloor' assert story.display_name == 'OfficeFloor' assert len(story.room_2ds) == 4 for room in story.room_2ds: assert isinstance(room, Room2D) assert room.has_parent assert story.floor_to_floor_height == 3 assert story.multiplier == 1 assert story.parent is None assert not story.has_parent assert story.floor_height == 3 assert story.volume == 100 * 3 * 4 assert story.floor_area == 400 assert story.exterior_wall_area == 60 * 4 assert story.exterior_aperture_area == 60 * 4 * 0.4 assert story.is_above_ground
def test_properties(): """Test various properties on the model.""" pts_1 = (Point3D(0, 0, 3), Point3D(10, 0, 3), Point3D(10, 10, 3), Point3D(0, 10, 3)) pts_2 = (Point3D(10, 0, 3), Point3D(20, 0, 3), Point3D(20, 10, 3), Point3D(10, 10, 3)) pts_3 = (Point3D(0, 20, 3), Point3D(20, 20, 3), Point3D(20, 30, 3), Point3D(0, 30, 3)) room2d_1 = Room2D('Office1', Face3D(pts_1), 3) room2d_2 = Room2D('Office2', Face3D(pts_2), 3) room2d_3 = Room2D('Office3', Face3D(pts_3), 3) story_big = Story('OfficeFloorBig', [room2d_3]) story = Story('OfficeFloor', [room2d_1, room2d_2]) story.solve_room_2d_adjacency(0.01) story.set_outdoor_window_parameters(SimpleWindowRatio(0.4)) story.multiplier = 4 building = Building('OfficeBuilding', [story]) story_big.set_outdoor_window_parameters(SimpleWindowRatio(0.4)) story_big.multiplier = 2 building_big = Building('OfficeBuildingBig', [story_big]) model = Model('NewDevelopment', [building, building_big]) assert model.average_story_count == 3 assert model.average_story_count_above_ground == 3 assert model.average_height == 12 assert model.average_height_above_ground == 9 assert model.footprint_area == 100 * 4 assert model.floor_area == (100 * 2 * 4) + (200 * 2) assert model.exterior_wall_area == (90 * 2 * 4) + (180 * 2) assert model.exterior_aperture_area == (90 * 2 * 4 * 0.4) + (180 * 2 * 0.4) assert model.volume == (100 * 2 * 4 * 3) + (200 * 2 * 3)
def story_simple(directory): """Generate simple Story sample.""" mass_set = ConstructionSet('Thermal Mass Construction Set') pts_1 = (Point3D(0, 0, 3), Point3D(0, 10, 3), Point3D(10, 10, 3), Point3D(10, 0, 3)) pts_2 = (Point3D(10, 0, 3), Point3D(10, 10, 3), Point3D(20, 10, 3), Point3D(20, 0, 3)) pts_3 = (Point3D(0, 10, 3), Point3D(0, 20, 3), Point3D(10, 20, 3), Point3D(10, 10, 3)) pts_4 = (Point3D(10, 10, 3), Point3D(10, 20, 3), Point3D(20, 20, 3), Point3D(20, 10, 3)) room2d_1 = Room2D('Office 1', Face3D(pts_1), 3) room2d_2 = Room2D('Office 2', Face3D(pts_2), 3) room2d_3 = Room2D('Office 3', Face3D(pts_3), 3) room2d_4 = Room2D('Office 4', Face3D(pts_4), 3) story = Story('Office Floor', [room2d_1, room2d_2, room2d_3, room2d_4]) story.solve_room_2d_adjacency(0.01) story.set_outdoor_window_parameters(SimpleWindowRatio(0.4)) story.properties.energy.construction_set = mass_set dest_file = os.path.join(directory, 'story_simple.json') with open(dest_file, 'w') as fp: json.dump(story.to_dict(True), fp, indent=4)
def two_buildings(): pts_1 = (Point3D(0, 0, 3), Point3D(10, 0, 3), Point3D(10, 10, 3), Point3D(0, 10, 3)) pts_2 = (Point3D(10, 0, 3), Point3D(20, 0, 3), Point3D(20, 10, 3), Point3D(10, 10, 3)) pts_3 = (Point3D(0, 20, 3), Point3D(20, 20, 3), Point3D(20, 30, 3), Point3D(0, 30, 3)) room2d_1 = Room2D('Office1', Face3D(pts_1), 3) room2d_2 = Room2D('Office2', Face3D(pts_2), 3) room2d_3 = Room2D('Office3', Face3D(pts_3), 3) story_big = Story('OfficeFloorBig', [room2d_3]) story = Story('OfficeFloor', [room2d_1, room2d_2]) story.solve_room_2d_adjacency(0.01) story.set_outdoor_window_parameters(SimpleWindowRatio(0.3)) story.multiplier = 3 building = Building('OfficeBuilding', [story]) building.separate_top_bottom_floors() story_big.set_outdoor_window_parameters(SimpleWindowRatio(0.6)) story_big.multiplier = 4 building_big = Building('OfficeBuildingBig', [story_big]) building_big.separate_top_bottom_floors() tree_canopy_geo1 = Face3D.from_regular_polygon(6, 6, Plane(o=Point3D(5, -10, 6))) tree_canopy_geo2 = Face3D.from_regular_polygon( 6, 2, Plane(o=Point3D(-5, -10, 3))) tree_canopy = ContextShade('TreeCanopy', [tree_canopy_geo1, tree_canopy_geo2]) model = Model('NewDevelopment', [building, building_big], [tree_canopy]) return model
def test_energy_properties(): """Test the existence of the Model energy properties.""" pts_1 = (Point3D(0, 0, 3), Point3D(0, 10, 3), Point3D(10, 10, 3), Point3D(10, 0, 3)) pts_2 = (Point3D(10, 0, 3), Point3D(10, 10, 3), Point3D(20, 10, 3), Point3D(20, 0, 3)) pts_3 = (Point3D(0, 10, 3), Point3D(0, 20, 3), Point3D(10, 20, 3), Point3D(10, 10, 3)) pts_4 = (Point3D(10, 10, 3), Point3D(10, 20, 3), Point3D(20, 20, 3), Point3D(20, 10, 3)) room2d_1 = Room2D('Office1', Face3D(pts_1), 3) room2d_2 = Room2D('Office2', Face3D(pts_2), 3) room2d_3 = Room2D('Office3', Face3D(pts_3), 3) room2d_4 = Room2D('Office4', Face3D(pts_4), 3) story = Story('OfficeFloor', [room2d_1, room2d_2, room2d_3, room2d_4]) story.solve_room_2d_adjacency(0.01) story.set_outdoor_window_parameters(SimpleWindowRatio(0.4)) story.multiplier = 4 for room in story.room_2ds: room.properties.energy.program_type = office_program room.properties.energy.add_default_ideal_air() building = Building('OfficeBuilding', [story]) tree_canopy_geo1 = Face3D.from_regular_polygon(6, 6, Plane(o=Point3D(5, -10, 6))) tree_canopy_geo2 = Face3D.from_regular_polygon( 6, 2, Plane(o=Point3D(-5, -10, 3))) tree_canopy = ContextShade('TreeCanopy', [tree_canopy_geo1, tree_canopy_geo2]) bright_leaves = ShadeConstruction('Bright Light Leaves', 0.5, 0.5, True) tree_canopy.properties.energy.construction = bright_leaves tree_trans = ScheduleRuleset.from_constant_value('Tree Transmittance', 0.5, schedule_types.fractional) tree_canopy.properties.energy.transmittance_schedule = tree_trans model = Model('NewDevelopment', [building], [tree_canopy]) assert hasattr(model.properties, 'energy') assert isinstance(model.properties.energy, ModelEnergyProperties) assert isinstance(model.properties.host, Model) assert len(model.properties.energy.materials) == 0 for mat in model.properties.energy.materials: assert isinstance(mat, _EnergyMaterialBase) assert len(model.properties.energy.constructions) == 1 for cnst in model.properties.energy.constructions: assert isinstance(cnst, (WindowConstruction, OpaqueConstruction, ShadeConstruction, AirBoundaryConstruction)) assert len(model.properties.energy.shade_constructions) == 1 assert len(model.properties.energy.construction_sets) == 0 assert len(model.properties.energy.schedule_type_limits) == 3 assert len(model.properties.energy.schedules) == 8 assert len(model.properties.energy.shade_schedules) == 1 assert len(model.properties.energy.program_types) == 1
def lab_building(directory): poly_file = './scripts/geometry/lab_building_geo.json' with open(poly_file, 'r') as fp: geo_dict = json.load(fp) # get all of the programs and construction sets c_set = constr_set_lib.construction_set_by_identifier('2013::ClimateZone5::SteelFramed') office = prog_type_lib.program_type_by_identifier('2013::MediumOffice::ClosedOffice') writeup = prog_type_lib.program_type_by_identifier('2013::Laboratory::Office') lab_support = prog_type_lib.program_type_by_identifier('2013::Laboratory::Lab with fume hood') laboratory = prog_type_lib.program_type_by_identifier('2013::Laboratory::Open lab') conference = prog_type_lib.program_type_by_identifier('2013::MediumOffice::Conference') classroom = prog_type_lib.program_type_by_identifier('2013::MediumOffice::Classroom') corridor = prog_type_lib.program_type_by_identifier('2013::MediumOffice::Corridor') storage = prog_type_lib.program_type_by_identifier('2013::MediumOffice::Storage') progs = [office, writeup, lab_support, laboratory, conference, classroom, corridor, storage] prog_keys = ['office', 'writeup', 'lab_support', 'laboratory', 'conference', 'classroom', 'corridor', 'storage'] # create the basic Room objects rooms = [] for prog_key, program in zip(prog_keys, progs): for i, room_geo_dict in enumerate(geo_dict[prog_key]): room_geo = Face3D.from_dict(room_geo_dict) room = Room2D('{}_{}'.format(prog_key, i), room_geo, 3.5) room.properties.energy.program_type = program room.properties.energy.construction_set = c_set room.properties.energy.add_default_ideal_air() rooms.append(room) # solve adjacency and set windows + shades story = Story('Lab_Floor_1', rooms, 4) story.remove_room_2d_colinear_vertices(0.01) story.intersect_room_2d_adjacency(0.01) story.solve_room_2d_adjacency(0.01) story.set_outdoor_window_parameters(RepeatingWindowRatio(0.35, 2.8, 0.8, 3)) story.set_ground_contact(True) story.set_top_exposed(True) bldg = Building('Lab_Building', [story]) # create the honeybee model model = bldg.to_honeybee(tolerance=0.01) model.units = 'Meters' model.tolerance = 0.01 model.angle_tolerance = 1.0 # generate louvers for all of the apertures for ap in model.apertures: ap.louvers_by_count(1, 0.5, 0.0, 0.0, Vector2D(1, 0)) # write the model to a JSON dest_file = os.path.join(directory, 'lab_building.hbjson') with open(dest_file, 'w') as fp: json.dump(model.to_dict(), fp, indent=4)
def test_building_init(): """Test the initialization of Building objects and basic properties.""" pts_1 = (Point3D(0, 0, 3), Point3D(0, 10, 3), Point3D(10, 10, 3), Point3D(10, 0, 3)) pts_2 = (Point3D(10, 0, 3), Point3D(10, 10, 3), Point3D(20, 10, 3), Point3D(20, 0, 3)) pts_3 = (Point3D(0, 10, 3), Point3D(0, 20, 3), Point3D(10, 20, 3), Point3D(10, 10, 3)) pts_4 = (Point3D(10, 10, 3), Point3D(10, 20, 3), Point3D(20, 20, 3), Point3D(20, 10, 3)) room2d_1 = Room2D('Office1', Face3D(pts_1), 3) room2d_2 = Room2D('Office2', Face3D(pts_2), 3) room2d_3 = Room2D('Office3', Face3D(pts_3), 3) room2d_4 = Room2D('Office4', Face3D(pts_4), 3) story = Story('Office_Floor', [room2d_1, room2d_2, room2d_3, room2d_4]) story.solve_room_2d_adjacency(0.01) story.set_outdoor_window_parameters(SimpleWindowRatio(0.4)) story.multiplier = 4 building = Building('Office_Building_1234', [story]) building.display_name = 'Office Building' str(building) # test the string representation assert building.identifier == 'Office_Building_1234' assert building.display_name == 'Office Building' assert len(building.unique_stories) == len( building.unique_stories_above_ground) == 1 assert len(building.all_stories()) == 4 assert len(building.unique_room_2ds) == 4 assert len(building.all_room_2ds()) == 16 for story in building.unique_stories: assert isinstance(story, Story) assert story.has_parent for story in building.all_stories(): assert isinstance(story, Story) assert story.has_parent for room in building.unique_room_2ds: assert isinstance(room, Room2D) assert room.has_parent for room in building.all_room_2ds(): assert isinstance(room, Room2D) assert room.has_parent assert building.height == 15 assert building.story_count == building.story_count_above_ground == 4 assert building.height_from_first_floor == building.height_above_ground == 12 assert building.footprint_area == 100 * 4 assert building.floor_area == 100 * 4 * 4 assert building.exterior_wall_area == 60 * 4 * 4 assert building.exterior_aperture_area == 60 * 4 * 4 * 0.4 assert building.volume == 100 * 3 * 4 * 4
def test_check_duplicate_construction_set_identifiers(): """Test the check_duplicate_construction_set_identifiers method.""" pts_1 = (Point3D(0, 0, 3), Point3D(0, 10, 3), Point3D(10, 10, 3), Point3D(10, 0, 3)) pts_2 = (Point3D(10, 0, 3), Point3D(10, 10, 3), Point3D(20, 10, 3), Point3D(20, 0, 3)) room2d_1 = Room2D('Office1', Face3D(pts_1), 3) room2d_2 = Room2D('Office2', Face3D(pts_2), 3) story = Story('OfficeFloor', [room2d_1, room2d_2]) story.solve_room_2d_adjacency(0.01) story.set_outdoor_window_parameters(SimpleWindowRatio(0.4)) story.multiplier = 4 for room in story.room_2ds: room.properties.energy.program_type = office_program room.properties.energy.add_default_ideal_air() building = Building('OfficeBuilding', [story]) building.separate_top_bottom_floors() constr_set = ConstructionSet('Attic Construction Set') polyiso = EnergyMaterial('PolyIso', 0.2, 0.03, 43, 1210, 'MediumRough') roof_constr = OpaqueConstruction('Attic Roof Construction', [roof_membrane, polyiso, wood]) floor_constr = OpaqueConstruction('Attic Floor Construction', [wood, insulation, wood]) constr_set.floor_set.interior_construction = floor_constr constr_set.roof_ceiling_set.exterior_construction = roof_constr building.unique_room_2ds[ -1].properties.energy.construction_set = constr_set building.unique_room_2ds[ -2].properties.energy.construction_set = constr_set tree_canopy_geo1 = Face3D.from_regular_polygon(6, 6, Plane(o=Point3D(5, -10, 6))) tree_canopy_geo2 = Face3D.from_regular_polygon( 6, 2, Plane(o=Point3D(-5, -10, 3))) tree_canopy = ContextShade('TreeCanopy', [tree_canopy_geo1, tree_canopy_geo2]) model = Model('NewDevelopment', [building], [tree_canopy]) assert model.properties.energy.check_duplicate_construction_set_identifiers( False) constr_set2 = ConstructionSet('Attic Construction Set') building.unique_room_2ds[ -2].properties.energy.construction_set = constr_set2 assert not model.properties.energy.check_duplicate_construction_set_identifiers( False) with pytest.raises(ValueError): model.properties.energy.check_duplicate_construction_set_identifiers( True)
def default_building(): pts_1 = (Point3D(0, 0, 3), Point3D(10, 0, 3), Point3D(10, 10, 3), Point3D(0, 10, 3)) pts_2 = (Point3D(10, 0, 3), Point3D(20, 0, 3), Point3D(20, 10, 3), Point3D(10, 10, 3)) room2d_1 = Room2D('Office1', Face3D(pts_1), 3) room2d_2 = Room2D('Office2', Face3D(pts_2), 3) story = Story('OfficeFloor', [room2d_1, room2d_2]) story.solve_room_2d_adjacency(0.01) story.set_outdoor_window_parameters(SimpleWindowRatio(0.3)) story.multiplier = 3 building = Building('OfficeBuilding', [story]) building.separate_top_bottom_floors() return building
def test_buildings_to_honeybee(): """Test the buildings_to_honeybee method.""" pts_1 = (Point3D(0, 0, 3), Point3D(10, 0, 3), Point3D(10, 10, 3), Point3D(0, 10, 3)) pts_2 = (Point3D(10, 0, 3), Point3D(20, 0, 3), Point3D(20, 10, 3), Point3D(10, 10, 3)) pts_3 = (Point3D(0, 20, 3), Point3D(20, 20, 3), Point3D(20, 30, 3), Point3D(0, 30, 3)) room2d_1 = Room2D('Office1', Face3D(pts_1), 3) room2d_2 = Room2D('Office2', Face3D(pts_2), 3) room2d_3 = Room2D('Office3', Face3D(pts_3), 3) story_big = Story('Office_Floor_Big', [room2d_3]) story = Story('Office_Floor', [room2d_1, room2d_2]) story.solve_room_2d_adjacency(0.01) story.set_outdoor_window_parameters(SimpleWindowRatio(0.4)) story.multiplier = 4 building = Building('Office_Building', [story]) story_big.set_outdoor_window_parameters(SimpleWindowRatio(0.4)) story_big.multiplier = 4 building_big = Building('Office_Building_Big', [story_big]) hb_models = Building.buildings_to_honeybee([building, building_big], None, None, False) assert len(hb_models) == 2 assert isinstance(hb_models[0], Model) assert len(hb_models[0].orphaned_shades) == 4 assert isinstance(hb_models[-1], Model) assert len(hb_models[-1].rooms) == 4 assert len(hb_models[-1].rooms[-1]) == 6 assert hb_models[-1].rooms[-1].volume == 600 assert hb_models[-1].rooms[-1].floor_area == 200 assert hb_models[-1].rooms[-1].exterior_wall_area == 180 hb_models = Building.buildings_to_honeybee([building, building_big], None, 5, True) assert len(hb_models) == 2 assert isinstance(hb_models[0], Model) assert len(hb_models[0].orphaned_shades) == 0 assert len(hb_models[0].rooms) == 2 for room in hb_models[0].rooms: assert room.multiplier == 4 hb_models = Building.buildings_to_honeybee([building, building_big], cap=True) assert len(hb_models) == 2 assert isinstance(hb_models[0], Model) assert len(hb_models[0].orphaned_shades) == 5
def test_to_honeybee(): """Test the to_honeybee method.""" pts_1 = (Point3D(0, 0, 3), Point3D(10, 0, 3), Point3D(10, 10, 3), Point3D(0, 10, 3)) pts_2 = (Point3D(10, 0, 3), Point3D(20, 0, 3), Point3D(20, 10, 3), Point3D(10, 10, 3)) room2d_1 = Room2D('Office1', Face3D(pts_1), 3) room2d_2 = Room2D('Office2', Face3D(pts_2), 3) story = Story('Office_Floor', [room2d_1, room2d_2]) story.solve_room_2d_adjacency(0.01) story.set_outdoor_window_parameters(SimpleWindowRatio(0.4)) story.multiplier = 4 building = Building('Office_Building', [story]) hb_model = building.to_honeybee(False, 0.01) assert isinstance(hb_model, Model) assert len(hb_model.rooms) == 8 assert len(hb_model.rooms[0]) == 6 assert hb_model.rooms[0].volume == 300 assert hb_model.rooms[0].floor_area == 100 assert hb_model.rooms[0].exterior_wall_area == 90 assert hb_model.rooms[0].exterior_aperture_area == pytest.approx(90 * 0.4, rel=1e-3) assert hb_model.rooms[0].average_floor_height == 3 assert hb_model.rooms[0].check_solid(0.01, 1) == '' assert isinstance(hb_model.rooms[0][1].boundary_condition, Outdoors) assert isinstance(hb_model.rooms[0][2].boundary_condition, Surface) assert hb_model.rooms[0][2].boundary_condition.boundary_condition_object == \ hb_model.rooms[1][4].identifier assert len(hb_model.rooms[0][1].apertures) == 1 assert len(hb_model.rooms[0][2].apertures) == 0 assert hb_model.check_duplicate_room_identifiers() == '' assert hb_model.check_duplicate_face_identifiers() == '' assert hb_model.check_duplicate_sub_face_identifiers() == '' assert hb_model.check_missing_adjacencies() == '' hb_model = building.to_honeybee(True, 0.01) assert len(hb_model.rooms) == 2 for room in hb_model.rooms: assert room.multiplier == 4 assert hb_model.check_duplicate_room_identifiers() == '' assert hb_model.check_duplicate_face_identifiers() == '' assert hb_model.check_duplicate_sub_face_identifiers() == '' assert hb_model.check_missing_adjacencies() == ''
def test_check_duplicate_program_type_identifiers(): """Test the check_duplicate_program_type_identifiers method.""" pts_1 = (Point3D(0, 0, 3), Point3D(0, 10, 3), Point3D(10, 10, 3), Point3D(10, 0, 3)) pts_2 = (Point3D(10, 0, 3), Point3D(10, 10, 3), Point3D(20, 10, 3), Point3D(20, 0, 3)) room2d_1 = Room2D('Office1', Face3D(pts_1), 3) room2d_2 = Room2D('Office2', Face3D(pts_2), 3) story = Story('OfficeFloor', [room2d_1, room2d_2]) story.solve_room_2d_adjacency(0.01) story.set_outdoor_window_parameters(SimpleWindowRatio(0.4)) story.multiplier = 4 for room in story.room_2ds: room.properties.energy.program_type = office_program room.properties.energy.add_default_ideal_air() building = Building('OfficeBuilding', [story]) building.separate_top_bottom_floors() attic_program_type = plenum_program.duplicate() attic_program_type.identifier = 'Attic Space' schedule = ScheduleRuleset.from_constant_value('Always Dim', 1, schedule_types.fractional) lighting = Lighting('Attic Lighting', 3, schedule) attic_program_type.lighting = lighting building.unique_room_2ds[ -1].properties.energy.program_type = attic_program_type building.unique_room_2ds[ -2].properties.energy.program_type = attic_program_type tree_canopy_geo1 = Face3D.from_regular_polygon(6, 6, Plane(o=Point3D(5, -10, 6))) tree_canopy_geo2 = Face3D.from_regular_polygon( 6, 2, Plane(o=Point3D(-5, -10, 3))) tree_canopy = ContextShade('TreeCanopy', [tree_canopy_geo1, tree_canopy_geo2]) model = Model('NewDevelopment', [building], [tree_canopy]) assert model.properties.energy.check_duplicate_program_type_identifiers( False) attic_program_type.unlock() attic_program_type.identifier = office_program.identifier attic_program_type.lock() assert not model.properties.energy.check_duplicate_program_type_identifiers( False) with pytest.raises(ValueError): model.properties.energy.check_duplicate_program_type_identifiers(True)
def test_to_from_dict(): """Test the to/from dict of Story objects.""" pts_1 = (Point3D(0, 0, 2), Point3D(10, 0, 2), Point3D(10, 10, 2), Point3D(0, 10, 2)) pts_2 = (Point3D(10, 0, 3), Point3D(20, 0, 3), Point3D(20, 10, 3), Point3D(10, 10, 3)) room2d_1 = Room2D('Office1', Face3D(pts_1), 5) room2d_2 = Room2D('Office2', Face3D(pts_2), 3) story = Story('OfficeFloor', [room2d_1, room2d_2]) story.solve_room_2d_adjacency(0.01) story.set_outdoor_window_parameters(SimpleWindowRatio(0.4)) story.set_outdoor_shading_parameters(Overhang(1)) story_dict = story.to_dict() new_story = Story.from_dict(story_dict) assert isinstance(new_story, Story) assert new_story.to_dict() == story_dict
def test_set_construction_set(): """Test the setting of a ConstructionSet on a Story.""" pts_1 = (Point3D(0, 0, 3), Point3D(0, 10, 3), Point3D(10, 10, 3), Point3D(10, 0, 3)) pts_2 = (Point3D(10, 0, 3), Point3D(10, 10, 3), Point3D(20, 10, 3), Point3D(20, 0, 3)) pts_3 = (Point3D(0, 10, 3), Point3D(0, 20, 3), Point3D(10, 20, 3), Point3D(10, 10, 3)) pts_4 = (Point3D(10, 10, 3), Point3D(10, 20, 3), Point3D(20, 20, 3), Point3D(20, 10, 3)) room2d_1 = Room2D('Office1', Face3D(pts_1), 3) room2d_2 = Room2D('Office2', Face3D(pts_2), 3) room2d_3 = Room2D('Office3', Face3D(pts_3), 3) room2d_4 = Room2D('Office4', Face3D(pts_4), 3) story = Story('OfficeFloor', [room2d_1, room2d_2, room2d_3, room2d_4]) story.solve_room_2d_adjacency(0.01) story.set_outdoor_window_parameters(SimpleWindowRatio(0.4)) mass_set = ConstructionSet('Thermal Mass Construction Set') concrete20 = EnergyMaterial('20cm Concrete', 0.2, 2.31, 2322, 832, 'MediumRough', 0.95, 0.75, 0.8) concrete10 = EnergyMaterial('10cm Concrete', 0.1, 2.31, 2322, 832, 'MediumRough', 0.95, 0.75, 0.8) thick_constr = OpaqueConstruction('Thick Concrete Construction', [concrete20]) thin_constr = OpaqueConstruction('Thin Concrete Construction', [concrete10]) shade_constr = ShadeConstruction('Light Shelf', 0.5, 0.5) mass_set.wall_set.exterior_construction = thick_constr mass_set.roof_ceiling_set.interior_construction = thin_constr mass_set.shade_construction = shade_constr story.properties.energy.construction_set = mass_set assert story.properties.energy.construction_set == mass_set assert story[0].properties.energy.construction_set == mass_set rooms = story.to_honeybee() model = hb_model.Model(story.identifier, rooms) assert len(model.properties.energy.construction_sets) == 1 assert model.properties.energy.construction_sets[0] == mass_set assert model.rooms[0].properties.energy.construction_set == mass_set
def test_model_init(): """Test the initialization of Model objects and basic properties.""" pts_1 = (Point3D(0, 0, 3), Point3D(0, 10, 3), Point3D(10, 10, 3), Point3D(10, 0, 3)) pts_2 = (Point3D(10, 0, 3), Point3D(10, 10, 3), Point3D(20, 10, 3), Point3D(20, 0, 3)) pts_3 = (Point3D(0, 10, 3), Point3D(0, 20, 3), Point3D(10, 20, 3), Point3D(10, 10, 3)) pts_4 = (Point3D(10, 10, 3), Point3D(10, 20, 3), Point3D(20, 20, 3), Point3D(20, 10, 3)) room2d_1 = Room2D('Office1', Face3D(pts_1), 3) room2d_2 = Room2D('Office2', Face3D(pts_2), 3) room2d_3 = Room2D('Office3', Face3D(pts_3), 3) room2d_4 = Room2D('Office4', Face3D(pts_4), 3) story = Story('Office_Floor', [room2d_1, room2d_2, room2d_3, room2d_4]) story.solve_room_2d_adjacency(0.01) story.set_outdoor_window_parameters(SimpleWindowRatio(0.4)) story.multiplier = 4 building = Building('Office_Building', [story]) tree_canopy_geo1 = Face3D.from_regular_polygon(6, 6, Plane(o=Point3D(5, -10, 6))) tree_canopy_geo2 = Face3D.from_regular_polygon(6, 2, Plane(o=Point3D(-5, -10, 3))) tree_canopy = ContextShade('Tree_Canopy', [tree_canopy_geo1, tree_canopy_geo2]) model = Model('New_Development', [building], [tree_canopy]) str(model) # test the string representation of the object assert model.identifier == 'New_Development' assert model.display_name == 'New_Development' assert model.units == 'Meters' assert model.tolerance == 0.01 assert model.angle_tolerance == 1.0 assert len(model.buildings) == 1 assert isinstance(model.buildings[0], Building) assert len(model.context_shades) == 1 assert isinstance(model.context_shades[0], ContextShade) assert model.average_story_count == 4 assert model.average_story_count_above_ground == 4 assert model.average_height == 15 assert model.average_height_above_ground == 12 assert model.footprint_area == 100 * 4 assert model.floor_area == 100 * 4 * 4 assert model.exterior_wall_area == 60 * 4 * 4 assert model.exterior_aperture_area == 60 * 4 * 4 * 0.4 assert model.volume == 100 * 3 * 4 * 4 assert model.min.x == pytest.approx(-6.73, rel=1e-2) assert model.min.y == pytest.approx(-16, rel=1e-2) assert model.max == Point2D(20, 20)
def test_model_add_objects(): """Test the addition of objects to a Model and getting objects by identifier.""" pts_1 = (Point3D(0, 0, 3), Point3D(0, 10, 3), Point3D(10, 10, 3), Point3D(10, 0, 3)) pts_2 = (Point3D(10, 0, 3), Point3D(10, 10, 3), Point3D(20, 10, 3), Point3D(20, 0, 3)) pts_3 = (Point3D(0, 20, 3), Point3D(0, 30, 3), Point3D(10, 30, 3), Point3D(10, 20, 3)) pts_4 = (Point3D(10, 20, 3), Point3D(10, 30, 3), Point3D(20, 30, 3), Point3D(20, 20, 3)) room2d_1 = Room2D('Office1', Face3D(pts_1), 3) room2d_2 = Room2D('Office2', Face3D(pts_2), 3) room2d_3 = Room2D('Office3', Face3D(pts_3), 3) room2d_4 = Room2D('Office4', Face3D(pts_4), 3) story_1 = Story('OfficeFloor1', [room2d_1, room2d_2]) story_2 = Story('OfficeFloor2', [room2d_3, room2d_4]) story_1.solve_room_2d_adjacency(0.01) story_1.set_outdoor_window_parameters(SimpleWindowRatio(0.4)) story_1.multiplier = 4 story_2.solve_room_2d_adjacency(0.01) story_2.set_outdoor_window_parameters(SimpleWindowRatio(0.4)) story_2.multiplier = 2 building_1 = Building('OfficeBuilding1', [story_1]) building_2 = Building('OfficeBuilding2', [story_2]) tree_canopy_geo1 = Face3D.from_regular_polygon(6, 6, Plane(o=Point3D(5, -10, 6))) tree_canopy_geo2 = Face3D.from_regular_polygon(6, 2, Plane(o=Point3D(-5, -10, 3))) tree_canopy_1 = ContextShade('TreeCanopy1', [tree_canopy_geo1]) tree_canopy_2 = ContextShade('TreeCanopy2', [tree_canopy_geo2]) model = Model('NewDevelopment', [building_1], [tree_canopy_1]) assert len(model.buildings) == 1 assert len(model.context_shades) == 1 with pytest.raises(AssertionError): model.add_building(tree_canopy_2) model.add_building(building_2) assert len(model.buildings) == 2 with pytest.raises(AssertionError): model.add_context_shade(building_2) model.add_context_shade(tree_canopy_2) assert len(model.context_shades) == 2 assert len(model.buildings_by_identifier(['OfficeBuilding1'])) == 1 with pytest.raises(ValueError): model.buildings_by_identifier(['NotABuilding']) assert len(model.context_shade_by_identifier(['TreeCanopy1'])) == 1 with pytest.raises(ValueError): model.context_shade_by_identifier(['NotAShade'])