diff --git a/Readme.md b/Readme.md index 2558926..60f4f3c 100644 --- a/Readme.md +++ b/Readme.md @@ -83,10 +83,10 @@ DST=/sf/cristallina/applications/mx/zamofing_t/ # /sf/cristallina/applications/mx ssh saresc-cons-02 mkdir /tmp/zamofing_t/ -rsync -vai ~/Documents/prj/SwissFEL/epics_ioc_modules/ESB_MX saresc-cons-03:$DST -rsync -vai ~/Documents/prj/SwissFEL/PBTools saresc-cons-03:$DST +rsync -vai --delete ~/Documents/prj/SwissFEL/epics_ioc_modules/ESB_MX saresc-cons-03:$DST +rsync -vai --delete ~/Documents/prj/SwissFEL/PBTools saresc-cons-03:$DST -cd /tmp/zamofing_t/ESB_MX/python/SwissMX/ +cd /sf/cristallina/applications/mx/zamofing_t/ESB_MX/python/SwissMX/ /opt/gfa/python-3.7/latest/bin/python swissmx.py /opt/gfa/python-3.8/latest/bin/pip install qtawesome --user diff --git a/app_config.py b/app_config.py index a205358..6b843b0 100644 --- a/app_config.py +++ b/app_config.py @@ -187,11 +187,11 @@ class AppCfg(QSettings): if key==AppCfg.DT_MISC: val={'show_plots': True, 'vel_scl': 1.0, 'pt2pt_time': 10.0,'sync_mode':1,'sync_flag':3,'verbose':0xff} elif key==AppCfg.GBL_MISC: - val={'img_trace':4} + val={'img_trace_len':4} else: val={} elif key in (AppCfg.GEO_BEAM_SZ,AppCfg.GEO_BEAM_POS,): - val=np.array(tuple(map(float, val)))/1000 + val=np.array(tuple(map(float, val))) elif key in (AppCfg.GEO_OPT_CTR): val=np.array(tuple(map(float, val))) return val @@ -227,7 +227,7 @@ class WndParameter(QMainWindow): #GEO_CAM_PARAM gbl_misc = cfg.value(AppCfg.GBL_MISC) gbl_dev_prefix = cfg.value(AppCfg.GBL_DEV_PREFIX) - geo_beam_sz = cfg.value(AppCfg.GEO_BEAM_SZ)*1000 + geo_beam_sz = cfg.value(AppCfg.GEO_BEAM_SZ) dft_pos_pst = cfg.value(AppCfg.DFT_POS_PST) dft_pos_col = cfg.value(AppCfg.DFT_POS_COL) dft_pos_bklgt = cfg.value(AppCfg.DFT_POS_BKLGT) @@ -276,7 +276,7 @@ verbose bits: {'name':'smaract motors', 'value':gbl_dev_prefix[1], 'type':'str'}, ]}, {'name':AppCfg.GBL_MISC, 'title':'miscellaneous', 'type':'group', 'children':[ - {'name':'img_trace', 'value':gbl_misc['img_trace'], 'type':'int', 'tip':tip_sync_flag}, + {'name':'img_trace_len', 'value':gbl_misc['img_trace_len'], 'type':'int', 'tip':tip_sync_flag}, #{'name':'verbose', 'value':gbl_misc['verbose'], 'type':'int', 'tip':tip_verbose}, ]}, # {'name':AppCfg.GEO_CAM_TRF, 'value':cfg.value(AppCfg.GEO_CAM_TRF), 'type':'str'}, @@ -394,7 +394,10 @@ verbose bits: except AttributeError as e: _log.warning('can not set beam size to application window') else: + v=v/1000 # convert from um to mm + bm.blockSignals(True) # avoid to call cb_marker_moved bm.setSize(v) + bm.blockSignals(False) elif par_nm==AppCfg.GEO_CAM_PARAM: d=dict(map(lambda x:(x.name(),x.value()), parent.children())) try: @@ -441,6 +444,18 @@ verbose bits: elif par_nm in (AppCfg.GBL_MISC,AppCfg.DT_MISC): d=dict(map(lambda x:(x.name(),x.value()), parent.children())) cfg.setValue(par_nm, d) + if par_nm in (AppCfg.GBL_MISC): + try: + grp=self.parent()._goTrace + vb=self.parent().vb + except AttributeError as e: + _log.warning('can not access the application window') + else: + grp._tracelen=tl=d['img_trace_len'] + cld=grp.childItems() + while len(cld)>tl: + vb.removeItem(cld[0]) + cld=grp.childItems() else: _log.warning(f'can\'t save parameter:{childName} change:{change} data:{str(data)}') raise diff --git a/epics_widgets/SmaractMotorTweak.py b/epics_widgets/SmaractMotorTweak.py index 7dd25bf..ede574a 100644 --- a/epics_widgets/SmaractMotorTweak.py +++ b/epics_widgets/SmaractMotorTweak.py @@ -130,6 +130,14 @@ class SmaractMotorTweak(QWidget, Ui_MotorTweak): def get_rbv(self): return self._pv_readback.get(use_monitor=False) + def get_val(self): + # return self._motor.get('VAL') + try: + v=self._val + except AttributeError: + self._val=v=self._pv_drive.get() + return v + def is_homed(self): pend_event() return 1 == self._pv_is_homed.get(use_monitor=False) diff --git a/swissmx.py b/swissmx.py index c3bd302..c79bb28 100755 --- a/swissmx.py +++ b/swissmx.py @@ -403,8 +403,8 @@ class WndSwissMx(QMainWindow, Ui_MainWindow): self.vb.addItem(grp) #--- beam marker --- - size_eu=cfg.value(AppCfg.GEO_BEAM_SZ) - pos_eu=cfg.value(AppCfg.GEO_BEAM_POS) + size_eu=cfg.value(AppCfg.GEO_BEAM_SZ)/1000 # convert from um to mm + pos_eu=cfg.value(AppCfg.GEO_BEAM_POS)/1000 # convert from um to mm self._goBeamMarker=obj=UsrGO.Marker(pos_eu-size_eu/2,size_eu,mode=0) obj.sigRegionChangeFinished.connect(self.cb_marker_moved) #bm.setTransform(tr) # assign transform @@ -639,7 +639,7 @@ class WndSwissMx(QMainWindow, Ui_MainWindow): param=cam.get_param() paramSv=cfg.value(AppCfg.GEO_CAM_PARAM) - if paramSv is None: + if not paramSv: cfg.setValue(AppCfg.GEO_CAM_PARAM, param) else: for k,v in param.items(): @@ -747,15 +747,17 @@ class WndSwissMx(QMainWindow, Ui_MainWindow): 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) + geo._opt_ctr=opt_ctr=np.array(oc_pos+oc_sz/2) + if (QMessageBox.question(self, "save config", f"save optical center position {opt_ctr} permanently?", + QMessageBox.Yes|QMessageBox.No, QMessageBox.No, )==QMessageBox.Yes): + cfg.setValue(AppCfg.GEO_OPT_CTR,opt_ctr) 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) + pos=np.array(bm_pos+bm_sz/2)*1000 # convert from mm to um + if (QMessageBox.question(self, "save config", f"save beam marker position {pos} permanently?", + QMessageBox.Yes|QMessageBox.No, QMessageBox.No, )==QMessageBox.Yes): + cfg.setValue(AppCfg.GEO_BEAM_POS,pos) self.track_objects() def cb_zoom_changed(self, value): @@ -1022,6 +1024,7 @@ class WndSwissMx(QMainWindow, Ui_MainWindow): x=imgPos.x();y=imgPos.y() _log.debug('append calib: zoom:{} stage_x_y:{}/{} cam_pix_x_y:{}/{}'.format(zoom, fx, fy, x, y)) raw.append((fx, fy, x, y)) + self._wd_calib_tree.setData(app._raw_pix2pos) elif self._btn_opt_ctr.isChecked(): try: raw=app._raw_opt_ctr[zoom] @@ -1031,9 +1034,11 @@ class WndSwissMx(QMainWindow, Ui_MainWindow): x=imgPos.x();y=imgPos.y() _log.debug('append calib: zoom:{} cam_pix_x_y:{}/{}'.format(zoom, x, y)) raw.append(( x, y)) + self._wd_calib_tree.setData(app._raw_opt_ctr) else: QMessageBox.warning(self, "calibration", "no calibration started yet.\nPress 'pix2pos' or 'opt_ctr' button first") + def cb_mouse_click(self, event): #_log.debug("{}".format(event)) #_log.debug("screen pos {}".format(event.screenPos())) #pixel position on the whole screen @@ -1298,17 +1303,39 @@ class WndSwissMx(QMainWindow, Ui_MainWindow): def add_camera_trace(self): # add up to tracelen image when moveing motors to new positions - tracelen=4 - img=pg.ImageItem(self._goImg.image) + try: + tracelen=self._goTrace._tracelen + except AttributeError: + app=QApplication.instance() + cfg=app._cfg + tracelen=self._goTrace._tracelen=cfg.value(AppCfg.GBL_MISC)['img_trace_len'] + if tracelen==0: + return + + trImg=self._goImgGrp.transform() trTrk=self._goTracked.transform() - tr=trImg*trTrk.inverted()[0] # TODO: check if oder correct !!! + img=pg.ImageItem(self._goImg.image) img.setTransform(tr) - self._goTrace.addItem(img) - cld=self._goTrace.childItems() - if len(cld) > tracelen: - self.vb.removeItem(cld[0]) + self._goTrace.addItem(img) # automatically added to self.vb + + + cldLst=self._goTrace.childItems() + if len(cldLst)>tracelen: #check if one image needs to be removed + r1=self.vb.itemBoundingRect(img) + for c in cldLst[:-1]: + #check overlap with newest image, and remove previous if it is more than 30% + r2=self.vb.itemBoundingRect(c) + r3=r1.intersected(r2) + s3=r3.size() + s1=r1.size() + if s3.width()/s1.width()>0.3 and s3.height()/s1.height()>0.3: + self.vb.removeItem(c) + return + self.vb.removeItem(cldLst[0]) #if no one was removes, remove oldest + + def cb_modify_app_param(self): wnd=WndParameter(self) @@ -1601,6 +1628,8 @@ Author Thierry Zamofing (thierry.zamofing@psi.ch) pass def prepare_wd_tabs_left(self): + + tabs = self._wd_tabs_left tabs.currentChanged.connect(self.cb_switch_task) @@ -1617,118 +1646,15 @@ Author Thierry Zamofing (thierry.zamofing@psi.ch) setup_tab.layout().addWidget(tbox) - # Jungfrau parameters - block = QWidget() - block.setAccessibleName(TASK_JUNGFRAU_SETTINGS) - block.setContentsMargins(0, 0, 0, 0) - block.setLayout(QVBoxLayout()) - #self.jungfrau = jungfrau_widget.JungfrauWidget() #ZAC: orig. code - #block.layout().addWidget(self.jungfrau) #ZAC: orig. code - block.layout().addStretch() - tbox.addItem(block, "Jungfrau Parameters") + # -------- DAQ Methods Tabs -------- + self.build_tab_module_fix_target() + self._OLD_build_daq_methods_grid_tab() + self._OLD_build_daq_methods_prelocated_tab() #ZAC: orig. code + self._OLD_create_helical_widgets() #ZAC: orig. code + self._OLD_build_daq_methods_embl_tab() + #self._OLD_build_sample_selection_tab() - # # group beam box - # block = QWidget() - # block.setAccessibleName(TASK_SETUP_BEAM_CENTER) - # block.setContentsMargins(0, 0, 0, 0) - # block.setLayout(QVBoxLayout()) - # grp = QWidget() - # block.layout().addWidget(grp) - # block.layout().addStretch() - # grp.setLayout(QGridLayout()) - # tbox.addItem(block, "Beam Box") - # # setup_tab.layout().addWidget(grp) - # - # row = grp.layout().rowCount - # - # if self._pv_shutter is not None: - # but = QPushButton("open/close shutter") - # but.setCheckable(True) - # but.setChecked(1 == self._pv_shutter.get()) - # but.clicked.connect(self.toggle_shutter) - # self._button_shutter = but - # grp.layout().addWidget(but, 0, 0, 1, 2) - # self._pv_shutter.add_callback(self.update_shutter_label) - # #else: #ZAC: orig. code - # # self._picker = bernina_pulse_picker.PickerWidget() - # # grp.layout().addWidget(self._picker, 0, 0, 1, 2) - # but = QPushButton("clear beam markers") - # but.clicked.connect(self.remove_beam_markers) - # grp.layout().addWidget(but, 1, 1) - # help = QTextBrowser() - # grp.layout().addWidget(help, 2, 0, 5, 2) - # help.setHtml( - # """ - #

