diff --git a/RIXSconfig/RIXSconfig.py b/RIXSconfig/RIXSconfig.py index d268dba..a038e08 100755 --- a/RIXSconfig/RIXSconfig.py +++ b/RIXSconfig/RIXSconfig.py @@ -160,8 +160,40 @@ class WndMainRIXS(QWidget): w.clicked.connect(lambda val, w=w:self.OnEnergyChanged(w, val)) lg.addWidget(w, row, 2) row+=1 + + w=QPushButton('sync motors') + w.clicked.connect(self.btnSyncMotors) + lv.addWidget(w) self.show() + def btnSyncMotors(self): + #reads the epics motor and updates the vizualization + _log.info('') + app=QApplication.instance() + dev=app._dev + pv_rbv=dev._pvDict['rbv'] + geo=dev._geo + for k,v in pv_rbv.items(): + if v.connected: + geo[k]=v.get() + else: + _log.warning(f'pv {k} not connected') + return + dev.motor2geometry() + dev.setGeometry(dev._geo) + try: + wndCld=app._wndVisualize + except AttributeError as e: + pass + else: + wndCld.updateDevice(dev) + try: + wndCld=app._wndVars + except AttributeError as e: + pass + else: + wndCld.updateDevice(dev) + def OnOpenChildWnd(self,wnd): app=QApplication.instance() if wnd=='Visualize': @@ -934,23 +966,19 @@ class WndVars(QWidget): if pv.connected: v=pv.get(as_string=True) else: - v=t + v=m w=QLineEdit(v,objectName=m) w.setToolTip(desc) l.addWidget(w, i,1) - v=f"{t}" + v=f"{m}" w=QLabel(v,objectName=m) l.addWidget(w, i, 2) #pv=pvd[rcNm] - w=QPushButton('sync motors') - w.clicked.connect(self.btnSyncMotors) - l.addWidget(w, i+1, 1) - w=QPushButton('move motors') w.clicked.connect(self.btnMoveMotors) - l.addWidget(w, i+2, 1) + l.addWidget(w, i+1, 1) @@ -983,72 +1011,61 @@ class WndVars(QWidget): val=v pv_rbv=dev._pvDict['rbv'] pv=pv_rbv[k] - rbv=pv.get() + if pv.connected: + rbv=pv.get() + else: + rbv=None _log.debug(f'change: {key}:{val}:{rbv}') grpMot=self._wdGrpMotor wLe=grpMot.findChild(QLineEdit, key) if wLe is not None: wCb=grpMot.findChild(QCheckBox, key) wLb=grpMot.findChild(QLabel, key) + #TODO: if val is None: - v=f"{rbv:.5g}" + v=f"{rbv}" else: wLe.setText(f'{val:.3f}') # {v:.6g} - d=abs(val-rbv) - b=bool(d>0.001) - wCb.setChecked(b) - if b: - c='ff8080' + if rbv is None: + v=f"{rbv}" else: - c='60a060' - v=f"{rbv:.5g} ({d:+.5g})" + d=abs(val-rbv) + b=bool(d>0.001) + wCb.setChecked(b) + if b: + c='ff8080' + else: + c='60a060' + v=f"{rbv:.5g} ({d:+.5g})" wLb.setText(v) def btnMoveMotors(self): - grpMot=self._wdGrpMotor - lg=grpMot.layout() - col=lg.columnCount() - eDevs=self._epicsDevDct - - for k,eDev in eDevs.items(): - wCb=grpMot.findChild(QCheckBox, k) - if wCb.isChecked(): - wLe=grpMot.findChild(QLineEdit, k) - v=float(wLe.text()) - if eDev is not None: - _log.info(f'move motor {k} to {v}') - if type(eDev)==SimEpicsDevice: - eDev.VAL=v # move motor #comment out for safety - self.update_label(key=k,val=v) - else: - #eDev.VAL=v # move motor #comment out for safety - pass - - def btnSyncMotors(self): - #reads the epics motor and updates the vizualization - _log.info('') app=QApplication.instance() dev=app._dev pv_rbv=dev._pvDict['rbv'] + try: + pv_val=dev._pvDict['val'] + except KeyError as e: + pv_val=dev._pvDict['val']=dict() + geo=dev._geo - for k,v in pv_rbv.items(): - geo[k]=v.get() - - dev.motor2geometry() - dev.setGeometry(dev._geo) - try: - wndCld=app._wndVisualize - except AttributeError as e: - pass - else: - wndCld.updateDevice(dev) - try: - wndCld=app._wndVars - except AttributeError as e: - pass - else: - wndCld.updateDevice(dev) - + grpMot=self._wdGrpMotor + lg=grpMot.layout() + col=lg.columnCount() + row=lg.rowCount() + for r in range(row-1): # -1 because last one is a button + wCb=lg.itemAtPosition(r, 0) + if wCb is None: + continue + wCb=wCb.widget() + if wCb.isChecked(): + m=wCb.objectName() + try: + pv=pv_val[m] + except KeyError as e: + pvn=RIXSdevice._prefix+'MOT_'+m.upper()+'.VAL' + pv=pv_val[m]=epics.get_pv(pvn)#,connection_callback=self.OnConnectionChange,callback=self.OnValueChange) + pv.put(geo[m]) # ->>>> https://pyepics.github.io/pyepics/devices.html >>> USE THIS