Initial test of matching
This commit is contained in:
@@ -26,7 +26,7 @@ class OpticsTools(QtWidgets.QMainWindow, Ui_OpticsGUI):
|
||||
|
||||
# initialize online model
|
||||
self.model = Model(phase=phase,parent=self)
|
||||
self.matching = Matching(parent=self,model = self.model)
|
||||
|
||||
if phase > 0:
|
||||
office = True
|
||||
self.machine = Machine(parent = True, office = office)
|
||||
@@ -42,6 +42,7 @@ class OpticsTools(QtWidgets.QMainWindow, Ui_OpticsGUI):
|
||||
self.loadSettingsdirect("/sf/data/applications/BD-OpticsTools/reference/settings/ReferenceSetting.json")
|
||||
self.sandbox.updateSandbox()
|
||||
self.reference = ReferenceManager(parent=self)
|
||||
self.matching = Matching(parent=self, model=self.model, reference = self.reference)
|
||||
|
||||
# events handling
|
||||
self.actionOpen_2.triggered.connect(self.loadSettings)
|
||||
|
||||
96
generateMatchSettings.py
Normal file
96
generateMatchSettings.py
Normal file
@@ -0,0 +1,96 @@
|
||||
import json
|
||||
|
||||
varypar={'min:':-1e-6,'max:':1e-6,'preset':0}
|
||||
|
||||
def MatchStep(ref,id,end, dest,sequence='SwissFEL',saveTwiss=False):
|
||||
match={'Reference':ref,'MatchID':id,'End':end, 'Destination':dest,'Sequence':sequence}
|
||||
return match
|
||||
|
||||
def MatchParameter(var0,tar0):
|
||||
var={key: varypar for key in var0}
|
||||
tar= tar0
|
||||
return {'Variable':var,'Target':tar}
|
||||
|
||||
def MatchReference(loc,twiss):
|
||||
match ={'Location': loc, 'Twiss': twiss}
|
||||
return match
|
||||
|
||||
|
||||
|
||||
#def MatchTar(tar_in)
|
||||
# tar_out={}
|
||||
# for tar in tar_in:
|
||||
# if 'Reference' in tar.key():
|
||||
# res=self.getReferenceByTag(tar['Reference'])
|
||||
# tar_out[res['Location']]=res['Twiss']
|
||||
# return tar_out
|
||||
|
||||
|
||||
|
||||
#def MatchFixed(var0,start,cond):
|
||||
# var = {key: varypar for key in var0}
|
||||
# match={'Variable':var,'Start':start,'Constraint':cond}
|
||||
# return match
|
||||
|
||||
|
||||
|
||||
|
||||
#def MatchPeriodic(seq,var,tar,save):
|
||||
# match={'Sequence':seq,'Variable':var,'Target':tar,'Save':save}
|
||||
# return match
|
||||
|
||||
#def MatchCondition(par,val,loc,cond):
|
||||
# match={'Parameter':par,'Value':val,'Location':loc,'Condition':cond}
|
||||
# return match
|
||||
|
||||
|
||||
|
||||
|
||||
path ="Settings/"
|
||||
label='Reference'
|
||||
|
||||
order = []
|
||||
order.append(MatchStep('Start', 'Laser Heater','SINLH02','SATBD01'))
|
||||
order.append(MatchStep(None, 'SINSB04', None,'SATBD01','SINSB04',True))
|
||||
#order.append(MatchStep('Laser Heater', 'Match to SINSB04','Dependent','Athos'))
|
||||
#order.append(MatchStep('Laser Heater', 'Bunch Compressor 1','Fixed','Athos'))
|
||||
#order.append(MatchStep('Bunch Compressor 1', 'Linac 1','Periodic','Athos'))
|
||||
#order.append(MatchStep('Bunch Compressor 1', 'Match to Linac 1','Dependent','Athos'))
|
||||
#order.append(MatchStep('Bunch Compressor 1', 'Bunch Compressor 2','Fixed','Athos'))
|
||||
|
||||
parameter={}
|
||||
var = ['SINLH01-MQUA020', 'SINLH01-MQUA040','SINLH01-MQUA050','SINLH01-MQUA070','SINLH02-MQUA010']
|
||||
parameter['Laser Heater'] = MatchParameter(var,[{'Reference':'Laser Heater'}])
|
||||
var = ['SINSB04-MQUA130','SINSB04-MQUA230']
|
||||
parameter['SINSB04'] = MatchParameter(var,[{'Fixed':{'Location':'#e','Twiss':{'MUX':0.2,'MUY':0.2}}}])
|
||||
|
||||
|
||||
dependence={}
|
||||
dependence['S10CB01-MQUA230']=['S20CB02-MQUA230','S10DI01-MQUA120'] + ['S20CB%2.2d-MQUA430' %i for i in range(3,9)]
|
||||
dependence['S10CB01-MQUA430']=['S20CB02-MQUA430'] + ['S20CB%2.2d-MQUA230' %i for i in range(3,9)]
|
||||
|
||||
|
||||
#periodic={}
|
||||
#target=[MatchCondition('MUX',0.2,'#e','='), MatchCondition('MUY',0.2,'#e','=')]
|
||||
#variable = ['SINSB04-MQUA130','SINSB04-MQUA230']
|
||||
#periodic['SINSB04']=MatchPeriodic('SINSB04',variable,target,{})
|
||||
#target=[MatchCondition('MUX',0.1883,'#e','='), MatchCondition('MUY',0.1883,'#e','=')]
|
||||
#variable = ['S10CB01-MQUA230','S10CB01-MQUA430']
|
||||
#periodic['Linac 1']=MatchPeriodic('S10CB01',variable,target,{})
|
||||
|
||||
reference={}
|
||||
reference['Start'] = MatchReference('start',{'betax':29.971,'alphax':0.003,'betay':26.00,'alphay':-0.288})
|
||||
reference['Laser Heater'] = MatchReference('sinlh02.mqua410$start',{'betax': 11.2, 'alphax': 3.2,'betay': 0.8, 'alphay': 0.75,})
|
||||
reference['Bunch Compressor 1'] = MatchReference('sindi02.mqua020$start',{'betax': 11.1557, 'alphax': -1.17,'betay': 50, 'alphay': 0.})
|
||||
reference['Bunch Compressor 2'] = MatchReference('s10ma01.mqua020$start',{'betax': 6.14, 'alphax': -0.83,'betay': 22.86, 'alphay': -1.18})
|
||||
reference['Switchyard'] = MatchReference('s20sy02.mqua070$start',{'betax': 12.99, 'alphax': 3.7011,'betay': 46.339, 'alphay': -6.501})
|
||||
reference['Linac3'] = MatchReference('s30cb10.mqua430$start',{'betax': 8.83,'alphax': 0.548,'betay': 30.44,'alphay': -1.866})
|
||||
reference['Aramis Stopper'] = MatchReference('sarma01.mqua010$start',{'betax': 2.304, 'alphax': -1.4045, 'betay': 25.929, 'alphay': -6.363})
|
||||
reference['Athos HERO'] = MatchReference('satdi01.mqua250$start',{'betax': 35.76, 'alphax': -1.166,'betay': 24.087, 'alphay': 0.648})
|
||||
reference['Athos Deflector'] = MatchReference('satbd01.mqua010$start',{'betax': 50, 'alphax': 0,'betay': 50, 'alphay': 0})
|
||||
|
||||
|
||||
settings={'Label':label,'Order':order,'Dependence':dependence,'Reference':reference,'Parameter':parameter}
|
||||
|
||||
with open(path+label+'.json', 'w', encoding='utf-8') as f:
|
||||
json.dump(settings, f, ensure_ascii=False, indent=4)
|
||||
71
matching.py
71
matching.py
@@ -1,25 +1,58 @@
|
||||
from matchingmanager import MatchManager
|
||||
|
||||
converttwiss= {'betax':'betx','betay':'bety','alphax':'alfx','alphay':'alfy',
|
||||
'etax':'dx','etay':'dy','etapx':'dpx','etapy':'dpy',
|
||||
'x':'x','y':'y','px':'px','py':'py','energy':'energy'}
|
||||
|
||||
class Matching:
|
||||
def __init__(self,parent=None,model=None):
|
||||
def __init__(self,parent=None,model=None,reference = None):
|
||||
self.parent = parent
|
||||
self.model = model
|
||||
self.manager = MatchManager(parent=parent)
|
||||
self.parent.UIMFodoMatchSingle.clicked.connect(self.matchingFodo)
|
||||
self.reference = reference
|
||||
|
||||
def matchingFodo(self):
|
||||
print('matching')
|
||||
par = self.manager.getFODOParameters()
|
||||
if par is None:
|
||||
self.destination=''
|
||||
|
||||
def match(self):
|
||||
config = self.reference.getMatchingPoint()
|
||||
if config is None:
|
||||
return
|
||||
quads=par['Quads']
|
||||
vals=par['Init']
|
||||
if par['FlipPol']:
|
||||
vals = [-val for val in vals]
|
||||
var = {name:vals[i] for i,name in enumerate(quads)}
|
||||
cond = {'range':'#e','mux':par['mu'],'muy':par['mu']}
|
||||
res,twiss,tar = self.model.match(sequence=par['Sequence'], destination=par['Destination'],variables=var, conditions=cond, periodic=True)
|
||||
par['Result']=tar
|
||||
par['Twiss']=twiss
|
||||
print(res)
|
||||
self.manager.setFODOParameters(par)
|
||||
vars = {}
|
||||
for var in config['Variable']:
|
||||
var0=var.replace('-','.').lower()
|
||||
if 'mqua' in var0 or 'mqsk' in var0:
|
||||
var0 += '.k1'
|
||||
elif 'msex' in var0:
|
||||
var0 += '.k2'
|
||||
vars[var0]={'Min':-1e6,'Max':1e6,'Preset':0,'Step':0.00001}
|
||||
|
||||
|
||||
|
||||
print(vars)
|
||||
|
||||
|
||||
return
|
||||
if not config['End'] == self.destination:
|
||||
self.destination = config['End']
|
||||
self.model.setBranch(self.destination)
|
||||
start=config['Reference']['Location']
|
||||
if not start in self.reference.reference.keys():
|
||||
return
|
||||
twiss_in = self.reference.reference[start]['Twiss']
|
||||
twiss0 = {converttwiss[key]: twiss_in[key] for key in twiss_in.keys()}
|
||||
twiss0['Energy']= 150.*1e-3
|
||||
loc = self.reference.reference[start]['Location']
|
||||
print(loc)
|
||||
print(twiss0)
|
||||
print(config['Variable'])
|
||||
#
|
||||
|
||||
|
||||
def matchold(self,sequence,destination, variables,conditions,periodic=False,plot=True):
|
||||
self.setBranch(destination.upper())
|
||||
twiss={'energy0':150.}
|
||||
self.madx.updateVariables(twiss)
|
||||
res,twiss,tar=self.madx.match(sequence,variables,conditions,periodic)
|
||||
energy = self.calcEnergyProfile(twiss)
|
||||
matchtwiss={'betax':twiss.betx[0],'betay':twiss.bety[0],'alphax':twiss.alfx[0],'alphay':twiss.alfy[0]}
|
||||
if plot:
|
||||
self.parent.plot.newData(twiss, energy)
|
||||
return res, matchtwiss,tar
|
||||
|
||||
66
model.py
66
model.py
@@ -6,7 +6,7 @@ from onlinemodel.core import Facility
|
||||
from onlinemodel.madx import CMadX
|
||||
|
||||
converttwiss= {'betax':'betx','betay':'bety','alphax':'alfx','alphay':'alfy',
|
||||
'etax':'dx','etay':'dy','etapx':'dpx','etapy':'dpy',
|
||||
'etax':'dx','etay':'dy','etapx':'dpx','etapy':'dpy','mux':'mux','muy':'muy',
|
||||
'x':'x','y':'y','px':'px','py':'py','energy':'energy'}
|
||||
|
||||
|
||||
@@ -26,6 +26,11 @@ class Model:
|
||||
# hook up events
|
||||
self.eventHandling()
|
||||
|
||||
def eventHandling(self):
|
||||
self.parent.UITrack.clicked.connect(self.track)
|
||||
self.parent.UIMatchSelected.clicked.connect(self.match)
|
||||
|
||||
|
||||
def getLatticeVersion(self):
|
||||
return self.om.Version
|
||||
|
||||
@@ -123,9 +128,6 @@ class Model:
|
||||
print(settings['Energy']['energy'])
|
||||
print('Energy in system',self.om.EnergyAt(self.energyReference)[0])
|
||||
|
||||
|
||||
|
||||
|
||||
##### very old code should be become obsolete after some nice matching files
|
||||
def updateModel(self):
|
||||
file ='SwissFELRef.json'
|
||||
@@ -165,20 +167,47 @@ class Model:
|
||||
##############################33
|
||||
# tracking
|
||||
|
||||
def eventHandling(self):
|
||||
self.parent.UITrack.clicked.connect(self.track)
|
||||
|
||||
def match(self,sequence,destination, variables,conditions,periodic=False,plot=True):
|
||||
self.setBranch(destination.upper())
|
||||
twiss={'energy0':150.}
|
||||
self.madx.updateVariables(twiss)
|
||||
res,twiss,tar=self.madx.match(sequence,variables,conditions,periodic)
|
||||
energy = self.calcEnergyProfile(twiss)
|
||||
matchtwiss={'betax':twiss.betx[0],'betay':twiss.bety[0],'alphax':twiss.alfx[0],'alphay':twiss.alfy[0]}
|
||||
def match(self):
|
||||
config = self.parent.reference.getMatchingPoint()
|
||||
self.setBranch(config['Destination'])
|
||||
if config['Reference'] is None:
|
||||
start='#s'
|
||||
end='#e'
|
||||
itwiss=None
|
||||
else:
|
||||
start=config['Reference']['Location']
|
||||
if start.upper() == 'START':
|
||||
start='#s'
|
||||
end = config['End']+'$end'
|
||||
itwiss = {converttwiss[key.lower()]:config['Reference']['Twiss'][key] for key in config['Reference']['Twiss'].keys()}
|
||||
var={}
|
||||
for key in config['Variable'].keys():
|
||||
key0=key.replace('-','.').lower()
|
||||
if 'mqua' or 'mqsk' in key0:
|
||||
key0+='.k1'
|
||||
elif 'msex' in key0:
|
||||
key0+='.k2'
|
||||
var[key0]=config['Variable'][key]
|
||||
conf0={}
|
||||
for key in config['Target'].keys():
|
||||
sconf = config['Target'][key]
|
||||
conf0[key] = {converttwiss[key0.lower()]:sconf[key0] for key0 in sconf.keys()}
|
||||
|
||||
|
||||
res,twiss,err=self.madx.match(sequence=config['Sequence'], start=start, end=end,
|
||||
init=itwiss, var=var, const=conf0,
|
||||
preset=False,random=False)
|
||||
print(res)
|
||||
print(err)
|
||||
plot = True
|
||||
if plot:
|
||||
self.parent.plot.newData(twiss, energy)
|
||||
return res, matchtwiss,tar
|
||||
energy = self.calcEnergyProfile(twiss)
|
||||
print('Plotting')
|
||||
self.parent.plot.newData(twiss,energy)
|
||||
|
||||
##################
|
||||
# tracking
|
||||
|
||||
def track(self):
|
||||
start = str(self.parent.UITrackStart.text()).upper()
|
||||
@@ -187,12 +216,11 @@ class Model:
|
||||
start = start[0:7]
|
||||
if len(end)>7:
|
||||
end = end[0:7]
|
||||
twiss0 = self.parent.reference.getReferencePoint()
|
||||
refloc = self.parent.reference.getReferenceLocation().upper()
|
||||
if refloc == 'START':
|
||||
refloc, twiss0 = self.parent.reference.getReference()
|
||||
|
||||
if refloc.upper() == 'START':
|
||||
refloc = start.upper()
|
||||
twiss0['energy'] = self.startEnergy*1e-3 # convert to GeV for madx
|
||||
|
||||
start, end = self.checkRange(start, end, refloc[0:7])
|
||||
if start is None:
|
||||
return
|
||||
|
||||
1
plot.py
1
plot.py
@@ -102,6 +102,7 @@ class OpticsPlot(QtWidgets.QMainWindow, Ui_OpticsPlotGUI):
|
||||
self.energyref=copy.deepcopy(self.energy)
|
||||
|
||||
def newData(self,twiss,energy):
|
||||
print('Updating Plotting Data')
|
||||
self.twiss=twiss
|
||||
self.energy=energy
|
||||
self.updateOpticsTable()
|
||||
|
||||
234
reference.py
234
reference.py
@@ -1,7 +1,23 @@
|
||||
import json
|
||||
|
||||
from PyQt5 import QtCore, QtGui, QtWidgets
|
||||
from fontTools.misc.cython import returns
|
||||
|
||||
CBeige = QtGui.QColor(250, 240, 200)
|
||||
CGreen = QtGui.QColor(100, 255, 100)
|
||||
CYellow = QtGui.QColor(255, 255, 0)
|
||||
CRed = QtGui.QColor(255, 100, 100)
|
||||
|
||||
|
||||
|
||||
|
||||
class ReferenceManager:
|
||||
def __init__(self, parent):
|
||||
self.parent = parent
|
||||
self.settings={}
|
||||
self.reference={}
|
||||
self.label=None
|
||||
|
||||
self.twisswidget={'betax':self.parent.UIBetax,'betay':self.parent.UIBetay,
|
||||
'alphax':self.parent.UIAlphax,'alphay':self.parent.UIAlphay,
|
||||
'etax':self.parent.UIEtax,'etay':self.parent.UIEtay,
|
||||
@@ -10,25 +26,176 @@ class ReferenceManager:
|
||||
'px':self.parent.UIPX,'py':self.parent.UIPY}
|
||||
|
||||
|
||||
self.defineReferencePoints()
|
||||
self.loadReference('Settings/Reference.json')
|
||||
self.parent.UITrackReference.currentIndexChanged.connect(self.updateReferenceWidgets)
|
||||
#self.parent.UIMatchOrder.itemClicked.connect(self.updateMatchingPoint)
|
||||
|
||||
|
||||
|
||||
def loadReference(self, filename):
|
||||
with open(filename) as f:
|
||||
self.settings = json.load(f)
|
||||
self.order={ele['MatchID']:i for i,ele in enumerate(self.settings['Order'])}
|
||||
self.reference=self.settings['Reference']
|
||||
self.label=self.settings['Label']
|
||||
self.parameter=self.settings['Parameter']
|
||||
self.parent.UIMatchSequenceLabel.setText(self.label)
|
||||
self.updateReferenceComboBox()
|
||||
self.updateReferenceWidgets()
|
||||
self.parent.UITrackReference.currentIndexChanged.connect(self.updateReferenceWidgets)
|
||||
self.updateMatchOrder()
|
||||
|
||||
|
||||
|
||||
|
||||
def getMatchingPoint(self):
|
||||
idx = self.parent.UIMatchOrder.currentRow()
|
||||
if idx < 0:
|
||||
return None
|
||||
|
||||
ID = str(self.parent.UIMatchOrder.item(idx).text())
|
||||
print('Matching Step Label:', ID)
|
||||
idx = self.order[ID] # get index in the list
|
||||
order = self.settings['Order'][idx] # getting the specific entry from the order list
|
||||
if not order['Reference'] is None: # has a fixed referenc epoint instead of periodic solution
|
||||
twiss0 = self.getReferenceByTag(order['Reference']) # get the starting parameters by its reference
|
||||
order['Reference'] = twiss0 # put it back into the order variable
|
||||
order['Variable'] = self.parameter[ID]['Variable']
|
||||
nvar = len(order['Variable'].keys())
|
||||
target0= self.parameter[ID]['Target']
|
||||
target = {}
|
||||
ncon = 0
|
||||
for tar in target0:
|
||||
if 'Reference' in tar.keys():
|
||||
par=self.getReferenceByTag(tar['Reference'])
|
||||
loc = par['Location']
|
||||
con = {key:{'Val':par['Twiss'][key],'Condition':0} for key in par['Twiss'].keys()}
|
||||
target[loc]=con
|
||||
ncon += len(con.keys())
|
||||
elif 'Fixed' in tar.keys():
|
||||
loc=tar['Fixed']['Location']
|
||||
con = {key: {'Val': tar['Fixed']['Twiss'][key], 'Condition': 0} for key in tar['Fixed']['Twiss'].keys()}
|
||||
target[loc]=con
|
||||
ncon += len(con.keys())
|
||||
if nvar>ncon:
|
||||
dummycon={}
|
||||
for key in order['Reference']['Twiss'].keys():
|
||||
if ncon < nvar:
|
||||
dummycon[key]={'Val':order['Reference']['Twiss'][key],'Condition':0}
|
||||
ncon+=1
|
||||
target['#s']=dummycon
|
||||
order['Target'] = target
|
||||
return order
|
||||
|
||||
|
||||
#### all event selecting some tracking points
|
||||
|
||||
#--------------------------------
|
||||
# match info
|
||||
def updateMatchOrder(self):
|
||||
self.parent.UIMatchOrder.clear()
|
||||
for i,ele in enumerate(self.settings['Order']):
|
||||
self.parent.UIMatchOrder.addItem(ele['MatchID'])
|
||||
self.parent.UIMatchOrder.item(i).setBackground(CBeige)
|
||||
|
||||
def updateMatchingPoint(self):
|
||||
idx = self.parent.UIMatchOrder.currentRow()
|
||||
if idx < 0:
|
||||
return
|
||||
ID = str(self.parent.UIMatchOrder.item(idx).text())
|
||||
idx = self.order[ID]
|
||||
order=self.settings['Order'][idx]
|
||||
reference = order['Reference']
|
||||
type = order['Type']
|
||||
loc = self.reference[reference]['Location']
|
||||
self.parent.UIMatchLabel.setText(ID)
|
||||
self.parent.UIMatchType.setText(type)
|
||||
self.parent.UIMatchStart.setText(loc)
|
||||
if type == 'Periodic':
|
||||
var,tar=self.updateMatchPointPeriodic(ID)
|
||||
elif type == 'Fixed':
|
||||
var,tar=self.updateMatchPointFixed(ID)
|
||||
else:
|
||||
return
|
||||
if var is None:
|
||||
var =[]
|
||||
tar = []
|
||||
self.updateKnobs(var)
|
||||
self.updateTargets(tar)
|
||||
|
||||
def updateMatchPointFixed(self, ID):
|
||||
if not ID in self.reference.keys():
|
||||
return
|
||||
var = self.settings['Fixed'][ID]['Variable']
|
||||
reflab = self.settings['Fixed'][ID]['Reference']
|
||||
if not reflab in self.reference.keys():
|
||||
return None, None
|
||||
ref=self.reference[reflab]
|
||||
tar=[]
|
||||
for ele in ref['Twiss'].keys():
|
||||
ele0 = ele.replace('beta','bet').replace('alpha','alf').upper()
|
||||
tar.append({'Parameter':ele0,'Condition':'=','Value':ref['Twiss'][ele],'Location':ref['Location']})
|
||||
return var,tar
|
||||
|
||||
|
||||
|
||||
def updateMatchPointPeriodic(self,ID):
|
||||
if not ID in self.settings['Periodic'].keys():
|
||||
return None, None
|
||||
var = self.settings['Periodic'][ID]['Variable']
|
||||
tar = self.settings['Periodic'][ID]['Target']
|
||||
return var,tar
|
||||
|
||||
def updateKnobs(self,var):
|
||||
self.parent.UIMatchKnobs.clear()
|
||||
for ele in var:
|
||||
self.parent.UIMatchKnobs.addItem(ele)
|
||||
|
||||
def updateTargets(self,tar):
|
||||
self.parent.UIMatchTargets.clear()
|
||||
self.parent.UIMatchTargets.setColumnCount(4)
|
||||
self.parent.UIMatchTargets.setRowCount(len(tar))
|
||||
for irow,ele in enumerate(tar):
|
||||
self.parent.UIMatchTargets.setItem(irow, 0, QtWidgets.QTableWidgetItem(ele['Parameter']))
|
||||
self.parent.UIMatchTargets.setItem(irow, 1, QtWidgets.QTableWidgetItem(ele['Condition']))
|
||||
self.parent.UIMatchTargets.setItem(irow, 2, QtWidgets.QTableWidgetItem('%7.3f' % ele['Value']))
|
||||
self.parent.UIMatchTargets.setItem(irow, 3, QtWidgets.QTableWidgetItem(ele['Location']))
|
||||
self.parent.UIMatchTargets.resizeColumnsToContents()
|
||||
self.parent.UIMatchTargets.verticalHeader().hide()
|
||||
self.parent.UIMatchTargets.horizontalHeader().hide()
|
||||
|
||||
#--------------------------------
|
||||
# obtaining reference data
|
||||
def getReference(self):
|
||||
return self.getReferenceLocation(),self.getReferenceTwiss()
|
||||
|
||||
def getReferenceByTag(self,tag):
|
||||
if not tag in self.reference.keys():
|
||||
return None
|
||||
return self.reference[tag]
|
||||
|
||||
|
||||
def getReferenceTwiss(self):
|
||||
self.updateReferenceWidgets() # enforce that the data is consistent
|
||||
twiss = {key:float(str(self.twisswidget[key].text())) for key in self.twisswidget.keys()}
|
||||
return twiss
|
||||
|
||||
def getReferenceLocation(self):
|
||||
return str(self.parent.UITrackLocation.text())
|
||||
|
||||
|
||||
##### interaction of the tracking reference point
|
||||
|
||||
def swithToUserDefinedLocation(self):
|
||||
n = self.parent.UITrackReference.count()
|
||||
self.parent.UITrackReference.setCurrentIndex(n-1)
|
||||
|
||||
def updateReferenceLocation(self,location):
|
||||
self.parent.UITrackLocation.setText(location)
|
||||
def updateReferenceWidgets(self):
|
||||
key = str(self.parent.UITrackReference.currentText())
|
||||
if key == 'User Defined':
|
||||
return
|
||||
|
||||
def updateReferencePoint(self,twiss):
|
||||
twiss = self.reference[key]['Twiss']
|
||||
name = self.reference[key]['Location']
|
||||
self.parent.UITrackLocation.setText(name)
|
||||
for key in self.twisswidget.keys():
|
||||
if key in twiss.keys():
|
||||
value = twiss[key]
|
||||
@@ -38,62 +205,9 @@ class ReferenceManager:
|
||||
value = 30
|
||||
self.twisswidget[key].setText('%7.3f' % value)
|
||||
|
||||
def getReferencePoint(self):
|
||||
self.updateReferenceWidgets() # enforce that the data is consistent
|
||||
twiss = {key:float(str(self.twisswidget[key].text())) for key in self.twisswidget.keys()}
|
||||
return twiss
|
||||
|
||||
def getReferenceLocation(self):
|
||||
return str(self.parent.UITrackLocation.text())
|
||||
|
||||
|
||||
def updateReferenceWidgets(self):
|
||||
key = str(self.parent.UITrackReference.currentText())
|
||||
if key == 'User Defined':
|
||||
return
|
||||
elif key == 'Start':
|
||||
twiss = {key[0:-1]:self.parent.model.startTwiss[key] for key in self.parent.model.startTwiss.keys()} # strip of the zero
|
||||
name = 'Start'
|
||||
else:
|
||||
twiss = self.reference['Reference'][key]['twiss']
|
||||
name = self.reference['Reference'][key]['location']
|
||||
self.updateReferenceLocation(name)
|
||||
self.updateReferencePoint(twiss)
|
||||
|
||||
def updateReferenceComboBox(self):
|
||||
self.parent.UITrackReference.clear()
|
||||
self.parent.UITrackReference.addItem('Start')
|
||||
for ref in self.reference['Reference'].keys():
|
||||
for ref in self.reference.keys():
|
||||
self.parent.UITrackReference.addItem(ref)
|
||||
self.parent.UITrackReference.addItem('User Defined')
|
||||
|
||||
def defineReferencePoints(self):
|
||||
self.reference={'Reference':{}}
|
||||
self.reference['Reference']['Laser Heater']=self.defineRef('sinlh02.mqua410$start',
|
||||
{'betax':11.2,'alphax':3.2,
|
||||
'betay':0.8,'alphay':0.75})
|
||||
self.reference['Reference']['Bunch Compressor1']=self.defineRef('sindi02.mqua020$start',
|
||||
{'betax': 11.1557,'alphax': -1.17,
|
||||
'betay': 50, 'alphay': 0.})
|
||||
self.reference['Reference']['Bunch Compressor 2']=self.defineRef('s10ma01.mqua020$start',
|
||||
{'betax': 6.14, 'alphax': -0.83,
|
||||
'betay': 22.86,'alphay': -1.18})
|
||||
self.reference['Reference']['Switchyard']=self.defineRef('s20sy02.mqua070$start',
|
||||
{'betax': 12.99, 'alphax': 3.7011,
|
||||
'betay': 46.339,'alphay': -6.501})
|
||||
self.reference['Reference']['Linac3']=self.defineRef('s30cb10.mqua430$start',
|
||||
{'betax': 8.83, 'alphax': 0.548,
|
||||
'betay': 30.44, 'alphay': -1.866})
|
||||
self.reference['Reference']['Aramis Stopper']=self.defineRef('sarma01.mqua010$start',
|
||||
{'betax': 2.304, 'alphax': -1.4045,
|
||||
'betay': 25.929, 'alphay': -6.363})
|
||||
self.reference['Reference']['Athos HERO']=self.defineRef('satdi01.mqua250$start',
|
||||
{'betax': 35.76, 'alphax': -1.166,
|
||||
'betay': 24.087, 'alphay': 0.648})
|
||||
self.reference['Reference']['Athos Deflector']=self.defineRef('satbd01.mqua010$start',
|
||||
{'betax': 50, 'alphax': 0,
|
||||
'betay': 50, 'alphay': 0})
|
||||
|
||||
def defineRef(self,location,twiss):
|
||||
ref={'location':location,'twiss':twiss}
|
||||
return ref
|
||||
@@ -34,18 +34,6 @@ class Ui_OpticsGUI(object):
|
||||
self.widget_2.setObjectName("widget_2")
|
||||
self.verticalLayout = QtWidgets.QVBoxLayout(self.widget_2)
|
||||
self.verticalLayout.setObjectName("verticalLayout")
|
||||
self.UISettingState = QtWidgets.QComboBox(self.widget_2)
|
||||
font = QtGui.QFont()
|
||||
font.setPointSize(12)
|
||||
font.setBold(True)
|
||||
font.setWeight(75)
|
||||
self.UISettingState.setFont(font)
|
||||
self.UISettingState.setObjectName("UISettingState")
|
||||
self.UISettingState.addItem("")
|
||||
self.UISettingState.addItem("")
|
||||
self.UISettingState.addItem("")
|
||||
self.UISettingState.addItem("")
|
||||
self.verticalLayout.addWidget(self.UISettingState)
|
||||
self.UITrack = QtWidgets.QPushButton(self.widget_2)
|
||||
font = QtGui.QFont()
|
||||
font.setPointSize(12)
|
||||
@@ -437,6 +425,102 @@ class Ui_OpticsGUI(object):
|
||||
self.TabMaster.addTab(self.tab, "")
|
||||
self.tab_2 = QtWidgets.QWidget()
|
||||
self.tab_2.setObjectName("tab_2")
|
||||
self.horizontalLayout_9 = QtWidgets.QHBoxLayout(self.tab_2)
|
||||
self.horizontalLayout_9.setObjectName("horizontalLayout_9")
|
||||
self.verticalLayout_6 = QtWidgets.QVBoxLayout()
|
||||
self.verticalLayout_6.setObjectName("verticalLayout_6")
|
||||
self.label_22 = QtWidgets.QLabel(self.tab_2)
|
||||
font = QtGui.QFont()
|
||||
font.setPointSize(12)
|
||||
font.setBold(True)
|
||||
font.setWeight(75)
|
||||
self.label_22.setFont(font)
|
||||
self.label_22.setObjectName("label_22")
|
||||
self.verticalLayout_6.addWidget(self.label_22)
|
||||
self.horizontalLayout_8 = QtWidgets.QHBoxLayout()
|
||||
self.horizontalLayout_8.setObjectName("horizontalLayout_8")
|
||||
self.label_14 = QtWidgets.QLabel(self.tab_2)
|
||||
self.label_14.setObjectName("label_14")
|
||||
self.horizontalLayout_8.addWidget(self.label_14)
|
||||
self.UIMatchSequenceLabel = QtWidgets.QLineEdit(self.tab_2)
|
||||
self.UIMatchSequenceLabel.setText("")
|
||||
self.UIMatchSequenceLabel.setObjectName("UIMatchSequenceLabel")
|
||||
self.horizontalLayout_8.addWidget(self.UIMatchSequenceLabel)
|
||||
self.verticalLayout_6.addLayout(self.horizontalLayout_8)
|
||||
self.label_15 = QtWidgets.QLabel(self.tab_2)
|
||||
self.label_15.setObjectName("label_15")
|
||||
self.verticalLayout_6.addWidget(self.label_15)
|
||||
self.UIMatchOrder = QtWidgets.QListWidget(self.tab_2)
|
||||
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Expanding)
|
||||
sizePolicy.setHorizontalStretch(0)
|
||||
sizePolicy.setVerticalStretch(0)
|
||||
sizePolicy.setHeightForWidth(self.UIMatchOrder.sizePolicy().hasHeightForWidth())
|
||||
self.UIMatchOrder.setSizePolicy(sizePolicy)
|
||||
self.UIMatchOrder.setObjectName("UIMatchOrder")
|
||||
self.verticalLayout_6.addWidget(self.UIMatchOrder)
|
||||
self.UIMatchAll = QtWidgets.QPushButton(self.tab_2)
|
||||
self.UIMatchAll.setObjectName("UIMatchAll")
|
||||
self.verticalLayout_6.addWidget(self.UIMatchAll)
|
||||
self.UIMatchFromSelected = QtWidgets.QPushButton(self.tab_2)
|
||||
self.UIMatchFromSelected.setObjectName("UIMatchFromSelected")
|
||||
self.verticalLayout_6.addWidget(self.UIMatchFromSelected)
|
||||
self.UIMatchSelected = QtWidgets.QPushButton(self.tab_2)
|
||||
self.UIMatchSelected.setObjectName("UIMatchSelected")
|
||||
self.verticalLayout_6.addWidget(self.UIMatchSelected)
|
||||
self.horizontalLayout_9.addLayout(self.verticalLayout_6)
|
||||
self.verticalLayout_7 = QtWidgets.QVBoxLayout()
|
||||
self.verticalLayout_7.setObjectName("verticalLayout_7")
|
||||
self.label_21 = QtWidgets.QLabel(self.tab_2)
|
||||
font = QtGui.QFont()
|
||||
font.setPointSize(12)
|
||||
font.setBold(True)
|
||||
font.setWeight(75)
|
||||
self.label_21.setFont(font)
|
||||
self.label_21.setObjectName("label_21")
|
||||
self.verticalLayout_7.addWidget(self.label_21)
|
||||
self.gridLayout_5 = QtWidgets.QGridLayout()
|
||||
self.gridLayout_5.setObjectName("gridLayout_5")
|
||||
self.label_16 = QtWidgets.QLabel(self.tab_2)
|
||||
self.label_16.setObjectName("label_16")
|
||||
self.gridLayout_5.addWidget(self.label_16, 0, 0, 1, 1)
|
||||
self.UIMatchLabel = QtWidgets.QLineEdit(self.tab_2)
|
||||
self.UIMatchLabel.setObjectName("UIMatchLabel")
|
||||
self.gridLayout_5.addWidget(self.UIMatchLabel, 0, 1, 1, 1)
|
||||
self.label_17 = QtWidgets.QLabel(self.tab_2)
|
||||
self.label_17.setObjectName("label_17")
|
||||
self.gridLayout_5.addWidget(self.label_17, 1, 0, 1, 1)
|
||||
self.UIMatchStart = QtWidgets.QLineEdit(self.tab_2)
|
||||
self.UIMatchStart.setObjectName("UIMatchStart")
|
||||
self.gridLayout_5.addWidget(self.UIMatchStart, 1, 1, 1, 1)
|
||||
self.label_18 = QtWidgets.QLabel(self.tab_2)
|
||||
self.label_18.setObjectName("label_18")
|
||||
self.gridLayout_5.addWidget(self.label_18, 2, 0, 1, 1)
|
||||
self.UIMatchType = QtWidgets.QLineEdit(self.tab_2)
|
||||
self.UIMatchType.setObjectName("UIMatchType")
|
||||
self.gridLayout_5.addWidget(self.UIMatchType, 2, 1, 1, 1)
|
||||
self.verticalLayout_7.addLayout(self.gridLayout_5)
|
||||
self.label_19 = QtWidgets.QLabel(self.tab_2)
|
||||
self.label_19.setObjectName("label_19")
|
||||
self.verticalLayout_7.addWidget(self.label_19)
|
||||
self.UIMatchKnobs = QtWidgets.QListWidget(self.tab_2)
|
||||
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Expanding)
|
||||
sizePolicy.setHorizontalStretch(0)
|
||||
sizePolicy.setVerticalStretch(0)
|
||||
sizePolicy.setHeightForWidth(self.UIMatchKnobs.sizePolicy().hasHeightForWidth())
|
||||
self.UIMatchKnobs.setSizePolicy(sizePolicy)
|
||||
self.UIMatchKnobs.setObjectName("UIMatchKnobs")
|
||||
self.verticalLayout_7.addWidget(self.UIMatchKnobs)
|
||||
self.label_20 = QtWidgets.QLabel(self.tab_2)
|
||||
self.label_20.setObjectName("label_20")
|
||||
self.verticalLayout_7.addWidget(self.label_20)
|
||||
self.UIMatchTargets = QtWidgets.QTableWidget(self.tab_2)
|
||||
self.UIMatchTargets.setObjectName("UIMatchTargets")
|
||||
self.UIMatchTargets.setColumnCount(0)
|
||||
self.UIMatchTargets.setRowCount(0)
|
||||
self.verticalLayout_7.addWidget(self.UIMatchTargets)
|
||||
self.horizontalLayout_9.addLayout(self.verticalLayout_7)
|
||||
spacerItem4 = QtWidgets.QSpacerItem(242, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
|
||||
self.horizontalLayout_9.addItem(spacerItem4)
|
||||
self.TabMaster.addTab(self.tab_2, "")
|
||||
self.verticalLayout_4.addWidget(self.TabMaster)
|
||||
OpticsGUI.setCentralWidget(self.centralwidget)
|
||||
@@ -567,18 +651,13 @@ class Ui_OpticsGUI(object):
|
||||
self.menubar.addAction(self.menuHelp.menuAction())
|
||||
|
||||
self.retranslateUi(OpticsGUI)
|
||||
self.TabMaster.setCurrentIndex(0)
|
||||
self.UISettingState.setCurrentIndex(1)
|
||||
self.TabMaster.setCurrentIndex(3)
|
||||
self.actionQuit.triggered.connect(OpticsGUI.close) # type: ignore
|
||||
QtCore.QMetaObject.connectSlotsByName(OpticsGUI)
|
||||
|
||||
def retranslateUi(self, OpticsGUI):
|
||||
_translate = QtCore.QCoreApplication.translate
|
||||
OpticsGUI.setWindowTitle(_translate("OpticsGUI", "SwissFEL Optics"))
|
||||
self.UISettingState.setItemText(0, _translate("OpticsGUI", "Machine"))
|
||||
self.UISettingState.setItemText(1, _translate("OpticsGUI", "Reference"))
|
||||
self.UISettingState.setItemText(2, _translate("OpticsGUI", "User Settings"))
|
||||
self.UISettingState.setItemText(3, _translate("OpticsGUI", "Sandbox"))
|
||||
self.UITrack.setText(_translate("OpticsGUI", "Track"))
|
||||
self.UITrackStart.setText(_translate("OpticsGUI", "SINLH01"))
|
||||
self.label_2.setText(_translate("OpticsGUI", "End-Section"))
|
||||
@@ -634,7 +713,19 @@ class Ui_OpticsGUI(object):
|
||||
self.checkBox.setText(_translate("OpticsGUI", "Random Initialization"))
|
||||
self.label_13.setText(_translate("OpticsGUI", "Result"))
|
||||
self.TabMaster.setTabText(self.TabMaster.indexOf(self.tab), _translate("OpticsGUI", "Absolute Matching"))
|
||||
self.TabMaster.setTabText(self.TabMaster.indexOf(self.tab_2), _translate("OpticsGUI", "Relative Matching"))
|
||||
self.label_22.setText(_translate("OpticsGUI", "Matching Procedure"))
|
||||
self.label_14.setText(_translate("OpticsGUI", "Label"))
|
||||
self.label_15.setText(_translate("OpticsGUI", "Order"))
|
||||
self.UIMatchAll.setText(_translate("OpticsGUI", "Match From Start"))
|
||||
self.UIMatchFromSelected.setText(_translate("OpticsGUI", "Match From Selected"))
|
||||
self.UIMatchSelected.setText(_translate("OpticsGUI", "Match Selected"))
|
||||
self.label_21.setText(_translate("OpticsGUI", "Matching Point"))
|
||||
self.label_16.setText(_translate("OpticsGUI", "Match"))
|
||||
self.label_17.setText(_translate("OpticsGUI", "Start"))
|
||||
self.label_18.setText(_translate("OpticsGUI", "Type"))
|
||||
self.label_19.setText(_translate("OpticsGUI", "Knobs"))
|
||||
self.label_20.setText(_translate("OpticsGUI", "Target"))
|
||||
self.TabMaster.setTabText(self.TabMaster.indexOf(self.tab_2), _translate("OpticsGUI", "Matching"))
|
||||
self.menuFile.setTitle(_translate("OpticsGUI", "File"))
|
||||
self.menuHelp.setTitle(_translate("OpticsGUI", "Help"))
|
||||
self.actionOpen_2.setText(_translate("OpticsGUI", "Open Settings..."))
|
||||
|
||||
@@ -34,40 +34,6 @@
|
||||
<item>
|
||||
<widget class="QWidget" name="widget_2" native="true">
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<item>
|
||||
<widget class="QComboBox" name="UISettingState">
|
||||
<property name="font">
|
||||
<font>
|
||||
<pointsize>12</pointsize>
|
||||
<weight>75</weight>
|
||||
<bold>true</bold>
|
||||
</font>
|
||||
</property>
|
||||
<property name="currentIndex">
|
||||
<number>1</number>
|
||||
</property>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>Machine</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>Reference</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>User Settings</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>Sandbox</string>
|
||||
</property>
|
||||
</item>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="UITrack">
|
||||
<property name="font">
|
||||
@@ -772,21 +738,176 @@
|
||||
</widget>
|
||||
<widget class="QWidget" name="tab_2">
|
||||
<attribute name="title">
|
||||
<string>Relative Matching</string>
|
||||
<string>Matching</string>
|
||||
</attribute>
|
||||
<widget class="QGroupBox" name="groupBox_3">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>10</x>
|
||||
<y>10</y>
|
||||
<width>301</width>
|
||||
<height>241</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="title">
|
||||
<string>GroupBox</string>
|
||||
</property>
|
||||
</widget>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_9">
|
||||
<item>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_6">
|
||||
<item>
|
||||
<widget class="QLabel" name="label_22">
|
||||
<property name="font">
|
||||
<font>
|
||||
<pointsize>12</pointsize>
|
||||
<weight>75</weight>
|
||||
<bold>true</bold>
|
||||
</font>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Matching Procedure</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_8">
|
||||
<item>
|
||||
<widget class="QLabel" name="label_14">
|
||||
<property name="text">
|
||||
<string>Label</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLineEdit" name="UIMatchSequenceLabel">
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="label_15">
|
||||
<property name="text">
|
||||
<string>Order</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QListWidget" name="UIMatchOrder">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Expanding">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="UIMatchAll">
|
||||
<property name="text">
|
||||
<string>Match From Start</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="UIMatchFromSelected">
|
||||
<property name="text">
|
||||
<string>Match From Selected</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="UIMatchSelected">
|
||||
<property name="text">
|
||||
<string>Match Selected</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_7">
|
||||
<item>
|
||||
<widget class="QLabel" name="label_21">
|
||||
<property name="font">
|
||||
<font>
|
||||
<pointsize>12</pointsize>
|
||||
<weight>75</weight>
|
||||
<bold>true</bold>
|
||||
</font>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Matching Point</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QGridLayout" name="gridLayout_5">
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="label_16">
|
||||
<property name="text">
|
||||
<string>Match</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="QLineEdit" name="UIMatchLabel"/>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QLabel" name="label_17">
|
||||
<property name="text">
|
||||
<string>Start</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<widget class="QLineEdit" name="UIMatchStart"/>
|
||||
</item>
|
||||
<item row="2" column="0">
|
||||
<widget class="QLabel" name="label_18">
|
||||
<property name="text">
|
||||
<string>Type</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="1">
|
||||
<widget class="QLineEdit" name="UIMatchType"/>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="label_19">
|
||||
<property name="text">
|
||||
<string>Knobs</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QListWidget" name="UIMatchKnobs">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Expanding">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="label_20">
|
||||
<property name="text">
|
||||
<string>Target</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QTableWidget" name="UIMatchTargets"/>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="horizontalSpacer_3">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>242</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</widget>
|
||||
</item>
|
||||
|
||||
Reference in New Issue
Block a user