honeybee-core 1.64.2__tar.gz → 1.64.4__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.
Files changed (111) hide show
  1. {honeybee_core-1.64.2/honeybee_core.egg-info → honeybee_core-1.64.4}/PKG-INFO +1 -1
  2. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/honeybee/model.py +37 -19
  3. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/honeybee/room.py +22 -7
  4. {honeybee_core-1.64.2 → honeybee_core-1.64.4/honeybee_core.egg-info}/PKG-INFO +1 -1
  5. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/.github/workflows/ci.yaml +0 -0
  6. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/.github/workflows/dependency-release.yaml +0 -0
  7. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/.gitignore +0 -0
  8. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/.releaserc.json +0 -0
  9. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/CODE_OF_CONDUCT.md +0 -0
  10. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/CONTRIBUTING.md +0 -0
  11. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/LICENSE +0 -0
  12. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/MANIFEST.in +0 -0
  13. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/README.md +0 -0
  14. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/deploy.sh +0 -0
  15. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/dev-requirements.txt +0 -0
  16. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/docs/_build/.nojekyll +0 -0
  17. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/docs/_build/README.md +0 -0
  18. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/docs/_build/docs/README.md +0 -0
  19. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/docs/_static/custom.css +0 -0
  20. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/docs/_templates/layout.html +0 -0
  21. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/docs/cli/index.rst +0 -0
  22. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/docs/conf.py +0 -0
  23. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/docs/index.rst +0 -0
  24. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/honeybee/__init__.py +0 -0
  25. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/honeybee/__main__.py +0 -0
  26. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/honeybee/_base.py +0 -0
  27. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/honeybee/_basewithshade.py +0 -0
  28. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/honeybee/_lockable.py +0 -0
  29. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/honeybee/altnumber.py +0 -0
  30. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/honeybee/aperture.py +0 -0
  31. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/honeybee/boundarycondition.py +0 -0
  32. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/honeybee/checkdup.py +0 -0
  33. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/honeybee/cli/__init__.py +0 -0
  34. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/honeybee/cli/compare.py +0 -0
  35. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/honeybee/cli/create.py +0 -0
  36. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/honeybee/cli/edit.py +0 -0
  37. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/honeybee/cli/lib.py +0 -0
  38. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/honeybee/cli/setconfig.py +0 -0
  39. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/honeybee/cli/validate.py +0 -0
  40. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/honeybee/colorobj.py +0 -0
  41. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/honeybee/config.json +0 -0
  42. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/honeybee/config.py +0 -0
  43. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/honeybee/dictutil.py +0 -0
  44. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/honeybee/door.py +0 -0
  45. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/honeybee/extensionutil.py +0 -0
  46. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/honeybee/face.py +0 -0
  47. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/honeybee/facetype.py +0 -0
  48. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/honeybee/logutil.py +0 -0
  49. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/honeybee/orientation.py +0 -0
  50. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/honeybee/properties.py +0 -0
  51. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/honeybee/search.py +0 -0
  52. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/honeybee/shade.py +0 -0
  53. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/honeybee/shademesh.py +0 -0
  54. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/honeybee/typing.py +0 -0
  55. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/honeybee/units.py +0 -0
  56. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/honeybee/writer/__init__.py +0 -0
  57. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/honeybee/writer/aperture.py +0 -0
  58. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/honeybee/writer/door.py +0 -0
  59. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/honeybee/writer/face.py +0 -0
  60. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/honeybee/writer/model.py +0 -0
  61. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/honeybee/writer/room.py +0 -0
  62. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/honeybee/writer/shade.py +0 -0
  63. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/honeybee/writer/shademesh.py +0 -0
  64. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/honeybee_core.egg-info/SOURCES.txt +0 -0
  65. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/honeybee_core.egg-info/dependency_links.txt +0 -0
  66. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/honeybee_core.egg-info/entry_points.txt +0 -0
  67. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/honeybee_core.egg-info/requires.txt +0 -0
  68. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/honeybee_core.egg-info/top_level.txt +0 -0
  69. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/requirements.txt +0 -0
  70. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/setup.cfg +0 -0
  71. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/setup.py +0 -0
  72. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/tests/__init__.py +0 -0
  73. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/tests/aperture_test.py +0 -0
  74. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/tests/boundary_condition_test.py +0 -0
  75. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/tests/cli_compare_test.py +0 -0
  76. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/tests/cli_create_test.py +0 -0
  77. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/tests/cli_edit_test.py +0 -0
  78. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/tests/cli_validate_test.py +0 -0
  79. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/tests/colorobj_test.py +0 -0
  80. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/tests/config_test.py +0 -0
  81. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/tests/dictutil_test.py +0 -0
  82. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/tests/door_test.py +0 -0
  83. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/tests/face_test.py +0 -0
  84. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/tests/facetype_test.py +0 -0
  85. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/tests/json/ShoeBox.json +0 -0
  86. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/tests/json/bad_geometry_model.hbjson +0 -0
  87. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/tests/json/colliding_room_volumes.hbjson +0 -0
  88. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/tests/json/compare_model_1.hbjson +0 -0
  89. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/tests/json/compare_model_2.hbjson +0 -0
  90. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/tests/json/complex_polyfaces.json +0 -0
  91. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/tests/json/minor_geometry/existing_model.hbjson +0 -0
  92. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/tests/json/minor_geometry/updated_model.hbjson +0 -0
  93. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/tests/json/mismatched_area_adj.hbjson +0 -0
  94. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/tests/json/model_with_adiabatic.hbjson +0 -0
  95. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/tests/json/model_with_holes.hbjson +0 -0
  96. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/tests/json/model_without_adjacency.hbjson +0 -0
  97. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/tests/json/nonascii_face.json +0 -0
  98. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/tests/json/polygons_for_gap_boundary.json +0 -0
  99. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/tests/json/room_for_window_offset.hbjson +0 -0
  100. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/tests/json/single_family_home.hbjson +0 -0
  101. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/tests/lockable_test.py +0 -0
  102. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/tests/model_test.py +0 -0
  103. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/tests/orientation_test.py +0 -0
  104. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/tests/room_test.py +0 -0
  105. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/tests/search_test.py +0 -0
  106. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/tests/shade_test.py +0 -0
  107. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/tests/shademesh_test.py +0 -0
  108. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/tests/stl/cube_ascii.stl +0 -0
  109. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/tests/stl/cube_binary.stl +0 -0
  110. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/tests/typing_test.py +0 -0
  111. {honeybee_core-1.64.2 → honeybee_core-1.64.4}/tests/units_test.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: honeybee-core
