nice VLS graphics

This commit is contained in:
2022-11-03 19:12:10 +01:00
parent 03a1885d0a
commit 28822472eb
2 changed files with 226 additions and 40 deletions

126
graphEx1.ui Normal file
View File

@@ -0,0 +1,126 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>800</width>
<height>919</height>
</rect>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
<widget class="QWidget" name="_wdCentral">
<widget class="QWidget" name="gridLayoutWidget">
<property name="geometry">
<rect>
<x>30</x>
<y>580</y>
<width>221</width>
<height>31</height>
</rect>
</property>
<layout class="QGridLayout" name="_wdGridLayout">
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>energy</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QTextEdit" name="textEdit"/>
</item>
</layout>
</widget>
<widget class="QWidget" name="gridLayoutWidget_2">
<property name="geometry">
<rect>
<x>410</x>
<y>220</y>
<width>221</width>
<height>323</height>
</rect>
</property>
<layout class="QGridLayout" name="_wdGridLayout_2">
<item row="5" column="2">
<widget class="QTextEdit" name="textEdit_7"/>
</item>
<item row="1" column="2">
<widget class="QTextEdit" name="textEdit_2"/>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string>R1</string>
</property>
</widget>
</item>
<item row="6" column="2">
<widget class="QLabel" name="label_4">
<property name="text">
<string>R1</string>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QLabel" name="label_7">
<property name="text">
<string>R1</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>R1</string>
</property>
</widget>
</item>
<item row="2" column="2">
<widget class="QTextEdit" name="textEdit_4"/>
</item>
<item row="3" column="2">
<widget class="QTextEdit" name="textEdit_5"/>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_5">
<property name="text">
<string>R1</string>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QLabel" name="label_6">
<property name="geometry">
<rect>
<x>210</x>
<y>680</y>
<width>18</width>
<height>70</height>
</rect>
</property>
<property name="text">
<string>R1</string>
</property>
</widget>
</widget>
<widget class="QMenuBar" name="menubar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>800</width>
<height>22</height>
</rect>
</property>
</widget>
<widget class="QStatusBar" name="statusbar"/>
</widget>
<resources/>
<connections/>
</ui>

View File

@@ -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()