From c91a0fbd841a5dc3e00ffe0d78ddde94bae8bbdc Mon Sep 17 00:00:00 2001 From: Connor Ferster Date: Fri, 21 Nov 2025 14:08:48 -0800 Subject: [PATCH 1/2] chore: remove debug print --- src/papermodels/geometry/geom_ops.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/papermodels/geometry/geom_ops.py b/src/papermodels/geometry/geom_ops.py index a62de0b..ed139e3 100644 --- a/src/papermodels/geometry/geom_ops.py +++ b/src/papermodels/geometry/geom_ops.py @@ -549,7 +549,6 @@ def get_cantilever_segments( ) if split_a.distance(ordered_supports[0]) < split_a.distance(ordered_supports[-1]): - print(joist_prototype.intersection(ordered_supports[0], grid_size=1e-3)) a_intersection = get_intersection(joist_prototype, ordered_supports[0], "") b_intersection = get_intersection(joist_prototype, ordered_supports[-1], "") From ee5caa6cd0be35b814d3a147dd7c0d9d34872c06 Mon Sep 17 00:00:00 2001 From: Connor Ferster Date: Fri, 21 Nov 2025 15:09:43 -0800 Subject: [PATCH 2/2] fix: changed how intersections were calculated in geom_ops.sort_supports --- src/papermodels/datatypes/element.py | 15 ++++++++++++--- src/papermodels/datatypes/joist_models.py | 11 +++++++++++ src/papermodels/geometry/geom_ops.py | 5 ++++- 3 files changed, 27 insertions(+), 4 deletions(-) diff --git a/src/papermodels/datatypes/element.py b/src/papermodels/datatypes/element.py index 5d43e85..f6bb57f 100644 --- a/src/papermodels/datatypes/element.py +++ b/src/papermodels/datatypes/element.py @@ -17,6 +17,7 @@ import tomli_w import json + Geometry = Union[LineString, Polygon] ELEMENT_ATTRS = { @@ -277,9 +278,17 @@ def get_collector_extents(self, relative: bool = True) -> dict[str, tuple]: for idx, poly_support_geom in enumerate(support_geoms): clean_support_geom = support_geoms[idx] cleaned_supports_map.update({clean_support_geom: poly_support_geom}) - ordered_support_geoms = geom_ops.sort_supports( - self.geometry, support_geoms + assert all( + [self.geometry.intersects(support) for support in support_geoms] ) + try: + ordered_support_geoms = geom_ops.sort_supports( + self.geometry, support_geoms + ) + except (AssertionError,): + raise geom_ops.GeometryError( + f"Element only has one support: {self.tag=}" + ) try: extents = geom_ops.get_joist_extents( self.geometry, @@ -288,7 +297,7 @@ def get_collector_extents(self, relative: bool = True) -> dict[str, tuple]: extent_polygon=self.extent_polygon, ) except (AssertionError, ValueError) as e: - raise AssertionError( + raise geom_ops.GeometryError( f"No intersection within joist extents: {self.tag=}" ) tagged_extents = {} diff --git a/src/papermodels/datatypes/joist_models.py b/src/papermodels/datatypes/joist_models.py index c3708d4..d663a24 100644 --- a/src/papermodels/datatypes/joist_models.py +++ b/src/papermodels/datatypes/joist_models.py @@ -676,8 +676,19 @@ def generate_joist_geom(self, index: int): end_b, self.vector_parallel, self._cantilever_tolerance / 10 ) joist_geom = LineString([end_a, end_b]) + if not all([joist_geom.intersects(support) for support in self._supports]): + end_a = geom_ops.project_node( + end_a, -self.vector_parallel, self._cantilever_tolerance / 10 + ) + end_b = geom_ops.project_node( + end_b, self.vector_parallel, self._cantilever_tolerance / 10 + ) + joist_geom = LineString([end_a, end_b]) + + # A tolerance check to see if we generated a useably long joist if joist_geom.length <= self._cantilever_tolerance: return None + return joist_geom def get_extent_edge(self, edge: str = "start"): diff --git a/src/papermodels/geometry/geom_ops.py b/src/papermodels/geometry/geom_ops.py index ed139e3..e0ea1ba 100644 --- a/src/papermodels/geometry/geom_ops.py +++ b/src/papermodels/geometry/geom_ops.py @@ -821,7 +821,10 @@ def sort_supports( docstring for get_start_end_nodes for more explanation of the +ve vector direction. """ all_supports = MultiLineString(supports) - joist_intersections = joist_prototype.intersection(all_supports, grid_size=1e-3) + # joist_intersections = joist_prototype.intersection(all_supports, grid_size=1e-3) + joist_intersections = all_supports.intersection(joist_prototype) + if joist_intersections.geom_type == "Point": + joist_intersections = all_supports.intersection(joist_prototype, grid_size=1e-3) assert joist_intersections.geom_type != "Point" assert not joist_intersections.is_empty ordered_intersections = order_nodes_positive(joist_intersections.geoms)