diff --git a/OpticsTools.py b/OpticsTools.py index 960a26d..5e03be5 100644 --- a/OpticsTools.py +++ b/OpticsTools.py @@ -48,6 +48,7 @@ class OpticsTools(QtWidgets.QMainWindow, Ui_OpticsGUI): # events handling self.actionOpen_2.triggered.connect(self.loadSettings) self.actionSave.triggered.connect(self.saveSettings) + self.UIUpdateFromMachine.clicked.connect(self.fullUpdate) def closeEvent(self, event): self.plot.close() @@ -80,6 +81,16 @@ class OpticsTools(QtWidgets.QMainWindow, Ui_OpticsGUI): 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 diff --git a/issues.txt b/issues.txt index afcf4cc..33c71d9 100644 --- a/issues.txt +++ b/issues.txt @@ -1,12 +1,11 @@ -1) Energy update in model from Sandbox or machine -2) Full update from machine + + 3) export to machine for magnet settings 4) export elegant lattice 5) support of other reference files -> fill up the selection list 6) matching -7) when writing magnets do snapshot? 8) Elegant support? 10) Prepare several settings files 11) About and website support -12) install cpymax on machine network + diff --git a/machine.py b/machine.py index 8156d1b..49b596f 100644 --- a/machine.py +++ b/machine.py @@ -58,7 +58,6 @@ class Machine: magnets[key[0:15]]=values[key] if 'MBND' in key and 'K0L-SET' in key: if 'SINBC' in key or 'SINLH' in key or 'S10BC' in key or 'SATMA' in key or 'SATUN' in key: - print(key,values[key]) magnets[key[0:15]] = values[key]*180./np.pi if 'UMOD' in key: und[key[0:12]]=[values[key],0.] diff --git a/model.py b/model.py index f60376a..e8ac1e9 100644 --- a/model.py +++ b/model.py @@ -61,6 +61,24 @@ class Model: return variable + def updateFromMachine(self,machine): + pol = ['LH', 'LV+', 'LV-', 'C+', 'C-', 'ZL'] + mag = machine['Magnet'] + for key in mag: + keyom=key.replace('-','.') + self.updateElement(keyom,[mag[key]]) # needs to be a list + und = machine['Undulator'] + for key in und: + keyom=key.replace('-','.') + self.updateElement(keyom,[und[key][0],pol[int(und[key][1])]]) + rf = machine['RF'] + for key in rf: + keyom=key.replace('-','.') + self.updateElement(keyom,rf[key]) + energy = machine['Energy'] + for key in energy: + self.updateEnergy(energy[key]) + def updateEnergy(self,E0): if isinstance(E0,list): E0=E0[0] diff --git a/runOpticsTools.sh b/runOpticsTools.sh new file mode 100755 index 0000000..5f8f837 --- /dev/null +++ b/runOpticsTools.sh @@ -0,0 +1,14 @@ +#!/bin/bash + +BASEDIR=$(dirname $0) +echo "Script location: ${BASEDIR}" +# runs in the sfbd conda environment SLIC +source /sf/bd/packages/conda/etc/profile.d/conda.sh +conda activate slic +export PYTHONPATH=/sf/bd/packages/slic:/sf/bd/packages/sfbd:/sf/bd/packages/bstrd:/sf/bd/packages/pyrealta:/sf/bd/packages/onlinemodel:$PYTHONPATH +cd $BASEDIR +python OpticsTools.py +# needs command line arguments +#-debug 1 -offline 0 + + diff --git a/sandbox.py b/sandbox.py index 0b326f4..646bf6e 100644 --- a/sandbox.py +++ b/sandbox.py @@ -28,10 +28,17 @@ class Sandbox: elif self.parent.sender() is self.parent.Mach2ModUnd: self.updateModel(self.parent.UndSB, 3, False) self.updateModel(self.parent.RFSB, 3, False) + energy= float(str(self.parent.SBE0Machine.text())) + print('Updating from Maching:',energy) + self.parent.model.updateEnergy(energy) elif self.parent.sender() is self.parent.SB2ModUnd: self.updateModel(self.parent.UndSB, 1, False) self.updateModel(self.parent.RFSB, 1, False) - + energy = float(str(self.parent.SBE0Model.text())) + print('Updating from Model:',energy) + self.parent.model.updateEnergy(energy) + self.updateSandbox() + self.parent.status('Sandbox mode') def updateModel(self,sb,col,single): for i in range(sb.rowCount()): @@ -42,11 +49,9 @@ class Sandbox: if single: val = [val] else: - val = [val,str(sb.item(i+1,col).text())] + val = [val,str(sb.item(i,col+1).text())] self.parent.model.updateElement(field.replace('-','.'),val) - self.updateSandbox() - - + def updateSandbox(self): machine = self.parent.machine.getMachineStatus() model = self.parent.model.getSettings() diff --git a/ui/OpticsPlotGui.py b/ui/OpticsPlotGui.py index fca8863..8ea4011 100644 --- a/ui/OpticsPlotGui.py +++ b/ui/OpticsPlotGui.py @@ -2,15 +2,12 @@ # Form implementation generated from reading ui file 'ui/OpticsPlotGui.ui' # -# Created by: PyQt5 UI code generator 5.15.10 +# Created by: PyQt5 UI code generator 5.9.2 # -# WARNING: Any manual changes made to this file will be lost when pyuic5 is -# run again. Do not edit this file unless you know what you are doing. - +# WARNING! All changes made in this file will be lost! from PyQt5 import QtCore, QtGui, QtWidgets - class Ui_OpticsPlotGUI(object): def setupUi(self, OpticsPlotGUI): OpticsPlotGUI.setObjectName("OpticsPlotGUI") @@ -314,7 +311,7 @@ class Ui_OpticsPlotGUI(object): self.retranslateUi(OpticsPlotGUI) self.TabMaster.setCurrentIndex(0) - self.actionQuit.triggered.connect(OpticsPlotGUI.close) # type: ignore + self.actionQuit.triggered.connect(OpticsPlotGUI.close) QtCore.QMetaObject.connectSlotsByName(OpticsPlotGUI) def retranslateUi(self, OpticsPlotGUI): @@ -404,3 +401,4 @@ class Ui_OpticsPlotGUI(object): self.actionLoad_Reference.setText(_translate("OpticsPlotGUI", "Load Reference...")) self.actionSave_Reference.setText(_translate("OpticsPlotGUI", "Save Reference")) self.actionNew_Reference.setText(_translate("OpticsPlotGUI", "New Reference")) + diff --git a/ui/OpticsToolsGui.py b/ui/OpticsToolsGui.py index 7b74c03..f3ab30a 100644 --- a/ui/OpticsToolsGui.py +++ b/ui/OpticsToolsGui.py @@ -2,15 +2,12 @@ # Form implementation generated from reading ui file 'ui/OpticsToolsGui.ui' # -# Created by: PyQt5 UI code generator 5.15.10 +# Created by: PyQt5 UI code generator 5.9.2 # -# WARNING: Any manual changes made to this file will be lost when pyuic5 is -# run again. Do not edit this file unless you know what you are doing. - +# WARNING! All changes made in this file will be lost! from PyQt5 import QtCore, QtGui, QtWidgets - class Ui_OpticsGUI(object): def setupUi(self, OpticsGUI): OpticsGUI.setObjectName("OpticsGUI") @@ -31,6 +28,11 @@ class Ui_OpticsGUI(object): self.horizontalLayout = QtWidgets.QHBoxLayout(self.tab_3) self.horizontalLayout.setObjectName("horizontalLayout") self.widget_2 = QtWidgets.QWidget(self.tab_3) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.widget_2.sizePolicy().hasHeightForWidth()) + self.widget_2.setSizePolicy(sizePolicy) self.widget_2.setObjectName("widget_2") self.verticalLayout = QtWidgets.QVBoxLayout(self.widget_2) self.verticalLayout.setObjectName("verticalLayout") @@ -245,6 +247,26 @@ class Ui_OpticsGUI(object): self.verticalLayout.addLayout(self.gridLayout_3) spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.verticalLayout.addItem(spacerItem) + self.UIUpdateFromMachine = QtWidgets.QPushButton(self.widget_2) + self.UIUpdateFromMachine.setObjectName("UIUpdateFromMachine") + self.verticalLayout.addWidget(self.UIUpdateFromMachine) + self.label_13 = QtWidgets.QLabel(self.widget_2) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.label_13.sizePolicy().hasHeightForWidth()) + self.label_13.setSizePolicy(sizePolicy) + self.label_13.setObjectName("label_13") + self.verticalLayout.addWidget(self.label_13) + self.UIStatus = QtWidgets.QLineEdit(self.widget_2) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Ignored, QtWidgets.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.UIStatus.sizePolicy().hasHeightForWidth()) + self.UIStatus.setSizePolicy(sizePolicy) + self.UIStatus.setMinimumSize(QtCore.QSize(150, 0)) + self.UIStatus.setObjectName("UIStatus") + self.verticalLayout.addWidget(self.UIStatus) self.horizontalLayout.addWidget(self.widget_2) spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout.addItem(spacerItem1) @@ -449,7 +471,7 @@ class Ui_OpticsGUI(object): self.verticalLayout_4.addWidget(self.TabMaster) OpticsGUI.setCentralWidget(self.centralwidget) self.menubar = QtWidgets.QMenuBar(OpticsGUI) - self.menubar.setGeometry(QtCore.QRect(0, 0, 813, 22)) + self.menubar.setGeometry(QtCore.QRect(0, 0, 813, 20)) self.menubar.setObjectName("menubar") self.menuFile = QtWidgets.QMenu(self.menubar) self.menuFile.setObjectName("menuFile") @@ -575,8 +597,8 @@ class Ui_OpticsGUI(object): self.menubar.addAction(self.menuHelp.menuAction()) self.retranslateUi(OpticsGUI) - self.TabMaster.setCurrentIndex(2) - self.actionQuit.triggered.connect(OpticsGUI.close) # type: ignore + self.TabMaster.setCurrentIndex(0) + self.actionQuit.triggered.connect(OpticsGUI.close) QtCore.QMetaObject.connectSlotsByName(OpticsGUI) def retranslateUi(self, OpticsGUI): @@ -609,6 +631,8 @@ class Ui_OpticsGUI(object): self.UIEtapy.setText(_translate("OpticsGUI", "30")) self.UIY.setText(_translate("OpticsGUI", "30")) self.UIPY.setText(_translate("OpticsGUI", "30")) + self.UIUpdateFromMachine.setText(_translate("OpticsGUI", "Update Model from Machine")) + self.label_13.setText(_translate("OpticsGUI", "Status")) self.TabMaster.setTabText(self.TabMaster.indexOf(self.tab_3), _translate("OpticsGUI", "Track")) self.groupBox_8.setTitle(_translate("OpticsGUI", "Magnets (Angle/ k1L / k2L)")) self.label_23.setText(_translate("OpticsGUI", "Start")) @@ -699,3 +723,4 @@ class Ui_OpticsGUI(object): self.actionSave_Reference.setText(_translate("OpticsGUI", "Save Reference")) self.actionNew_Reference.setText(_translate("OpticsGUI", "New Reference")) self.actionSave.setText(_translate("OpticsGUI", "Save Settings...")) + diff --git a/ui/OpticsToolsGui.ui b/ui/OpticsToolsGui.ui index 7d5eedd..56dfe6e 100644 --- a/ui/OpticsToolsGui.ui +++ b/ui/OpticsToolsGui.ui @@ -24,7 +24,7 @@ - 2 + 0 @@ -33,6 +33,12 @@ + + + 0 + 0 + + @@ -394,6 +400,42 @@ + + + + Update Model from Machine + + + + + + + + 0 + 0 + + + + Status + + + + + + + + 0 + 0 + + + + + 150 + 0 + + + + @@ -757,7 +799,7 @@ 0 0 813 - 22 + 20