diff --git a/GUI_draft_live.py b/GUI_draft_live.py index 971d3210f87fcf99024e856fa122928bc61922ef..90089d8827ccae9665dc4797e7fba4e5bba094d0 100644 --- a/GUI_draft_live.py +++ b/GUI_draft_live.py @@ -1,5 +1,6 @@ import sys import math +import csv # <-- Added import numpy as np # For smoothing the path @@ -778,8 +779,6 @@ class AdvancedSettingsWidget(QWidget): Shows toggle rainbow, circle editor, line smoothing slider, contrast slider, plus two image previews (contrasted-blurred and cost). The images should maintain aspect ratio upon resize. - - Now displays the images stacked vertically with labels above them. """ def __init__(self, main_window, parent=None): super().__init__(parent) @@ -1114,21 +1113,55 @@ class MainWindow(QMainWindow): return gray def export_path(self): + """ + Exports the path as a CSV in the format: x, y, TYPE, + ensuring that each anchor influences exactly one path point. + """ full_xy = self.image_view.get_full_path_xy() if not full_xy: print("No path to export.") return + # We'll consider each anchor point as "USER-PLACED". + # But unlike a distance-threshold approach, we assign each anchor + # to exactly one closest path point. + anchor_points = self.image_view.anchor_points + + # For each anchor, find the index of the closest path point + user_placed_indices = set() + for ax, ay in anchor_points: + min_dist = float('inf') + closest_idx = None + for i, (px, py) in enumerate(full_xy): + dist = math.hypot(px - ax, py - ay) + if dist < min_dist: + min_dist = dist + closest_idx = i + if closest_idx is not None: + user_placed_indices.add(closest_idx) + + # Ask user for the CSV filename options = QFileDialog.Options() file_path, _ = QFileDialog.getSaveFileName( self, "Export Path", "", - "NumPy Files (*.npy);;All Files (*)", + "CSV Files (*.csv);;All Files (*)", options=options ) - if file_path: - arr = np.array(full_xy) - np.save(file_path, arr) - print(f"Exported path with {len(arr)} points to {file_path}") + if not file_path: + return + + import csv + with open(file_path, 'w', newline='') as csvfile: + writer = csv.writer(csvfile) + writer.writerow(["x", "y", "TYPE"]) + + for i, (x, y) in enumerate(full_xy): + ptype = "USER-PLACED" if i in user_placed_indices else "PATH" + writer.writerow([x, y, ptype]) + + print(f"Exported path with {len(full_xy)} points to {file_path}") + + def clear_points(self): self.image_view.clear_guide_points()