2626 SegmentDataModel ,
2727 SegmentItemModel ,
2828 compare_segments ,
29+ get_segments_from_directory ,
2930)
3031from omc3_gui .segment_by_segment .segment_view import SegmentDialog
3132from omc3_gui .ui_components .dataclass_ui import SettingsDialog
@@ -46,15 +47,18 @@ class SbSController(Controller):
4647 settings : Settings
4748 _view : SbSWindow
4849
49- def __init__ (self , settings : Settings | None = None ):
50+ def __init__ (self , measurements : list [ Path | str ] | None = None , settings : Settings | None = None ):
5051 super ().__init__ (SbSWindow ())
5152 self .settings : Settings = settings or Settings ()
52- self ._last_selected_optics_path : Path = self .settings .main .cwd
53+ self ._last_selected_measurement_path : Path = self .settings .main .cwd
5354 self ._running_tasks : list [BackgroundThread ] = []
5455
5556 self .connect_signals ()
5657 self .set_measurement_interaction_buttons_enabled (False )
5758 self .set_all_segment_buttons_enabled (False )
59+
60+ if measurements is not None :
61+ self .open_measurements_from_paths (measurements )
5862
5963 def connect_signals (self ):
6064 """ Connect the signals from the GUI components (view) to the slots (controller). """
@@ -153,7 +157,6 @@ def set_measurement_interaction_buttons_enabled(self, enabled: bool = True):
153157 for button in measurement_interaction_buttons :
154158 button .setEnabled (enabled )
155159
156-
157160 def add_measurement (self , measurement : OpticsMeasurement ):
158161 """ Add a measurement to the GUI.
159162
@@ -172,27 +175,63 @@ def open_measurements(self):
172175 filenames = OpenDirectoriesDialog (
173176 parent = view ,
174177 caption = "Select Optics Folders" ,
175- directory = self ._last_selected_optics_path ,
178+ directory = self ._last_selected_measurement_path ,
176179 ).run_selection_dialog ()
177180
178181 loaded_measurements = view .get_measurement_list ()
179182 measurement_indices = []
180183
181184 LOGGER .debug (f"User selected { len (filenames )} files." )
182185 for filename in filenames :
183- LOGGER .debug (f"adding : { filename !s} " )
186+ LOGGER .debug (f"Adding : { filename !s} " )
184187 optics_measurement = OpticsMeasurement .from_path (filename )
188+
189+ if self .settings .main .autoload_segments :
190+ self .load_segments_for_measurement (optics_measurement )
191+
192+ if self .settings .main .autodefault_segments :
193+ self .add_default_segments (optics_measurement )
194+
185195 try :
186196 loaded_measurements .add_item (optics_measurement )
187197 except ValueError as e :
188198 LOGGER .error (str (e ))
189199 else :
190200 measurement_indices .append (loaded_measurements .get_index (optics_measurement ))
191201
192- self ._last_selected_optics_path = filename .parent
202+ self ._last_selected_measurement_path = filename .parent
193203
194204 view .set_selected_measurements (measurement_indices )
195205
206+ def open_measurements_from_paths (self , paths : Sequence [Path | str ]):
207+ """ Open the given paths as measurements on start. """
208+ if not len (paths ):
209+ LOGGER .debug ("No measurement paths to load." )
210+ return
211+
212+ view : SbSWindow = self ._view
213+ loaded_measurements = view .get_measurement_list ()
214+
215+ LOGGER .debug (f"Loading { len (paths )} measurements." )
216+ for directory in paths :
217+ directory = Path (directory )
218+
219+ LOGGER .debug (f"Adding: { directory !s} " )
220+ optics_measurement = OpticsMeasurement .from_path (directory )
221+
222+ if self .settings .main .autoload_segments :
223+ self .load_segments_for_measurement (optics_measurement )
224+
225+ if self .settings .main .autodefault_segments :
226+ self .add_default_segments (optics_measurement )
227+
228+ try :
229+ loaded_measurements .add_item (optics_measurement )
230+ except ValueError as e :
231+ LOGGER .error (str (e ))
232+
233+ view .set_selected_measurements ()
234+
196235 @Slot ()
197236 def edit_measurement (self , measurement : OpticsMeasurement | None = None ):
198237 """ Open the edit dialog for a measurement.
@@ -256,7 +295,7 @@ def measurement_selection_changed(self, measurements: Sequence[OpticsMeasurement
256295 self .set_measurement_interaction_buttons_enabled (True )
257296 self .set_all_segment_buttons_enabled (True )
258297
259- # Group the segments fo the measurements into table-items when they have the same defintion ---
298+ # Group the segments for the measurements into table-items when they have the same defintion ---
260299 segment_table_items : list [SegmentItemModel ] = []
261300
262301 for measurement in measurements :
@@ -463,18 +502,27 @@ def add_default_segments(self):
463502 return
464503
465504 for measurement in selected_measurements :
466- beam = measurement .beam
467- if beam is None :
468- LOGGER .error (f"No beam found in measurement { measurement .display ()} . Cannot add default segments." )
469- continue
505+ self .add_default_segements_to_measurement (measurement )
506+
507+ self .measurement_selection_changed (selected_measurements )
508+
509+ def add_default_segements_to_measurement (self , measurement : OpticsMeasurement ):
510+ """ Add default segments to the given measurement.
511+ These segments are defined in :data:`omc3_gui.segment_by_segment.defaults.DEFAULT_SEGMENTS`.
470512
513+ Args:
514+ measurement (OpticsMeasurement): The measurement to add segments to.
515+ """
516+ if measurement .beam is not None : # LHC
471517 for segment_tuple in DEFAULT_SEGMENTS :
472518 segment = SegmentDataModel (measurement , * segment_tuple )
473- segment .start = f"{ segment .start } .B{ beam } "
474- segment .end = f"{ segment .end } .B{ beam } "
519+ segment .start = f"{ segment .start } .B{ measurement . beam } "
520+ segment .end = f"{ segment .end } .B{ measurement . beam } "
475521 measurement .try_add_segment (segment )
522+
523+ # TODO: Implement for other accelerators
524+ LOGGER .error (f"No beam found in measurement { measurement .display ()} . Cannot add default segments." )
476525
477- self .measurement_selection_changed (selected_measurements )
478526
479527 @Slot ()
480528 def new_segment (self ):
@@ -578,13 +626,44 @@ def remove_segment(self, segments: Sequence[SegmentItemModel] | None = None):
578626
579627 @Slot ()
580628 def load_segments (self ):
581- LOGGER .debug ("Loading segments from file/folder." )
582- # TODO
583- # Either parse a folder to find the segements therein, or load from a json file.
629+ self .load_segments_for_selected_measurements ()
630+ # LOGGER.debug("Loading segments from file/folder.")
631+ # TODO: implement file saving and loading and ask user which one to do.
632+
633+ def load_segments_for_selected_measurements (self ):
634+ """ Load segments for the currently selected measurements. """
635+ LOGGER .debug ("Loading segments for selected measurements." )
636+ view : SbSWindow = self ._view
637+
638+ selected_measurements = view .get_selected_measurements ()
639+ if not selected_measurements :
640+ LOGGER .error ("Please select at least one measurement." )
641+ return
642+
643+ for measurement in selected_measurements :
644+ self .load_segments_for_measurement (measurement )
645+
646+ # Update the view
647+ self .measurement_selection_changed (selected_measurements )
648+
649+ def load_segments_for_measurement (self , measurement : OpticsMeasurement ):
650+ """ Load segments for the given measurement. """
651+ LOGGER .debug (f"Loading segments for { measurement .display ()} ." )
652+
653+ segments = get_segments_from_directory (measurement .output_dir )
654+ if not segments :
655+ LOGGER .debug (f"No segments found in { measurement .output_dir } ." )
656+ return
657+
658+ for segment_tuple in segments :
659+ segment = SegmentDataModel (measurement , * segment_tuple )
660+ measurement .try_add_segment (segment )
584661
585662 @Slot ()
586663 def save_segments (self ):
587664 LOGGER .debug ("Saving segments to a file." )
665+ view : SbSWindow = self ._view
666+ view .showErrorDialog ("Error: Not Implemented" , "The save segments function is not implemented yet." )
588667 # TODO
589668 # Save current segements to a json file
590669
@@ -654,6 +733,7 @@ def clear_all():
654733 # For Debugging: Start sbs directly ---
655734 sbs_function ()
656735 clear_all ()
736+ LOGGER .info (f"Finished { measurement_task .message } " )
657737 # -------------------------------------
658738
659739# Plotting ---------------------------------------------------------------------
0 commit comments