refactoring and other stuff

This commit is contained in:
2022-08-31 13:03:17 +02:00
parent e651fddd56
commit d29a961763
3 changed files with 135 additions and 119 deletions

View File

@@ -30,6 +30,8 @@ class MyJsonEncoder(json.JSONEncoder):
return json.JSONEncoder.default(self, obj) return json.JSONEncoder.default(self, obj)
class AppCfg(QSettings): class AppCfg(QSettings):
GBL_FLD_SCR_SHOT="global/folder_screenshot"
GEO_OPT_CTR='geometry/opt_ctr' GEO_OPT_CTR='geometry/opt_ctr'
GEO_PIX2POS='geometry/pix2pos' GEO_PIX2POS='geometry/pix2pos'

View File

@@ -347,8 +347,13 @@ class geometry:
A[:,0:2]=points[:,:2] A[:,0:2]=points[:,:2]
y=np.asmatrix(y.ravel()).T y=np.asmatrix(y.ravel()).T
A=np.asmatrix(A) A=np.asmatrix(A)
try:
aa=(A.T*A).I*A.T*y aa=(A.T*A).I*A.T*y
except np.linalg.LinAlgError as e:
_log.warning(e)
return
aa=aa.A.ravel() aa=aa.A.ravel()
print(f'plane={aa[0]}X+{aa[1]}Y+{aa[2]}')
for p in points: for p in points:
print(f'{p}->{aa[0]*p[0]+aa[1]*p[1]+aa[2]}') print(f'{p}->{aa[0]*p[0]+aa[1]*p[1]+aa[2]}')
self._fitPlane=aa self._fitPlane=aa

View File

