def create_closest_plant(self, segment_part): closest_expected_projection = segment_part.expected_projections[0] closest_expected_position = projection_to_position_2d(closest_expected_projection, segment_part.start.position, segment_part.end.position) # Add on z value closest_expected_position = closest_expected_position + (segment_part.start.position[2],) new_plant = CreatedPlant(name='plant', position=closest_expected_position, zone=segment_part.start.zone) new_plant.projection = closest_expected_projection return new_plant
def split_segment_into_parts(self, segment_part, forward_plant, reverse_plant): if not forward_plant or not reverse_plant: return [] # Can't split up any more. # First change reverse plant projection to be in the forward direction to make it consistent. _, reverse_plant.projection = lateral_and_projection_distance_2d(reverse_plant.position, segment_part.start.position, segment_part.end.position) projection_difference = reverse_plant.projection - forward_plant.projection selected_plants = [] if abs(projection_difference) < 0.0001: # Segments split on same plant so it doesn't matter which one we choose. selected_plants = [forward_plant] elif projection_difference > self.closest_plant_spacing: # Normal case where forward/reverse don't overlap. We should now have 3 segments. selected_plants = [forward_plant, reverse_plant] else: # Forward/reverse overlap. Need to decide which one to use. if forward_plant.type == 'CreatedPlant' and reverse_plant.type == 'CreatedPlant': avg_position = np.mean([forward_plant.position, reverse_plant.position], axis=0) avg_plant = CreatedPlant(name='plant', position=avg_position, zone=forward_plant.zone) avg_plant.projection = np.mean([forward_plant.projection, reverse_plant.projection], axis=0) selected_plants = [avg_plant] elif forward_plant.type == 'Plant' and reverse_plant.type == 'Plant': if forward_plant.penalty < reverse_plant.penalty: selected_plants = [forward_plant] else: selected_plants = [reverse_plant] elif forward_plant.type == 'Plant': selected_plants = [forward_plant] elif reverse_plant.type == 'Plant': selected_plants = [reverse_plant] else: assert(False) if len(selected_plants) == 0: return [] elif len(selected_plants) == 1: selected_plant = selected_plants[0] first_subpart = SegmentPart(start=segment_part.start, end=selected_plant) second_subpart = SegmentPart(start=selected_plant, end=segment_part.end) before_plants, after_plants = self.split_possible_plants_by_projections(segment_part.possible_plants, [selected_plant.projection]) first_subpart.possible_plants = before_plants second_subpart.possible_plants = after_plants return [first_subpart, second_subpart] elif len(selected_plants) == 2: first_subpart = SegmentPart(start=segment_part.start, end=selected_plants[0]) second_subpart = SegmentPart(start=selected_plants[0], end=selected_plants[1]) third_subpart = SegmentPart(start=selected_plants[1], end=segment_part.end) first_subpart.possible_plants, second_subpart.possible_plants, third_subpart.possible_plants = \ self.split_possible_plants_by_projections(segment_part.possible_plants, [selected_plants[0].projection, selected_plants[1].projection]) return [first_subpart, second_subpart, third_subpart] else: assert(False)