diff --git a/ARESvis/ARESvis.py b/ARESvis/ARESvis.py index 90fcebf..c3c5e73 100755 --- a/ARESvis/ARESvis.py +++ b/ARESvis/ARESvis.py @@ -44,7 +44,7 @@ from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QPushButton, QSlider QCheckBox, QHBoxLayout, QVBoxLayout, QGroupBox, QGridLayout, QComboBox from PyQt5.QtGui import QPainter, QColor, QPen, QBrush, QPolygon, QPolygonF, QTransform, QPainterPath, \ QPixmap, QMouseEvent, QImage -from PyQt5.QtCore import QPoint, QPointF, Qt,pyqtSignal +from PyQt5.QtCore import QPoint, QPointF, Qt,pyqtSignal,QObject #import PyQt5.QtGui as QtGui #import PyQt5.QtCore as QtCore @@ -315,12 +315,12 @@ class ARESdevice(): #qp.drawRect(-10, -10+rArm, 20, 20) #--- pixmaps --- - pm=pic['bl'] #bellow + pm=pic['bl'] # bellow w,h=pm.width(),pm.height() qp.setTransform(tfArm);qp.translate(0, -rArm);qp.scale(.64,.64) qp.drawPixmap(QPointF(-w/2,-h),pm) - pm=pic['mi'] #foccussing mirror + pm=pic['mi'] # foccussing mirror w,h=pm.width(),pm.height() qp.setTransform(tf2Th);qp.translate(-39.6,-273.6);qp.scale(.64,.64) qp.drawPixmap(QPointF(-w/2,-h/2),pm) @@ -330,26 +330,31 @@ class ARESdevice(): qp.setTransform(tf2Th);qp.rotate(54);qp.translate(0,-240);qp.scale(.64,.64) qp.drawPixmap(QPointF(-w/2,-h/2),pm) - pm=pic['df'] #diffrantometer + pm=pic['df'] # diffrantometer w,h=pm.width(),pm.height() qp.setTransform(tfTrg);qp.translate(22, 17);qp.scale(.64,.64) qp.drawPixmap(QPointF(-w/2,-h/2),pm) - pm=pic['jf'] #jungfrau detector + pm=pic['jf'] # jungfrau detector w,h=pm.width(),pm.height() qp.setTransform(tfJFr);qp.translate(-25, -225);qp.scale(.64,.64) qp.drawPixmap(QPointF(-w/2,-h/2),pm) - pm=pic['lm'] #laser mirror + pm=pic['lm'] # laser mirror w,h=pm.width(),pm.height() qp.setTransform(tfDet);qp.rotate(181-7);qp.translate(13, -193);qp.scale(.64,.64) qp.drawPixmap(QPointF(-w/2,-h/2),pm) - pm=pic['di'] #diode + pm=pic['di'] # diode det1 w,h=pm.width(),pm.height() qp.setTransform(tfDet);qp.rotate(165.4);qp.translate(-0, -205);qp.scale(.64,.64) qp.drawPixmap(QPointF(-w/2,-h/2),pm) + pm=pic['di'] # diode det2 + w,h=pm.width(),pm.height() + qp.setTransform(tfDet);qp.rotate(-96);qp.translate(-0, -205);qp.scale(.64,.64) + qp.drawPixmap(QPointF(-w/2,-h/2),pm) + #--- RIXS-arm devices --- qp.setTransform(tfArm) qp.setPen(QPen(Qt.red, tickW, Qt.SolidLine)) @@ -394,7 +399,9 @@ class ARESdevice(): qp.setPen(penBk) qp.setBrush(QColor(0,0,255,192)) qp.setTransform(tfDet);qp.rotate(165.4);qp.translate(-diW/2,-rDet) - qp.drawRect(0, 0, diW, diH) # diode1 + qp.drawRect(0, 0, diW, diH) # diode det1 + qp.setTransform(tfDet);qp.rotate(-96);qp.translate(-diW/2,-rDet) + qp.drawRect(0, 0, diW, diH) # diode det2 qp.setTransform(tfDet);qp.rotate(181);qp.translate(0,-rDet+miW/2);qp.rotate(-45) qp.drawRect(-int(miW/2), 0, miW, miH) # mirror1 @@ -441,7 +448,7 @@ class ARESdevice(): qp.setPen(penBl) qp.setTransform(QTransform()) for r,a,tf in ((rArm,aArm,tfArm),(r2Th,a2Th,tf2Th),(rDet,aDet,tfDet),(rJFr,aJFr,tfJFr),(rTrg/2,aTrg,tfTrg),): - p=QPoint(*tf.map(0, -r+40)) + p=QPoint(*tf.map(0, int(-r+40))) txt=f'{a:.5g}°' txr=qp.boundingRect(p.x(), p.y(), 0, 0, Qt.AlignLeft, txt) txr.moveTop(int(txr.y()-txr.height()/2)) @@ -468,11 +475,16 @@ class WndVisualize(QWidget): 'SATES30-MCS001:MOT_6.RBV' :'txPar', 'SATES30-ACSFM:MOT_TZ.RBV' :'tzFM', } + #updSignal=pyqtSignal(str, float, str) def __init__(self): super().__init__() self.initUI() self.connectEPICS() + # self.update() must be called in main thread. Else gui may block after some time + # PV monitoring is done in a separate thread. Therefore functions as: + # OnConnectionChange, OnValueChange MUST NOT call update, but use this Signal helper class. + #self.updSignal.connect(lambda key,value,col: self.vis_update(key,value,col)) def initUI(self): self.setGeometry(560, 100, 1300, 800) @@ -597,6 +609,7 @@ class WndVisualize(QWidget): except KeyError as e: _log.warning(f"can't handle PV: {pvname}:{value}") return + #self._updSignal.emit() # self.update() would block after some time self.vis_update(key,value,'008000') def vis_update(self,key,value,col='000000'):