moving ROI with stage and zoom
This commit is contained in:
106
swissmx.py
106
swissmx.py
@@ -180,19 +180,19 @@ class Sequencer(QObject):
|
||||
Ui_MainWindow, QMainWindow = loadUiType("swissmx.ui")
|
||||
|
||||
class Main(QMainWindow, Ui_MainWindow):
|
||||
pixelsPerMillimeter = pyqtSignal(float)
|
||||
beamCameraCoordinatesChanged = pyqtSignal(float, float)
|
||||
#pixelsPerMillimeter = pyqtSignal(float)
|
||||
#beamCameraCoordinatesChanged = pyqtSignal(float, float)
|
||||
addGridRequest = pyqtSignal(float, float)
|
||||
zoomChanged = pyqtSignal(float)
|
||||
#zoomChanged = pyqtSignal(float)
|
||||
folderChanged = pyqtSignal(str)
|
||||
prefixChanged = pyqtSignal(str)
|
||||
projectChanged = pyqtSignal(str)
|
||||
gridUpdated = pyqtSignal(int) # index in self._grids
|
||||
gonioMoveRequest = pyqtSignal(float, float, float, float, float)
|
||||
fast_x_position = pyqtSignal(float)
|
||||
fast_y_position = pyqtSignal(float)
|
||||
fast_dx_position = pyqtSignal(float)
|
||||
fast_dy_position = pyqtSignal(float)
|
||||
#fast_x_position = pyqtSignal(float)
|
||||
#fast_y_position = pyqtSignal(float)
|
||||
#fast_dx_position = pyqtSignal(float)
|
||||
#fast_dy_position = pyqtSignal(float)
|
||||
fiducialPositionSelected = pyqtSignal(float, float, float, float) # camx, camy, gonx, gony
|
||||
appendPrelocatedPosition = pyqtSignal(float, float, float, float)
|
||||
appendPrelocatedFiducial = pyqtSignal(bool, float, float, float, float)
|
||||
@@ -346,18 +346,21 @@ class Main(QMainWindow, Ui_MainWindow):
|
||||
#--- 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)
|
||||
self.vb.addItem(bm)
|
||||
vb.addItem(bm)
|
||||
|
||||
#--- opctical center ----
|
||||
oc_sz=np.array((50,50))
|
||||
self._goOptCtr=obj=UsrGO.Marker(-opt_ctr-oc_sz/2, oc_sz,mode=1)
|
||||
bm.setTransform(tr) # assign transform
|
||||
self.vb.addItem(obj)
|
||||
vb.addItem(obj)
|
||||
|
||||
#--- testing scan grid ---
|
||||
vi=UsrGO.Grid((120, -100), (200, 150), (30, 22), 2)
|
||||
vi.setTransform(tr) # assign transform
|
||||
self.vb.addItem(vi)
|
||||
self.track_objects() # first call is needed to initialize the structure self._goTracked
|
||||
go=UsrGO.Grid((120, -100), (200, 150), (30, 22), 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)
|
||||
|
||||
|
||||
@@ -1037,7 +1040,7 @@ class Main(QMainWindow, Ui_MainWindow):
|
||||
return
|
||||
|
||||
def zoom_changed_cb(self, value):
|
||||
self.zoomChanged.emit(value)
|
||||
#self.zoomChanged.emit(value)
|
||||
app=QApplication.instance()
|
||||
cfg=app._cfg
|
||||
geo=app._geometry
|
||||
@@ -1055,8 +1058,73 @@ class Main(QMainWindow, Ui_MainWindow):
|
||||
bm.setPos(bm_pos,finish=False)
|
||||
bm.setSize(bm_sz)
|
||||
_log.debug(f"zoom->{value} beam marker pos:{bm_pos} sz:{bm_sz})")
|
||||
self.track_objects()
|
||||
#self.update_beam_marker(value)
|
||||
|
||||
def track_objects(self):
|
||||
#self._goTracked= dictionary with infos about tracked objects
|
||||
# objLst = list of objects to track
|
||||
# state = (zoom, fx, fy) (created at first call of self.track_objects() )
|
||||
app=QApplication.instance()
|
||||
geo=app._geometry
|
||||
zoom = app._zoom.get()
|
||||
fast_x=self.tweakers["fast_x"];fast_y=self.tweakers["fast_y"]
|
||||
fx=fast_x.get_position()
|
||||
fy=fast_y.get_position()
|
||||
try:
|
||||
tracked=self._goTracked
|
||||
zoom_old,fx_old,fy_old=tracked['state']
|
||||
except AttributeError: # at initialization
|
||||
self._goTracked={'objLst':list(), 'state':(zoom,fx,fy)}
|
||||
return
|
||||
_log.debug(f"zoom:{zoom_old}->{zoom} fx:{fx_old}->{fx} fy:{fy_old}->{fy}")
|
||||
opt_ctr=geo._opt_ctr
|
||||
if zoom_old!=zoom:
|
||||
geo.interp_zoom(zoom_old)
|
||||
pix2pos_old=geo._pix2pos
|
||||
geo.interp_zoom(zoom)
|
||||
pix2pos_new=geo._pix2pos
|
||||
for o in tracked['objLst']:
|
||||
# names consists of abrevations
|
||||
# part 0: po=position sz=size dt=delta
|
||||
# part 1: px=pixel eu=engineering units (e.g. mm)
|
||||
po_px=o.pos()
|
||||
sz_px=o.size()
|
||||
tr=o.transform()
|
||||
geo._pix2pos=pix2pos_old
|
||||
dt_px=-opt_ctr-po_px
|
||||
dt_eu=geo.pix2pos(dt_px)
|
||||
sz_eu=geo.pix2pos(sz_px)
|
||||
|
||||
geo._pix2pos=pix2pos_new
|
||||
dt_px2=geo.pos2pix(dt_eu)
|
||||
sz_px2=geo.pos2pix(sz_eu)
|
||||
po_px2=-opt_ctr-dt_px2
|
||||
o.setPos(po_px2)
|
||||
o.setSize(sz_px2)
|
||||
|
||||
#np.asarray(self._pix2pos*np.mat(p).T).ravel()
|
||||
geo.interp_zoom(zoom)
|
||||
|
||||
if fx_old!=fx or fy_old!=fy:
|
||||
p1=geo.pos2pix((fx_old,fy_old))
|
||||
p2=geo.pos2pix((fx,fy))
|
||||
d=p2-p1
|
||||
|
||||
for o in tracked['objLst']:
|
||||
pos=o.pos()
|
||||
sz=o.size()
|
||||
tr=o.transform()
|
||||
o.setPos(pos+d)
|
||||
tracked['state']=(zoom, fx, fy)
|
||||
#imgPos=self._goImg.mapFromScene(event.scenePos())
|
||||
#x=imgPos.x();y=imgPos.y()
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
def append_to_beam_markers(self, x, y, zoom):
|
||||
self._beam_markers[zoom] = (x, y)
|
||||
_log.info("beam markers {}".format(self._beam_markers))
|
||||
@@ -1195,7 +1263,7 @@ class Main(QMainWindow, Ui_MainWindow):
|
||||
pos=event.scenePos()
|
||||
_log.debug(f'move to position :scene pos {pos}')
|
||||
geo=app._geometry
|
||||
geo.interp_zoom(1)
|
||||
#geo.interp_zoom(1)
|
||||
bm=self._goBeamMarker
|
||||
p1=self._goImg.mapFromScene(pos)
|
||||
p2=bm.pos()+bm.size()/2
|
||||
@@ -1657,9 +1725,11 @@ class Main(QMainWindow, Ui_MainWindow):
|
||||
for key, tweaker in self.tweakers.items():
|
||||
tweaker.event_axis_fault.connect(self.axis_fault)
|
||||
|
||||
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_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_x"].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()
|
||||
|
||||
def axis_fault(self, pvname, kw):
|
||||
@@ -1968,7 +2038,7 @@ class Main(QMainWindow, Ui_MainWindow):
|
||||
usy.move_relative(-tandem_twv)
|
||||
dsy.move_relative(-tandem_twv)
|
||||
|
||||
def get_tweaker(self, pv, alias=None, label=None, mtype="epics_motor", layout=None, **kwargs):
|
||||
def get_tweaker(self, rec, alias=None, label=None, mtype="epics_motor", layout=None, **kwargs):
|
||||
app = QApplication.instance()
|
||||
sim=app._args.sim
|
||||
if mtype == "epics_motor":
|
||||
@@ -1981,7 +2051,7 @@ class Main(QMainWindow, Ui_MainWindow):
|
||||
m=SimMotorTweak()
|
||||
else:
|
||||
m = SmaractMotorTweak()
|
||||
m.connect_motor(pv, label, **kwargs)
|
||||
m.connect_motor(rec, label, **kwargs)
|
||||
self.tweakers[alias] = m
|
||||
return m
|
||||
|
||||
|
||||
Reference in New Issue
Block a user