mri_lab_8_sd.py
class MRI_SD_Widget(QDialog):
def __init__(self,parent=None): #设定UI界面,包括按钮、菜单
[MRI Lab]-[Pulse Design]
#menu
self.createGradMenu() #已完成的部分
self.createPulseMenu()
self.createLoopMenu()
'''
self.createAmplMenu() #未完成的部分
self.createAttenMenu()
self.createGateMenu()
self.createPhModMenu()
'''
以PulseMenu
为例,对照可了解弹出菜单的做法(设置每一帧的属性)
def createPulseMenu(self):
self.setContextMenuPolicy(Qt.CustomContextMenu)
self.PulseMenu=QMenu(self)
self.Pulseaction90=self.PulseMenu.addAction(self.pulse90Icon,u'| 90 Pulse')
self.Pulseaction180X=self.PulseMenu.addAction(self.pulse180Icon,u'|180X+ Pulse')
self.Pulseaction180Xminus=self.PulseMenu.addAction(self.pulse180Icon,u'|180X- Pulse')
self.Pulseaction180Y=self.PulseMenu.addAction(self.pulse180Icon,u'|180Y+ Pulse')
self.Pulseaction180Yminus=self.PulseMenu.addAction(self.pulse180Icon,u'|180Y- Pulse')
self.PulseactionDesign=self.PulseMenu.addAction(u'|Design Pulse')
self.PulseactionZero=self.PulseMenu.addAction(self.zeroIcon,u'| zero')
self.PulseactionShow=self.PulseMenu.addAction(u'| show')
self.Pulseaction90.triggered.connect(self.Pulseaction90Handler)
self.Pulseaction180X.triggered.connect(self.Pulseaction180XHandler)
self.Pulseaction180Xminus.triggered.connect(self.Pulseaction180XminusHandler)
self.Pulseaction180Y.triggered.connect(self.Pulseaction180YHandler)
self.Pulseaction180Yminus.triggered.connect(self.Pulseaction180YminusHandler)
self.PulseactionDesign.triggered.connect(self.PulseactionDesignHandler)
self.PulseactionZero.triggered.connect(self.PulseactionZeroHandler)
self.PulseactionShow.triggered.connect(self.PulseactionShowHandler)
def tableWidget_set(self): #设置绘图区域的尺寸,包括:
self.headerVertical=["Time Delay /us",
"Pulse Sequence",
"Gradient X",
"Gradient Y",
"Gradient Z",
"Loop structure"]
#以及不同属性的显示(png格式图片)
默认参数从data.txt
载入,导入self.flag[][]
数组中:以前4列的数据为例
#open file
fileObject=open('Pulse_design/data.txt','r')
15
6
100
100
500 //row 1
0
0
0
0
0
81
120 //row 2
0 //pulse sequence
0 //gradient X
0 //gradient Y
+Amplitude:0.01 Increase duration:1 Holding duration:119 Decrease duration:0 The END //gradient Z
0
87
120 //row 3
pulse90
0
0
+Amplitude:0.01 Increase duration:0 Holding duration:119 Decrease duration:1 The END
0
107
120 //row 4
0
+Amplitude:0.01 Increase duration:1 Holding duration:119 Decrease duration:0 The END
+Amplitude:0.01 Increase duration:1 Holding duration:119 Decrease duration:0 The END
-Amplitude:0.01 Increase duration:1 Holding duration:118 Decrease duration:1 The END
0
310
self.flags[k][i]=fileObject.readline().rstrip('\n')
具体写入如下:
for i in range(self.CountColumn):
for k in range(1,self.CountRow): #对于gradient的3行
self.labels[k][i].setMinimumSize(3,3)
self.labels[k][i].setScaledContents(True)
self.tableWidget.setItem(k,i,QTableWidgetItem(" "))
if self.flags[k][i][0]=='0':
self.labels[k][i].setPixmap(self.zeroScaled)
#推测这个函数的功能是以点阵格式载入png文件(1152*648)到这个单元
elif self.flags[k][i][0]=='+':
self.labels[k][i].setPixmap(self.highScaled)
elif self.flags[k][i][0]=='-':
self.labels[k][i].setPixmap(self.lowScaled)
elif self.flags[k][i][0]=='?' or self.flags[k][i][0:6]=="Spiral":
self.labels[k][i].setPixmap(self.funcScaled)
elif self.flags[k][i]=="pulse90":
self.labels[k][i].setPixmap(self.pulse90Scaled)
self.tableWidget.setItem(k,i,QTableWidgetItem("90°"))
self.tableWidget.item(k,i).setTextAlignment(QtCore.Qt.AlignCenter)
elif self.flags[k][i]=="pulse180X+":
self.labels[k][i].setPixmap(self.pulse180Scaled)
self.tableWidget.setItem(k,i,QTableWidgetItem("180°X+"))
self.tableWidget.item(k,i).setTextAlignment(QtCore.Qt.AlignCenter)
elif self.flags[k][i]=="pulse180X-":
self.labels[k][i].setPixmap(self.pulse180Scaled)
self.tableWidget.setItem(k,i,QTableWidgetItem("180°X-"))
self.tableWidget.item(k,i).setTextAlignment(QtCore.Qt.AlignCenter)
elif self.flags[k][i]=="pulse180Y+":
self.labels[k][i].setPixmap(self.pulse180Scaled)
self.tableWidget.setItem(k,i,QTableWidgetItem("180°Y+"))
self.tableWidget.item(k,i).setTextAlignment(QtCore.Qt.AlignCenter)
elif self.flags[k][i]=="pulse180Y-":
self.labels[k][i].setPixmap(self.pulse180Scaled)
self.tableWidget.setItem(k,i,QTableWidgetItem("180°Y-"))
self.tableWidget.item(k,i).setTextAlignment(QtCore.Qt.AlignCenter)
elif self.flags[k][i][0:9]=="loopStart":
self.labels[k][i].setPixmap(self.loopStartScaled)
self.tableWidget.setItem(k,i,QTableWidgetItem(self.flags[k][i][9:]))
self.LoopTime=self.flags[k][i][9:]
self.tableWidget.item(k,i).setTextAlignment(QtCore.Qt.AlignCenter)
elif self.flags[k][i]=="loopEnd":
self.labels[k][i].setPixmap(self.loopEndScaled)
self.tableWidget.item(k,i).setTextAlignment(QtCore.Qt.AlignCenter)
else:
self.labels[k][i].setPixmap(self.funcScaled)
问题:函数QPixmap等未定义?是没做完还是在别的文件里调用了库?
设置右侧3个按钮的功能,以[Add Column]为例:
def AddColumnBtnClicked(self):
self.CountColumn+=1
y=self.CountColumn-1 #原列数
self.tableWidget.setColumnCount(self.CountColumn)
self.tableWidget.setColumnWidth(y,self.ColumnWidth)
self.tableWidget.setItem(0,y,QTableWidgetItem("5"))
self.tableWidget.item(0,y).setTextAlignment(QtCore.Qt.AlignCenter)
for i in range(1,self.CountRow):
self.labels[i][y].setPixmap(self.zeroScaled)
self.flags[i][y]="0"
self.tableWidget.setCellWidget(i,y,self.labels[i][y])
self.labels[i][y].setScaledContents(True)
再以[save]为例:
def SaveBtnClicked(self):
fileObject=open('Pulse_design/data.txt','w')#写入之前那个文件,貌似不能新建
fileObject.write(str(self.CountColumn))
fileObject.write('\n')
fileObject.write(str(self.CountRow))
fileObject.write('\n')
fileObject.write(str(self.rangeMax))
fileObject.write('\n')
for i in range(self.CountColumn):
fileObject.write(str(self.tableWidget.columnWidth(i)))
fileObject.write('\n')
fileObject.write(self.tableWidget.item(0,i).text())
fileObject.write('\n')
for k in range(1,self.CountRow):
fileObject.write(self.flags[k][i])
fileObject.write('\n')
fileObject.close()
而[create]是重头戏,创建学生使用的序列,以汇编语言写入txt文件:
def CreateBtnClicked(self):
#create time and xyz program
fileObject=open('sequence/sig/myPulse.txt','w')
print("creating TimePulse")
fileObject.write("J C"+'\n')
fileObject.write("LOOP_CTR = "+hex(int(self.LoopTime))+'\n') # no LOOP now
fileObject.write("CMD1 = 0x0"+'\n')
fileObject.write("CMD2 = 0x0"+'\n')
fileObject.write("CMD3 = 0x2"+'\n')
fileObject.write("CMD4 = 0x0"+'\n')
fileObject.write("CMD5 = TX_GATE | TX_PULSE | RX_PULSE"+'\n')
....
J C
LOOP_CTR = 0x1
CMD1 = 0x0
CMD2 = 0x0
CMD3 = 0x2
CMD4 = 0x0
CMD5 = TX_GATE | TX_PULSE | RX_PULSE
CMD6 = TX_GATE | TX_PULSE
CMD7 = GRAD_PULSE | RX_PULSE
CMD8 = GRAD_PULSE
CMD9 = TX_GATE | TX_PULSE | RX_PULSE | GRAD_PULSE
CMD10 = TX_GATE | TX_PULSE | GRAD_PULSE
LD64 2, LOOP_CTR
LD64 3, CMD3
LD64 4, CMD4
LD64 5, CMD5
LD64 6, CMD6
LD64 7, CMD7
LD64 8, CMD8
LD64 9, CMD9
LD64 10, CMD10 #以上是对板子的初始化
PR 3, 500 #从单元属性,到一维数组元素的值,再到写入的汇编语言,复杂的对应关系
PR 7, 120
TXOFFSET 0
PR 9, 120
PR 7, 420
PR 3, 300
PR 7, 120
TXOFFSET 1000
PR 9, 120
PR 5, 60
PR 3, 60
PR 7, 400
HALT
另一个有待完成的功能是读取学生编程的cpp文件。写入cpp文件的代码如下:
#X Y Z design的cpp
fileObject=open("server/PulseProgram.cpp","w")
fileObject.write("#include <stdio.h>"+'\n')
fileObject.write("#include <stdlib.h>"+'\n')
fileObject.write("#include <stdint.h>"+'\n')
...
#fRO还没偶定义**************
#fROprestep还没有定义****************************