enhance girder vizualization
This commit is contained in:
@@ -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),
|
||||
|
||||
117
graphExample.py
117
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,
|
||||
|
||||
Reference in New Issue
Block a user