From b52fa6d9bda3a67e81a81683cca9d88cfec8be78 Mon Sep 17 00:00:00 2001 From: Thierry Zamofing Date: Fri, 26 Aug 2022 19:10:23 +0200 Subject: [PATCH] towards document type --- ModuleFixTarget.py | 20 ++++++-- pyqtUsrObj.py | 116 ++++++++++++++++++++++++++++++++++++++------- swissmx.py | 57 ++++++++++++++-------- 3 files changed, 151 insertions(+), 42 deletions(-) diff --git a/ModuleFixTarget.py b/ModuleFixTarget.py index 487de8e..e75ed52 100644 --- a/ModuleFixTarget.py +++ b/ModuleFixTarget.py @@ -182,9 +182,15 @@ class WndFixTarget(QWidget): bl.addWidget(param, 1, 1,1,1) self._btnAdd=btnAdd = QPushButton("add obj") - btnAdd.clicked.connect(self.add_obj) + #btnAdd.clicked.connect(lambda x: _log.warning("TODO: IMPLEMENT") ) bl.addWidget(btnAdd, 1, 2,1,1) + self._btnDelAll=btnDelAll = QPushButton("del all") + #btnDelAll.clicked.connect(lambda x: _log.warning("TODO: IMPLEMENT") ) + bl.addWidget(btnDelAll, 2, 2,1,1) + + + # but = QPushButton("Dump to console") # but.clicked.connect(self.dump_data) @@ -275,6 +281,15 @@ class WndFixTarget(QWidget): print(data) self._data=data self._tree.setData(data) + try: + wnd=app._mainWnd + except AttributeError: + _log.info('_mainWnd not handeled') + pass + else: + for go in data: + wnd.vb.addItem(go) + wnd._goTracked['objLst']=self._data return @@ -358,9 +373,6 @@ class WndFixTarget(QWidget): json.dump(self._data, f,cls=MyJsonEncoder) print(self._data) - def add_obj(self): - _log.warning("TODO: IMPLEMENT") - def delete_selected(self): row = self._current_row try: diff --git a/pyqtUsrObj.py b/pyqtUsrObj.py index eb521ff..98c7b50 100644 --- a/pyqtUsrObj.py +++ b/pyqtUsrObj.py @@ -18,6 +18,7 @@ from pyqtgraph.Qt import QtCore, QtGui import numpy as np from PyQt5.QtGui import QPolygon,QPolygonF from PyQt5.QtCore import Qt,QPointF,QLineF +import yaml def obj_tree(obj,p=''): obj_info(obj,p) @@ -159,6 +160,24 @@ class Fiducial(pg.ROI): p.setTransform(tr) + def __repr__(self): + s=f'{self.__class__.__name__}:(pos:{tuple(self.pos())}, size:{tuple(self.size())}, xyz:{self._xyz}}}' + return s + + @staticmethod + def yaml_repr(dumper, data): + m={'pos':(data.pos()),'size':(data.size()),'xyz':(map(float,data._xyz))} + return dumper.represent_mapping(u'!Fiducial', m) + + @staticmethod + def yaml_cnstr(loader, node): + m=loader.construct_mapping(node) + return Fiducial(**m) + +yaml.add_representer(Fiducial, Fiducial.yaml_repr) +yaml.add_constructor(u'!Fiducial', Fiducial.yaml_cnstr) + + class Grid(pg.ROI): '''a grid''' @@ -224,21 +243,24 @@ class Grid(pg.ROI): def __repr__(self): s=f'{self.__class__.__name__}:(pos:{tuple(self.pos())}, size:{tuple(self.size())}, cnt:{self._cnt}, ficucialScale:{self._fidScl}}}' return s -import yaml -def yaml_repr_Grid(dumper, data): - #s=f'{{"pos":{tuple(data.pos())}, "size":{tuple(data.size())}, "cnt":{data._cnt}, "ficucialScale":{data._fidScl}}}' - #return dumper.represent_scalar(u'!Grid', s) - m={'pos':tuple(data.pos()),'size':tuple(data.size()),'cnt':data._cnt, 'ficucialScale':data._fidScl} - return dumper.represent_mapping(u'!Grid', m) -yaml.add_representer(Grid, yaml_repr_Grid) -def yaml_cnstr_Grid(loader, node): - #value = loader.construct_scalar(node) - #kwargs=eval(value) - #return Grid(**kwargs) - m = loader.construct_mapping(node) - return Grid(**m) -yaml.add_constructor(u'!Grid', yaml_cnstr_Grid) + @staticmethod + def yaml_repr(dumper, data): + #s=f'{{"pos":{tuple(data.pos())}, "size":{tuple(data.size())}, "cnt":{data._cnt}, "ficucialScale":{data._fidScl}}}' + #return dumper.represent_scalar(u'!Grid', s) + m={'pos':list(data.pos()),'size':list(data.size()),'cnt':list(data._cnt), 'ficucialScale':data._fidScl} + return dumper.represent_mapping(u'!Grid', m) + + @staticmethod + def yaml_cnstr(loader, node): + # value = loader.construct_scalar(node) + # kwargs=eval(value) + # return Grid(**kwargs) + m=loader.construct_mapping(node) + return Grid(**m) + +yaml.add_representer(Grid, Grid.yaml_repr) +yaml.add_constructor(u'!Grid', Grid.yaml_cnstr) class Path(pg.ROI): @@ -302,6 +324,24 @@ class Path(pg.ROI): lv=QLineF(x, y-5*ry, x, y+5*ry) p.drawLines(lh,lv) + def __repr__(self): + s=f'{self.__class__.__name__}:(pos:{tuple(self.pos())}, size:{tuple(self.size())}, cnt:{self._cnt}, ficucialScale:{self._fidScl}}}' + return s + + @staticmethod + def yaml_repr(dumper, data): + m={'pos':list(data.pos()),'size':list(data.size()),'cnt':data._cnt, 'ficucialScale':data._fidScl} + return dumper.represent_mapping(u'!Path', m) + + @staticmethod + def yaml_cnstr(loader, node): + m=loader.construct_mapping(node) + return Path(**m) + +yaml.add_representer(Path, Path.yaml_repr) +yaml.add_constructor(u'!Path', Path.yaml_cnstr) + + class FixTargetFrame(pg.ROI): '''fixed target frame''' tpl={ @@ -345,10 +385,13 @@ class FixTargetFrame(pg.ROI): } } - def __init__( self, pos=(0,0), size=(100,100), tpl='test', **kargs): - pg.ROI.__init__(self, pos, size, **kargs) + def __init__( self, pos=(0,0), size=(100,100), tpl='test', dscr=None, **kwargs): + pg.ROI.__init__(self, pos, size, **kwargs) #fiducial type 0: 5 squares with pitch 120 um - self._dscr=FixTargetFrame.tpl[tpl] + if dscr is not None: + self._dscr=dscr + else: + self._dscr=FixTargetFrame.tpl[tpl] self.addScaleHandle([1, 1], [0, 0]) self.addScaleHandle([0, 0], [1, 1]) @@ -404,6 +447,25 @@ class FixTargetFrame(pg.ROI): else: assert('unknown feducial type') + def __repr__(self): + s=f'{self.__class__.__name__}:(pos:{tuple(self.pos())}, size:{tuple(self.size())}, dscr:{self._dscr}}}' + return s + + @staticmethod + def yaml_repr(dumper, data): + #m={'pos':list(data.pos()),'size':list(data.size()),'dscr':repr(data._dscr)} + m={'pos':list(data.pos()),'size':list(data.size())} + return dumper.represent_mapping(u'!FixTargetFrame', m) + + @staticmethod + def yaml_cnstr(loader, node): + m=loader.construct_mapping(node) + #m['dscr']=eval(m['dscr']) + return FixTargetFrame(**m) + +yaml.add_representer(FixTargetFrame, FixTargetFrame.yaml_repr) +yaml.add_constructor(u'!FixTargetFrame', FixTargetFrame.yaml_cnstr) + class TxtROI(pg.ROI): @@ -539,12 +601,22 @@ if __name__=='__main__': # Custom ROI for selecting an image region #viRoi=pg.ROI([20, -50], [60, 40]) viRoi=TxtROI([20, -50], [60, 40]) + #viRoi.addScaleHandle([1, 1], [0, 0]) + #viRoi.addScaleHandle([.7, .5], [0, 0]) + vb.addItem(viRoi) viUsrRoi=Marker([50, 120], [30, 20],mode=0) vb.addItem(viUsrRoi) obj=Marker([250, 220], [30, 20],mode=1) vb.addItem(obj) vi=Grid( (120,-100), (200,150), (30,20),2) + tr=QtGui.QTransform() # prepare ImageItem transformation: + tr.setMatrix(1, -.1, 0, + .2, 1, 0, + 10, 10, 1) + vi.setTransform(tr) # assign transform + + #vi=Grid( (50,10), (200,150), (6,4)) vb.addItem(vi) #vi= visual item @@ -567,6 +639,16 @@ if __name__=='__main__': vi=Fiducial((0,200),(40,40),(1,2,3)) vb.addItem(vi) + viRoi=pg.ROI([-200, -200], [100, 80],movable=True, rotatable=True, resizable=True) + + viRoi.addFreeHandle(pos=[.7, .5], axes=None, item=None, name=None, index=None) # rechteck , frei beweglich ??? verschwinden anch bewegung + #viRoi.addRotateFreeHandle([.7, .5], [0, 0], axes=None, item=None, name=None, index=None) # kreis ??? verschwinden anch erstem gebrauch + #viRoi.addRotateHandle([.7, .5], [0, 0], item=None, name=None, index=None) # kreis, nur rot + #viRoi.addScaleHandle([.7, .5], [0, 0], axes=None, item=None, name=None, lockAspect=False, index=None) # raute scale x,y + #viRoi.addScaleRotateHandle([0, .5], [1, .5], item=None, name=None, index=None) # kreis + #viRoi.addTranslateHandle([.7, .5], axes=None, item=None, name=None, index=None) #quadrat + vb.addItem(viRoi) + childTree(vb) diff --git a/swissmx.py b/swissmx.py index 74b2bc8..8959b1c 100755 --- a/swissmx.py +++ b/swissmx.py @@ -407,8 +407,8 @@ class SwissMxWnd(QMainWindow, Ui_MainWindow): self._goGrid=grid=pg.GridItem() # green grid and labels grid.opts['pen']=QPen(QColor(0, 255, 0)) grid.opts['textPen']=QPen(QColor(0, 255, 0)) - tr.reset() - grid.setTransform(tr) # assign transform + #tr.reset() + #grid.setTransform(tr) # assign transform vb.addItem(grid) #--- beam marker --- @@ -424,13 +424,13 @@ class SwissMxWnd(QMainWindow, Ui_MainWindow): #--- testing scan grid --- 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), (1000, 500), (10, 5), 2) - go.setTransform(tr) # assign transform - vb.addItem(go) - self._goTracked['objLst'].append(go) - self.track_objects() #tracking now the objects - #UsrGO.obj_tree(vb) + # #go=UsrGO.Grid((120, -100), (200, 150), (30, 22), 2) + # go=UsrGO.Grid((120, -100), (1000, 500), (10, 5), 2) + # go.setTransform(tr) # assign transform + # vb.addItem(go) + # self._goTracked['objLst'].append(go) + # self.track_objects() #tracking now the objects + # #UsrGO.obj_tree(vb) def init_actions(self): app = QApplication.instance() @@ -964,7 +964,11 @@ class SwissMxWnd(QMainWindow, Ui_MainWindow): px=p2+p1 mm=geo.pix2pos(px) _log.debug(f'{px} -> {mm}') - fx_motor, fy_motor, bx_motor, bz_motor, omega_motor=self.get_gonio_tweakers() + + fx_motor=self.tweakers["fast_x"] + fy_motor=self.tweakers["fast_y"] + #bz=self.tweakers["base_z"].get_rbv() + #fx_motor, fy_motor, bx_motor, bz_motor, omega_motor=self.get_gonio_tweakers() #fx=fx_motor.get_position() #fy=fy_motor.get_position() #dx=(x-bx)/ppm @@ -1538,7 +1542,7 @@ class SwissMxWnd(QMainWindow, Ui_MainWindow): self._moduleFixTarget =mft = ModuleFixTarget.WndFixTarget(self,data) tab = self._tabs_daq_methods.insertTab(0,mft,'Fix Target') mft._btnAdd.clicked.connect(self.module_fix_target_add_obj) - + mft._btnDelAll.clicked.connect(self.module_fix_target_del_all_obj) #tab.layout().addWidget(mft) mft.prefixSelected.connect(lambda prefix: self._le_prefix.setText(prefix)) @@ -1613,37 +1617,48 @@ class SwissMxWnd(QMainWindow, Ui_MainWindow): mft=self._moduleFixTarget fx=self.tweakers["fast_x"].get_rbv() fy=self.tweakers["fast_y"].get_rbv() - #cz=self.tweakers["fast_y"].get_rbv() + bz=self.tweakers["base_z"].get_rbv() app=QApplication.instance() geo=app._geometry oc=geo._opt_ctr + bm_pos=self._goBeamMarker.pos() + bm_sz=self._goBeamMarker.size() idx=mft._cbType.currentIndex() param=mft._txtParam.text() #cb.addItems(["Fiducial", "FixTarget(12.5x12.5)", "FixTarget(23.0x23.0)", "FixTarget()", "Grid()"]) if idx==0: - go=UsrGO.Fiducial((120, -100), (200, 150),(1,2,3)) + go=UsrGO.Fiducial(bm_pos+bm_sz/2-(20, 20), (40, 40),(fx,fy,bz)) elif idx==1: v=geo.pos2pix((12.5, 0)) l=np.linalg.norm(v) - go=UsrGO.FixTargetFrame(-oc, (l, l), tpl='12.5x12.5') + go=UsrGO.FixTargetFrame(bm_pos+bm_sz/2-(l/2,l/2), (l, l), tpl='12.5x12.5') elif idx==2: v=geo.pos2pix((23, 0)) l=np.linalg.norm(v) - go=UsrGO.FixTargetFrame(-oc, (l, l), tpl='23.0x23.0') + go=UsrGO.FixTargetFrame(bm_pos+bm_sz/2-(l/2,l/2), (l, l), tpl='23.0x23.0') elif idx==3: - go=UsrGO.FixTargetFrame((120, -100), (200, 150), tpl='test') + go=UsrGO.FixTargetFrame(bm_pos+bm_sz/2-(200/2,150/2), (200, 150), tpl='test') elif idx==4: - go=UsrGO.Grid((120, -100), (200, 150), (30, 22), 2) + go=UsrGO.Grid(bm_pos+bm_sz/2-(200/2,150/2), (200, 150), (30, 22), 2) else: + _log.error('index not handeled') - _log.error('set xstep 0..2 for tests') self.vb.addItem(go) obj=self._goTracked['objLst'] obj.append(go) mft._tree.setData(obj) + def module_fix_target_del_all_obj(self): + mft=self._moduleFixTarget + vb=self.vb + objLst=self._goTracked['objLst'] + for go in objLst: + vb.removeItem(go) + objLst.clear() + mft._tree.setData(objLst) + # **************** OBSOLETE AND/OR OLD STUFF **************** @@ -3407,9 +3422,9 @@ if __name__=="__main__": startupWin.set(60, f'start main window') - main = SwissMxWnd() - main.show() - startupWin._wnd.finish(main) + app._mainWnd=wnd=SwissMxWnd() + wnd.show() + startupWin._wnd.finish(wnd) # needed so pycharm can restart application signal.signal(signal.SIGINT, sigint_handler)