def test_duplicate(): """Test what happens to energy properties when duplicating a Room2D.""" 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))) shade_original = ContextShade('TreeCanopy', [tree_canopy_geo1, tree_canopy_geo2]) shade_dup_1 = shade_original.duplicate() bright_leaves = ShadeConstruction('Bright Light Leaves', 0.5, 0.5, True) tree_trans = ScheduleRuleset.from_constant_value('Tree Transmittance', 0.5, schedule_types.fractional) assert shade_original.properties.energy.host is shade_original assert shade_dup_1.properties.energy.host is shade_dup_1 assert shade_original.properties.energy.host is not \ shade_dup_1.properties.energy.host assert shade_original.properties.energy.construction == \ shade_dup_1.properties.energy.construction shade_dup_1.properties.energy.construction = bright_leaves assert shade_original.properties.energy.construction != \ shade_dup_1.properties.energy.construction shade_dup_2 = shade_dup_1.duplicate() assert shade_dup_1.properties.energy.construction == \ shade_dup_2.properties.energy.construction shade_dup_2.properties.energy.construction = None assert shade_dup_1.properties.energy.construction != \ shade_dup_2.properties.energy.construction
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_to_dict(): """Test the Building to_dict method with energy properties.""" 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]) sd = tree_canopy.to_dict() assert 'properties' in sd assert sd['properties']['type'] == 'ContextShadeProperties' assert 'energy' in sd['properties'] assert sd['properties']['energy']['type'] == 'ContextShadeEnergyProperties' assert 'construction' not in sd['properties']['energy'] or \ sd['properties']['energy']['construction'] is None bright_leaves = ShadeConstruction('Bright Light Leaves', 0.5, 0.5, True) tree_trans = ScheduleRuleset.from_constant_value('Tree Transmittance', 0.5, schedule_types.fractional) tree_canopy.properties.energy.construction = bright_leaves tree_canopy.properties.energy.transmittance_schedule = tree_trans sd = tree_canopy.to_dict() assert sd['properties']['energy']['construction'] is not None assert sd['properties']['energy']['transmittance_schedule'] is not None
def test_to_from_dict(): """Test the to/from dict of ContextShade objects.""" 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]) context_dict = tree_canopy.to_dict() new_context = ContextShade.from_dict(context_dict) assert isinstance(new_context, ContextShade) assert new_context.to_dict() == context_dict
def test_to_dict(): """Test the ContextShade to_dict method.""" 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]) sd = tree_canopy.to_dict() assert sd['type'] == 'ContextShade' assert sd['identifier'] == 'Tree_Canopy' assert sd['display_name'] == 'Tree_Canopy' assert len(sd['geometry']) == 2
def test_to_honeybee(): """Test the to_honeybee method.""" 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]) hb_tree_canopies = tree_canopy.to_honeybee() assert len(hb_tree_canopies) == 2 for shd in hb_tree_canopies: assert isinstance(shd, Shade) assert shd.identifier.startswith('Tree_Canopy') assert hb_tree_canopies[0].identifier != hb_tree_canopies[1].identifier assert tree_canopy.area == sum([shd.area for shd in hb_tree_canopies])
def test_scale(): """Test the ContextShade scale method.""" pts = (Point3D(1, 1, 2), Point3D(2, 1, 2), Point3D(2, 2, 2), Point3D(1, 2, 2)) plane_1 = Plane(Vector3D(0, 0, 1), Point3D(0, 0, 0)) awning_canopy = ContextShade('Awning_Canopy', [Face3D(pts, plane_1)]) new_a = awning_canopy.duplicate() new_a.scale(2) assert new_a[0][0] == Point3D(2, 2, 4) assert new_a[0][1] == Point3D(4, 2, 4) assert new_a[0][2] == Point3D(4, 4, 4) assert new_a[0][3] == Point3D(2, 4, 4) assert new_a.area == awning_canopy.area * 2 ** 2
def test_move(): """Test the ContextShade move method.""" pts_1 = (Point3D(0, 2, 3), Point3D(2, 2, 3), Point3D(2, 0, 3), Point3D(0, 0, 3)) plane_1 = Plane(Vector3D(0, 0, 1), Point3D(0, 0, 0)) awning_canopy = ContextShade('Awning_Canopy', [Face3D(pts_1, plane_1)]) vec_1 = Vector3D(2, 2, 2) new_a = awning_canopy.duplicate() new_a.move(vec_1) assert new_a[0][0] == Point3D(2, 2, 5) assert new_a[0][1] == Point3D(4, 2, 5) assert new_a[0][2] == Point3D(4, 4, 5) assert new_a[0][3] == Point3D(2, 4, 5) assert awning_canopy.area == new_a.area
def test_rotate_xy(): """Test the ContextShade 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)) awning_canopy = ContextShade('Awning_Canopy', [Face3D(pts, plane)]) origin_1 = Point3D(1, 1, 0) test_1 = awning_canopy.duplicate() test_1.rotate_xy(180, origin_1) assert test_1[0][0].x == pytest.approx(1, rel=1e-3) assert test_1[0][0].y == pytest.approx(1, rel=1e-3) assert test_1[0][0].z == pytest.approx(2, rel=1e-3) assert test_1[0][2].x == pytest.approx(0, rel=1e-3) assert test_1[0][2].y == pytest.approx(0, rel=1e-3) assert test_1[0][2].z == pytest.approx(2, rel=1e-3)
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 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_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_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 default_context(): 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]) return tree_canopy
def test_writer(): """Test the Building writer object.""" 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]) writers = [mod for mod in dir(tree_canopy.to) if not mod.startswith('_')] for writer in writers: assert callable(getattr(tree_canopy.to, writer))
def test_context_shade_min_max(): """Test the min and max properties of ContextShade objects.""" 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 = ContextShade('Awning_Canopy', [awning_geo1, awning_geo2]) assert awning_canopy.area == 40 assert awning_canopy.min == Point2D(-5, -10) assert awning_canopy.max == Point2D(11, -4)
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 custom_context(): 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]) tree_canopy.properties.uwg.is_vegetation = True return tree_canopy
def test_reflect(): """Test the ContextShade 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)) awning_canopy = ContextShade('Awning_Canopy', [Face3D(pts, plane)]) origin_1 = Point3D(1, 0, 2) normal_1 = Vector3D(1, 0, 0) plane_1 = Plane(normal_1, origin_1) test_1 = awning_canopy.duplicate() test_1.reflect(plane_1) assert test_1[0][-1].x == pytest.approx(1, rel=1e-3) assert test_1[0][-1].y == pytest.approx(1, rel=1e-3) assert test_1[0][-1].z == pytest.approx(2, rel=1e-3) assert test_1[0][1].x == pytest.approx(0, rel=1e-3) assert test_1[0][1].y == pytest.approx(2, rel=1e-3) assert test_1[0][1].z == pytest.approx(2, rel=1e-3)
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'])
def context_shade_two_tree_canopy(directory): """Generate the context_shade_two_tree_canopy sample.""" 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]) bright_leaves = ShadeConstruction('Bright Light Leaves', 0.5, 0.5, True) tree_trans = ScheduleRuleset.from_constant_value('Tree Transmittance', 0.5, schedule_types.fractional) tree_canopy.properties.energy.construction = bright_leaves tree_canopy.properties.energy.transmittance_schedule = tree_trans dest_file = os.path.join(directory, 'context_shade_two_tree_canopy.json') with open(dest_file, 'w') as fp: json.dump(tree_canopy.to_dict(True), fp, indent=4)
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_from_dict(): """Test the Story from_dict method with energy properties.""" 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_trans = ScheduleRuleset.from_constant_value('Tree Transmittance', 0.5, schedule_types.fractional) tree_canopy.properties.energy.construction = bright_leaves tree_canopy.properties.energy.transmittance_schedule = tree_trans sd = tree_canopy.to_dict() new_shd = ContextShade.from_dict(sd) assert new_shd.properties.energy.construction == bright_leaves assert new_shd.properties.energy.transmittance_schedule == tree_trans assert new_shd.to_dict() == sd
def test_to_from_dict(): """Test the Building to_dict and from_dict methods.""" context = custom_context() context_dict = context.to_dict() assert 'uwg' in context_dict['properties'] assert 'is_vegetation' in context_dict['properties']['uwg'] new_context = ContextShade.from_dict(context_dict) assert new_context.properties.uwg.is_vegetation == \ context.properties.uwg.is_vegetation
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_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 test_context_shade_init(): """Test the initialization of ContextShade objects.""" 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]) str(tree_canopy) # test the string representation assert tree_canopy.identifier == 'Tree_Canopy' assert tree_canopy.display_name == 'Tree_Canopy' assert len(tree_canopy) == len(tree_canopy.geometry) == 2 for geo in tree_canopy: assert isinstance(geo, Face3D) assert len(tree_canopy[0].vertices) == 6
def test_to_geojson(): """Test the Model to_geojson method.""" pts_1 = (Point3D(50, 50, 3), Point3D(60, 50, 3), Point3D(60, 60, 3), Point3D(50, 60, 3)) pts_2 = (Point3D(60, 50, 3), Point3D(70, 50, 3), Point3D(70, 60, 3), Point3D(60, 60, 3)) pts_3 = (Point3D(50, 70, 3), Point3D(70, 70, 3), Point3D(70, 80, 3), Point3D(50, 80, 3)) room2d_1 = Room2D('Residence1', Face3D(pts_1), 3) room2d_2 = Room2D('Residence2', Face3D(pts_2), 3) room2d_3 = Room2D('Retail', Face3D(pts_3), 3) story_big = Story('RetailFloor', [room2d_3]) story = Story('ResidenceFloor', [room2d_1, room2d_2]) story.solve_room_2d_adjacency(0.01) story.set_outdoor_window_parameters(SimpleWindowRatio(0.4)) story.multiplier = 3 building = Building('ResidenceBuilding', [story]) story_big.set_outdoor_window_parameters(SimpleWindowRatio(0.4)) story_big.multiplier = 1 building_big = Building('RetailBuildingBig', [story_big]) 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)) pts_5 = (Point3D(-5, -5, 3), Point3D(-10, -5, 3), Point3D(-10, -10, 3), Point3D(-5, -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) room2d_5 = Room2D('Office5', Face3D(pts_5), 3) int_rms = Room2D.intersect_adjacency( [room2d_1, room2d_2, room2d_3, room2d_4, room2d_5], 0.01) story = Story('OfficeFloor', 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 = 5 building_mult = 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('TestGeoJSON', [building, building_big, building_mult], [tree_canopy]) location = Location('Boston', 'MA', 'USA', 42.366151, -71.019357) geojson_folder = './tests/geojson/' model.to_geojson(location, folder=geojson_folder) geo_fp = os.path.join( geojson_folder, model.identifier, '{}.geojson'.format(model.identifier)) assert os.path.isfile(geo_fp) nukedir(os.path.join(geojson_folder, model.identifier), True)
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_energy_properties(): """Test the existence of the ContextShade energy properties.""" 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]) assert hasattr(tree_canopy.properties, 'energy') assert isinstance(tree_canopy.properties.energy, ContextShadeEnergyProperties) assert isinstance(tree_canopy.properties.energy.construction, ShadeConstruction) assert tree_canopy.properties.energy.transmittance_schedule is None