Updating Beam Mark

- #
    - #
  1. clear beam markers
  2. - #
  3. for each zoom level, CTRL-Click (left mouse button) the center of the beam
  4. - #
- # - # """ - # ) - - # # group regions - # block = QWidget() - # block.setAccessibleName(TASK_SETUP_ROI) - # block.setContentsMargins(0, 0, 0, 0) - # block.setLayout(QVBoxLayout()) - # grp = QWidget() - # block.layout().addWidget(grp) - # block.layout().addStretch() - # grp.setLayout(QGridLayout()) - # tbox.addItem(block, "Regions of Interest") - # but = QPushButton("add RECT roi") - # but.clicked.connect(self.roi_add_rect) - # grp.layout().addWidget(but, 0, 0) - # but = QPushButton("add LINE roi") - # but.clicked.connect(self.roi_add_line) - # grp.layout().addWidget(but, 0, 1) - # - # # group camera settings - # block = QWidget() - # block.setAccessibleName(TASK_SETUP_CAMERA) - # block.setContentsMargins(0, 0, 0, 0) - # block.setLayout(QVBoxLayout()) - # grp = QWidget() - # block.layout().addWidget(grp) - # block.layout().addStretch() - # grp.setLayout(QGridLayout()) - # tbox.addItem(block, "Camera Settings") - # but = QPushButton("remove transformations") - # but.clicked.connect(lambda bogus: self.modify_camera_transform("remove_all")) - # grp.layout().addWidget(but, 0, 0) - # but = QPushButton("remove last") - # but.clicked.connect(lambda bogus: self.modify_camera_transform("undo_last")) - # grp.layout().addWidget(but, 0, 1) - # but = QPushButton("Turn 90 CCW") - # #but.clicked.connect( - # # lambda bogus, n=camera.Transforms.ROTATE_90: self.modify_camera_transform(n) - # #) #ZAC: orig. code - # grp.layout().addWidget(but, 1, 0) - # but = QPushButton("Turn 90 CW") - # #but.clicked.connect(lambda bogus, n=camera.Transforms.ROTATE_270: self.modify_camera_transform(n)) #ZAC: orig. code - # grp.layout().addWidget(but) - # but = QPushButton("Turn 180 CCW") - # #but.clicked.connect(lambda bogus, n=camera.Transforms.ROTATE_180: self.modify_camera_transform(n)) #ZAC: orig. code - # grp.layout().addWidget(but) - # but = QPushButton("Transpose") - # #but.clicked.connect(lambda bogus, n=camera.Transforms.TRANSPOSE: self.modify_camera_transform(n)) #ZAC: orig. code - # grp.layout().addWidget(but) - # but = QPushButton("Flip L/R") - # #but.clicked.connect(lambda bogus, n=camera.Transforms.FLIP_LR: self.modify_camera_transform(n)) #ZAC: orig. code - # grp.layout().addWidget(but) - # but = QPushButton("Flip U/D") - # #but.clicked.connect(lambda bogus, n=camera.Transforms.FLIP_UD: self.modify_camera_transform(n)) #ZAC: orig. code - # grp.layout().addWidget(but) - # row = grp.layout().rowCount() - # self._label_transforms = QLabel() - # self._label_transforms.setWordWrap(True) - # self.modify_camera_transform(None) - # - # grp.layout().addWidget(self._label_transforms, row, 0, 1, 2) - - # group geometry calibration + # -------- group geometry calibration -------- block = QWidget() block.setAccessibleName(TASK_SETUP_GEOMETRY_CALIB) block.setContentsMargins(0, 0, 0, 0) @@ -1745,45 +1671,17 @@ Author Thierry Zamofing (thierry.zamofing@psi.ch) #self._ppm_feature_size_spinbox.setDecimals(0) #self._ppm_feature_size_spinbox.setSuffix(" µM") #grp.layout().addWidget(self._ppm_feature_size_spinbox, 0, 1) - self._btn_pix2pos = but = QPushButton("pix2pos") + self._btn_pix2pos = but = QPushButton("Pixel to position calibration") but.setCheckable(True) but.clicked.connect(self.cb_update_pix2pos) grp.layout().addWidget(but, 0, 0) - self._btn_opt_ctr = but = QPushButton("opt_ctr") + self._btn_opt_ctr = but = QPushButton("Optical center calibration") but.setCheckable(True) but.clicked.connect(self.cb_update_opt_ctr) grp.layout().addWidget(but, 1, 0) - help = QTextBrowser() - grp.layout().addWidget(help, 2, 0) - help.setHtml( - """ -

