import sys import json import webbrowser import subprocess from argparse import ArgumentParser from PyQt5 import QtWidgets,QtGui from ui.OpticsToolsGui import Ui_OpticsGUI from plot import OpticsPlot from model import Model from machine import Machine from reference import ReferenceManager from sandbox import Sandbox from matching import Matching from elegant import Elegant class OpticsTools(QtWidgets.QMainWindow, Ui_OpticsGUI): def __init__(self,phase=0, office= 1): super(OpticsTools, self).__init__() self.setupUi(self) office = office== 1 self.version = '1.0.1' self.setWindowIcon(QtGui.QIcon("rsc/iconoptics.png")) self.plot = OpticsPlot(parent=self) self.plot.show() # initialize online model self.model = Model(phase=phase,parent=self) if phase > 0: office = True self.machine = Machine(parent = True, office = office) self.machine.initPVs(self.model.getElements()) self.sandbox = Sandbox(parent = self, machine = self.machine) self.elegant=Elegant(parent=self,model=self.model) title = "SwissFEL Optics Tools - Lattice %s (Phase %d)" % (self.model.getLatticeVersion(),phase) if office: title += " - offline" self.setWindowTitle(title) # initialization self.loadSettingsdirect("Settings/ReferenceSetting.json") self.sandbox.updateSandbox() self.reference = ReferenceManager(parent=self) self.matching = Matching(parent=self, model=self.model, reference = self.reference) # events handling self.actionOpen_2.triggered.connect(self.loadSettings) self.actionSave.triggered.connect(self.saveSettings) self.UIUpdateFromMachine.clicked.connect(self.fullUpdate) self.actionHelp.triggered.connect(self.openGit) self.actionAbout.triggered.connect(self.about) self.actionOpenMatch.triggered.connect(self.loadMatchingConfig) self.actionOpenMatchEditor.triggered.connect(self.editMatchingConfig) self.actionOpenScriptEditor.triggered.connect(self.editMatchingScript) self.actionExportElegant.triggered.connect(self.exportElegant) def closeEvent(self, event): self.plot.close() event.accept() def about(self): QtWidgets.QMessageBox.about(self, "Optics Tool", "Version:%s\nContact: Sven Reiche\nEmail: sven.reiche@psi.ch" % self.version) def openGit(self): webbrowser.open("https://gitea.psi.ch/reiche/opticstool") def exportElegant(self): self.elegant.writeElegantFiles('Elegant','dummy','SATBD01') def loadMatchingConfig(self): options = QtWidgets.QFileDialog.Options() options |= QtWidgets.QFileDialog.DontUseNativeDialog fileName, _ = QtWidgets.QFileDialog.getOpenFileName(self, "Open Matching Config File", "MatchingConfig/Reference.json", "Json Files (*.json)", options=options) if not fileName: return self.reference.loadReference(fileName) def editMatchingConfig(self): options = QtWidgets.QFileDialog.Options() options |= QtWidgets.QFileDialog.DontUseNativeDialog fileName, _ = QtWidgets.QFileDialog.getOpenFileName(self, "Open Matching Config File", "MatchingConfig/Reference.json", "Json Files (*.json)", options=options) if not fileName: return subprocess.Popen(["emacs", fileName]) def editMatchingScript(self): options = QtWidgets.QFileDialog.Options() options |= QtWidgets.QFileDialog.DontUseNativeDialog fileName, _ = QtWidgets.QFileDialog.getOpenFileName(self, "Open Matching Script File", "Scripts/switchyard.madx", "MadX Files (*.madx)", options=options) if not fileName: return subprocess.Popen(["emacs", fileName]) def saveSettings(self): options = QtWidgets.QFileDialog.Options() options |= QtWidgets.QFileDialog.DontUseNativeDialog fileName, _ = QtWidgets.QFileDialog.getSaveFileName(self, "Save Settings", "Settings/newSetting.json", "Json Files (*.json)", options=options) if not fileName: return settings=self.model.getSettings() with open(fileName, 'w', encoding='utf-8') as f: json.dump(settings, f, ensure_ascii=False, indent=4) def loadSettings(self): options = QtWidgets.QFileDialog.Options() options |= QtWidgets.QFileDialog.DontUseNativeDialog fileName, _ = QtWidgets.QFileDialog.getOpenFileName(self, "Open Settings", "Settings/ReferenceSetting.json", "Json Files (*.json)", options=options) if not fileName: return self.loadSettingsdirect(fileName) def loadSettingsdirect(self,fileName): with open(fileName, 'r', encoding='utf-8') as f: settings = json.load(f) self.model.loadSettings(settings) self.status('Reference loaded') def fullUpdate(self): machine = self.machine.getMachineStatus() self.model.updateFromMachine(machine) self.sandbox.updateSandbox() self.status('Machine Settings') def status(self,msg=''): self.UIStatus.setText(msg) # -------------------------------- # Main routine if __name__ == '__main__': QtWidgets.QApplication.setStyle(QtWidgets.QStyleFactory.create("plastique")) parser = ArgumentParser() parser.add_argument('-phase', type=int, help='Disable any action on the machine', default=0) parser.add_argument('-offline', type=int, help='Excludes any connection to control system', default=1) args = parser.parse_args() app = QtWidgets.QApplication(sys.argv) main = OpticsTools(phase = args.phase, office = args.offline) if main: main.show() sys.exit(app.exec_())