enhance calibration + minor fixes

This commit is contained in:
2022-09-14 09:36:20 +02:00
parent e215f3abea
commit 14260851cf
4 changed files with 233 additions and 185 deletions

View File

@@ -83,10 +83,10 @@ DST=/sf/cristallina/applications/mx/zamofing_t/
# /sf/cristallina/applications/mx # /sf/cristallina/applications/mx
ssh saresc-cons-02 mkdir /tmp/zamofing_t/ ssh saresc-cons-02 mkdir /tmp/zamofing_t/
rsync -vai ~/Documents/prj/SwissFEL/epics_ioc_modules/ESB_MX saresc-cons-03:$DST rsync -vai --delete ~/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/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.7/latest/bin/python swissmx.py
/opt/gfa/python-3.8/latest/bin/pip install qtawesome --user /opt/gfa/python-3.8/latest/bin/pip install qtawesome --user

View File

@@ -187,11 +187,11 @@ class AppCfg(QSettings):
if key==AppCfg.DT_MISC: 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} 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: elif key==AppCfg.GBL_MISC:
val={'img_trace':4} val={'img_trace_len':4}
else: else:
val={} val={}
elif key in (AppCfg.GEO_BEAM_SZ,AppCfg.GEO_BEAM_POS,): 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): elif key in (AppCfg.GEO_OPT_CTR):
val=np.array(tuple(map(float, val))) val=np.array(tuple(map(float, val)))
return val return val
@@ -227,7 +227,7 @@ class WndParameter(QMainWindow):
#GEO_CAM_PARAM #GEO_CAM_PARAM
gbl_misc = cfg.value(AppCfg.GBL_MISC) gbl_misc = cfg.value(AppCfg.GBL_MISC)
gbl_dev_prefix = cfg.value(AppCfg.GBL_DEV_PREFIX) 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_pst = cfg.value(AppCfg.DFT_POS_PST)
dft_pos_col = cfg.value(AppCfg.DFT_POS_COL) dft_pos_col = cfg.value(AppCfg.DFT_POS_COL)
dft_pos_bklgt = cfg.value(AppCfg.DFT_POS_BKLGT) 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':'smaract motors', 'value':gbl_dev_prefix[1], 'type':'str'},
]}, ]},
{'name':AppCfg.GBL_MISC, 'title':'miscellaneous', 'type':'group', 'children':[ {'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':'verbose', 'value':gbl_misc['verbose'], 'type':'int', 'tip':tip_verbose},
]}, ]},
# {'name':AppCfg.GEO_CAM_TRF, 'value':cfg.value(AppCfg.GEO_CAM_TRF), 'type':'str'}, # {'name':AppCfg.GEO_CAM_TRF, 'value':cfg.value(AppCfg.GEO_CAM_TRF), 'type':'str'},
@@ -394,7 +394,10 @@ verbose bits:
except AttributeError as e: except AttributeError as e:
_log.warning('can not set beam size to application window') _log.warning('can not set beam size to application window')
else: else:
v=v/1000 # convert from um to mm
bm.blockSignals(True) # avoid to call cb_marker_moved
bm.setSize(v) bm.setSize(v)
bm.blockSignals(False)
elif par_nm==AppCfg.GEO_CAM_PARAM: elif par_nm==AppCfg.GEO_CAM_PARAM:
d=dict(map(lambda x:(x.name(),x.value()), parent.children())) d=dict(map(lambda x:(x.name(),x.value()), parent.children()))
try: try:
@@ -441,6 +444,18 @@ verbose bits:
elif par_nm in (AppCfg.GBL_MISC,AppCfg.DT_MISC): elif par_nm in (AppCfg.GBL_MISC,AppCfg.DT_MISC):
d=dict(map(lambda x:(x.name(),x.value()), parent.children())) d=dict(map(lambda x:(x.name(),x.value()), parent.children()))
cfg.setValue(par_nm, d) 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: else:
_log.warning(f'can\'t save parameter:{childName} change:{change} data:{str(data)}') _log.warning(f'can\'t save parameter:{childName} change:{change} data:{str(data)}')
raise raise

View File

@@ -130,6 +130,14 @@ class SmaractMotorTweak(QWidget, Ui_MotorTweak):
def get_rbv(self): def get_rbv(self):
return self._pv_readback.get(use_monitor=False) 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): def is_homed(self):
pend_event() pend_event()
return 1 == self._pv_is_homed.get(use_monitor=False) return 1 == self._pv_is_homed.get(use_monitor=False)