3
- Version: 1.64.2
3
+ Version: 1.64.4
4
4
  Summary: A library to create 3D building geometry for various types of environmental simulation.
5
5
  Home-page: https://github.com/ladybug-tools/honeybee-core
6
6
  Author: Ladybug Tools
@@ -1478,7 +1478,7 @@ class Model(_Base):
1478
1478
  )
1479
1479
  return shades
1480
1480
 
1481
- def classified_envelope_edges(self, tolerance=None, exclude_coplanar=False):
1481
+ def classified_envelope_edges(self, tolerance=None, exclude_coplanar=True):
1482
1482
  """Get classified edges of this Model's envelope based on Faces they adjoin.
1483
1483
 
1484
1484
  The edges returned by this method will only exist along the exterior
@@ -1490,7 +1490,7 @@ class Model(_Base):
1490
1490
  considered equivalent. If None, the Model's tolerance will be used.
1491
1491
  exclude_coplanar: Boolean to note whether edges falling between two
1492
1492
  coplanar Faces in the building envelope should be included
1493
- in the result (False) or excluded from it (True). (Default: False).
1493
+ in the result (False) or excluded from it (True). (Default: True).
1494
1494
 
1495
1495
  Returns:
1496
1496
  A tuple with eight items where each item is a list containing
@@ -1562,43 +1562,61 @@ class Model(_Base):
1562
1562
  - window_mullions - Apertures meet one another.
1563
1563
 
1564
1564
  - door_frames - Doors meet their parent exterior wall or roof.
1565
+
1566
+ - door_mullions - Doors meet one another.
1565
1567
  """
