diff --git a/furkaRIXS.py b/furkaRIXS.py index a78cd42..b74a087 100755 --- a/furkaRIXS.py +++ b/furkaRIXS.py @@ -284,7 +284,7 @@ class WndFurkaRIXS(QMainWindow, Ui_MainWindow): # pfx=QApplication.instance()._cfg.value(AppCfg.GBL_DEV_PREFIX)[1] - pfx='SATES30-RX:MOT_' + pfx='SATES30-RIXS:MOT_' #SATES30-RIXS:MOT_2TRY. widgets=[ self.create_tweaker(f"{pfx}MT", alias="gc_mt", label="MT", mtype=SimMotorTweak), diff --git a/graphExample.py b/graphExample.py index 9b9f197..b6f3679 100755 --- a/graphExample.py +++ b/graphExample.py @@ -59,12 +59,18 @@ def obj_info(obj,p=''): pass class RIXSgirder(QWidget): - + _lutColor={0:(255,0,0),1:(0,255,0),2:(255,255,0)} def __init__(self): super().__init__() self._param={'ctr':(200, 300), # location of big chamber - 'aa':45, # RIXS arm angle - 'cc':45, # UNSUSED + 'rCmb':80, # radius of chamber + 'rTrg':10, # radius of target + 'szSeal': (20,50), + 'szArm': (80,350), + 'aaSeal':70, # RIXS sliding angle + 'aaArm':70, # RIXS arm angle + 'airPads':0, # air pads (off=0 on=1 undef=2) + 'defComp':0, # deformation compensation (off=0 on=1 undef=2) } self.initUI() @@ -76,48 +82,113 @@ class RIXSgirder(QWidget): #label.move(50,50) #b1 = QPushButton("Button1",self) #b1.move(400,150) - w=QtGui.QGroupBox("Drawing",self) + self._wdGrpDraw=w=QtGui.QGroupBox("Drawing",self) w.move(10,10) l=QtGui.QVBoxLayout(w) sld={} - for key,rng,tk,pos in (('aa',(0,180),5,20),('cc',(0,180),5,40),): - sl=QtGui.QSlider(QtCore.Qt.Horizontal) + for key,rng,tk in (('aaSeal',(0,180),5),('aaArm',(0,180),5),('airPads',(0,2),1),('defComp',(0,2),1),): + sl=QtGui.QSlider(QtCore.Qt.Horizontal,objectName=key) sl.setFixedWidth(200);sl.setMinimum(rng[0]);sl.setMaximum(rng[1]) sl.setValue(self._param[key]) sl.setTickPosition(QtGui.QSlider.TicksBelow);sl.setTickInterval(tk) l.addWidget(sl) sl.valueChanged.connect(lambda val,key=key: self.sldChanged(key,val)) sld[key]=sl + self.show() def sldChanged(self,key,val,*args,**kwargs): - print(key,val) - self._param[key]=val + p=self._param + #print(key,val) + if key=='aaArm': + p['aaSeal']=v=p['aaSeal']-p['aaArm']+val + wSl=self._wdGrpDraw.findChild(QtGui.QSlider, 'aaSeal') + wSl.blockSignals(True) + wSl.setValue(int(v)) + wSl.blockSignals(False) + sl=QtGui.QSlider(QtCore.Qt.Horizontal,objectName=key) + + p[key]=val self.update() def paintEvent(self, e): p=self._param ctr=p['ctr'] - aa=p['aa'] + aaSeal=p['aaSeal'] + aaArm=p['aaArm'] + rCmb=p['rCmb'] + rTrg=p['rTrg'] + xa,ya=p['szArm'] + xs,ys=p['szSeal'] + ap=p['airPads'] + dc=p['defComp'] + + qp = QPainter() qp.begin(self) qp.translate(ctr[0],ctr[1]) + tf0=qp.transform() qp.setPen(QtGui.QPen(QtCore.Qt.black, 2, QtCore.Qt.SolidLine)) - qp.setBrush(QColor(255, 80, 0, 128)) + qp.setBrush(QColor(155, 155, 155, 128)) + br1=qp.brush() - rCmb=100 # radius of chamber - rTrg=10 # radius of target qp.drawEllipse(-rCmb, -rCmb, 2*rCmb, 2*rCmb) # big chamber qp.drawEllipse(-rTrg, -rTrg, 2*rTrg, 2*rTrg) # target qp.drawLine(0,-rCmb-50,0,-rTrg) #beam - qp.rotate(-aa) - qp.drawRect(-50, 100, 100, 300) # girder - qp.drawEllipse(-50, 100+150, 20, 20) #pusher left - qp.drawEllipse( 50-20, 100+150, 20, 20) #pusher right - qp.drawEllipse(-50, 100+250, 20, 20) #air pad left - qp.drawEllipse( 50-20, 100+250, 20, 20) #air pad right + qp.rotate(-aaSeal) + qp.translate(0,rCmb) + tf1=qp.transform() + xs2=xs//2 + xa2=xa//2 + ya2=ya//2 + d=int(abs(aaSeal-aaArm)*20) + r=min(155+d,255) + gb=max(155-d,0) + qp.setBrush(QColor(r, gb, gb, 255)) + qp.drawRect(-xs2, 0, xs, ys) # seal bellow + + qp.setBrush(br1) + + qp.setTransform(tf0) + qp.rotate(-aaArm) + qp.translate(0,rCmb+ys) + tf2=qp.transform() + qp.drawRect(-xa2, 0, xa, ya) # girder + #qp.drawEllipse(-ya2, 100+150, 20, 20) #pusher left + #qp.drawEllipse( ya2-r, 100+150, 20, 20) #pusher right + + #air pad + r,g,b=RIXSgirder._lutColor[ap] + rd=13 + r3=int(rd*np.sqrt(3)) + qp.setBrush(QColor(r, g, b, 255)) + qp.drawEllipse(-xa2-rd, ya-4*rd, 2*rd, 2*rd) #left + qp.drawEllipse(-xa2-rd+r3,ya-3*rd, 2*rd, 2*rd) #left + qp.drawEllipse(-xa2-rd+r3,ya-5*rd, 2*rd, 2*rd) #left + + qp.drawEllipse( xa2-rd, ya-4*rd, 2*rd, 2*rd) #right + qp.drawEllipse( xa2-rd-r3,ya-3*rd, 2*rd, 2*rd) #right + qp.drawEllipse( xa2-rd-r3,ya-5*rd, 2*rd, 2*rd) #right + + qp.drawEllipse( -rd, 3*rd, 2*rd, 2*rd) #grating + qp.drawEllipse( 0, 3*rd-r3, 2*rd, 2*rd) #grating + qp.drawEllipse( -2*rd, 3*rd-r3, 2*rd, 2*rd) #grating + + qp.setBrush(br1) + + #deformation compensation + r,g,b=RIXSgirder._lutColor[dc] + rd=14 + qp.setBrush(QColor(r, g, b, 255)) + qp.drawEllipse(-xa2, ya2, 2*rd, 2*rd) #air pad left + qp.drawEllipse( xa2-2*rd, ya2, 2*rd, 2*rd) #air pad right + #qp.drawEllipse( -rd, rd, 2*rd, 2*rd) #air pad grating + qp.setBrush(br1) + + + qp.end() @@ -561,10 +632,10 @@ class DlgMoveMotors(QtGui.QDialog): self.layout.addWidget(w) self._layoutGrid=lg=QtGui.QGridLayout(w) - # dev=epics.Device('SATES30-RX:MOT_ABL.', attrs=('VAL', 'RBV', 'DESC')) + # dev=epics.Device('SATES30-RIXS:MOT_ABL.', attrs=('VAL', 'RBV', 'DESC')) app=QApplication.instance() devs=app._devs - prefix='SATES30-RX:' + prefix='SATES30-RIXS:' for i,(k,v) in enumerate(motDst.items()): m='MOT_'+k.upper() #devs[k]=dev=epics.Device(prefix+m+'.', attrs=('RBV', 'DESC'), timeout=.5) # for safty: removed 'VAL', @@ -614,11 +685,11 @@ class DlgMoveMotors(QtGui.QDialog): #import CaChannel #import epics -#capv=CaChannel.CaChannel('SATES30-RX:MOT_ABL.VAL') -> THIS IS REALLY BASIC... +#capv=CaChannel.CaChannel('SATES30-RIXS:MOT_ABL.VAL') -> THIS IS REALLY BASIC... #capv.state() -#m=epics.Motor('SATES30-RX:MOT_ABL') +#m=epics.Motor('SATES30-RIXS:MOT_ABL') #pv=pvm.PV('RBV') -#dev=epics.Device('SATES30-RX:MOT_ABL.', attrs=('VAL', 'RBV', 'DESC')) +#dev=epics.Device('SATES30-RIXS:MOT_ABL.', attrs=('VAL', 'RBV', 'DESC')) #dev.RBV class SimDevice(): def __init__(self, prefix='', attrs=None,