diff --git a/geometry.py b/geometry.py index c9f2136..ae950d2 100755 --- a/geometry.py +++ b/geometry.py @@ -384,6 +384,23 @@ if __name__=="__main__": import numpy as np import matplotlib as mpl import matplotlib.pyplot as plt + import json + + class MyJsonEncoder(json.JSONEncoder): + """ Special json encoder for numpy types """ + + def default(self, obj): + if isinstance(obj, np.integer): + return int(obj) + elif isinstance(obj, np.floating): + return float(obj) + elif isinstance(obj, np.ndarray): + return obj.tolist() + elif type(obj) not in (dict, list, str, int): + _log.error('dont know how to json') + return repr(obj) + return json.JSONEncoder.default(self, obj) + np.set_printoptions(suppress=True) np.set_printoptions(linewidth=196) @@ -444,6 +461,8 @@ if __name__=="__main__": obj.update_pix2pos(measure) + print(json.dumps(obj._lut_pix2pos, cls=MyJsonEncoder)) + obj.interp_zoom(1) print(obj._pix2pos) print(obj._pix2pos.I) diff --git a/pyqtUsrObj.py b/pyqtUsrObj.py index c358970..69acfbb 100644 --- a/pyqtUsrObj.py +++ b/pyqtUsrObj.py @@ -105,12 +105,12 @@ class Marker(pg.ROI): f.setPixelSize(10) p.setFont(f) p.drawText(ofx+24, ofy+20, 'beam marker') - ctr=tuple(self.pos()+self.size()/2) - sz=tuple(self.size()) - p.drawText(ofx+5, ofy+45, '{:.1f}x{:.1f}'.format(*sz)) + ctr=tuple((self.pos()+self.size()/2)*1000) + sz=tuple(self.size()*1000) + p.drawText(ofx+5, ofy+45, '{:.1f}x{:.1f} um'.format(*sz)) #p.drawText(5, -35, '{:.1f}'.format(ctr[0])) p.drawText(ofx+5, ofy+55,42,30,Qt.AlignRight, '{:.1f}'.format(ctr[0])) - p.drawText(ofx+55, ofy+65, '{:.1f}'.format(ctr[1])) + p.drawText(ofx+55, ofy+65, '{:.1f} um'.format(ctr[1])) elif m==1: p.drawEllipse(20,20,60,60) diff --git a/swissmx.py b/swissmx.py index 301519b..7b38336 100755 --- a/swissmx.py +++ b/swissmx.py @@ -108,6 +108,7 @@ ts.log('Import part 5/8:') import matplotlib as mpl import matplotlib.pyplot as plt import numpy as np +np.set_printoptions(suppress=True,linewidth=196) import pyqtgraph as pg import pyqtgraph.exporters # use antialias for draw lines, interpret image data as row-major instead of col-major @@ -378,6 +379,7 @@ class WndSwissMx(QMainWindow, Ui_MainWindow): def init_graphics(self): app = QApplication.instance() cfg = app._cfg + geo = app._geometry self.glw = pg.GraphicsLayoutWidget() self.microscope_page.setLayout(QVBoxLayout()) self.microscope_page.layout().addWidget(self.glw) @@ -431,15 +433,31 @@ class WndSwissMx(QMainWindow, Ui_MainWindow): #grid.setTransform(tr) # assign transform vb.addItem(grid) + #--- fixed group --- + # uses pix2pos transformation with a fixed fx,fy value =(0,0) + # contains beam marker + self._goFixGrp=grp=pg.ItemGroup() + + geo.interp_zoom(1) + pix2pos=geo._pix2pos + A=np.asarray(pix2pos.I) + tr=grp.transform() + p1=np.hstack((opt_ctr,1)) #position of optical center on image item + p2=np.matmul(trf, p1) #position of optical center on viewbox + tr.setMatrix(A[0,0], A[0,1], 0, + A[1,0], A[1,1], 0, + p2[0], p2[1], 1) # translate dx,dy + grp.setTransform(tr) + self.vb.addItem(grp) #--- beam marker --- - bm_sz=np.array((50, 40)) # it is immidiatly repositioned in cb_zoom_changed - self._goBeamMarker=obj=UsrGO.Marker(-opt_ctr-bm_sz/2,bm_sz,mode=0) - obj._size_eu=cfg.value(AppCfg.GEO_BEAM_SZ) - obj._pos_eu=cfg.value(AppCfg.GEO_BEAM_POS) + size_eu=cfg.value(AppCfg.GEO_BEAM_SZ) + pos_eu=cfg.value(AppCfg.GEO_BEAM_POS) + pos_eu*=0 + 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 - vb.addItem(obj) + grp.addItem(obj) #--- testing scan grid --- #self.track_objects() # first call is needed to initialize the structure self._goTracked @@ -802,15 +820,28 @@ class WndSwissMx(QMainWindow, Ui_MainWindow): except AttributeError as e: _log.warning(e) else: + grp=self._goFixGrp opt_ctr=geo._opt_ctr - 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.setSize(bm_sz) - bm.blockSignals(False) - _log.debug(f"zoom->{value} beam marker pos:{bm_pos} sz:{bm_sz})") + A=np.asarray(geo._pix2pos.I) + #trf=cfg.value(AppCfg.GEO_CAM_TRF) + tr=self._goImgGrp.transform() + trf=np.array( ((tr.m11(),tr.m21(),tr.m31()),(tr.m12(),tr.m22(),tr.m32()),(tr.m13(),tr.m23(),tr.m33())) ) + tr=grp.transform() + p1=np.hstack((opt_ctr, 1)) # position of optical center on image item + p2=np.matmul(trf, p1) # position of optical center on viewbox + tr.setMatrix(A[0, 0], A[0, 1], 0, + A[1, 0], A[1, 1], 0, + p2[0], p2[1], 1) # translate dx,dy + grp.setTransform(tr) + + #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.setSize(bm_sz) + #bm.blockSignals(False) + #_log.debug(f"zoom->{value} beam marker pos:{bm_pos} sz:{bm_sz})") self.track_objects() def cb_move_backlight_safe(self, pos): @@ -982,10 +1013,12 @@ class WndSwissMx(QMainWindow, Ui_MainWindow): task = self.active_task() z = app._zoom.get_val() - #bm=self._goBeamMarker + bm=self._goBeamMarker #pos=event.scenePos() pImg=pg.Point(self._goImg.mapFromScene(pos)) pTrk=pg.Point(self._goTracked.mapFromScene(pos)) + pFix=pg.Point(self._goFixGrp.mapFromScene(pos)) + pFix-=bm.pos()+bm.size()/2 fx=self.tweakers["fast_x"].get_val() fy=self.tweakers["fast_y"].get_val() pRel=pTrk-(fx,fy) @@ -1000,7 +1033,7 @@ class WndSwissMx(QMainWindow, Ui_MainWindow): s=\ f'img pix ({pImg[0]:0.1f} {pImg[1]:0.1f})px \u23A2 ' \ f'stage ({pTrk[0]:0.4f} {pTrk[1]:>0.4f} {cz:>0.4f})mm \u23A2 ' \ - f'dist to beam ({pRel[0]:>0.4f} {pRel[1]:>0.4f})mm ' + f'dist to beam ({pFix[0]:>0.4f} {pFix[1]:>0.4f})mm ' #f'dist to beam ({pRel[0]:>0.6g} {pRel[1]:>0.6g}mm) ' #_log.debug(s) @@ -1079,19 +1112,20 @@ class WndSwissMx(QMainWindow, Ui_MainWindow): _log.debug(f'move to position :scene pos {pos}') geo=app._geometry + bm=self._goBeamMarker pImg=pg.Point(self._goImg.mapFromScene(pos)) pTrk=pg.Point(self._goTracked.mapFromScene(pos)) - fx=self.tweakers["fast_x"].get_val() - fy=self.tweakers["fast_y"].get_val() - pRel=pTrk-(fx, fy) - _log.debug(f'dist to beam ({pTrk[0]:>0.6g} {pTrk[1]:>0.6g}mm)') + pFix=pg.Point(self._goFixGrp.mapFromScene(pos)) + pFix-=bm.pos()+bm.size()/2 + + _log.debug(f'dist to beam ({pFix[0]:>0.6g} {pFix[1]:>0.6g}mm)') fx_motor=self.tweakers["fast_x"] fy_motor=self.tweakers["fast_y"] - #fx_motor.move_rel(pRel[0]) - #fy_motor.move_rel(pRel[1]) - fx_motor.move_abs(pTrk[0]) - fy_motor.move_abs(pTrk[1]) + fx_motor.move_rel(pFix[0]) + fy_motor.move_rel(pFix[1]) + #fx_motor.move_abs(fx_motor.get_val()+pFix[0]) + #fy_motor.move_abs(fy_motor.get_val()+pFix[1]) try: pln=geo._fitPlane except AttributeError: pass @@ -1283,8 +1317,8 @@ class WndSwissMx(QMainWindow, Ui_MainWindow): tr=grp.transform() #UsrGO.obj_info(tr) bm=self._goBeamMarker - bm_pos=bm._pos_eu - bm_sz=bm._size_eu + bm_pos=bm.pos() + bm_sz=bm.size() pos=(-fx,-fy)-bm_pos #fx_px,fy_px=geo.pos2pix((fx,fy)-bm_pos)-opt_ctr @@ -1878,8 +1912,8 @@ class WndSwissMx(QMainWindow, Ui_MainWindow): #cb.addItems(["Fiducial", "FixTarget(12.5x12.5)", "FixTarget(23.0x23.0)", "FixTarget()", "Grid()"]) - bm_pos_eu=self._goBeamMarker._pos_eu - bm_size_eu=self._goBeamMarker._size_eu + #bm_pos_eu=self._goBeamMarker._pos_eu + #bm_size_eu=self._goBeamMarker._size_eu if idx==0: #go=UsrGO.Fiducial(bm_pos+bm_sz/2-(20, 20), (40, 40),(fx,fy,bz))