1566
- # set up lists to be populated
1567
- window_frames, window_mullions = [], []
1568
+ # set up variables to be used for all sub_faces
1568
1569
  tol = tolerance if tolerance is not None else self.tolerance
1569
1570
  a_tol = math.radians(angle_tolerance) if angle_tolerance is not None else \
1570
1571
  math.radians(self.angle_tolerance)
1571
1572
  mul_thick = tol if mullion_thickness is None else mullion_thickness
1572
1573
 
1574
+ # get the edges of the sub_faces
1575
+ window_frames, window_mullions = \
1576
+ self._classify_mullions(self.apertures, mul_thick, tol, a_tol)
1577
+ door_frames, door_mullions = \
1578
+ self._classify_mullions(self.doors, mul_thick, tol, a_tol)
1579
+ return window_frames, window_mullions, door_frames, door_mullions
1580
+
1581
+ @staticmethod
1582
+ def _classify_mullions(sub_faces, mul_thick, tol, a_tol):
1583
+ """Organize subface edges depending on whether they are frames or mullions."""
1584
+ sub_face_frames, sub_face_mullions = [], []
1573
1585
  # group the apertures by the plane in which they exist
1574
- apertures = self.apertures
1575
- coplanar_dict = {apertures[0].geometry.plane: [apertures[0]]}
1576
- for ap in apertures[1:]:
1577
- if isinstance(ap.boundary_condition, Outdoors):
1586
+ coplanar_dict = {}
1587
+ sub_faces = [sf for sf in sub_faces
1588
+ if isinstance(sf.boundary_condition, Outdoors)]
1589
+ if len(sub_faces) != 0:
1590
+ coplanar_dict = {sub_faces[0].geometry.plane: [sub_faces[0]]}
1591
+ for sf in sub_faces[1:]:
1578
1592
  for pln, f_list in coplanar_dict.items():
1579
- if ap.geometry.plane.is_coplanar_tolerance(pln, tol, a_tol):
1580
- f_list.append(ap)
1593
+ if sf.geometry.plane.is_coplanar_tolerance(pln, tol, a_tol):
1594
+ f_list.append(sf)
1581
1595
  break
1582
1596
  else: # the first face with this type of plane
1583
- coplanar_dict[ap.geometry.plane] = [ap]
1597
+ coplanar_dict[sf.geometry.plane] = [sf]
1584
1598
 
1585
1599
  # for each group, intersect their edges and extract edges from a Polyface3D
1586
- for plane, aps in coplanar_dict.items():
1600
+ for plane, sfs in coplanar_dict.items():
1587
1601
  # intersect edges that are close enough to one another within thickness
1588
1602
  polygons = []
1589
- for ap in aps:
1590
- pts_2d = [plane.xyz_to_xy(pt) for pt in ap.geometry.boundary]
1591
- polygons.append(Polygon2D(pts_2d))
1603
+ for sf in sfs:
1604
+ pts_2d = [plane.xyz_to_xy(pt) for pt in sf.geometry.boundary]
1605
+ try:
1606
+ poly = Polygon2D(pts_2d).remove_colinear_vertices(mul_thick)
1607
+ polygons.append(poly)
1608
+ except AssertionError:
1609
+ pass # too small of a geometry
1592
1610
  polygons = Polygon2D.intersect_polygon_segments(polygons, mul_thick)
1593
1611
  faces = []
1594
1612
  for poly in polygons:
1595
- faces.append(Face3D([plane.xy_to_xyz(pt) for pt in poly]))
1613
+ faces.append(Face3D([plane.xy_to_xyz(pt) for pt in poly], plane))
1596
1614
  # create a joined Polyface3D and classify the edges
