diff --git a/src/papermodels/datatypes/element.py b/src/papermodels/datatypes/element.py index e632724..9afd78c 100644 --- a/src/papermodels/datatypes/element.py +++ b/src/papermodels/datatypes/element.py @@ -452,13 +452,13 @@ def _get_transfer_loads(self, precision: int): source_start_extent = [] source_end_extent = [] elif len(correspondent_above.other_extents) == 2: - target_start_extent = round(correspondent_above.other_extents[0]) - target_end_extent = round(correspondent_above.other_extents[1]) + target_start_extent = round(correspondent_above.other_extents[0], precision) + target_end_extent = round(correspondent_above.other_extents[1], precision) source_start_extent = [] source_end_extent = [] elif len(correspondent_above.other_extents) == 4: - target_start_extent = round(correspondent_above.other_extents[0]) - target_end_extent = round(correspondent_above.other_extents[1]) + target_start_extent = round(correspondent_above.other_extents[0], precision) + target_end_extent = round(correspondent_above.other_extents[1], precision) source_start_extent = round(correspondent_above.other_extents[2], precision) source_end_extent = round(correspondent_above.other_extents[3], precision) @@ -738,7 +738,30 @@ def get_transfer_extents(element: Element) -> tuple[str, dict]: } ) - return intersection_extents + correspondent_extents = {} + for correspondent_below in element.correspondents_below: + tag = correspondent_below.other_tag + other_geom = correspondent_below.other_geometry + intersecting_region = element.geometry.intersection(other_geom) + other_geom_centerline = geom_ops.get_rectangle_centerline(other_geom) + below_start_coord, _ = geom_ops.get_start_end_nodes(other_geom_centerline) + above_start_coord, _ = geom_ops.get_rectangle_centerline(element.geometry).coords + above_start_coord = Point(above_start_coord) + intersecting_centerline = geom_ops.get_rectangle_centerline(intersecting_region) + inter_start_coord, inter_end_coord = geom_ops.get_start_end_nodes(intersecting_centerline) + correspondent_extents.update( + { + tag: ( + below_start_coord.distance(inter_start_coord), + below_start_coord.distance(inter_end_coord), + above_start_coord.distance(inter_start_coord), + above_start_coord.distance(inter_end_coord), + ) + } + ) + + + return intersection_extents | correspondent_extents diff --git a/src/papermodels/datatypes/geometry_graph.py b/src/papermodels/datatypes/geometry_graph.py index e7c7b69..b74819c 100644 --- a/src/papermodels/datatypes/geometry_graph.py +++ b/src/papermodels/datatypes/geometry_graph.py @@ -255,11 +255,17 @@ def add_intersection_indexes_below(self): for intersection in element.intersections_below if intersection.other_tag in dependents ] + dependent_correspondents = [ + correspondent + for correspondent in element.correspondents_below + if correspondent.other_tag in dependents + ] if node_attrs['start_coord'] is None: # node geometry is polygon updated_intersections_below = [] all_extents = {} if element.reaction_type == "linear": all_extents = get_transfer_extents(element) + for intersection in dependent_intersections: extents = all_extents.get(intersection.other_tag) new_intersection = Intersection( @@ -271,6 +277,20 @@ def add_intersection_indexes_below(self): other_extents=extents ) updated_intersections_below.append(new_intersection) + + updated_correspondents_below = [] + for correspondent in dependent_correspondents: + extents = all_extents.get(correspondent.other_tag) + new_correspondent = Correspondent( + correspondent.overlap_ratio, + correspondent.other_geometry, + correspondent.other_tag, + correspondent.other_rank, + correspondent.other_reaction_type, + extents, + ) + updated_correspondents_below.append(new_correspondent) + element.correspondents_below = updated_correspondents_below else: start_coord = Point(node_attrs['start_coord']) intersection_below_local_coords = [] @@ -330,6 +350,11 @@ def add_intersection_indexes_above(self): for intersection in element.intersections_above if intersection.other_tag in predecessors ] + predecessor_correspondents = [ + correspondent + for correspondent in element.correspondents_above + if correspondent.other_tag in predecessors + ] for intersection in predecessor_intersections: other_tag = intersection.other_tag element_above: Element = self.nodes[other_tag]['element'] @@ -371,7 +396,33 @@ def add_intersection_indexes_above(self): ) indexed_intersections_above.append(new_sub_intersection) + indexed_correspondents_above = [] + for correspondent in predecessor_correspondents: + other_tag = correspondent.other_tag + element_above: Element = self.nodes[other_tag]['element'] + above_dependents = list(self.successors(other_tag)) + element_above_dependent_correspondents = [ + correspondent + for correspondent in element_above.correspondents_below + if element.tag in above_dependents + ] + above_correspondents_below = { + above_correspondent_below.other_tag: above_correspondent_below.other_extents + for above_correspondent_below in element_above_dependent_correspondents + } + other_extents = above_correspondents_below[element_tag] + if element_above.subelements is None: + new_correspondent = Correspondent( + correspondent.overlap_ratio, + correspondent.other_geometry, + correspondent.other_tag, + correspondent.other_rank, + correspondent.other_reaction_type, + other_extents + ) + indexed_correspondents_above.append(new_correspondent) + element.correspondents_above = indexed_correspondents_above element.intersections_above = indexed_intersections_above self.nodes[node]['element'] = element