def test_story_floor_geometry(): """Test the Story floor_geometry 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]) floor_geo = story.floor_geometry(0.01) outline_segs = story.outline_segments(0.01) assert isinstance(floor_geo, Polyface3D) assert floor_geo.area == story.floor_area assert len(outline_segs) == 8 assert all([isinstance(seg, LineSegment3D) for seg in outline_segs])
def test_model_add_model(): """Test the addition of one Model to another.""" 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_1 = Model('NewDevelopment1', [building_1], [tree_canopy_1]) model_2 = Model('NewDevelopment2', [building_2], [tree_canopy_2]) assert len(model_1.buildings) == 1 assert len(model_1.context_shades) == 1 assert len(model_2.buildings) == 1 assert len(model_2.context_shades) == 1 combined_model = model_1 + model_2 assert len(combined_model.buildings) == 2 assert len(combined_model.context_shades) == 2 assert len(model_1.buildings) == 1 assert len(model_1.context_shades) == 1 model_1 += model_2 assert len(model_1.buildings) == 2 assert len(model_1.context_shades) == 2
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('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]) assert hasattr(building.properties, 'energy') assert isinstance(building.properties.energy, BuildingEnergyProperties) assert isinstance(building.properties.energy.construction_set, ConstructionSet)
def test_building_window_shading_parameters(): """Test the Building 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('Office_Floor', [room2d_1, room2d_2, room2d_3, room2d_4]) story.solve_room_2d_adjacency(0.01) story.multiplier = 4 building = Building('Office_Building', [story]) assert building.exterior_aperture_area == 0 assert building.unique_room_2ds[0].window_parameters[2] is None ashrae_base = SimpleWindowRatio(0.4) story.set_outdoor_window_parameters(ashrae_base) assert building.exterior_aperture_area == 60 * 4 * 4 * 0.4 assert building.unique_room_2ds[0].window_parameters[2] == ashrae_base assert building.unique_room_2ds[0].shading_parameters[2] is None overhang = Overhang(1) story.set_outdoor_shading_parameters(overhang) assert building.unique_room_2ds[0].shading_parameters[2] == overhang assert len(building.unique_stories) == 1 assert len(building.all_stories()) == 4 assert len(building.unique_room_2ds) == 4 building.separate_top_bottom_floors() assert len(building.unique_stories) == 3 assert len(set(story.identifier for story in building.unique_stories)) == 3 assert len(building.all_stories()) == 4 assert len(building.unique_room_2ds) == 12
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_dict_to_object(): """Test the dict_to_object method with all geometry objects.""" 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]) model_dict = model.to_dict() room_dict = room2d_1.to_dict() story_dict = story.to_dict() building_dict = building.to_dict() assert isinstance(dict_to_object(model_dict), Model) assert isinstance(dict_to_object(room_dict), Room2D) assert isinstance(dict_to_object(story_dict), Story) assert isinstance(dict_to_object(building_dict), Building)
def test_room2d_intersect_adjacency(): """Test the Room2D intersect_adjacency method.""" pts_1 = (Point3D(0, 0, 3), Point3D(10, 0, 3), Point3D(10, 10, 3), Point3D(0, 10, 3)) pts_2 = (Point3D(10, 5, 2), Point3D(20, 5, 2), Point3D(20, 15, 2), Point3D(10, 15, 2)) room2d_1 = Room2D('SquareShoebox1', Face3D(pts_1), 3) room2d_2 = Room2D('SquareShoebox2', Face3D(pts_2), 3) room2d_1, room2d_2 = Room2D.intersect_adjacency([room2d_1, room2d_2], 0.01) assert len(room2d_1) == 5 assert len(room2d_2) == 5 Room2D.solve_adjacency([room2d_1, room2d_2], 0.01) assert isinstance(room2d_1.boundary_conditions[2], Surface) assert isinstance(room2d_2.boundary_conditions[4], Surface) assert room2d_1.boundary_conditions[2].boundary_condition_object == \ '{}..Face5'.format(room2d_2.identifier) assert room2d_2.boundary_conditions[4].boundary_condition_object == \ '{}..Face3'.format(room2d_1.identifier)
def test_room2d_set_boundary_condition(): """Test the Room2D set_boundary_condition method.""" pts = (Point3D(0, 0, 3), Point3D(10, 0, 3), Point3D(10, 10, 3), Point3D(0, 10, 3)) room2d = Room2D('SquareShoebox', Face3D(pts), 3) room2d.set_boundary_condition(1, bcs.ground) assert isinstance(room2d.boundary_conditions[1], Ground) room2d.set_outdoor_window_parameters(SimpleWindowRatio(0.4)) assert room2d.window_parameters[1] is None with pytest.raises(AssertionError): room2d.set_boundary_condition(3, bcs.ground)
def test_scale(): """Test the Room2D scale 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]) new_s = story.duplicate() new_s.scale(2) assert new_s.room_2ds[0].floor_geometry[0] == Point3D(0, 0, 6) assert new_s.room_2ds[0].floor_geometry[1] == Point3D(20, 0, 6) assert new_s.room_2ds[0].floor_geometry[2] == Point3D(20, 20, 6) assert new_s.room_2ds[0].floor_geometry[3] == Point3D(0, 20, 6) assert new_s.room_2ds[1].floor_geometry[0] == Point3D(20, 0, 6) assert new_s.room_2ds[1].floor_geometry[1] == Point3D(40, 0, 6) assert new_s.room_2ds[1].floor_geometry[2] == Point3D(40, 20, 6) assert new_s.room_2ds[1].floor_geometry[3] == Point3D(20, 20, 6) assert new_s.floor_area == story.floor_area * 2 ** 2 assert new_s.volume == story.volume * 2 ** 3
def test_move(): """Test the Story move 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]) vec_1 = Vector3D(2, 2, 2) new_s = story.duplicate() story.move(vec_1) assert story.room_2ds[0].floor_geometry[0] == Point3D(2, 2, 5) assert story.room_2ds[0].floor_geometry[1] == Point3D(12, 2, 5) assert story.room_2ds[0].floor_geometry[2] == Point3D(12, 12, 5) assert story.room_2ds[0].floor_geometry[3] == Point3D(2, 12, 5) assert story.room_2ds[1].floor_geometry[0] == Point3D(12, 2, 5) assert story.room_2ds[1].floor_geometry[1] == Point3D(22, 2, 5) assert story.room_2ds[1].floor_geometry[2] == Point3D(22, 12, 5) assert story.room_2ds[1].floor_geometry[3] == Point3D(12, 12, 5) assert story.floor_area == new_s.floor_area assert story.volume == new_s.volume
def test_room2d_remove_colinear_vertices(): """Test the Room2D remove_colinear_vertices method.""" pts = (Point3D(0, 0, 3), Point3D(5, 0, 3), Point3D(10, 0, 3), Point3D(10, 10, 3), Point3D(0, 10, 3)) room2d = Room2D('SquareShoebox', Face3D(pts), 3) assert len(room2d) == 5 new_room = room2d.remove_colinear_vertices(0.01) assert len(new_room) == 4 assert len(new_room.boundary_conditions) == 4 assert len(new_room.window_parameters) == 4 assert len(new_room.shading_parameters) == 4
def test_to_dict(): """Test the Story 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('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)) sd = story.to_dict() assert sd['type'] == 'Story' assert sd['identifier'] == 'OfficeFloor' assert sd['display_name'] == 'OfficeFloor' assert 'room_2ds' in sd assert len(sd['room_2ds']) == 2 assert sd['floor_to_floor_height'] == 5 assert sd['multiplier'] == 1 assert 'properties' in sd assert sd['properties']['type'] == 'StoryProperties'
def test_room2d_init_invalid(): """Test the initialization of Room2D objects with invalid inputs.""" pts = (Point3D(0, 0, 3), Point3D(10, 0, 3), Point3D(10, 10, 3), Point3D(0, 10, 3)) ashrae_base = SimpleWindowRatio(0.4) overhang = Overhang(1) boundarycs = [bcs.outdoors, bcs.ground, bcs.outdoors, bcs.ground] window = [ashrae_base, None, ashrae_base, None] shading = [overhang, None, None, None] Room2D('SquareShoebox', Face3D(pts), 3, boundarycs, window, shading) old_bc = boundarycs.pop(-1) with pytest.raises(AssertionError): Room2D('SquareShoebox', Face3D(pts), 3, boundarycs, window, shading) boundarycs.append(old_bc) old_glz = window.pop(-1) with pytest.raises(AssertionError): Room2D('SquareShoebox', Face3D(pts), 3, boundarycs, window, shading) window.append(old_glz) old_shd = shading.pop(-1) with pytest.raises(AssertionError): Room2D('SquareShoebox', Face3D(pts), 3, boundarycs, window, shading) shading.append(old_shd) new_bcs = [bcs.ground, bcs.outdoors, bcs.outdoors, bcs.ground] with pytest.raises(AssertionError): Room2D('SquareShoebox', Face3D(pts), 3, new_bcs, window, shading) new_glz = [None, ashrae_base, ashrae_base, None] with pytest.raises(AssertionError): Room2D('SquareShoebox', Face3D(pts), 3, boundarycs, new_glz, shading)
def test_check_duplicate_identifiers(): """Test check_duplicate_building_identifiers.""" 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('OfficeBuilding', [story_1]) building_2 = Building('OfficeBuilding', [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('TreeCanopy', [tree_canopy_geo1]) tree_canopy_2 = ContextShade('TreeCanopy', [tree_canopy_geo2]) model_1 = Model('NewDevelopment1', [building_1], [tree_canopy_1]) model_2 = Model('NewDevelopment2', [building_2], [tree_canopy_2]) assert model_1.check_duplicate_building_identifiers(False) == '' assert model_1.check_duplicate_context_shade_identifiers(False) == '' model_1.add_model(model_2) assert model_1.check_duplicate_building_identifiers(False) != '' with pytest.raises(ValueError): model_1.check_duplicate_building_identifiers(True) assert model_1.check_duplicate_context_shade_identifiers(False) != '' with pytest.raises(ValueError): model_1.check_duplicate_context_shade_identifiers(True)
def test_room2d_remove_duplicate_vertices(): """Test the Room2D remove_duplicate_vertices method.""" pts = (Point3D(0, 0, 3), Point3D(10, 0, 3), Point3D(10, 0, 3.001), Point3D(10, 10, 3), Point3D(0, 10, 3)) ashrae_base = SimpleWindowRatio(0.4) overhang = Overhang(1) boundarycs = (bcs.outdoors, bcs.ground, bcs.ground, bcs.outdoors, bcs.ground) window = (ashrae_base, None, None, ashrae_base, None) shading = (overhang, None, None, None, None) room2d = Room2D('SquareShoebox', Face3D(pts), 3, boundarycs, window, shading) assert len(room2d.boundary_conditions) == 5 assert len(room2d.window_parameters) == 5 assert len(room2d.shading_parameters) == 5 room2d.remove_duplicate_vertices(0.01) assert len(room2d.boundary_conditions) == 4 assert len(room2d.window_parameters) == 4 assert len(room2d.shading_parameters) == 4 pts = (Point3D(0, 0, 3), Point3D(10, 0, 3), Point3D(10, 10, 3), Point3D(0, 10, 3), Point3D(0, 0.0001, 3)) ashrae_base = SimpleWindowRatio(0.4) overhang = Overhang(1) boundarycs = (bcs.outdoors, bcs.ground, bcs.outdoors, bcs.ground, bcs.outdoors) window = (ashrae_base, None, ashrae_base, None, ashrae_base) shading = (overhang, None, None, None, overhang) room2d = Room2D('SquareShoebox', Face3D(pts), 3, boundarycs, window, shading) assert len(room2d.boundary_conditions) == 5 assert len(room2d.window_parameters) == 5 assert len(room2d.shading_parameters) == 5 room2d.remove_duplicate_vertices(0.01) assert len(room2d.boundary_conditions) == 4 assert len(room2d.window_parameters) == 4 assert len(room2d.shading_parameters) == 4
def test_to_from_dict(): """Test the to/from dict of Building 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('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() building_dict = building.to_dict() new_building = Building.from_dict(building_dict) assert isinstance(new_building, Building) assert new_building.to_dict() == building_dict
def test_district_to_honeybee(): """Test the district_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_model = Building.district_to_honeybee([building, building_big], False, 0.01) assert isinstance(hb_model, Model) assert len(hb_model.rooms) == 12 assert len(hb_model.rooms[-1]) == 6 assert hb_model.rooms[-1].volume == 600 assert hb_model.rooms[-1].floor_area == 200 assert hb_model.rooms[-1].exterior_wall_area == 180 hb_model = Building.district_to_honeybee([building, building_big], True, 0.01) assert isinstance(hb_model, Model) assert len(hb_model.rooms) == 3 for room in hb_model.rooms: assert room.multiplier == 4
def test_solve_adjacency_air_boundary(): """Test the Room2D solve_adjacency method with an air boundary.""" 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('SquareShoebox1', Face3D(pts_1), 3) room2d_2 = Room2D('SquareShoebox2', Face3D(pts_2), 3) adj_info = Room2D.solve_adjacency([room2d_1, room2d_2], 0.01) for room_pair in adj_info: for room_adj in room_pair: room, wall_i = room_adj air_bnd = list(room.air_boundaries) air_bnd[wall_i] = True room.air_boundaries = air_bnd assert isinstance(room2d_1.boundary_conditions[1], Surface) assert isinstance(room2d_2.boundary_conditions[3], Surface) assert room2d_1.air_boundaries[1] assert room2d_2.air_boundaries[3] hb_room_1, hb_room_2 = room2d_1.to_honeybee()[0], room2d_2.to_honeybee()[0] assert isinstance(hb_room_1[2].type, AirBoundary) assert isinstance(hb_room_2[4].type, AirBoundary)
def custom_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() building.properties.uwg.program == 'MidriseApartment' building.properties.uwg.vintage == 'Pre1980' building.properties.uwg.fract_heat_to_canyon == 1.0 building.properties.uwg.shgc == 0.6 building.properties.uwg.wall_albedo == 0.3 building.properties.uwg.roof_albedo == 0.5 building.properties.uwg.roof_veg_fraction == 0.3 return building
def test_default_properties(): """Test the auto-assigning of Room2D properties.""" pts = (Point3D(0, 0, 3), Point3D(10, 0, 3), Point3D(10, 10, 3), Point3D(0, 10, 3)) ashrae_base = SimpleWindowRatio(0.4) room = Room2D('SquareShoebox', Face3D(pts), 3) room.set_outdoor_window_parameters(ashrae_base) assert room.properties.energy.construction_set.identifier == \ 'Default Generic Construction Set' assert room.properties.energy.program_type.identifier == 'Plenum' assert room.properties.energy.hvac is None assert not room.properties.energy.is_conditioned
def test_to_dict(): """Test the Model to_dict 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) 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.tolerance = 0.01 model.angle_tolerance = 1 model_dict = model.to_dict() assert model_dict['type'] == 'Model' assert model_dict['identifier'] == 'NewDevelopment' assert model_dict['display_name'] == 'NewDevelopment' assert 'buildings' in model_dict assert len(model_dict['buildings']) == 1 assert 'context_shades' in model_dict assert len(model_dict['context_shades']) == 1 assert 'tolerance' in model_dict assert model_dict['tolerance'] == 0.01 assert 'angle_tolerance' in model_dict assert model_dict['angle_tolerance'] == 1 assert 'properties' in model_dict assert model_dict['properties']['type'] == 'ModelProperties'
def test_move(): """Test the Building move 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('Office_1', Face3D(pts_1), 3) room2d_2 = Room2D('Office_2', Face3D(pts_2), 3) story = Story('Office_Floor', [room2d_1, room2d_2]) story.solve_room_2d_adjacency(0.01) story.multiplier = 4 building = Building('Office_Building', [story]) vec_1 = Vector3D(2, 2, 2) new_b = building.duplicate() building.move(vec_1) assert building.unique_stories[0].room_2ds[0].floor_geometry[0] == Point3D( 2, 2, 5) assert building.unique_stories[0].room_2ds[0].floor_geometry[1] == Point3D( 12, 2, 5) assert building.unique_stories[0].room_2ds[0].floor_geometry[2] == Point3D( 12, 12, 5) assert building.unique_stories[0].room_2ds[0].floor_geometry[3] == Point3D( 2, 12, 5) assert building.unique_stories[0].room_2ds[1].floor_geometry[0] == Point3D( 12, 2, 5) assert building.unique_stories[0].room_2ds[1].floor_geometry[1] == Point3D( 22, 2, 5) assert building.unique_stories[0].room_2ds[1].floor_geometry[2] == Point3D( 22, 12, 5) assert building.unique_stories[0].room_2ds[1].floor_geometry[3] == Point3D( 12, 12, 5) assert building.floor_area == new_b.floor_area assert building.volume == new_b.volume assert building.height_from_first_floor == new_b.height_from_first_floor assert building.height == 17
def test_to_dict(): """Test the Room2D to_dict method.""" pts = (Point3D(0, 0, 3), Point3D(5, 0, 3), Point3D(5, 10, 3), Point3D(0, 10, 3)) ashrae_base = SimpleWindowRatio(0.4) overhang = Overhang(1) boundarycs = (bcs.outdoors, bcs.ground, bcs.outdoors, bcs.ground) window = (ashrae_base, None, ashrae_base, None) shading = (overhang, None, None, None) room = Room2D('ShoeBoxZone', Face3D(pts), 3, boundarycs, window, shading, True, False) rd = room.to_dict() assert rd['type'] == 'Room2D' assert rd['identifier'] == 'ShoeBoxZone' assert rd['display_name'] == 'ShoeBoxZone' assert 'floor_boundary' in rd assert len(rd['floor_boundary']) == 4 assert 'floor_holes' not in rd assert rd['floor_height'] == 3 assert rd['floor_to_ceiling_height'] == 3 assert 'boundary_conditions' in rd assert len(rd['boundary_conditions']) == 4 assert 'window_parameters' in rd assert len(rd['window_parameters']) == 4 assert 'shading_parameters' in rd assert len(rd['shading_parameters']) == 4 assert rd['is_ground_contact'] assert not rd['is_top_exposed'] assert 'properties' in rd assert rd['properties']['type'] == 'Room2DProperties' room_2 = Room2D('ShoeBoxZone', Face3D(pts), 3) rd = room_2.to_dict() assert 'boundary_conditions' in rd assert len(rd['boundary_conditions']) == 4 assert 'window_parameters' not in rd assert 'shading_parameters' not in rd
def test_set_all_room_2d_hvac(): """Test the set_all_room_2d_hvac 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)) sensible = 0.8 latent = 0.7 ideal_air_sys = IdealAirSystem('Office HVAC', sensible_heat_recovery=sensible, latent_heat_recovery=latent) story.properties.energy.set_all_room_2d_hvac(ideal_air_sys, False) assert all( isinstance(room.properties.energy.hvac, IdealAirSystem) for room in story.room_2ds) assert all(room.properties.energy.hvac.sensible_heat_recovery == sensible for room in story.room_2ds) assert all(room.properties.energy.hvac.latent_heat_recovery == latent for room in story.room_2ds)
def test_building_basement(): """Test the initialization of Building objects and the setting of a basement.""" 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.multiplier = 4 building = Building('Office_Building_1234', [story]) building.display_name = 'Office Building' building.separate_top_bottom_floors() # this should yield 3 story objects building.unique_stories[0].make_underground( ) # make the first floor a basement story.set_outdoor_window_parameters( SimpleWindowRatio(0.4)) # windows on top floors assert not building.unique_stories[0].is_above_ground assert building.height == 15 assert building.story_count == 4 assert building.story_count_above_ground == 3 assert building.height_from_first_floor == 12 assert building.height_above_ground == 9 assert building.exterior_wall_area == 60 * 4 * 3
def test_scale(): """Test the Building scale 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.multiplier = 4 building = Building('Office_Building', [story]) new_b = building.duplicate() new_b.scale(2) assert new_b.unique_stories[0].room_2ds[0].floor_geometry[0] == Point3D( 0, 0, 6) assert new_b.unique_stories[0].room_2ds[0].floor_geometry[1] == Point3D( 20, 0, 6) assert new_b.unique_stories[0].room_2ds[0].floor_geometry[2] == Point3D( 20, 20, 6) assert new_b.unique_stories[0].room_2ds[0].floor_geometry[3] == Point3D( 0, 20, 6) assert new_b.unique_stories[0].room_2ds[1].floor_geometry[0] == Point3D( 20, 0, 6) assert new_b.unique_stories[0].room_2ds[1].floor_geometry[1] == Point3D( 40, 0, 6) assert new_b.unique_stories[0].room_2ds[1].floor_geometry[2] == Point3D( 40, 20, 6) assert new_b.unique_stories[0].room_2ds[1].floor_geometry[3] == Point3D( 20, 20, 6) assert new_b.floor_area == building.floor_area * 2**2 assert new_b.volume == building.volume * 2**3 assert new_b.height_from_first_floor == building.height_from_first_floor * 2 assert new_b.height == 30
def test_to_honeybee_missing_adjacency(): """Test the to_honeybee method with a missing adjacency.""" 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]) Room2D.solve_adjacency([room2d_1, room2d_2]) story = Story('OfficeFloor', [room2d_1]) 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]) model = Model('NewDevelopment', [building, building_big]) hb_models = model.to_honeybee('District', None, False, tolerance=0.01) assert len(hb_models) == 1 assert isinstance(hb_models[0], hb_model.Model)
def test_set_construction_set(): """Test the setting of a ConstructionSet 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]) 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 building.properties.energy.construction_set = mass_set assert building.properties.energy.construction_set == mass_set assert building[0].properties.energy.construction_set == mass_set hb_model = building.to_honeybee() assert len(hb_model.properties.energy.construction_sets) == 1 assert hb_model.properties.energy.construction_sets[0] == mass_set assert hb_model.rooms[0].properties.energy.construction_set == mass_set
def test_apply_properties_from_geojson_dict(): """Test the apply_properties_from_geojson_dict 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) story.set_outdoor_window_parameters(SimpleWindowRatio(0.4)) story.multiplier = 4 building = Building('OfficeBuilding', [story]) geojson_dict = { 'building_type': 'MediumOffice', 'template': '90.1-2010', 'climate_zone': '5A', 'system_type': 'VAV chiller with gas boiler reheat' } building.properties.energy.apply_properties_from_geojson_dict(geojson_dict)
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)) story.multiplier = 4 building = Building('OfficeBuilding', [story]) mass_set = ConstructionSet('Thermal Mass Construction Set') building.properties.energy.construction_set = mass_set bd = building.to_dict() new_bldg = Building.from_dict(bd) assert new_bldg.properties.energy.construction_set.identifier == \ 'Thermal Mass Construction Set' assert new_bldg.to_dict() == bd