Pixel to position calibration

-
    -
  1. press: pix2pos
  2. -
  3. for each zoom level: -
  4. choose a good fiducial mark -
  5. move the stage x/y at min. 3 different locations -
  6. Click (left mouse button) on the fiducial mark -
  7. un-click: pix2pos
  8. -
-

optical center calibration

-
    -
  1. press: opt_ctr
  2. -
  3. choose at least 3 fiducial mark visible at various zoom levels -
  4. for at least two zoom level: -
  5. Click (left mouse button) on the fiducial marks -
  6. un-click: opt_ctr
  7. -
- - """ - ) - - # grp = PpmToolBox(viewbox=self.vb, camera=sample_camera, signals=self) - # grp.setAccessibleName(TASK_SETUP_PPM_CALIBRATION_TBOX) - # grp.pixelPerMillimeterCalibrationChanged.connect(self.update_ppm_fitters) - # tbox.addItem(grp, "PPM ToolBox") - # self._ppm_toolbox = grp + self._wd_calib_tree=tree=pg.DataTreeWidget(data=None) + grp.layout().addWidget(tree, 2, 0) tbox.currentChanged.connect(self.cb_switch_task) @@ -1791,13 +1689,116 @@ Author Thierry Zamofing (thierry.zamofing@psi.ch) # setup_tab.layout().addStretch() exp_tab.layout().addStretch() - # DAQ Methods Tabs - self.build_tab_module_fix_target() - self._OLD_build_daq_methods_grid_tab() - self._OLD_build_daq_methods_prelocated_tab() #ZAC: orig. code - self._OLD_create_helical_widgets() #ZAC: orig. code - self._OLD_build_daq_methods_embl_tab() - #self._OLD_build_sample_selection_tab() + # Jungfrau parameters + block=QWidget() + block.setAccessibleName(TASK_JUNGFRAU_SETTINGS) + block.setContentsMargins(0, 0, 0, 0) + block.setLayout(QVBoxLayout()) + # self.jungfrau = jungfrau_widget.JungfrauWidget() #ZAC: orig. code + # block.layout().addWidget(self.jungfrau) #ZAC: orig. code + block.layout().addStretch() + tbox.addItem(block, "Jungfrau Parameters") + + # # -------- group beam box -------- + # block = QWidget() + # block.setAccessibleName(TASK_SETUP_BEAM_CENTER) + # block.setContentsMargins(0, 0, 0, 0) + # block.setLayout(QVBoxLayout()) + # grp = QWidget() + # block.layout().addWidget(grp) + # block.layout().addStretch() + # grp.setLayout(QGridLayout()) + # tbox.addItem(block, "Beam Box") + # # setup_tab.layout().addWidget(grp) + # + # row = grp.layout().rowCount + # + # if self._pv_shutter is not None: + # but = QPushButton("open/close shutter") + # but.setCheckable(True) + # but.setChecked(1 == self._pv_shutter.get()) + # but.clicked.connect(self.toggle_shutter) + # self._button_shutter = but + # grp.layout().addWidget(but, 0, 0, 1, 2) + # self._pv_shutter.add_callback(self.update_shutter_label) + # #else: #ZAC: orig. code + # # self._picker = bernina_pulse_picker.PickerWidget() + # # grp.layout().addWidget(self._picker, 0, 0, 1, 2) + # but = QPushButton("clear beam markers") + # but.clicked.connect(self.remove_beam_markers) + # grp.layout().addWidget(but, 1, 1) + # help = QTextBrowser() + # grp.layout().addWidget(help, 2, 0, 5, 2) + # help.setHtml( + # """ + #

