From 28822472eb4084ad342193ade20977ea2e4cc133 Mon Sep 17 00:00:00 2001 From: Thierry Zamofing Date: Thu, 3 Nov 2022 19:12:10 +0100 Subject: [PATCH] nice VLS graphics --- graphEx1.ui | 126 +++++++++++++++++++++++++++++++++++++++++++ graphExample.py | 140 ++++++++++++++++++++++++++++++++++-------------- 2 files changed, 226 insertions(+), 40 deletions(-) create mode 100644 graphEx1.ui diff --git a/graphEx1.ui b/graphEx1.ui new file mode 100644 index 0000000..4ae787b --- /dev/null +++ b/graphEx1.ui @@ -0,0 +1,126 @@ + + + MainWindow + + + + 0 + 0 + 800 + 919 + + + + MainWindow + + + + + + 30 + 580 + 221 + 31 + + + + + + + energy + + + + + + + + + + + + 410 + 220 + 221 + 323 + + + + + + + + + + + + + R1 + + + + + + + R1 + + + + + + + R1 + + + + + + + R1 + + + + + + + + + + + + + R1 + + + + + + + + + 210 + 680 + 18 + 70 + + + + R1 + + + + + + + 0 + 0 + 800 + 22 + + + + + + + + diff --git a/graphExample.py b/graphExample.py index 5ddbcec..4acd561 100755 --- a/graphExample.py +++ b/graphExample.py @@ -14,6 +14,7 @@ import numpy as np import PyQt5.QtGui as QtGui import PyQt5.QtCore as QtCore import PyQt5.QtWidgets as QtW +from PyQt5.uic import loadUiType import numpy as np import sys @@ -91,19 +92,28 @@ class RIXSgirder(QWidget): qp.end() -class RIXSgrating(QWidget): + + +#Ui_MainWindow, QMainWindow = loadUiType("graphEx1.ui") +#class RIXSgrating(QMainWindow, Ui_MainWindow): +# def __init__(self, ): +# super(RIXSgrating, self).__init__() +# self.setupUi(self) + +class RIXSgrating(QWidget): def __init__(self): - super().__init__() - self._param={'ctr':(400,400), # location of vlsg - 'aa':20, #grating angle - 'gg':90, #detector angle - 'r1':350,#distance probe grating - 'r2':450,#distance grating detector - 'szG':(200,5), #size VLS grating - 'szD':(150,5), #size detector - } - self.initUI() + super().__init__() + + self._param={'ctr':(400,400), # location of vlsg + 'aa':20, #grating angle + 'gg':90, #detector angle + 'r1':350,#distance probe grating + 'r2':450,#distance grating detector + 'szG':(200,5), #size VLS grating + 'szD':(150,5), #size detector + } + self.initUI() def initUI(self): #p=self.palette() @@ -111,29 +121,50 @@ class RIXSgrating(QWidget): #self.setPalette(p) self.setGeometry(300, 300, 850, 800) self.setWindowTitle('RIXS grating') - #label = QLabel('Python', self) - #label.move(50,50) - b1 = QPushButton("Button1",self) - b1.move(400,150) - w = QWidget(self) - w.move(100,100) - self._wgGrid1=grid=QtGui.QGridLayout(w) - #grid.move(20, 200) - w=QLabel('QLabel') - grid.addWidget(w, 0,0) - w=QPushButton('QPushButton') - grid.addWidget(w, 0,1) - #self.setLayout(grid) + #w.move(400,100) + #w.setFixedSize(200,200) + self._wdGrpEnergy=w=QtGui.QGroupBox("Energy",self) + w.move(10,10) + #w.setFixedSize(200,42+32*2) + l=QtGui.QGridLayout(w) + for i,t in enumerate(('Energy',)): + w=QLabel(t) + l.addWidget(w, i,0) + w=QtGui.QLineEdit(t) + l.addWidget(w, i,1) + + self._wdGrpEnergy + w=QtGui.QPushButton('calc geometry') + l.addWidget(w, i+1, 1) + + w=QtGui.QGroupBox("Geometry",self) + w.move(240,10) + #w.setFixedSize(200,42+32*4) + l=QtGui.QGridLayout(w) + #for i,t in enumerate(('R1','R2','alpha','beta','gamma',)): + for i, t in enumerate(('R1', 'R2', '\u03B1','\u03B2', '\u03B3',)): + w=QLabel(t) + l.addWidget(w, i,0) + w=QtGui.QLineEdit(t) + l.addWidget(w, i,1) + w=QtGui.QPushButton('calc raw motors') + l.addWidget(w, i+1, 1) + + + + w=QtGui.QGroupBox("Drawing",self) + w.move(10,150) + l=QtGui.QVBoxLayout(w) sld={} - for key,rng,tk,pos in (('aa',(0,90),5,20),('gg',(0,180),5,40),('r1',(200,500),5,60),('r2',(200,500),5,80)): - sl=QtGui.QSlider(QtCore.Qt.Horizontal,self) + for key,rng,tk,pos in (('r1',(50,800),50,60),('r2',(50,800),50,80),('aa',(0,90),5,20),('gg',(0,180),5,40),): + sl=QtGui.QSlider(QtCore.Qt.Horizontal) sl.setFixedWidth(200);sl.setMinimum(rng[0]);sl.setMaximum(rng[1]) sl.setValue(self._param[key]) sl.setTickPosition(QtGui.QSlider.TicksBelow);sl.setTickInterval(tk) - sl.move(20,pos) + l.addWidget(sl) sl.valueChanged.connect(lambda val,key=key: self.sldChanged(key,val)) sld[key]=sl @@ -150,6 +181,7 @@ class RIXSgrating(QWidget): r1=p['r1'] r2=p['r2'] aa=p['aa'] + bb=aa*1.5 gg=p['gg'] szG=p['szG'] szD=p['szD'] @@ -160,13 +192,13 @@ class RIXSgrating(QWidget): #plot black background w=int(max(szG[0],szD[0])/2) - ctr=(max(ctr[0],w+r1),max(w+r2*np.sin(aa*2*np.pi/180),ctr[1])) + ctr=(max(ctr[0],w+r1),max(w+r2*np.sin((aa+bb)*np.pi/180),ctr[1])) qp.translate(ctr[0],ctr[1]) qp.setBrush(QColor(0, 0, 0)) qp.drawRect(-r1, -w, r1, 2*w) qp.drawEllipse(-r1-w, -w, 2*w, 2*w) qp.drawEllipse(-w, -w, 2*w, 2*w) - qp.rotate(180-2*aa) + qp.rotate(180-aa-bb) qp.drawRect(-r2, -w, r2, 2*w) qp.drawEllipse(-r2-w, -w, 2*w, 2*w) @@ -185,11 +217,12 @@ class RIXSgrating(QWidget): qp.rotate(-aa) tf1=qp.transform() qp.drawRect(int(-szG[0]/2), 0, szG[0], szG[1]) # grating - qp.rotate(-aa) + qp.rotate(-bb) + tf2=qp.transform() qp.drawLine(0,0,r2,0) #beam qp.translate(r2,0) qp.rotate(-gg) - tf2=qp.transform() + tf3=qp.transform() qp.drawRect(int(-szD[0]/2),0 , szD[0], szD[1]) # detector #beam target to vlsg @@ -211,21 +244,48 @@ class RIXSgrating(QWidget): col.setHsv(i*16,255,255,120) pen.setColor(col) qp.setPen(pen) - p2=QtCore.QPointF(*tf2.map(-szD[0]/2+szD[0]*i/(n-1),0)) + p2=QtCore.QPointF(*tf3.map(-szD[0]/2+szD[0]*i/(n-1),0)) qp.drawLine(p0,p2) qp.drawLine(p1,p2) + qp.setCompositionMode(QtGui.QPainter.CompositionMode_SourceOver) + pen=QtGui.QPen(QtCore.Qt.red, 3, QtCore.Qt.SolidLine) + qp.setPen(pen) + p0=QtCore.QPointF(*tf0.map(-r1-10, +10)) + p1=QtCore.QPointF(*tf0.map(-r1-10, 50+w)) + qp.drawLine(p0,p1) + p2=QtCore.QPointF(*tf0.map(0, 0)) + p3=QtCore.QPointF(*tf0.map(0, 50+w)) + qp.drawLine(p2,p3) + p4=(p1+p3)/2 + qp.drawText(p4,f'R1={r1:.5g}mm') + p5=QtCore.QPointF(*tf2.map(0, 50+w)) + qp.drawLine(p2,p5) + p6=QtCore.QPointF(*tf2.map(r2, 0)) + p7=QtCore.QPointF(*tf2.map(r2, 50+w)) + qp.drawLine(p6,p7) + p8=(p5+p7)/2 + qp.drawText(p8,f'R2={r2:.5g}mm') - return + p9=QtCore.QPointF(*tf1.map(0, -w)) + qp.drawLine(p2,p9) + s=50 + qp.drawArc(int(p2.x())-s, int(p2.y())-s, 2*s, 2*s, 180*16, (aa)*16) + qp.drawText(p2+QtCore.QPointF(-s,s),f'aa={aa:.5g}°') + qp.drawArc(int(p2.x())-s, int(p2.y())-s, 2*s, 2*s, aa*16, bb*16) + qp.drawText(p2+QtCore.QPointF(s,s),f'bb={bb:.5g}°') + + qp.drawArc(int(p6.x())-s, int(p6.y())-s, 2*s, 2*s, (180+aa+bb)*16, (gg)*16) + p10=QtCore.QPointF(*tf2.map(r2+20, 0)) + qp.drawText(p10,f'gg={gg:.5g}°') + + #for i,p in enumerate((p0,p1,p2,p3,p4,p5,p6,p7,p8,p9)): + # qp.drawText(p,f'P{i}') + + + #p5=QtCore.QPointF(*tf1.map(-r2-10, 50+w)) - qp.drawEllipse(-100, -100, 200, 200) # big chamber - qp.drawEllipse(-10, -10, 20, 20) # target - qp.drawLine(0,-150,0,-10) #beam - qp.rotate(-45) - 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.end()