honeybee-core 1.62.6__tar.gz → 1.62.8__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {honeybee_core-1.62.6/honeybee_core.egg-info → honeybee_core-1.62.8}/PKG-INFO +1 -1
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/honeybee/room.py +118 -1
- {honeybee_core-1.62.6 → honeybee_core-1.62.8/honeybee_core.egg-info}/PKG-INFO +1 -1
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/tests/room_test.py +76 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/.github/workflows/ci.yaml +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/.github/workflows/dependency-release.yaml +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/.gitignore +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/.releaserc.json +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/CODE_OF_CONDUCT.md +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/CONTRIBUTING.md +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/LICENSE +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/MANIFEST.in +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/README.md +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/deploy.sh +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/dev-requirements.txt +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/docs/_build/.nojekyll +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/docs/_build/README.md +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/docs/_build/docs/README.md +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/docs/_static/custom.css +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/docs/_templates/layout.html +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/docs/cli/index.rst +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/docs/conf.py +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/docs/index.rst +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/honeybee/__init__.py +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/honeybee/__main__.py +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/honeybee/_base.py +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/honeybee/_basewithshade.py +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/honeybee/_lockable.py +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/honeybee/altnumber.py +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/honeybee/aperture.py +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/honeybee/boundarycondition.py +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/honeybee/checkdup.py +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/honeybee/cli/__init__.py +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/honeybee/cli/compare.py +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/honeybee/cli/create.py +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/honeybee/cli/edit.py +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/honeybee/cli/lib.py +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/honeybee/cli/setconfig.py +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/honeybee/cli/validate.py +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/honeybee/colorobj.py +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/honeybee/config.json +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/honeybee/config.py +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/honeybee/dictutil.py +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/honeybee/door.py +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/honeybee/extensionutil.py +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/honeybee/face.py +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/honeybee/facetype.py +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/honeybee/logutil.py +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/honeybee/model.py +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/honeybee/orientation.py +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/honeybee/properties.py +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/honeybee/search.py +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/honeybee/shade.py +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/honeybee/shademesh.py +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/honeybee/typing.py +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/honeybee/units.py +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/honeybee/writer/__init__.py +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/honeybee/writer/aperture.py +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/honeybee/writer/door.py +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/honeybee/writer/face.py +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/honeybee/writer/model.py +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/honeybee/writer/room.py +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/honeybee/writer/shade.py +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/honeybee/writer/shademesh.py +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/honeybee_core.egg-info/SOURCES.txt +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/honeybee_core.egg-info/dependency_links.txt +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/honeybee_core.egg-info/entry_points.txt +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/honeybee_core.egg-info/requires.txt +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/honeybee_core.egg-info/top_level.txt +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/requirements.txt +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/setup.cfg +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/setup.py +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/tests/__init__.py +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/tests/aperture_test.py +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/tests/boundary_condition_test.py +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/tests/cli_compare_test.py +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/tests/cli_create_test.py +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/tests/cli_edit_test.py +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/tests/cli_validate_test.py +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/tests/colorobj_test.py +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/tests/config_test.py +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/tests/dictutil_test.py +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/tests/door_test.py +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/tests/face_test.py +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/tests/facetype_test.py +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/tests/json/ShoeBox.json +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/tests/json/bad_geometry_model.hbjson +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/tests/json/colliding_room_volumes.hbjson +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/tests/json/compare_model_1.hbjson +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/tests/json/compare_model_2.hbjson +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/tests/json/complex_polyfaces.json +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/tests/json/minor_geometry/existing_model.hbjson +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/tests/json/minor_geometry/updated_model.hbjson +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/tests/json/mismatched_area_adj.hbjson +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/tests/json/model_with_adiabatic.hbjson +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/tests/json/model_with_holes.hbjson +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/tests/json/model_without_adjacency.hbjson +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/tests/json/nonascii_face.json +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/tests/json/polygons_for_gap_boundary.json +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/tests/json/room_for_window_offset.hbjson +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/tests/json/single_family_home.hbjson +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/tests/lockable_test.py +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/tests/model_test.py +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/tests/orientation_test.py +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/tests/search_test.py +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/tests/shade_test.py +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/tests/shademesh_test.py +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/tests/stl/cube_ascii.stl +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/tests/stl/cube_binary.stl +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/tests/typing_test.py +0 -0
- {honeybee_core-1.62.6 → honeybee_core-1.62.8}/tests/units_test.py +0 -0
|
@@ -2031,6 +2031,80 @@ class Room(_BaseWithShade):
|
|
|
2031
2031
|
self._geometry = room_polyface
|
|
2032
2032
|
return new_faces
|
|
2033
2033
|
|
|
2034
|
+
@staticmethod
|
|
2035
|
+
def join_adjacent_rooms(rooms, tolerance=0.01):
|
|
2036
|
+
"""Get Rooms merged across their adjacent Surface boundary conditions.
|
|
2037
|
+
|
|
2038
|
+
When the input rooms form a continuous volume across their adjacencies,
|
|
2039
|
+
a list with only a single joined Room will be returned. Otherwise, there
|
|
2040
|
+
will be more than one Room in the result for each contiguous volume
|
|
2041
|
+
across the adjacencies.
|
|
2042
|
+
|
|
2043
|
+
In all cases, the Room with the highest volume in the contiguous group
|
|
2044
|
+
will set the properties of the joined Room, including multiplier, zone,
|
|
2045
|
+
story, exclude_floor_area, and all extension attributes
|
|
2046
|
+
|
|
2047
|
+
Args:
|
|
2048
|
+
rooms: A list of Rooms which will be merged into one (or more) Rooms
|
|
2049
|
+
across their adjacent Faces.
|
|
2050
|
+
tolerance: The minimum difference between the coordinate values of two
|
|
2051
|
+
faces at which they can be considered adjacent. (Default: 0.01,
|
|
2052
|
+
suitable for objects in meters).
|
|
2053
|
+
"""
|
|
2054
|
+
# group the rooms according to their adjacency
|
|
2055
|
+
adj_groups = Room.group_by_adjacency(rooms)
|
|
2056
|
+
joined_rooms = []
|
|
2057
|
+
|
|
2058
|
+
# create the joined Rooms from each group
|
|
2059
|
+
for adj_group in adj_groups:
|
|
2060
|
+
# first check to see if the group has any adjacencies at all
|
|
2061
|
+
if len(adj_group) == 1:
|
|
2062
|
+
joined_rooms.append(adj_group[0])
|
|
2063
|
+
continue
|
|
2064
|
+
# determine the primary room that will set the properties of the new Room
|
|
2065
|
+
volumes = [r.volume for r in adj_group]
|
|
2066
|
+
sort_inds = [i for _, i in sorted(zip(volumes, range(len(volumes))))]
|
|
2067
|
+
primary_room = adj_group[sort_inds[-1]]
|
|
2068
|
+
# gather all of the adjacent faces to be eliminated in the new Room
|
|
2069
|
+
all_adjacencies, remove_faces = {}, set()
|
|
2070
|
+
for room in adj_group:
|
|
2071
|
+
for face in room.faces:
|
|
2072
|
+
if isinstance(face.boundary_condition, Surface):
|
|
2073
|
+
bc_obj = face.boundary_condition.boundary_condition_object
|
|
2074
|
+
all_adjacencies[bc_obj] = face.identifier
|
|
2075
|
+
if face.identifier in all_adjacencies:
|
|
2076
|
+
remove_faces.add(face.identifier)
|
|
2077
|
+
remove_faces.add(all_adjacencies[face.identifier])
|
|
2078
|
+
# gather the faces forming a contiguous volume and make the new room
|
|
2079
|
+
new_faces, new_indoor_shades, new_outdoor_shades = [], [], []
|
|
2080
|
+
for room in adj_group:
|
|
2081
|
+
new_indoor_shades.extend((s.duplicate() for s in room.indoor_shades))
|
|
2082
|
+
new_outdoor_shades.extend((s.duplicate() for s in room.outdoor_shades))
|
|
2083
|
+
for face in room.faces:
|
|
2084
|
+
if face.identifier not in remove_faces:
|
|
2085
|
+
new_faces.append(face.duplicate())
|
|
2086
|
+
# create the new room and assign any shades
|
|
2087
|
+
new_r = Room(primary_room.identifier, new_faces, tolerance)
|
|
2088
|
+
new_r._outdoor_shades = new_outdoor_shades
|
|
2089
|
+
new_r._indoor_shades = new_indoor_shades
|
|
2090
|
+
for oshd in new_outdoor_shades:
|
|
2091
|
+
oshd._parent = new_r
|
|
2092
|
+
for ishd in new_indoor_shades:
|
|
2093
|
+
ishd._parent = new_r
|
|
2094
|
+
ishd._is_indoor = True
|
|
2095
|
+
# transfer the primary room properties to the new room
|
|
2096
|
+
new_r._display_name = primary_room._display_name
|
|
2097
|
+
new_r._user_data = None if primary_room.user_data is None \
|
|
2098
|
+
else primary_room.user_data.copy()
|
|
2099
|
+
new_r._multiplier = primary_room.multiplier
|
|
2100
|
+
new_r._zone = primary_room._zone
|
|
2101
|
+
new_r._story = primary_room._story
|
|
2102
|
+
new_r._exclude_floor_area = primary_room.exclude_floor_area
|
|
2103
|
+
new_r._properties._duplicate_extension_attr(primary_room._properties)
|
|
2104
|
+
joined_rooms.append(new_r)
|
|
2105
|
+
|
|
2106
|
+
return joined_rooms
|
|
2107
|
+
|
|
2034
2108
|
@staticmethod
|
|
2035
2109
|
def intersect_adjacency(rooms, tolerance=0.01, angle_tolerance=1):
|
|
2036
2110
|
"""Intersect the Faces of an array of Rooms to ensure matching adjacencies.
|
|
@@ -2339,6 +2413,49 @@ class Room(_BaseWithShade):
|
|
|
2339
2413
|
floor_heights.append(flrh)
|
|
2340
2414
|
return grouped_rooms, floor_heights
|
|
2341
2415
|
|
|
2416
|
+
@staticmethod
|
|
2417
|
+
def group_by_story(rooms):
|
|
2418
|
+
"""Group Rooms according to their story property.
|
|
2419
|
+
|
|
2420
|
+
The returned room groups will be sorted from the lowest average floor
|
|
2421
|
+
to the highest average floor height.
|
|
2422
|
+
|
|
2423
|
+
Args:
|
|
2424
|
+
rooms: A list of honeybee rooms to be grouped by story.
|
|
2425
|
+
|
|
2426
|
+
Returns:
|
|
2427
|
+
A tuple with three items.
|
|
2428
|
+
|
|
2429
|
+
- grouped_rooms - A list of lists of honeybee rooms with each sub-list
|
|
2430
|
+
representing a different story.
|
|
2431
|
+
|
|
2432
|
+
- story_names - A list of story names with one value for each
|
|
2433
|
+
sub-list of the output grouped_rooms.
|
|
2434
|
+
|
|
2435
|
+
- floor_heights - A list of floor heights with one floor height
|
|
2436
|
+
for each sub-list of the output grouped_rooms.
|
|
2437
|
+
"""
|
|
2438
|
+
# group the rooms by story
|
|
2439
|
+
story_dict = {}
|
|
2440
|
+
for room in rooms:
|
|
2441
|
+
try:
|
|
2442
|
+
story_dict[room.story].append(room)
|
|
2443
|
+
except KeyError:
|
|
2444
|
+
story_dict[room.story] = [room]
|
|
2445
|
+
# sort the stories by average floor height
|
|
2446
|
+
grouped_rooms, story_names, floor_heights = [], [], []
|
|
2447
|
+
for s_name, g_rooms in story_dict.items():
|
|
2448
|
+
grouped_rooms.append(g_rooms)
|
|
2449
|
+
story_names.append(s_name)
|
|
2450
|
+
weighted_sum = sum(r.average_floor_height * r.floor_area for r in g_rooms)
|
|
2451
|
+
total_area = sum(r.floor_area for r in g_rooms)
|
|
2452
|
+
avg_flr = weighted_sum / total_area
|
|
2453
|
+
floor_heights.append(avg_flr)
|
|
2454
|
+
zip_obj = zip(floor_heights, grouped_rooms, story_names)
|
|
2455
|
+
floor_heights, grouped_rooms, story_names = \
|
|
2456
|
+
(list(t) for t in zip(*sorted(zip_obj, key=lambda x: x[0])))
|
|
2457
|
+
return grouped_rooms, story_names, floor_heights
|
|
2458
|
+
|
|
2342
2459
|
@staticmethod
|
|
2343
2460
|
def stories_by_floor_height(rooms, min_difference=2.0):
|
|
2344
2461
|
"""Assign story properties to a set of Rooms using their floor heights.
|
|
@@ -3158,7 +3275,7 @@ class Room(_BaseWithShade):
|
|
|
3158
3275
|
# loop through the rooms and find air boundary adjacencies
|
|
3159
3276
|
for room in all_rooms:
|
|
3160
3277
|
adj_ids = adj_finding_function(room)
|
|
3161
|
-
if len(adj_ids) == 0: # a room
|
|
3278
|
+
if len(adj_ids) == 0: # a room with no adjacencies
|
|
3162
3279
|
adj_network.append([room])
|
|
3163
3280
|
else: # there are other adjacent rooms to find
|
|
3164
3281
|
local_network = [room]
|
|
@@ -605,6 +605,47 @@ def test_find_adjacency():
|
|
|
605
605
|
assert len(adj_faces[0]) == 2
|
|
606
606
|
|
|
607
607
|
|
|
608
|
+
def test_join_adjacent_rooms():
|
|
609
|
+
"""Test the join_adjacent_rooms method."""
|
|
610
|
+
pts_1 = (Point3D(0, 0), Point3D(15, 0), Point3D(10, 5), Point3D(5, 5))
|
|
611
|
+
pts_2 = (Point3D(15, 0), Point3D(15, 15), Point3D(10, 10), Point3D(10, 5))
|
|
612
|
+
pts_3 = (Point3D(0, 15), Point3D(5, 10), Point3D(10, 10), Point3D(15, 15))
|
|
613
|
+
pts_4 = (Point3D(0, 0), Point3D(5, 5), Point3D(5, 10), Point3D(0, 15))
|
|
614
|
+
pts_5 = (Point3D(5, 5), Point3D(10, 5), Point3D(10, 10), Point3D(5, 10))
|
|
615
|
+
pf_1 = Polyface3D.from_offset_face(Face3D(pts_1), 3)
|
|
616
|
+
pf_2 = Polyface3D.from_offset_face(Face3D(pts_2), 3)
|
|
617
|
+
pf_3 = Polyface3D.from_offset_face(Face3D(pts_3), 3)
|
|
618
|
+
pf_4 = Polyface3D.from_offset_face(Face3D(pts_4), 3)
|
|
619
|
+
pf_5 = Polyface3D.from_offset_face(Face3D(pts_5), 3)
|
|
620
|
+
room_1 = Room.from_polyface3d('Zone1', pf_1)
|
|
621
|
+
room_2 = Room.from_polyface3d('Zone2', pf_2)
|
|
622
|
+
room_3 = Room.from_polyface3d('Zone3', pf_3)
|
|
623
|
+
room_4 = Room.from_polyface3d('Zone4', pf_4)
|
|
624
|
+
room_5 = Room.from_polyface3d('Zone5', pf_5)
|
|
625
|
+
|
|
626
|
+
rooms = [room_1, room_2, room_3, room_4, room_5]
|
|
627
|
+
rooms_basement = [rm.duplicate() for rm in rooms]
|
|
628
|
+
for rm in rooms_basement:
|
|
629
|
+
rm.move(Vector3D(0, 0, -3))
|
|
630
|
+
rm.add_prefix('Basement')
|
|
631
|
+
Room.solve_adjacency(rooms, 0.01)
|
|
632
|
+
rooms_flr_2 = [rm.duplicate() for rm in rooms]
|
|
633
|
+
for rm in rooms_flr_2:
|
|
634
|
+
rm.move(Vector3D(0, 0, 3))
|
|
635
|
+
rm.add_prefix('Floor2')
|
|
636
|
+
all_rooms = rooms + rooms_flr_2 + rooms_basement
|
|
637
|
+
|
|
638
|
+
joined_rooms = Room.join_adjacent_rooms(all_rooms)
|
|
639
|
+
|
|
640
|
+
assert len(joined_rooms) == 7
|
|
641
|
+
for r in joined_rooms:
|
|
642
|
+
assert isinstance(r, Room)
|
|
643
|
+
assert sum(r.volume for r in joined_rooms) == \
|
|
644
|
+
pytest.approx(sum(r.volume for r in all_rooms), rel=1e-3)
|
|
645
|
+
assert sum(r.floor_area for r in joined_rooms) == \
|
|
646
|
+
pytest.approx(sum(r.floor_area for r in all_rooms), rel=1e-3)
|
|
647
|
+
|
|
648
|
+
|
|
608
649
|
def test_group_by_adjacency():
|
|
609
650
|
"""Test the group_by_adjacency method."""
|
|
610
651
|
pts_1 = (Point3D(0, 0), Point3D(15, 0), Point3D(10, 5), Point3D(5, 5))
|
|
@@ -714,6 +755,41 @@ def test_group_by_orientation():
|
|
|
714
755
|
assert orientations == [0.0, 90.0, 180.0, 270.0]
|
|
715
756
|
|
|
716
757
|
|
|
758
|
+
def test_group_by_story():
|
|
759
|
+
"""Test the group_by_story method."""
|
|
760
|
+
pts_1 = (Point3D(0, 0), Point3D(15, 0), Point3D(10, 5), Point3D(5, 5))
|
|
761
|
+
pts_2 = (Point3D(15, 0), Point3D(15, 15), Point3D(10, 10), Point3D(10, 5))
|
|
762
|
+
pts_3 = (Point3D(0, 15), Point3D(5, 10), Point3D(10, 10), Point3D(15, 15))
|
|
763
|
+
pts_4 = (Point3D(0, 0), Point3D(5, 5), Point3D(5, 10), Point3D(0, 15))
|
|
764
|
+
pts_5 = (Point3D(5, 5), Point3D(10, 5), Point3D(10, 10), Point3D(5, 10))
|
|
765
|
+
pf_1 = Polyface3D.from_offset_face(Face3D(pts_1), 3)
|
|
766
|
+
pf_2 = Polyface3D.from_offset_face(Face3D(pts_2), 3)
|
|
767
|
+
pf_3 = Polyface3D.from_offset_face(Face3D(pts_3), 3)
|
|
768
|
+
pf_4 = Polyface3D.from_offset_face(Face3D(pts_4), 3)
|
|
769
|
+
pf_5 = Polyface3D.from_offset_face(Face3D(pts_5), 3)
|
|
770
|
+
room_1 = Room.from_polyface3d('Zone1', pf_1)
|
|
771
|
+
room_2 = Room.from_polyface3d('Zone2', pf_2)
|
|
772
|
+
room_3 = Room.from_polyface3d('Zone3', pf_3)
|
|
773
|
+
room_4 = Room.from_polyface3d('Zone4', pf_4)
|
|
774
|
+
room_5 = Room.from_polyface3d('Zone5', pf_5)
|
|
775
|
+
rooms = [room_1, room_2, room_3, room_4, room_5]
|
|
776
|
+
for rm in rooms:
|
|
777
|
+
rm.story = 'Ground Floor'
|
|
778
|
+
|
|
779
|
+
rooms_basement = [rm.duplicate() for rm in rooms]
|
|
780
|
+
for rm in rooms_basement:
|
|
781
|
+
rm.move(Vector3D(0, 0, -3))
|
|
782
|
+
rm.add_prefix('Basement')
|
|
783
|
+
rm.story = 'Basement'
|
|
784
|
+
Room.solve_adjacency(rooms, 0.01)
|
|
785
|
+
all_rooms = rooms + rooms_basement
|
|
786
|
+
|
|
787
|
+
grouped_rooms, story_names, floor_heights = Room.group_by_story(all_rooms)
|
|
788
|
+
assert floor_heights == [-3.0, 0.0]
|
|
789
|
+
assert story_names == ['Basement', 'Ground Floor']
|
|
790
|
+
assert len(grouped_rooms[0]) == 5
|
|
791
|
+
|
|
792
|
+
|
|
717
793
|
def test_horizontal_boundary():
|
|
718
794
|
"""Test the horizontal_boundary method for a variety of shapes."""
|
|
719
795
|
geo_file = './tests/json/complex_polyfaces.json'
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{honeybee_core-1.62.6 → honeybee_core-1.62.8}/tests/json/minor_geometry/existing_model.hbjson
RENAMED
|
File without changes
|
{honeybee_core-1.62.6 → honeybee_core-1.62.8}/tests/json/minor_geometry/updated_model.hbjson
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|