1597
1615
  ap_polyface = Polyface3D.from_faces(faces, mul_thick)
1598
- window_frames.extend(ap_polyface.naked_edges)
1599
- window_mullions.extend(ap_polyface.internal_edges)
1616
+ sub_face_frames.extend(ap_polyface.naked_edges)
1617
+ sub_face_mullions.extend(ap_polyface.internal_edges)
1600
1618
 
1601
- return window_frames, window_mullions, self.exterior_door_edges
1619
+ return sub_face_frames, sub_face_mullions
1602
1620
 
1603
1621
  def add_prefix(self, prefix):
1604
1622
  """Change the identifier of this object and child objects by inserting a prefix.
@@ -6,8 +6,8 @@ import re
6
6
  import uuid
7
7
 
8
8
  from ladybug_geometry.geometry2d import Point2D, Vector2D, Polygon2D
9
- from ladybug_geometry.geometry3d import Point3D, Vector3D, Ray3D, Plane, Face3D, \
10
- Mesh3D, Polyface3D
9
+ from ladybug_geometry.geometry3d import Point3D, Vector3D, Ray3D, LineSegment3D, \
10
+ Plane, Face3D, Mesh3D, Polyface3D
11
11
  from ladybug_geometry.bounding import overlapping_bounding_boxes
12
12
  from ladybug_geometry_polyskel.polysplit import perimeter_core_subpolygons
13
13
 
@@ -640,22 +640,37 @@ class Room(_BaseWithShade):
640
640
  exterior_wall_to_wall, roof_ridge, exposed_floor_to_floor = [], [], []
641
641
  underground, interior = [], []
642
642
 
643
- # get all of the edges and map them to room faces
644
- edges = self.geometry.internal_edges
643
+ # get all of the edges in a way that colinear edges are broken down
644
+ base_edges = list(self.geometry.internal_edges)
645
+ base_vertices = self.geometry.vertices
646
+ edges = []
647
+ for i, edge in enumerate(base_edges):
648
+ for pt in base_vertices:
649
+ if edge.distance_to_point(pt) < tolerance and \
650
+ not edge.p1.distance_to_point(pt) < tolerance and \
651
+ not edge.p2.distance_to_point(pt) < tolerance:
652
+ # split the edge in two at the point
653
+ base_edges.append(LineSegment3D.from_end_points(edge.p1, pt))
654
+ base_edges.append(LineSegment3D.from_end_points(pt, edge.p2))
655
+ break
656
+ else: # no further subdivision needed
657
+ edges.append(edge)
658
+
659
+ # map the edges to room faces
645
660
  edge_faces = [[] for _ in edges]
646
661
  for i, edge in enumerate(edges):
647
662
  for face in self.faces:
648
663
  if overlapping_bounding_boxes(face.geometry, edge, tolerance):
649
664
  for f_edge in face.geometry.segments:
650
- if edge.distance_to_point(f_edge.p1) < tolerance and \
651
- edge.distance_to_point(f_edge.p2) < tolerance:
665
+ if f_edge.distance_to_point(edge.p1) < tolerance and \
666
+ f_edge.distance_to_point(edge.p2) < tolerance:
652
667
  edge_faces[i].append(face)
653
668
  break
654
669
 
655
670
  # classify the edges by analyzing the faces they adjoin
656
671
  for edge, faces in zip(edges, edge_faces):
657
672
  # first check for cases where the edge should be excluded
658
- if len(edge_faces) <= 1: # not an edge between two faces
673
+ if len(faces) <= 1: # not an edge between two faces
659
674
  continue
660
675
  if angle_tolerance is not None:
661
676
  ang_tol = math.radians(angle_tolerance)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: honeybee-core
3
- Version: 1.64.2
3
+ Version: 1.64.4
4
4
  Summary: A library to create 3D building geometry for various types of environmental simulation.
5
5
  Home-page: https://github.com/ladybug-tools/honeybee-core
6
6
  Author: Ladybug Tools
File without changes
File without changes
File without changes
File without changes
File without changes