View File

@@ -403,8 +403,8 @@ class WndSwissMx(QMainWindow, Ui_MainWindow):
self.vb.addItem(grp) self.vb.addItem(grp)
#--- beam marker --- #--- beam marker ---
size_eu=cfg.value(AppCfg.GEO_BEAM_SZ) size_eu=cfg.value(AppCfg.GEO_BEAM_SZ)/1000 # convert from um to mm
pos_eu=cfg.value(AppCfg.GEO_BEAM_POS) 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) self._goBeamMarker=obj=UsrGO.Marker(pos_eu-size_eu/2,size_eu,mode=0)
obj.sigRegionChangeFinished.connect(self.cb_marker_moved) obj.sigRegionChangeFinished.connect(self.cb_marker_moved)
#bm.setTransform(tr) # assign transform #bm.setTransform(tr) # assign transform
@@ -639,7 +639,7 @@ class WndSwissMx(QMainWindow, Ui_MainWindow):
param=cam.get_param() param=cam.get_param()
paramSv=cfg.value(AppCfg.GEO_CAM_PARAM) paramSv=cfg.value(AppCfg.GEO_CAM_PARAM)
if paramSv is None: if not paramSv:
cfg.setValue(AppCfg.GEO_CAM_PARAM, param) cfg.setValue(AppCfg.GEO_CAM_PARAM, param)
else: else:
for k,v in param.items(): for k,v in param.items():
@@ -747,15 +747,17 @@ class WndSwissMx(QMainWindow, Ui_MainWindow):
if obj==self._goOptCtr: if obj==self._goOptCtr:
oc_pos=obj.pos() oc_pos=obj.pos()
oc_sz=obj.size() oc_sz=obj.size()
geo._opt_ctr=opt_ctr=np.array(-oc_pos-oc_sz/2) geo._opt_ctr=opt_ctr=np.array(oc_pos+oc_sz/2)
_log.debug(f'{obj}->{opt_ctr} !!! NOT SAVED IN CONFIG !!!') if (QMessageBox.question(self, "save config", f"save optical center position {opt_ctr} permanently?",
#cfg.setValue(AppCfg.GEO_OPT_CTR,bm_pos) QMessageBox.Yes|QMessageBox.No, QMessageBox.No, )==QMessageBox.Yes):
cfg.setValue(AppCfg.GEO_OPT_CTR,opt_ctr)
elif obj==self._goBeamMarker: elif obj==self._goBeamMarker:
bm_pos=obj.pos() bm_pos=obj.pos()
bm_sz=obj.size() bm_sz=obj.size()
obj._pos_eu=bm_pos=-geo.pix2pos(bm_pos+opt_ctr+bm_sz/2) pos=np.array(bm_pos+bm_sz/2)*1000 # convert from mm to um
_log.debug(f'{obj}->{bm_pos} !!! NOT SAVED IN CONFIG !!!') if (QMessageBox.question(self, "save config", f"save beam marker position {pos} permanently?",
#cfg.setValue(AppCfg.GEO_BEAM_POS,bm_pos) QMessageBox.Yes|QMessageBox.No, QMessageBox.No, )==QMessageBox.Yes):
cfg.setValue(AppCfg.GEO_BEAM_POS,pos)
self.track_objects() self.track_objects()
def cb_zoom_changed(self, value): def cb_zoom_changed(self, value):
@@ -1022,6 +1024,7 @@ class WndSwissMx(QMainWindow, Ui_MainWindow):
x=imgPos.x();y=imgPos.y() x=imgPos.x();y=imgPos.y()
_log.debug('append calib: zoom:{} stage_x_y:{}/{} cam_pix_x_y:{}/{}'.format(zoom, fx, fy, x, 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)) raw.append((fx, fy, x, y))
self._wd_calib_tree.setData(app._raw_pix2pos)
elif self._btn_opt_ctr.isChecked(): elif self._btn_opt_ctr.isChecked():
try: try:
raw=app._raw_opt_ctr[zoom] raw=app._raw_opt_ctr[zoom]
@@ -1031,9 +1034,11 @@ class WndSwissMx(QMainWindow, Ui_MainWindow):
x=imgPos.x();y=imgPos.y() x=imgPos.x();y=imgPos.y()
_log.debug('append calib: zoom:{} cam_pix_x_y:{}/{}'.format(zoom, x, y)) _log.debug('append calib: zoom:{} cam_pix_x_y:{}/{}'.format(zoom, x, y))
raw.append(( x, y)) raw.append(( x, y))
self._wd_calib_tree.setData(app._raw_opt_ctr)
else: else:
QMessageBox.warning(self, "calibration", "no calibration started yet.\nPress 'pix2pos' or 'opt_ctr' button first") QMessageBox.warning(self, "calibration", "no calibration started yet.\nPress 'pix2pos' or 'opt_ctr' button first")
def cb_mouse_click(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
@@ -1298,17 +1303,39 @@ class WndSwissMx(QMainWindow, Ui_MainWindow):
def add_camera_trace(self): def add_camera_trace(self):
# add up to tracelen image when moveing motors to new positions # add up to tracelen image when moveing motors to new positions
tracelen=4 try:
img=pg.ImageItem(self._goImg.image) 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() trImg=self._goImgGrp.transform()
trTrk=self._goTracked.transform() trTrk=self._goTracked.transform()
tr=trImg*trTrk.inverted()[0] # TODO: check if oder correct !!! tr=trImg*trTrk.inverted()[0] # TODO: check if oder correct !!!
img=pg.ImageItem(self._goImg.image)
img.setTransform(tr) img.setTransform(tr)
self._goTrace.addItem(img) self._goTrace.addItem(img) # automatically added to self.vb
cld=self._goTrace.childItems()
if len(cld) > tracelen:
self.vb.removeItem(cld[0]) 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): def cb_modify_app_param(self):
wnd=WndParameter(self) wnd=WndParameter(self)
@@ -1601,6 +1628,8 @@ Author Thierry Zamofing (thierry.zamofing@psi.ch)
pass pass
def prepare_wd_tabs_left(self): def prepare_wd_tabs_left(self):
tabs = self._wd_tabs_left tabs = self._wd_tabs_left
tabs.currentChanged.connect(self.cb_switch_task) tabs.currentChanged.connect(self.cb_switch_task)
@@ -1617,17 +1646,60 @@ Author Thierry Zamofing (thierry.zamofing@psi.ch)
setup_tab.layout().addWidget(tbox) setup_tab.layout().addWidget(tbox)
# 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 geometry calibration --------
block = QWidget() block = QWidget()
block.setAccessibleName(TASK_SETUP_GEOMETRY_CALIB)
block.setContentsMargins(0, 0, 0, 0)
block.setLayout(QVBoxLayout())
grp = QWidget()
block.layout().addWidget(grp)
block.layout().addStretch()
grp.setLayout(QGridLayout())
tbox.addItem(block, "geometry calibration")
#grp.layout().addWidget(QLabel("feature size (µM)"), 0, 0)
#self._ppm_feature_size_spinbox = QDoubleSpinBox()
#self._ppm_feature_size_spinbox.setRange(5, 10000)
#self._ppm_feature_size_spinbox.setValue(50)
#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("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("Optical center calibration")
but.setCheckable(True)
but.clicked.connect(self.cb_update_opt_ctr)
grp.layout().addWidget(but, 1, 0)
self._wd_calib_tree=tree=pg.DataTreeWidget(data=None)
grp.layout().addWidget(tree, 2, 0)
tbox.currentChanged.connect(self.cb_switch_task)
# final stretch
# setup_tab.layout().addStretch()
exp_tab.layout().addStretch()
# Jungfrau parameters
block=QWidget()
block.setAccessibleName(TASK_JUNGFRAU_SETTINGS) block.setAccessibleName(TASK_JUNGFRAU_SETTINGS)
block.setContentsMargins(0, 0, 0, 0) block.setContentsMargins(0, 0, 0, 0)
block.setLayout(QVBoxLayout()) block.setLayout(QVBoxLayout())
#self.jungfrau = jungfrau_widget.JungfrauWidget() #ZAC: orig. code # self.jungfrau = jungfrau_widget.JungfrauWidget() #ZAC: orig. code
#block.layout().addWidget(self.jungfrau) #ZAC: orig. code # block.layout().addWidget(self.jungfrau) #ZAC: orig. code
block.layout().addStretch() block.layout().addStretch()
tbox.addItem(block, "Jungfrau Parameters") tbox.addItem(block, "Jungfrau Parameters")
# # group beam box # # -------- group beam box --------
# block = QWidget() # block = QWidget()
# block.setAccessibleName(TASK_SETUP_BEAM_CENTER) # block.setAccessibleName(TASK_SETUP_BEAM_CENTER)
# block.setContentsMargins(0, 0, 0, 0) # block.setContentsMargins(0, 0, 0, 0)
@@ -1668,7 +1740,7 @@ Author Thierry Zamofing (thierry.zamofing@psi.ch)
# """ # """
# ) # )
# # group regions # # -------- group regions --------
# block = QWidget() # block = QWidget()
# block.setAccessibleName(TASK_SETUP_ROI) # block.setAccessibleName(TASK_SETUP_ROI)
# block.setContentsMargins(0, 0, 0, 0) # block.setContentsMargins(0, 0, 0, 0)
@@ -1685,7 +1757,7 @@ Author Thierry Zamofing (thierry.zamofing@psi.ch)
# but.clicked.connect(self.roi_add_line) # but.clicked.connect(self.roi_add_line)
# grp.layout().addWidget(but, 0, 1) # grp.layout().addWidget(but, 0, 1)
# #
# # group camera settings # # -------- group camera settings --------
# block = QWidget() # block = QWidget()
# block.setAccessibleName(TASK_SETUP_CAMERA) # block.setAccessibleName(TASK_SETUP_CAMERA)
# block.setContentsMargins(0, 0, 0, 0) # block.setContentsMargins(0, 0, 0, 0)
@@ -1728,77 +1800,6 @@ Author Thierry Zamofing (thierry.zamofing@psi.ch)
# #
# grp.layout().addWidget(self._label_transforms, row, 0, 1, 2) # grp.layout().addWidget(self._label_transforms, row, 0, 1, 2)
# group geometry calibration
block = QWidget()
block.setAccessibleName(TASK_SETUP_GEOMETRY_CALIB)
block.setContentsMargins(0, 0, 0, 0)
block.setLayout(QVBoxLayout())
grp = QWidget()
block.layout().addWidget(grp)
block.layout().addStretch()
grp.setLayout(QGridLayout())
tbox.addItem(block, "geometry calibration")
#grp.layout().addWidget(QLabel("feature size (µM)"), 0, 0)
#self._ppm_feature_size_spinbox = QDoubleSpinBox()
#self._ppm_feature_size_spinbox.setRange(5, 10000)
#self._ppm_feature_size_spinbox.setValue(50)
#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")
but.setCheckable(True)
but.clicked.connect(self.cb_update_pix2pos)
grp.layout().addWidget(but, 0, 0)
self._btn_opt_ctr = but = QPushButton("opt_ctr")
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(
"""<body>
<h2>Pixel to position calibration</h2>
<ol>
<li>press: <b>pix2pos</b></li>
<li>for each zoom level:
<li>choose a good fiducial mark
<li>move the stage x/y at min. 3 different locations
<li>Click (left mouse button) on the fiducial mark
<li>un-click: <b>pix2pos</b></li>
</ol>
<h2>optical center calibration</h2>
<ol>
<li>press: <b>opt_ctr</b></li>
<li>choose at least 3 fiducial mark visible at various zoom levels
<li>for at least two zoom level:
<li>Click (left mouse button) on the fiducial marks
<li>un-click: <b>opt_ctr</b></li>
</ol>
</body>
"""
)
# 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
tbox.currentChanged.connect(self.cb_switch_task)
# final stretch
# 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()
def build_tab_module_fix_target(self): def build_tab_module_fix_target(self):
#tab = self._tab_daq_method_prelocated #tab = self._tab_daq_method_prelocated
try: try:
@@ -1856,6 +1857,13 @@ Author Thierry Zamofing (thierry.zamofing@psi.ch)
app=QApplication.instance() app=QApplication.instance()
if calib: if calib:
_log.info("received new pix2pos calibration") _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() app._raw_pix2pos=dict()
else: else:
s=str(app._raw_pix2pos).replace('),','),\n ').replace('],','],\n') 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): 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 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() app._raw_opt_ctr=dict()
else: 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=app._geometry
geo.update_optical_center(app._raw_opt_ctr) ocOld=geo._opt_ctr
app._cfg.setValue(AppCfg.GEO_OPT_CTR, geo._opt_ctr) try:
go=self._goOptCtr geo.update_optical_center(app._raw_opt_ctr,True)
oc_sz=go.size() except BaseException as e:
go.setPos(-geo._opt_ctr-oc_sz/2) _log.warning(e)
QMessageBox.warning(self, "calibration", f"rejected\n{e}")
del app._raw_opt_ctr del app._raw_opt_ctr
return return
del app._raw_opt_ctr
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): def module_fix_target_add_obj(self,*args,**kwargs):
mft=self._moduleFixTarget mft=self._moduleFixTarget