Updating Beam Mark

+ #
    + #
  1. clear beam markers
  2. + #
  3. for each zoom level, CTRL-Click (left mouse button) the center of the beam
  4. + #
+ # + # """ + # ) + + # # -------- group regions -------- + # block = QWidget() + # block.setAccessibleName(TASK_SETUP_ROI) + # block.setContentsMargins(0, 0, 0, 0) + # block.setLayout(QVBoxLayout()) + # grp = QWidget() + # block.layout().addWidget(grp) + # block.layout().addStretch() + # grp.setLayout(QGridLayout()) + # tbox.addItem(block, "Regions of Interest") + # but = QPushButton("add RECT roi") + # but.clicked.connect(self.roi_add_rect) + # grp.layout().addWidget(but, 0, 0) + # but = QPushButton("add LINE roi") + # but.clicked.connect(self.roi_add_line) + # grp.layout().addWidget(but, 0, 1) + # + # # -------- group camera settings -------- + # block = QWidget() + # block.setAccessibleName(TASK_SETUP_CAMERA) + # block.setContentsMargins(0, 0, 0, 0) + # block.setLayout(QVBoxLayout()) + # grp = QWidget() + # block.layout().addWidget(grp) + # block.layout().addStretch() + # grp.setLayout(QGridLayout()) + # tbox.addItem(block, "Camera Settings") + # but = QPushButton("remove transformations") + # but.clicked.connect(lambda bogus: self.modify_camera_transform("remove_all")) + # grp.layout().addWidget(but, 0, 0) + # but = QPushButton("remove last") + # but.clicked.connect(lambda bogus: self.modify_camera_transform("undo_last")) + # grp.layout().addWidget(but, 0, 1) + # but = QPushButton("Turn 90 CCW") + # #but.clicked.connect( + # # lambda bogus, n=camera.Transforms.ROTATE_90: self.modify_camera_transform(n) + # #) #ZAC: orig. code + # grp.layout().addWidget(but, 1, 0) + # but = QPushButton("Turn 90 CW") + # #but.clicked.connect(lambda bogus, n=camera.Transforms.ROTATE_270: self.modify_camera_transform(n)) #ZAC: orig. code + # grp.layout().addWidget(but) + # but = QPushButton("Turn 180 CCW") + # #but.clicked.connect(lambda bogus, n=camera.Transforms.ROTATE_180: self.modify_camera_transform(n)) #ZAC: orig. code + # grp.layout().addWidget(but) + # but = QPushButton("Transpose") + # #but.clicked.connect(lambda bogus, n=camera.Transforms.TRANSPOSE: self.modify_camera_transform(n)) #ZAC: orig. code + # grp.layout().addWidget(but) + # but = QPushButton("Flip L/R") + # #but.clicked.connect(lambda bogus, n=camera.Transforms.FLIP_LR: self.modify_camera_transform(n)) #ZAC: orig. code + # grp.layout().addWidget(but) + # but = QPushButton("Flip U/D") + # #but.clicked.connect(lambda bogus, n=camera.Transforms.FLIP_UD: self.modify_camera_transform(n)) #ZAC: orig. code + # grp.layout().addWidget(but) + # row = grp.layout().rowCount() + # self._label_transforms = QLabel() + # self._label_transforms.setWordWrap(True) + # self.modify_camera_transform(None) + # + # grp.layout().addWidget(self._label_transforms, row, 0, 1, 2) def build_tab_module_fix_target(self): #tab = self._tab_daq_method_prelocated @@ -1856,6 +1857,13 @@ Author Thierry Zamofing (thierry.zamofing@psi.ch) app=QApplication.instance() if calib: _log.info("received new pix2pos calibration") + QMessageBox.information(self,'Pixel to position calibration','''\ +- for each zoom level: + - choose a good fiducial mark + - move the stage x/y at min. 3 different locations + - click (left mouse button) on that fiducial mark +- un-click button "Pixel to position calibration" +''') app._raw_pix2pos=dict() else: s=str(app._raw_pix2pos).replace('),','),\n ').replace('],','],\n') @@ -1870,21 +1878,38 @@ Author Thierry Zamofing (thierry.zamofing@psi.ch) def cb_update_opt_ctr(self, calib): app=QApplication.instance() if calib: - _log.info("received new pix2pos calibration") + _log.info("received new opt_ctr calibration") + QMessageBox.information(self,'Optical center calibration','''\ +- choose the biggest zoom level to start +- choose at least 3 fiducial marks +- for at least two zoom level: + - Click (left mouse button) on the fiducial marks (always in the same order) +- un-click button "Optical center calibration" +''') + app._raw_opt_ctr=dict() else: - s=str(app._raw_opt_ctr).replace('),','),\n ').replace('],','],\n') - print(s) - res=QMessageBox.question(self, "calibration", f"use calibration\n{s} ? ") - if res==QMessageBox.Yes: - geo=app._geometry - geo.update_optical_center(app._raw_opt_ctr) - app._cfg.setValue(AppCfg.GEO_OPT_CTR, geo._opt_ctr) - go=self._goOptCtr - oc_sz=go.size() - go.setPos(-geo._opt_ctr-oc_sz/2) + geo=app._geometry + ocOld=geo._opt_ctr + try: + geo.update_optical_center(app._raw_opt_ctr,True) + except BaseException as e: + _log.warning(e) + QMessageBox.warning(self, "calibration", f"rejected\n{e}") + del app._raw_opt_ctr + return del app._raw_opt_ctr - return + go=self._goOptCtr + oc_sz=go.size() + go.blockSignals(True) # avoid to call cb_marker_moved + go.setPos(geo._opt_ctr-oc_sz/2) + res=QMessageBox.question(self, "calibration", f"keep new optical center\n{geo._opt_ctr} ? ") + if res==QMessageBox.Yes: + app._cfg.setValue(AppCfg.GEO_OPT_CTR, geo._opt_ctr) + else: + geo._opt_ctr=ocOld + go.setPos(geo._opt_ctr-oc_sz/2) + go.blockSignals(False) # allow to call cb_marker_moved def module_fix_target_add_obj(self,*args,**kwargs): mft=self._moduleFixTarget