@@ -88,7 +88,7 @@ from PyQt5 import QtCore, QtGui
from PyQt5.QtCore import Qt, pyqtSlot, QSize, QRegExp, pyqtSignal, QObject, QThread from PyQt5.QtCore import Qt, pyqtSlot, QSize, QRegExp, pyqtSignal, QObject, QThread
from PyQt5.QtGui import QKeySequence, QPixmap, QRegExpValidator from PyQt5.QtGui import QKeySequence, QPixmap, QRegExpValidator
from PyQt5.QtWidgets import ( from PyQt5.QtWidgets import (
QAction, QApplication, QDoubleSpinBox, QFormLayout, QGridLayout, QGroupBox, QHBoxLayout, QLabel, QLineEdit, QAction, QApplication, QDoubleSpinBox, QFileDialog, QFormLayout, QGridLayout, QGroupBox, QHBoxLayout, QLabel, QLineEdit,
QMessageBox, QPlainTextEdit, QProgressBar, QProgressDialog, QPushButton, QShortcut, QSizePolicy, QSpinBox, QMessageBox, QPlainTextEdit, QProgressBar, QProgressDialog, QPushButton, QShortcut, QSizePolicy, QSpinBox,
QSplashScreen, QTextBrowser, QToolBox, QVBoxLayout, QWidget,) QSplashScreen, QTextBrowser, QToolBox, QVBoxLayout, QWidget,)
from PyQt5.uic import loadUiType from PyQt5.uic import loadUiType
@@ -216,7 +216,7 @@ class StartupSplash:
Ui_MainWindow, QMainWindow = loadUiType("swissmx.ui") Ui_MainWindow, QMainWindow = loadUiType("swissmx.ui")
class SwissMxWnd(QMainWindow, Ui_MainWindow): class WndSwissMx(QMainWindow, Ui_MainWindow):
#pixelsPerMillimeter = pyqtSignal(float) #pixelsPerMillimeter = pyqtSignal(float)
#beamCameraCoordinatesChanged = pyqtSignal(float, float) #beamCameraCoordinatesChanged = pyqtSignal(float, float)
addGridRequest = pyqtSignal(float, float) addGridRequest = pyqtSignal(float, float)
@@ -237,7 +237,7 @@ class SwissMxWnd(QMainWindow, Ui_MainWindow):
daqAborted = pyqtSignal() daqAborted = pyqtSignal()
def __init__(self,): def __init__(self,):
super(SwissMxWnd, self).__init__() super(WndSwissMx, self).__init__()
self.setupUi(self) self.setupUi(self)
app=QApplication.instance() app=QApplication.instance()
@@ -328,17 +328,17 @@ class SwissMxWnd(QMainWindow, Ui_MainWindow):
self.prepare_left_tabs() self.prepare_left_tabs()
#self.update_beam_marker(qoptic_zoom.get_sp()) #ZAC: orig. code #self.update_beam_marker(qoptic_zoom.get_sp()) #ZAC: orig. code
self._centerpiece_stack.setCurrentIndex(0) self._centerpiece_stack.setCurrentIndex(0)
self._centerpiece_stack.currentChanged.connect(self.center_piece_update) self._centerpiece_stack.currentChanged.connect(self.cb_update_center_widget)
self._OLD_init_validators() self._OLD_init_validators()
#self.init_settings_tracker() ? not needed, was for TELL ? #self.init_settings_tracker() ? not needed, was for TELL ?
self._OLD_wire_storage() self._OLD_wire_storage()
self.center_piece_update(0) # start camera updater self.cb_update_center_widget(0) # start camera updater
curzoom = app._zoom.get_val() curzoom = app._zoom.get_val()
_log.debug(f"starting app with zoom at {curzoom}") _log.debug(f"starting app with zoom at {curzoom}")
self.zoom_changed_cb(curzoom) self.cb_zoom_changed(curzoom)
self._tabs_daq_methods.currentChanged.connect(self.switch_task) self._tabs_daq_methods.currentChanged.connect(self.cb_switch_task)
self.switch_task() self.cb_switch_task()
def init_settings(self): def init_settings(self):
app = QApplication.instance() app = QApplication.instance()
@@ -378,8 +378,8 @@ class SwissMxWnd(QMainWindow, Ui_MainWindow):
self.microscope_page.setLayout(QVBoxLayout()) self.microscope_page.setLayout(QVBoxLayout())
self.microscope_page.layout().addWidget(self.glw) self.microscope_page.layout().addWidget(self.glw)
self.glw.show() self.glw.show()
self.glw.scene().sigMouseMoved.connect(self.mouse_move_event) self.glw.scene().sigMouseMoved.connect(self.cb_mouse_move)
self.glw.scene().sigMouseClicked.connect(self.mouse_click_event) self.glw.scene().sigMouseClicked.connect(self.cb_mouse_click)
#--- viewbox --- #--- viewbox ---
#self.vb=vb=self.glw.addViewBox(invertY=False,border='r',enableMenu=False) #self.vb=vb=self.glw.addViewBox(invertY=False,border='r',enableMenu=False)
@@ -412,18 +412,22 @@ class SwissMxWnd(QMainWindow, Ui_MainWindow):
#grid.setTransform(tr) # assign transform #grid.setTransform(tr) # assign transform
vb.addItem(grid) vb.addItem(grid)
#--- beam marker ---
bm_sz=np.array((50, 40)) # it is immidiatly repositioned in zoom_changed_cb
self._goBeamMarker=bm=UsrGO.Marker(-opt_ctr-bm_sz/2,bm_sz,mode=0)
bm.setTransform(tr) # assign transform
vb.addItem(bm)
#--- opctical center ---- #--- opctical center ----
oc_sz=np.array((50,50)) oc_sz=np.array((50,50))
self._goOptCtr=obj=UsrGO.Marker(-opt_ctr-oc_sz/2, oc_sz,mode=1) self._goOptCtr=obj=UsrGO.Marker(-opt_ctr-oc_sz/2, oc_sz,mode=1)
bm.setTransform(tr) # assign transform obj.sigRegionChangeFinished.connect(self.cb_marker_moved)
#obj.setTransform(tr) # assign transform
vb.addItem(obj) vb.addItem(obj)
#--- beam marker ---
bm_sz=np.array((50, 40)) # it is immidiatly repositioned in cb_zoom_changed
self._goBeamMarker=bm=UsrGO.Marker(-opt_ctr-bm_sz/2,bm_sz,mode=0)
bm._size_eu=cfg.value(AppCfg.GEO_BEAM_SZ)
bm._pos_eu=cfg.value(AppCfg.GEO_BEAM_POS)
bm.sigRegionChangeFinished.connect(self.cb_marker_moved)
#bm.setTransform(tr) # assign transform
vb.addItem(bm)
#--- testing scan grid --- #--- testing scan grid ---
self.track_objects() # first call is needed to initialize the structure self._goTracked self.track_objects() # first call is needed to initialize the structure self._goTracked
# #go=UsrGO.Grid((120, -100), (200, 150), (30, 22), 2) # #go=UsrGO.Grid((120, -100), (200, 150), (30, 22), 2)
@@ -440,13 +444,13 @@ class SwissMxWnd(QMainWindow, Ui_MainWindow):
self.toolBar.setToolButtonStyle(Qt.ToolButtonTextUnderIcon) self.toolBar.setToolButtonStyle(Qt.ToolButtonTextUnderIcon)
self.shortcut = QShortcut(QKeySequence(Qt.CTRL + Qt.SHIFT + Qt.Key_S), self) self.shortcut = QShortcut(QKeySequence(Qt.CTRL + Qt.SHIFT + Qt.Key_S), self)
self.shortcut.activated.connect(self.saveSampleCameraScreenshot) self.shortcut.activated.connect(self.cb_save_cam_image)
self.shortcut = QShortcut(QKeySequence(Qt.Key_F2), self) self.shortcut = QShortcut(QKeySequence(Qt.Key_F2), self)
self.shortcut.activated.connect(self.saveSampleCameraScreenshot) self.shortcut.activated.connect(self.cb_save_cam_image)
self.shortcut = QShortcut(QKeySequence(Qt.CTRL + Qt.Key_S), self) self.shortcut = QShortcut(QKeySequence(Qt.CTRL + Qt.Key_S), self)
self.shortcut.activated.connect(self.saveSampleCameraScreenshotView) self.shortcut.activated.connect(self.cb_save_cam_image)
self.shortcut = QShortcut(QKeySequence(Qt.CTRL + Qt.SHIFT + Qt.Key_T), self) self.shortcut = QShortcut(QKeySequence(Qt.CTRL + Qt.SHIFT + Qt.Key_T), self)
self.shortcut.activated.connect(lambda: qutilities.toggle_warn(SKIP_ESCAPE_TRANSITIONS_IF_SAFE)) self.shortcut.activated.connect(lambda: qutilities.toggle_warn(SKIP_ESCAPE_TRANSITIONS_IF_SAFE))
@@ -459,20 +463,20 @@ class SwissMxWnd(QMainWindow, Ui_MainWindow):
self.shortcut = QShortcut(QKeySequence(Qt.CTRL + qkey), self) self.shortcut = QShortcut(QKeySequence(Qt.CTRL + qkey), self)
self.shortcut.activated.connect(lambda key=k: self.gotoBookmark(key)) self.shortcut.activated.connect(lambda key=k: self.gotoBookmark(key))
self._button_collect.clicked.connect(self.execute_collection) self._button_collect.clicked.connect(self.cb_execute_collection)
# Toolbar buttons # Toolbar buttons
icon_size = QSize(50, 50) icon_size = QSize(50, 50)
icon = qtawesome.icon("material.photo_camera") icon = qtawesome.icon("material.photo_camera")
action = QAction(icon, "Save View", self)
action.setToolTip("(Ctrl+S) Take a screenshot of the currently visible sample image, including markers. Saves in current folder.")
action.triggered.connect(self.saveSampleCameraScreenshotView)
self.toolBar.addAction(action)
action = QAction(icon, "Save Original", self) action = QAction(icon, "Save Original", self)
action.setToolTip("(Ctrl+Shift+S) Take a screenshot of the sample image, without markers. Saves in current folder.") action.setToolTip("(Ctrl+Shift+S) Take a screenshot of the sample image, without markers. Saves in current folder.")
action.triggered.connect(self.saveSampleCameraScreenshot) action.triggered.connect(self.cb_save_cam_image)
self.toolBar.addAction(action)
action = QAction(icon, "Save View", self)
action.setToolTip("(Ctrl+S) Take a screenshot of the currently visible sample image, including markers. Saves in current folder.")
action.triggered.connect(lambda: self.cb_save_cam_image(True))
self.toolBar.addAction(action) self.toolBar.addAction(action)
if os.getenv("DEVELOPMENT_VERSION"): if os.getenv("DEVELOPMENT_VERSION"):
@@ -510,27 +514,27 @@ class SwissMxWnd(QMainWindow, Ui_MainWindow):
action = QAction(icon, "Sample\nExchange", self) action = QAction(icon, "Sample\nExchange", self)
action.setToolTip("Move devices so a sample can be exchanged.") action.setToolTip("Move devices so a sample can be exchanged.")
action.setObjectName("action_SampleExchange") action.setObjectName("action_SampleExchange")
action.triggered.connect(self.escape_goToSampleExchange) action.triggered.connect(self.cb_esc_sample_exchange)
self.toolBar.addAction(action) self.toolBar.addAction(action)
self.toolBar.widgetForAction(action).setAccessibleName("action_SampleExchange") self.toolBar.widgetForAction(action).setAccessibleName("action_SampleExchange")
icon = qtawesome.icon("material.my_location") icon = qtawesome.icon("material.my_location")
action = QAction(icon, "Sample\nAlignment", self) action = QAction(icon, "Sample\nAlignment", self)
action.setToolTip("Move devices so a sample can be aligned.") action.setToolTip("Move devices so a sample can be aligned.")
action.triggered.connect(self.escape_goToSampleAlignment) action.triggered.connect(self.cb_esc_sample_alignment)
self.toolBar.addAction(action) self.toolBar.addAction(action)
self.toolBar.widgetForAction(action).setAccessibleName("action_SampleAlignment") self.toolBar.widgetForAction(action).setAccessibleName("action_SampleAlignment")
icon = qtawesome.icon("material.fingerprint") icon = qtawesome.icon("material.fingerprint")
action = QAction(icon, "Data\nCollection", self) action = QAction(icon, "Data\nCollection", self)
action.setToolTip("Move devices so a sample can be collected.") action.setToolTip("Move devices so a sample can be collected.")
action.triggered.connect(self.escape_goToDataCollection) action.triggered.connect(self.cb_esc_data_collection)
self.toolBar.addAction(action) self.toolBar.addAction(action)
self.toolBar.widgetForAction(action).setAccessibleName("action_DataCollection") self.toolBar.widgetForAction(action).setAccessibleName("action_DataCollection")
self.actionQuit.triggered.connect(self.really_quit) self.actionQuit.triggered.connect(self.cb_really_quit)
self.actionPreferences.triggered.connect(self._OLD_openPreferencesDialog) self.actionPreferences.triggered.connect(self._OLD_openPreferencesDialog)
self.actionHome_Fast_Stages.triggered.connect(self.home_deltatau_faststages) self.actionHome_Fast_Stages.triggered.connect(self.cb_deltatau_home_faststages)
self.actionUser_Storage.triggered.connect(self._OLD_update_user_and_storage) self.actionUser_Storage.triggered.connect(self._OLD_update_user_and_storage)
self.shortcut = QShortcut(QKeySequence(Qt.CTRL + Qt.SHIFT + Qt.Key_L), self) self.shortcut = QShortcut(QKeySequence(Qt.CTRL + Qt.SHIFT + Qt.Key_L), self)
@@ -619,7 +623,7 @@ class SwissMxWnd(QMainWindow, Ui_MainWindow):
else: else:
event.ignore() event.ignore()
def center_piece_update(self, index): def cb_update_center_widget(self, index):
if index > 0: # not showing camera image if index > 0: # not showing camera image
_log.warning("listening to zescape") _log.warning("listening to zescape")
self.timer.stop() self.timer.stop()
@@ -630,11 +634,11 @@ class SwissMxWnd(QMainWindow, Ui_MainWindow):
else: else:
app=QApplication.instance() app=QApplication.instance()
try: try:
self.new_frame_sim_cb() self.cb_new_frame_sim()
except AttributeError: except AttributeError:
app._camera.run(self.new_frame_pv_cb) app._camera.run(self.cb_new_frame_pv)
def new_frame_pv_cb(self, **kwargs): def cb_new_frame_pv(self, **kwargs):
#_log.debug('new_frame_pv_cb count {}'.format(kwargs['count'])) #_log.debug('new_frame_pv_cb count {}'.format(kwargs['count']))
app=QApplication.instance() app=QApplication.instance()
sz=app._camera._sz sz=app._camera._sz
@@ -648,7 +652,7 @@ class SwissMxWnd(QMainWindow, Ui_MainWindow):
camera.epics_cam.set_fiducial(pic, 255) camera.epics_cam.set_fiducial(pic, 255)
self._goImg.setImage(pic) self._goImg.setImage(pic)
def new_frame_sim_cb(self, **kwargs): def cb_new_frame_sim(self, **kwargs):
app=QApplication.instance() app=QApplication.instance()
sim=app._camera._sim sim=app._camera._sim
imgSeq=sim['imgSeq'] imgSeq=sim['imgSeq']
@@ -659,7 +663,7 @@ class SwissMxWnd(QMainWindow, Ui_MainWindow):
self._goImg.setImage(pic) self._goImg.setImage(pic)
delay=500 # ms -> 2fps delay=500 # ms -> 2fps
QtCore.QTimer.singleShot(delay, self.new_frame_sim_cb) QtCore.QTimer.singleShot(delay, self.cb_new_frame_sim)
def load_stylesheet(self): def load_stylesheet(self):
with open("swissmx.css", "r") as sheet: with open("swissmx.css", "r") as sheet:
@@ -682,8 +686,8 @@ class SwissMxWnd(QMainWindow, Ui_MainWindow):
self.zoombox = zoom.Zoom() self.zoombox = zoom.Zoom()
self.zoombox.init_settings() self.zoombox.init_settings()
self.zoombox.zoomChanged.connect(self.zoom_changed_cb) self.zoombox.zoomChanged.connect(self.cb_zoom_changed)
self.zoombox.moveBacklight.connect(self.safe_backlight_move) self.zoombox.moveBacklight.connect(self.cb_move_backlight_safe)
layout.addWidget(self.zoombox) layout.addWidget(self.zoombox)
@@ -699,7 +703,7 @@ class SwissMxWnd(QMainWindow, Ui_MainWindow):
# monitor all axis for an axis fault # monitor all axis for an axis fault
for key, tweaker in self.tweakers.items(): for key, tweaker in self.tweakers.items():
tweaker.event_axis_fault.connect(self.axis_fault) tweaker.event_axis_fault.connect(self.cb_axis_fault)
#self.tweakers["fast_x"].event_readback.connect(lambda alias, value, kw: self.fast_x_position.emit(value)) #self.tweakers["fast_x"].event_readback.connect(lambda alias, value, kw: self.fast_x_position.emit(value))
#self.tweakers["fast_y"].event_readback.connect(lambda alias, value, kw: self.fast_y_position.emit(value)) #self.tweakers["fast_y"].event_readback.connect(lambda alias, value, kw: self.fast_y_position.emit(value))
@@ -708,29 +712,47 @@ class SwissMxWnd(QMainWindow, Ui_MainWindow):
self.tweakers["fast_y"].event_val.connect(lambda rec_name, kw: self.track_objects()) self.tweakers["fast_y"].event_val.connect(lambda rec_name, kw: self.track_objects())
# layout.addStretch() # layout.addStretch()
def zoom_changed_cb(self, value): def cb_marker_moved(self,obj,*args,**kwargs):
#self.zoomChanged.emit(value) _log.debug(args)
_log.debug(kwargs)
app=QApplication.instance() app=QApplication.instance()
cfg=app._cfg cfg=app._cfg
geo=app._geometry geo=app._geometry
opt_ctr=geo._opt_ctr
if obj==self._goOptCtr:
oc_pos=obj.pos()
oc_sz=obj.size()
geo._opt_ctr=opt_ctr=np.array(-oc_pos-oc_sz/2)
_log.debug(f'{obj}->{opt_ctr} !!! NOT SAVED IN CONFIG !!!')
#cfg.setValue(AppCfg.GEO_OPT_CTR,bm_pos)
elif obj==self._goBeamMarker:
bm_pos=obj.pos()
bm_sz=obj.size()
obj._pos_eu=bm_pos=-geo.pix2pos(bm_pos+opt_ctr+bm_sz/2)
_log.debug(f'{obj}->{bm_pos} !!! NOT SAVED IN CONFIG !!!')
#cfg.setValue(AppCfg.GEO_BEAM_POS,bm_pos)
def cb_zoom_changed(self, value):
#self.zoomChanged.emit(value)
app=QApplication.instance()
geo=app._geometry
try: try:
geo.interp_zoom(value) geo.interp_zoom(value)
except AttributeError as e: except AttributeError as e:
_log.warning(e) _log.warning(e)
else: else:
opt_ctr=geo._opt_ctr opt_ctr=geo._opt_ctr
bm_sz=cfg.value(AppCfg.GEO_BEAM_SZ)
bm_pos=cfg.value(AppCfg.GEO_BEAM_POS)
bm_sz=np.abs(geo.pos2pix(bm_sz))
bm_pos=-opt_ctr-geo.pos2pix(bm_pos)-bm_sz/2
bm=self._goBeamMarker bm=self._goBeamMarker
bm_sz=np.abs(geo.pos2pix(bm._size_eu))
bm_pos=-opt_ctr-geo.pos2pix(bm._pos_eu)-bm_sz/2
bm.blockSignals(True) # avoid to call cb_marker_moved
bm.setPos(bm_pos,finish=False) bm.setPos(bm_pos,finish=False)
bm.setSize(bm_sz) bm.setSize(bm_sz)
bm.blockSignals(False)
_log.debug(f"zoom->{value} beam marker pos:{bm_pos} sz:{bm_sz})") _log.debug(f"zoom->{value} beam marker pos:{bm_pos} sz:{bm_sz})")
self.track_objects() self.track_objects()
#self.update_beam_marker(value)
def safe_backlight_move(self, pos): def cb_move_backlight_safe(self, pos):
# any move of backlight requires post sample tube out # any move of backlight requires post sample tube out
try: try:
self.assert_post_tube_position(pos="out") self.assert_post_tube_position(pos="out")
@@ -798,7 +820,7 @@ class SwissMxWnd(QMainWindow, Ui_MainWindow):
block.layout().addWidget(c) block.layout().addWidget(c)
return block return block
def axis_fault(self, pvname, kw): def cb_axis_fault(self, pvname, kw):
""" """
swissmx - {'pvname': 'SAR-EXPMX:MOT_FY.STAT', 'value': 0, 'char_value': 'NO_ALARM', 'status': 0, 'ftype': 17, 'chid': 38980392, swissmx - {'pvname': 'SAR-EXPMX:MOT_FY.STAT', 'value': 0, 'char_value': 'NO_ALARM', 'status': 0, 'ftype': 17, 'chid': 38980392,
'host': 'SAR-CPPM-EXPMX1.psi.ch:5064', 'count': 1, 'access': 'read-only', 'write_access': False, 'read_access': True, 'host': 'SAR-CPPM-EXPMX1.psi.ch:5064', 'count': 1, 'access': 'read-only', 'write_access': False, 'read_access': True,
@@ -885,7 +907,7 @@ class SwissMxWnd(QMainWindow, Ui_MainWindow):
def active_task(self): def active_task(self):
return self._active_task return self._active_task
def mouse_move_event(self, pos): def cb_mouse_move(self, pos):
app = QApplication.instance() app = QApplication.instance()
self._mouse_pos = pos self._mouse_pos = pos
task = self.active_task() task = self.active_task()
@@ -929,7 +951,7 @@ class SwissMxWnd(QMainWindow, Ui_MainWindow):
) )
) )
def mouse_click_event(self, event): def cb_mouse_click(self, event):
#_log.debug("{}".format(event)) #_log.debug("{}".format(event))
#_log.debug("screen pos {}".format(event.screenPos())) #pixel position on the whole screen #_log.debug("screen pos {}".format(event.screenPos())) #pixel position on the whole screen
#_log.debug("scene pos {}".format(event.scenePos())) #pixel position on the scene (including black frame) #_log.debug("scene pos {}".format(event.scenePos())) #pixel position on the scene (including black frame)
@@ -1191,50 +1213,36 @@ class SwissMxWnd(QMainWindow, Ui_MainWindow):
#x=imgPos.x();y=imgPos.y() #x=imgPos.x();y=imgPos.y()
@pyqtSlot() @pyqtSlot()
def saveSampleCameraScreenshot(self): def cb_save_cam_image(self,overlays=False):
outf = self.get_screenshot_filename() app=QApplication.instance()
_log.info("saving original clean screenshot: {}".format(outf)) cam=app._camera
filename, _ = QFileDialog.getSaveFileName(self,"Save data file",'', 'PNG files (*.png);;all files (*)')
if not filename:
return
_log.info(f"saving view screenshot: {filename}")
#try:
if not overlays:
import PIL.Image
#img=PIL.Image.fromarray(cam.pic.astype(np.uint8))
try: try:
sample_camera.saveimage(outf) pic=cam.pic
except Exception as e: except AttributeError:
_log.warning(e) sim=app._camera._sim
QMessageBox.warning(self, "Screenshot: failed to save image", "Failed to save screenshot!") pic=cam._sim['imgSeq'][sim['imgIdx']]
img=PIL.Image.fromarray(pic)
@pyqtSlot() img.save(filename)
def saveSampleCameraScreenshotView(self): else:
outf = self.get_screenshot_filename()
_log.info("saving view screenshot: {}".format(outf))
exporter = pg.exporters.ImageExporter(self.vb) exporter = pg.exporters.ImageExporter(self.vb)
# set export parameters if needed # set export parameters if needed
exporter.parameters()["width"] = 2000 # (note this also affects height parameter) #exporter.parameters()["width"] = 2000 # (note this also affects height parameter)
# save to file # save to file
try: exporter.export(filename)
exporter.export(outf)
except Exception as e:
_log.warning(e)
QMessageBox.warning(self, "Screenshot: failed to save viewer image", "Failed to save screenshot of viewer!",)
def get_screenshot_filename(self): #except Exception as e:
global folders # _log.warning(e)
_log.info("taking screenhot") # QMessageBox.warning(self, "Screenshot: failed to save image", "Failed to save screenshot!")
prefix = folders.prefix
folder = folders.res_folder
base = time.strftime("{}_%Y%m%d_%H%M%S.png".format(prefix))
if not os._exists(folder):
try:
os.makedirs(folder, 0o750, exist_ok=True)
except:
msg = "Failed to create folder: {}".format(folder)
_log.warning(msg)
QMessageBox.warning(self, "Screenshot: failed to create folder", "Failed to create output folder for screenshot!\n\n\tScreenshot not taken!",)
raise
outf = os.path.join(folder, base)
return outf
def execute_collection(self): def cb_execute_collection(self):
app=QApplication.instance() app=QApplication.instance()
geo=app._geometry geo=app._geometry
#zoom=app._zoom.get_val() #zoom=app._zoom.get_val()
@@ -1333,7 +1341,7 @@ class SwissMxWnd(QMainWindow, Ui_MainWindow):
elif task == TASK_EMBL: elif task == TASK_EMBL:
self.daq_embl_collect_points() self.daq_embl_collect_points()
def escape_goToSampleExchange(self): def cb_esc_sample_exchange(self):
self._escape_current_state = "busy" self._escape_current_state = "busy"
steps = [] steps = []
if option(CRYOJET_MOTION_ENABLED): if option(CRYOJET_MOTION_ENABLED):
@@ -1348,7 +1356,7 @@ class SwissMxWnd(QMainWindow, Ui_MainWindow):
self.escape_run_steps(steps, "Transitioning to Sample Exchange") self.escape_run_steps(steps, "Transitioning to Sample Exchange")
self._escape_current_state = "ManualSampleExchange" self._escape_current_state = "ManualSampleExchange"
def escape_goToSampleAlignment(self): def cb_esc_sample_alignment(self):
app=QApplication.instance() app=QApplication.instance()
self._escape_current_state = "busy" self._escape_current_state = "busy"
@@ -1362,7 +1370,7 @@ class SwissMxWnd(QMainWindow, Ui_MainWindow):
self.escape_run_steps(steps, "Transitioning to Sample Alignment") self.escape_run_steps(steps, "Transitioning to Sample Alignment")
self._escape_current_state = "SampleAlignment" self._escape_current_state = "SampleAlignment"
def escape_goToDataCollection(self): def cb_esc_data_collection(self):
self._escape_current_state = "busy" self._escape_current_state = "busy"
steps = [ steps = [
# lambda: sample_selection.tell.set_current(30.0), # lambda: sample_selection.tell.set_current(30.0),
@@ -1375,19 +1383,19 @@ class SwissMxWnd(QMainWindow, Ui_MainWindow):
self.escape_run_steps(steps, "Transitioning to Data Collection") self.escape_run_steps(steps, "Transitioning to Data Collection")
self._escape_current_state = "DataCollection" self._escape_current_state = "DataCollection"
def really_quit(self): def cb_really_quit(self):
"""called when user Ctrl-Q the app""" """called when user Ctrl-Q the app"""
if QMessageBox.question(self, "", "Are you sure you want to quit?", QMessageBox.Yes | QMessageBox.No, QMessageBox.No,) == QMessageBox.Yes: if QMessageBox.question(self, "", "Are you sure you want to quit?", QMessageBox.Yes | QMessageBox.No, QMessageBox.No,) == QMessageBox.Yes:
self._do_quit = True self._do_quit = True
self.close() self.close()
def home_deltatau_faststages(self): def cb_deltatau_home_faststages(self):
_log.warning("homing fast stages") _log.warning("homing fast stages")
epics.PV("SAR-EXPMX1:ASYN.AOUT").put(b"enable plc 1") epics.PV("SAR-EXPMX1:ASYN.AOUT").put(b"enable plc 1")
def prepare_left_tabs(self): def prepare_left_tabs(self):
tabs = self._left_tabs tabs = self._left_tabs
tabs.currentChanged.connect(self.switch_task) tabs.currentChanged.connect(self.cb_switch_task)
setup_tab = self._tab_setup setup_tab = self._tab_setup
exp_tab = self._tab_experiment exp_tab = self._tab_experiment
@@ -1532,11 +1540,11 @@ class SwissMxWnd(QMainWindow, Ui_MainWindow):
#grp.layout().addWidget(self._ppm_feature_size_spinbox, 0, 1) #grp.layout().addWidget(self._ppm_feature_size_spinbox, 0, 1)
self._btn_pix2pos = but = QPushButton("pix2pos") self._btn_pix2pos = but = QPushButton("pix2pos")
but.setCheckable(True) but.setCheckable(True)
but.clicked.connect(self.update_pix2pos) but.clicked.connect(self.cb_update_pix2pos)
grp.layout().addWidget(but, 0, 0) grp.layout().addWidget(but, 0, 0)
self._btn_opt_ctr = but = QPushButton("opt_ctr") self._btn_opt_ctr = but = QPushButton("opt_ctr")
but.setCheckable(True) but.setCheckable(True)
but.clicked.connect(self.update_opt_ctr) but.clicked.connect(self.cb_update_opt_ctr)
grp.layout().addWidget(but, 1, 0) grp.layout().addWidget(but, 1, 0)
help = QTextBrowser() help = QTextBrowser()
@@ -1570,7 +1578,7 @@ class SwissMxWnd(QMainWindow, Ui_MainWindow):
# tbox.addItem(grp, "PPM ToolBox") # tbox.addItem(grp, "PPM ToolBox")
# self._ppm_toolbox = grp # self._ppm_toolbox = grp
tbox.currentChanged.connect(self.switch_task) tbox.currentChanged.connect(self.cb_switch_task)
# final stretch # final stretch
# setup_tab.layout().addStretch() # setup_tab.layout().addStretch()
@@ -1610,7 +1618,7 @@ class SwissMxWnd(QMainWindow, Ui_MainWindow):
#tab.layout().addWidget(self._preloc_inspect_area) #tab.layout().addWidget(self._preloc_inspect_area)
def switch_task(self, index=0): def cb_switch_task(self, index=0):
stack = self._centerpiece_stack stack = self._centerpiece_stack
task = self._left_tabs.currentWidget().accessibleName() task = self._left_tabs.currentWidget().accessibleName()
setup_task = self._setup_toolbox.currentWidget().accessibleName() setup_task = self._setup_toolbox.currentWidget().accessibleName()
@@ -1633,7 +1641,7 @@ class SwissMxWnd(QMainWindow, Ui_MainWindow):
self.set_active_task(active_task) self.set_active_task(active_task)
self._status_task.setText(active_task) self._status_task.setText(active_task)
def update_pix2pos(self, calib): def cb_update_pix2pos(self, calib):
app=QApplication.instance() app=QApplication.instance()
if calib: if calib:
_log.info("received new pix2pos calibration") _log.info("received new pix2pos calibration")
@@ -1644,11 +1652,11 @@ class SwissMxWnd(QMainWindow, Ui_MainWindow):
res=QMessageBox.question(self, "calibration", f"use calibration\n{s} ? ") res=QMessageBox.question(self, "calibration", f"use calibration\n{s} ? ")
if res==QMessageBox.Yes: if res==QMessageBox.Yes:
geo=app._geometry geo=app._geometry
geo.update_pix2pos(app._raw_pix2pos) geo.cb_update_pix2pos(app._raw_pix2pos)
app._cfg.setValue(AppCfg.GEO_PIX2POS, geo._lut_pix2pos) app._cfg.setValue(AppCfg.GEO_PIX2POS, geo._lut_pix2pos)
del app._raw_pix2pos del app._raw_pix2pos
def update_opt_ctr(self, calib): def cb_update_opt_ctr(self, calib):
app=QApplication.instance() app=QApplication.instance()
if calib: if calib:
_log.info("received new pix2pos calibration") _log.info("received new pix2pos calibration")
@@ -1732,6 +1740,7 @@ class SwissMxWnd(QMainWindow, Ui_MainWindow):
sz=np.array(go._dscr['size']) sz=np.array(go._dscr['size'])
fid=fid/sz fid=fid/sz
trf=geometry.geometry.least_square_trf(ptFitTrf,fid) trf=geometry.geometry.least_square_trf(ptFitTrf,fid)
print(trf)
tr=go.transform() tr=go.transform()
tr.setMatrix(1, trf[1,0]/trf[0,0], 0, tr.setMatrix(1, trf[1,0]/trf[0,0], 0,
trf[0,1]/trf[1,1], 1, 0, trf[0,1]/trf[1,1], 1, 0,
@@ -2044,7 +2053,7 @@ class SwissMxWnd(QMainWindow, Ui_MainWindow):
) )
self.move_gonio_to_mount_position(offset=self._pin_mounting_offset) self.move_gonio_to_mount_position(offset=self._pin_mounting_offset)
elif "samplealignment" in state: elif "samplealignment" in state:
self.escape_goToSampleAlignment() self.cb_esc_sample_alignment()
except: except:
zescape.reply("Maintenance") zescape.reply("Maintenance")
zescape.reply(self._escape_current_state) zescape.reply(self._escape_current_state)
@@ -2238,12 +2247,12 @@ class SwissMxWnd(QMainWindow, Ui_MainWindow):
self.engage_mouse_tracking() self.engage_mouse_tracking()
def _OLD_engage_mouse_tracking(self): def _OLD_engage_mouse_tracking(self):
self.glw.scene().sigMouseMoved.connect(self.mouse_move_event) self.glw.scene().sigMouseMoved.connect(self.cb_mouse_move)
self.glw.scene().sigMouseMoved.emit() self.glw.scene().sigMouseMoved.emit()
self._mouse_tracking = True self._mouse_tracking = True
def _OLD_disengage_mouse_tracking(self): def _OLD_disengage_mouse_tracking(self):
self.glw.scene().sigMouseMoved.disconnect(self.mouse_move_event) self.glw.scene().sigMouseMoved.disconnect(self.cb_mouse_move)
self._mouse_tracking = False self._mouse_tracking = False
self._lb_coords.setText("") self._lb_coords.setText("")
@@ -2376,7 +2385,7 @@ class SwissMxWnd(QMainWindow, Ui_MainWindow):
(omega, t_omega, 0.01), (omega, t_omega, 0.01),
] ]
) )
self.escape_goToSampleExchange() self.cb_esc_sample_exchange()
def _OLD_lock_goniometer(self): def _OLD_lock_goniometer(self):
# tell.set_in_mount_position(True) # tell.set_in_mount_position(True)
@@ -3063,7 +3072,7 @@ class SwissMxWnd(QMainWindow, Ui_MainWindow):
self.daq_method_prelocated_update_markers() self.daq_method_prelocated_update_markers()
if option(ACTIVATE_PULSE_PICKER) or not option(SKIP_ESCAPE_TRANSITIONS_IF_SAFE): if option(ACTIVATE_PULSE_PICKER) or not option(SKIP_ESCAPE_TRANSITIONS_IF_SAFE):
self.escape_goToSampleAlignment() self.cb_esc_sample_alignment()
sequence = {"delta tau program": shapepath.prg, "points": shapepath.points.tolist(), "timestamp": tdstamp(),} sequence = {"delta tau program": shapepath.prg, "points": shapepath.points.tolist(), "timestamp": tdstamp(),}
@@ -3111,7 +3120,7 @@ class SwissMxWnd(QMainWindow, Ui_MainWindow):
return return
if option(ACTIVATE_PULSE_PICKER) or not option(SKIP_ESCAPE_TRANSITIONS_IF_SAFE): if option(ACTIVATE_PULSE_PICKER) or not option(SKIP_ESCAPE_TRANSITIONS_IF_SAFE):
self.escape_goToDataCollection() self.cb_esc_data_collection()
folders.make_if_needed() folders.make_if_needed()
@@ -3260,7 +3269,7 @@ class SwissMxWnd(QMainWindow, Ui_MainWindow):
self.re_connect_collect_button() self.re_connect_collect_button()
jungfrau_detector.abort() jungfrau_detector.abort()
if option(ACTIVATE_PULSE_PICKER) or not option(SKIP_ESCAPE_TRANSITIONS_IF_SAFE): if option(ACTIVATE_PULSE_PICKER) or not option(SKIP_ESCAPE_TRANSITIONS_IF_SAFE):
self.escape_goToSampleAlignment() self.cb_esc_sample_alignment()
self.increaseRunNumberRequest.emit() self.increaseRunNumberRequest.emit()
if option(DELTATAU_SHOW_PLOTS): if option(DELTATAU_SHOW_PLOTS):
@@ -3323,15 +3332,15 @@ class SwissMxWnd(QMainWindow, Ui_MainWindow):
but = QPushButton("Exchange\nSample") but = QPushButton("Exchange\nSample")
but.setAccessibleName("escape_button_se") but.setAccessibleName("escape_button_se")
but.setObjectName("action_SampleExchange") but.setObjectName("action_SampleExchange")
but.clicked.connect(self.escape_goToSampleExchange) but.clicked.connect(self.cb_esc_sample_exchange)
layout.addWidget(but) layout.addWidget(but)
but = QPushButton("Alignment") but = QPushButton("Alignment")
but.setAccessibleName("escape_button_sa") but.setAccessibleName("escape_button_sa")
but.clicked.connect(self.escape_goToSampleAlignment) but.clicked.connect(self.cb_esc_sample_alignment)
layout.addWidget(but) layout.addWidget(but)
but = QPushButton("Collection") but = QPushButton("Collection")
but.setAccessibleName("escape_button_dc") but.setAccessibleName("escape_button_dc")
but.clicked.connect(self.escape_goToDataCollection) but.clicked.connect(self.cb_esc_data_collection)
layout.addWidget(but) layout.addWidget(but)
cont.layout().addWidget(w) cont.layout().addWidget(w)
@@ -3565,7 +3574,7 @@ if __name__=="__main__":
startupWin.set(60, f'start main window') startupWin.set(60, f'start main window')
app._mainWnd=wnd=SwissMxWnd() app._mainWnd=wnd=WndSwissMx()
wnd.show() wnd.show()
startupWin._wnd.finish(wnd) startupWin._wnd.finish(wnd)