def test_scale(): """Test the Model 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]) story.solve_room_2d_adjacency(0.01) story.multiplier = 4 building = Building('OfficeBuilding', [story]) awning_geo1 = Face3D.from_rectangle(6, 6, Plane(o=Point3D(5, -10, 6))) awning_geo2 = Face3D.from_rectangle(2, 2, Plane(o=Point3D(-5, -10, 3))) awning_canopy_1 = ContextShade('AwningCanopy1', [awning_geo1]) awning_canopy_2 = ContextShade('AwningCanopy2', [awning_geo2]) model = Model('NewDevelopment', [building], [awning_canopy_1, awning_canopy_2]) new_m = model.duplicate() new_m.scale(2) assert new_m.buildings[0].unique_stories[0].room_2ds[0].floor_geometry[0] == Point3D(0, 0, 6) assert new_m.buildings[0].unique_stories[0].room_2ds[0].floor_geometry[1] == Point3D(20, 0, 6) assert new_m.buildings[0].unique_stories[0].room_2ds[0].floor_geometry[2] == Point3D(20, 20, 6) assert new_m.buildings[0].unique_stories[0].room_2ds[0].floor_geometry[3] == Point3D(0, 20, 6) assert new_m.buildings[0].unique_stories[0].room_2ds[1].floor_geometry[0] == Point3D(20, 0, 6) assert new_m.buildings[0].unique_stories[0].room_2ds[1].floor_geometry[1] == Point3D(40, 0, 6) assert new_m.buildings[0].unique_stories[0].room_2ds[1].floor_geometry[2] == Point3D(40, 20, 6) assert new_m.buildings[0].unique_stories[0].room_2ds[1].floor_geometry[3] == Point3D(20, 20, 6) assert new_m.buildings[0].floor_area == building.floor_area * 2 ** 2 assert new_m.context_shades[0][0][0] == Point3D(10, -20, 12) assert new_m.context_shades[1][0][0] == Point3D(-10, -20, 6)
def test_rotate_xy(): """Test the Story rotate_xy method.""" pts = (Point3D(1, 1, 2), Point3D(2, 1, 2), Point3D(2, 2, 2), Point3D(1, 2, 2)) plane = Plane(Vector3D(0, 0, 1), Point3D(0, 0, 2)) room = Room2D('SquareShoebox', Face3D(pts, plane), 3) story = Story('OfficeFloor', [room]) origin_1 = Point3D(1, 1, 0) test_1 = story.duplicate() test_1.rotate_xy(180, origin_1) assert test_1.room_2ds[0].floor_geometry[0].x == pytest.approx(1, rel=1e-3) assert test_1.room_2ds[0].floor_geometry[0].y == pytest.approx(1, rel=1e-3) assert test_1.room_2ds[0].floor_geometry[0].z == pytest.approx(2, rel=1e-3) assert test_1.room_2ds[0].floor_geometry[2].x == pytest.approx(0, rel=1e-3) assert test_1.room_2ds[0].floor_geometry[2].y == pytest.approx(0, rel=1e-3) assert test_1.room_2ds[0].floor_geometry[2].z == pytest.approx(2, rel=1e-3) test_2 = story.duplicate() test_2.rotate_xy(90, origin_1) assert test_2.room_2ds[0].floor_geometry[0].x == pytest.approx(1, rel=1e-3) assert test_2.room_2ds[0].floor_geometry[0].y == pytest.approx(1, rel=1e-3) assert test_2.room_2ds[0].floor_geometry[0].z == pytest.approx(2, rel=1e-3) assert test_2.room_2ds[0].floor_geometry[2].x == pytest.approx(0, rel=1e-3) assert test_2.room_2ds[0].floor_geometry[2].y == pytest.approx(2, rel=1e-3) assert test_2.room_2ds[0].floor_geometry[2].z == pytest.approx(2, rel=1e-3)
def test_reflect(): """Test the Building reflect method.""" pts = (Point3D(1, 1, 2), Point3D(2, 1, 2), Point3D(2, 2, 2), Point3D(1, 2, 2)) plane = Plane(Vector3D(0, 0, 1), Point3D(0, 0, 2)) room = Room2D('Square_Shoebox', Face3D(pts, plane), 3) story = Story('Office_Floor', [room]) story.multiplier = 4 building = Building('Office_Building', [story]) origin_1 = Point3D(1, 0, 2) normal_1 = Vector3D(1, 0, 0) plane_1 = Plane(normal_1, origin_1) test_1 = building.duplicate() test_1.reflect(plane_1) assert test_1.unique_stories[0].room_2ds[0].floor_geometry[ -1].x == pytest.approx(1, rel=1e-3) assert test_1.unique_stories[0].room_2ds[0].floor_geometry[ -1].y == pytest.approx(1, rel=1e-3) assert test_1.unique_stories[0].room_2ds[0].floor_geometry[ -1].z == pytest.approx(2, rel=1e-3) assert test_1.unique_stories[0].room_2ds[0].floor_geometry[ 1].x == pytest.approx(0, rel=1e-3) assert test_1.unique_stories[0].room_2ds[0].floor_geometry[ 1].y == pytest.approx(2, rel=1e-3) assert test_1.unique_stories[0].room_2ds[0].floor_geometry[ 1].z == pytest.approx(2, rel=1e-3)
def test_building_shade_representation(): """Test the Building shade_representation 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]) shade_rep = building.shade_representation(tolerance=0.01) assert len(shade_rep) == 8 shd_area = sum([shd.area for shd in shade_rep]) assert shd_area == building.exterior_wall_area
def test_reflect(): """Test the Model reflect method.""" pts = (Point3D(1, 1, 2), Point3D(2, 1, 2), Point3D(2, 2, 2), Point3D(1, 2, 2)) plane = Plane(Vector3D(0, 0, 1), Point3D(0, 0, 2)) room = Room2D('SquareShoebox', Face3D(pts, plane), 3) story = Story('OfficeFloor', [room]) story.multiplier = 4 building = Building('OfficeBuilding', [story]) pts = (Point3D(1, 1, 2), Point3D(2, 1, 2), Point3D(2, 2, 2), Point3D(1, 2, 2)) plane = Plane(Vector3D(0, 0, 1), Point3D(0, 0, 2)) awning_canopy = ContextShade('AwningCanopy', [Face3D(pts, plane)]) model = Model('NewDevelopment', [building], [awning_canopy]) origin_1 = Point3D(1, 0, 2) normal_1 = Vector3D(1, 0, 0) plane_1 = Plane(normal_1, origin_1) test_1 = model.duplicate() test_1.reflect(plane_1) assert test_1.buildings[0].unique_stories[0].room_2ds[0].floor_geometry[-1].x == pytest.approx(1, rel=1e-3) assert test_1.buildings[0].unique_stories[0].room_2ds[0].floor_geometry[-1].y == pytest.approx(1, rel=1e-3) assert test_1.buildings[0].unique_stories[0].room_2ds[0].floor_geometry[-1].z == pytest.approx(2, rel=1e-3) assert test_1.buildings[0].unique_stories[0].room_2ds[0].floor_geometry[1].x == pytest.approx(0, rel=1e-3) assert test_1.buildings[0].unique_stories[0].room_2ds[0].floor_geometry[1].y == pytest.approx(2, rel=1e-3) assert test_1.buildings[0].unique_stories[0].room_2ds[0].floor_geometry[1].z == pytest.approx(2, rel=1e-3) assert test_1.context_shades[0][0][-1].x == pytest.approx(1, rel=1e-3) assert test_1.context_shades[0][0][-1].y == pytest.approx(1, rel=1e-3) assert test_1.context_shades[0][0][-1].z == pytest.approx(2, rel=1e-3) assert test_1.context_shades[0][0][1].x == pytest.approx(0, rel=1e-3) assert test_1.context_shades[0][0][1].y == pytest.approx(2, rel=1e-3) assert test_1.context_shades[0][0][1].z == pytest.approx(2, rel=1e-3)
def test_story_make_underground(): """Test the Story make_underground 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) assert all(not room.is_ground_contact for room in story.room_2ds) assert all(not room.is_top_exposed for room in story.room_2ds) assert story.is_above_ground story.set_ground_contact(True) assert all(room.is_ground_contact for room in story.room_2ds) story.set_top_exposed(True) assert all(room.is_top_exposed for room in story.room_2ds) story.make_underground() assert not story.is_above_ground
def test_honeybee_floor_plenum(): """Test the add_plenum functionality in the to_honeybee method with floor.""" # Simple 10 x 10 room tol = 0.01 pts1 = (Point3D(0, 0, 1), Point3D(10, 0, 1), Point3D(10, 10, 1), Point3D(0, 10, 1)) pts2 = (Point3D(10, 0, 1.5), Point3D(20, 0, 1.5), Point3D(20, 10, 1.5), Point3D(10, 10, 1.5)) # Two rooms with different floor heights room2d_1m = Room2D('R1-1m', floor_geometry=Face3D(pts1), floor_to_ceiling_height=3, is_ground_contact=True, is_top_exposed=True) room2d_5m = Room2D('R2-5m', floor_geometry=Face3D(pts2), floor_to_ceiling_height=3, is_ground_contact=False, is_top_exposed=True) story = Story('S1', [room2d_1m, room2d_5m], floor_to_floor_height=3.0) story.solve_room_2d_adjacency(0.01) # Check story floor height is minimum of room floor heights assert story.floor_height == pytest.approx(1, abs=1e-10) # Check default floor condition w/o plenum _hb_room_5m, _ = room2d_5m.duplicate().to_honeybee(tolerance=tol, add_plenum=False) assert isinstance(_hb_room_5m[-1].boundary_condition, Outdoors) assert _is_adiabatic(_hb_room_5m[0].boundary_condition) # Make HB room w/ plenum for 2m hb_room_5m, _ = room2d_5m.to_honeybee(tolerance=tol, add_plenum=True) assert len(hb_room_5m) == 2 plenum_5m = hb_room_5m[-1] assert len(plenum_5m[:]) == 6 for i, face in enumerate(plenum_5m.faces): if face.identifier == 'R2-5m_floor_plenum..Face0': assert _is_adiabatic(face.boundary_condition) elif face.identifier == 'R2-5m_floor_plenum..Face1': assert isinstance(face.boundary_condition, Outdoors) elif face.identifier == 'R2-5m_floor_plenum..Face2': assert isinstance(face.boundary_condition, Outdoors) elif face.identifier == 'R2-5m_floor_plenum..Face3': assert isinstance(face.boundary_condition, Outdoors) elif face.identifier == 'R2-5m_floor_plenum..Face4': assert _is_adiabatic(face.boundary_condition) elif face.identifier == 'R2-5m_floor_plenum..Face5': assert isinstance(face.boundary_condition, Surface) else: assert False # Check height of plenum test_vert_face = (Point3D(10, 0, 1), Point3D(20, 0, 1), Point3D(20, 0, 1.5), Point3D(10, 0, 1.5)) for test_vert, vert in zip(test_vert_face, plenum_5m[1].vertices): assert test_vert.is_equivalent(vert, tol) # Make HB room w/ plenum for 1m floor height, no plenum produced hb_rooms_1m, _ = room2d_1m.to_honeybee(tolerance=tol, add_plenum=True) assert len(hb_rooms_1m) == 1 assert isinstance(hb_rooms_1m[0][0].boundary_condition, Ground)
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_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_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_generate_grid(): """Test the generate_grid 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]) mesh_grid = story.generate_grid(1) assert len(mesh_grid) == 2 assert len(mesh_grid[0].faces) == 100 mesh_grid = story.generate_grid(0.5) assert len(mesh_grid[0].faces) == 400
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_from_dict_reversed_surface_bcs(): """Test the from_dict of Story objects with reversed Surface boundary conditions.""" 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_dict_original = story.to_dict() # reverse the order of vertices in one of the rooms story_dict = story.to_dict() room2 = story_dict['room_2ds'][1] room2['floor_boundary'] = list(reversed(room2['floor_boundary'])) room2['boundary_conditions'] = list(reversed(room2['boundary_conditions'])) room1_bc = story_dict['room_2ds'][0]['boundary_conditions'][1] room1_bc['boundary_condition_objects'] = ('Office2..Face1', 'Office2') new_story = Story.from_dict(story_dict) assert new_story.to_dict() == story_dict_original # reverse the order of vertices in both of the rooms room1 = story_dict['room_2ds'][0] room1['floor_boundary'] = list(reversed(room1['floor_boundary'])) room1['boundary_conditions'] = list(reversed(room1['boundary_conditions'])) room2_bc = story_dict['room_2ds'][1]['boundary_conditions'][0] room2_bc['boundary_condition_objects'] = ('Office1..Face3', 'Office1') new_story = Story.from_dict(story_dict) assert new_story.to_dict() == story_dict_original
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_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_honeybee_ceiling_and_floor_plenum(): """Test the add_plenum in the to_honeybee method with ceiling and floor.""" # Simple 10 x 10 room tol = 0.01 pts1 = (Point3D(0, 0, 1), Point3D(10, 0, 1), Point3D(10, 10, 1), Point3D(0, 10, 1)) pts2 = (Point3D(10, 0, 1.5), Point3D(20, 0, 1.5), Point3D(20, 10, 1.5), Point3D(10, 10, 1.5)) # Two rooms that require plenums # floor_plenum: 0m, ceiling_plenum: 1m room2d_1m = Room2D('R1-1m', floor_geometry=Face3D(pts1), floor_to_ceiling_height=3, is_ground_contact=True, is_top_exposed=False) # floor_plenum: 0.5m, ceiling_plenum: 1m room2d_5m = Room2D('R2-5m', floor_geometry=Face3D(pts2), floor_to_ceiling_height=3, is_ground_contact=False, is_top_exposed=False) story = Story('S1', [room2d_1m, room2d_5m], floor_to_floor_height=4.0) story.solve_room_2d_adjacency(tol) # Make HB room w/ just ceiling plenum hb_rooms_1m, _ = room2d_1m.to_honeybee(tolerance=tol, add_plenum=True) assert len(hb_rooms_1m) == 2 # Make HB room w/ both hb_rooms_5m, _ = room2d_5m.to_honeybee(tolerance=tol, add_plenum=True) assert len(hb_rooms_5m) == 3 hb_room_5m, ceil_plenum_5m, floor_plenum_5m = hb_rooms_5m # Check names assert hb_room_5m.identifier == 'R2-5m' assert ceil_plenum_5m.identifier == 'R2-5m_ceiling_plenum' assert floor_plenum_5m.identifier == 'R2-5m_floor_plenum' # Check height of floor_plenum test_vert_face = (Point3D(10, 0, 1), Point3D(20, 0, 1), Point3D(20, 0, 1.5), Point3D(10, 0, 1.5)) for test_vert, vert in zip(test_vert_face, floor_plenum_5m[1].vertices): assert test_vert.is_equivalent(vert, tol) # Check height of ceil_plenum test_vert_face = (Point3D(10, 0, 4.5), Point3D(20, 0, 4.5), Point3D(20, 0, 5.0), Point3D(10, 0, 5.0)) for test_vert, vert in zip(test_vert_face, ceil_plenum_5m[1].vertices): assert test_vert.is_equivalent(vert, tol)
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_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 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 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_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_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_rotate_xy(): """Test the Building rotate_xy method.""" pts = (Point3D(1, 1, 2), Point3D(2, 1, 2), Point3D(2, 2, 2), Point3D(1, 2, 2)) plane = Plane(Vector3D(0, 0, 1), Point3D(0, 0, 2)) room = Room2D('Square_Shoebox', Face3D(pts, plane), 3) story = Story('Office_Floor', [room]) story.multiplier = 4 building = Building('Office_Building', [story]) origin_1 = Point3D(1, 1, 0) test_1 = building.duplicate() test_1.rotate_xy(180, origin_1) assert test_1.unique_stories[0].room_2ds[0].floor_geometry[ 0].x == pytest.approx(1, rel=1e-3) assert test_1.unique_stories[0].room_2ds[0].floor_geometry[ 0].y == pytest.approx(1, rel=1e-3) assert test_1.unique_stories[0].room_2ds[0].floor_geometry[ 0].z == pytest.approx(2, rel=1e-3) assert test_1.unique_stories[0].room_2ds[0].floor_geometry[ 2].x == pytest.approx(0, rel=1e-3) assert test_1.unique_stories[0].room_2ds[0].floor_geometry[ 2].y == pytest.approx(0, rel=1e-3) assert test_1.unique_stories[0].room_2ds[0].floor_geometry[ 2].z == pytest.approx(2, rel=1e-3) test_2 = building.duplicate() test_2.rotate_xy(90, origin_1) assert test_2.unique_stories[0].room_2ds[0].floor_geometry[ 0].x == pytest.approx(1, rel=1e-3) assert test_2.unique_stories[0].room_2ds[0].floor_geometry[ 0].y == pytest.approx(1, rel=1e-3) assert test_2.unique_stories[0].room_2ds[0].floor_geometry[ 0].z == pytest.approx(2, rel=1e-3) assert test_2.unique_stories[0].room_2ds[0].floor_geometry[ 2].x == pytest.approx(0, rel=1e-3) assert test_2.unique_stories[0].room_2ds[0].floor_geometry[ 2].y == pytest.approx(2, rel=1e-3) assert test_2.unique_stories[0].room_2ds[0].floor_geometry[ 2].z == pytest.approx(2, rel=1e-3) assert building.floor_area == test_1.floor_area assert building.volume == test_1.volume assert building.height_from_first_floor == test_1.height_from_first_floor assert building.height == 14
def test_set_all_room_2d_program_type(): """Test the set_all_room_2d_program_type 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]) 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 building.properties.energy.set_all_room_2d_program_type(lab_program) assert all(room_2d.properties.energy.program_type == lab_program for room_2d in building.unique_room_2ds)
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_convert_to_units(): """Test the Model convert_to_units method.""" pts_1 = (Point3D(0, 0), Point3D(120, 0), Point3D(120, 120), Point3D(0, 120)) pts_2 = (Point3D(120, 0), Point3D(240, 0), Point3D(240, 120), Point3D(120, 120)) room2d_1 = Room2D('Office1', Face3D(pts_1), 96) room2d_2 = Room2D('Office2', Face3D(pts_2), 96) story = Story('OfficeFloor', [room2d_1, room2d_2]) story.solve_room_2d_adjacency(0.01) story.multiplier = 4 building = Building('OfficeBuilding', [story]) model = Model('NewDevelopment', [building], units='Inches') inches_conversion = hb_model.Model.conversion_factor_to_meters('Inches') model.convert_to_units('Meters') assert room2d_1.floor_area == pytest.approx(120 * 120 * (inches_conversion ** 2), rel=1e-3) assert room2d_1.volume == pytest.approx(120 * 120 * 96 * (inches_conversion ** 3), rel=1e-3) assert model.units == 'Meters'
def test_writer(): """Test the Story writer object.""" pts_1 = (Point3D(0, 0, 2), Point3D(10, 0, 2), Point3D(10, 10, 2), Point3D(0, 10, 2)) room2d_1 = Room2D('Office1', Face3D(pts_1), 5) story = Story('OfficeFloor', [room2d_1]) writers = [mod for mod in dir(story.to) if not mod.startswith('_')] for writer in writers: assert callable(getattr(story.to, writer))
def test_reflect(): """Test the Story reflect method.""" pts = (Point3D(1, 1, 2), Point3D(2, 1, 2), Point3D(2, 2, 2), Point3D(1, 2, 2)) plane = Plane(Vector3D(0, 0, 1), Point3D(0, 0, 2)) room = Room2D('SquareShoebox', Face3D(pts, plane), 3) story = Story('OfficeFloor', [room]) origin_1 = Point3D(1, 0, 2) normal_1 = Vector3D(1, 0, 0) plane_1 = Plane(normal_1, origin_1) test_1 = story.duplicate() test_1.reflect(plane_1) assert test_1.room_2ds[0].floor_geometry[-1].x == pytest.approx(1, rel=1e-3) assert test_1.room_2ds[0].floor_geometry[-1].y == pytest.approx(1, rel=1e-3) assert test_1.room_2ds[0].floor_geometry[-1].z == pytest.approx(2, rel=1e-3) assert test_1.room_2ds[0].floor_geometry[1].x == pytest.approx(0, rel=1e-3) assert test_1.room_2ds[0].floor_geometry[1].y == pytest.approx(2, rel=1e-3) assert test_1.room_2ds[0].floor_geometry[1].z == pytest.approx(2, rel=1e-3)
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_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