nice VLS graphics
This commit is contained in:
126
graphEx1.ui
Normal file
126
graphEx1.ui
Normal 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>
|
||||
140
graphExample.py
140
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()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user