Source code for cosedaUI.importers.import_h5_window

"""Dialog for importing existing HDF5 datasets and creating plain INS metadata."""

from PyQt6.QtWidgets import (
    QDialog, QFormLayout, QLineEdit, QPushButton,
    QFileDialog, QMessageBox, QWidget, QHBoxLayout
)
import os
from coseda.initialize import create_plain_insfile
from coseda.importers.import_h5 import move_plain_h5

[docs] class ImportH5Window(QDialog): """ Dialog to import an existing HDF5: - Creates a plain INS file alongside the HDF5. - Moves and renames the HDF5 into the INS output folder. """ def __init__(self, parent=None): super().__init__(parent) self.main_window = parent self.h5_paths = [] self.setWindowTitle("Import HDF5 File(s)") layout = QFormLayout(self) # HDF5 file selection self.file_edit = QLineEdit(self) self.file_edit.setReadOnly(True) browse_btn = QPushButton("Browse...", self) browse_btn.clicked.connect(self.browse_file) file_container = QWidget(self) hc = QHBoxLayout(file_container) hc.setContentsMargins(0, 0, 0, 0) hc.addWidget(self.file_edit) hc.addWidget(browse_btn) layout.addRow("HDF5 File(s):", file_container) # Destination folder (optional) self.dest_edit = QLineEdit(self) dest_btn = QPushButton("Browse...", self) dest_btn.clicked.connect(self.browse_dest) dest_container = QWidget(self) hc2 = QHBoxLayout(dest_container) hc2.setContentsMargins(0, 0, 0, 0) hc2.addWidget(self.dest_edit) hc2.addWidget(dest_btn) layout.addRow("Destination Folder:", dest_container) # Import button import_btn = QPushButton("Import", self) import_btn.clicked.connect(self.import_h5) layout.addRow(import_btn)
[docs] def browse_file(self): """Pick one or more HDF5 files to import.""" paths, _ = QFileDialog.getOpenFileNames( self, "Select HDF5 File(s)", "", "HDF5 Files (*.h5 *.hdf5)" ) if paths: self.h5_paths = paths self.file_edit.setText("; ".join(paths))
[docs] def browse_dest(self): """Pick a destination folder for the INS/HDF5 outputs.""" path = QFileDialog.getExistingDirectory( self, "Select Destination Folder", "" ) if path: self.dest_edit.setText(path)
[docs] def import_h5(self): """Create plain INS files and move the selected HDF5 files.""" h5_paths = list(self.h5_paths) if not h5_paths: QMessageBox.warning(self, "Invalid File", "Please select at least one valid HDF5 file.") return dest_text = self.dest_edit.text().strip() if dest_text and not os.path.isdir(dest_text): QMessageBox.warning(self, "Invalid Destination", "Please select a valid destination folder.") return imported = [] errors = [] for h5_path in h5_paths: if not h5_path or not os.path.isfile(h5_path): errors.append(f"{h5_path}: file does not exist") continue # Default each file to its own directory if no destination is specified. dest = dest_text if dest_text else os.path.dirname(h5_path) try: # Create plain INS file; empty metadata and params ini_path = create_plain_insfile( h5_path, dest, acquisition_details={}, parameters={} ) except Exception as e: errors.append(f"{h5_path}: failed to create INI ({e})") continue try: new_h5 = move_plain_h5(ini_path) except Exception as e: errors.append(f"{h5_path}: failed to move HDF5 file ({e})") continue imported.append((ini_path, new_h5)) if imported and self.main_window and hasattr(self.main_window, "add_generated_ini_paths"): self.main_window.add_generated_ini_paths([ini_path for ini_path, _ in imported]) if not imported: QMessageBox.critical( self, "Import Failed", "No HDF5 files were imported.\n\n" + "\n".join(errors) ) return message = "Imported HDF5 files:\n\n" message += "\n\n".join( f"INI created at:\n{ini_path}\n\nHDF5 moved to:\n{new_h5}" for ini_path, new_h5 in imported ) if errors: message += "\n\nSkipped files:\n" + "\n".join(errors) QMessageBox.information(self, "Import Complete", message) self.accept()