Exemple #1
0
    def __init__(self, *args):
        AnalysisModule.__init__(self, *args)
        self.layout = Qt.QGridLayout()
        self.setLayout(self.layout)
        self.splitter = Qt.QSplitter()
        self.layout.addWidget(self.splitter)
        self.ptree = ParameterTree()
        self.splitter.addWidget(self.ptree)
        self.imageView = pg.ImageView()
        self.splitter.addWidget(self.imageView)
        
        self.params = Parameter(name='imager', children=[
            dict(name='scanner', type='interface', interfaceTypes=['scanner']),
            dict(name='detectors', type='group', addText="Add detector.."),
            dict(name='decomb', type='float', readonly=False, value=20e-6, suffix='s', siPrefix=True, bounds=[0, 1e-3], step=1e-6, decimals=5, children=[
                dict(name='auto', type='action'),
                dict(name='subpixel', type='bool', value=False),
                ]),
            dict(name='downsample', type='int', value=1, suffix='x', bounds=[1,None]),
            dict(name='display', type='bool', value=True),
            dict(name='scanProgram', type='list', values=[]),
            dict(name='Objective', type='str', value='Unknown', readonly=True),
            dict(name='Filter', type='str', value='Unknown', readonly=True),
            ])
        self.ptree.setParameters(self.params, showTop=False)
        self.params.sigTreeStateChanged.connect(self.update)
        self.params.child('detectors').sigAddNew.connect(self.addDetectorClicked)
        self.params.child('decomb', 'auto').sigActivated.connect(self.autoDecomb)

        self.man = getManager()
        self.scannerDev = self.man.getDevice(self.params['scanner'])
        # find first scope device that is parent of scanner
        dev = self.scannerDev
        while dev is not None and not isinstance(dev, Microscope):
            dev = dev.parentDevice()
        self.scopeDev = dev
                
        self.lastFrame = None
        # self.SUF = SUFA.ScannerUtilities()
        # self.ui.alphaSlider.valueChanged.connect(self.imageAlphaAdjust)        
        self.img = pg.ImageItem()  ## image shown in camera module
        self.img.setLookupTable(self.imageView.ui.histogram.getLookupTable)  # image fetches LUT from the ImageView
        self.imageView.ui.histogram.sigLevelsChanged.connect(self._updateCamModImage)
        self.imageView.imageItem.setAutoDownsample(True)
Exemple #2
0
def test_RectScanParameter():
    p = RectScanParameter()
    p.system.defaultState['sampleRate'][0] = 1e4
    p.system.defaultState['sampleRate'][2] = 'fixed'
    p.system.defaultState['downsample'][0] = 1
    p.system.defaultState['downsample'][2] = 'fixed'
    p.system.defaultState['p0'][0] = np.array([0, 0])
    p.system.defaultState['p0'][2] = 'fixed'
    p.system.defaultState['p1'][0] = np.array([150e-6, 0])
    p.system.defaultState['p1'][2] = 'fixed'
    p.system.defaultState['p2'][0] = np.array([0, -100e-6])
    p.system.defaultState['p2'][2] = 'fixed'
    p.system.defaultState['numFrames'][0] = 1
    p.updateSystem()
    w = ParameterTree()
    w.setParameters(p)
    w.show()
    return p, w
    def setupUi(self, Form):
        Form.setObjectName(_fromUtf8("Form"))
        Form.resize(336, 439)
        Form.setMinimumSize(QtCore.QSize(0, 100))
        self.verticalLayout_5 = QtGui.QVBoxLayout(Form)
        self.verticalLayout_5.setSpacing(0)
        self.verticalLayout_5.setMargin(0)
        self.verticalLayout_5.setObjectName(_fromUtf8("verticalLayout_5"))
        self.frame = QtGui.QFrame(Form)
        self.frame.setFrameShape(QtGui.QFrame.StyledPanel)
        self.frame.setFrameShadow(QtGui.QFrame.Raised)
        self.frame.setObjectName(_fromUtf8("frame"))
        self.verticalLayout_4 = QtGui.QVBoxLayout(self.frame)
        self.verticalLayout_4.setSpacing(0)
        self.verticalLayout_4.setMargin(0)
        self.verticalLayout_4.setObjectName(_fromUtf8("verticalLayout_4"))
        self.splitter = QtGui.QSplitter(self.frame)
        self.splitter.setOrientation(QtCore.Qt.Vertical)
        self.splitter.setChildrenCollapsible(False)
        self.splitter.setObjectName(_fromUtf8("splitter"))
        self.stack = QtGui.QStackedWidget(self.splitter)
        self.stack.setObjectName(_fromUtf8("stack"))
        self.page = QtGui.QWidget()
        self.page.setObjectName(_fromUtf8("page"))
        self.verticalLayout_3 = QtGui.QVBoxLayout(self.page)
        self.verticalLayout_3.setSpacing(0)
        self.verticalLayout_3.setMargin(0)
        self.verticalLayout_3.setObjectName(_fromUtf8("verticalLayout_3"))
        self.stimulusTree = ParameterTree(self.page)
        self.stimulusTree.setHeaderHidden(True)
        self.stimulusTree.setObjectName(_fromUtf8("stimulusTree"))
        self.stimulusTree.headerItem().setText(0, _fromUtf8("1"))
        self.verticalLayout_3.addWidget(self.stimulusTree)
        self.stack.addWidget(self.page)
        self.page_3 = QtGui.QWidget()
        self.page_3.setObjectName(_fromUtf8("page_3"))
        self.gridLayout = QtGui.QGridLayout(self.page_3)
        self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
        spacerItem = QtGui.QSpacerItem(20, 76, QtGui.QSizePolicy.Minimum,
                                       QtGui.QSizePolicy.Expanding)
        self.gridLayout.addItem(spacerItem, 0, 1, 1, 1)
        self.label = QtGui.QLabel(self.page_3)
        self.label.setTextFormat(QtCore.Qt.AutoText)
        self.label.setAlignment(QtCore.Qt.AlignCenter)
        self.label.setWordWrap(True)
        self.label.setObjectName(_fromUtf8("label"))
        self.gridLayout.addWidget(self.label, 1, 0, 1, 3)
        spacerItem1 = QtGui.QSpacerItem(93, 78, QtGui.QSizePolicy.Expanding,
                                        QtGui.QSizePolicy.Minimum)
        self.gridLayout.addItem(spacerItem1, 2, 0, 2, 1)
        self.forceAdvancedBtn = QtGui.QPushButton(self.page_3)
        self.forceAdvancedBtn.setObjectName(_fromUtf8("forceAdvancedBtn"))
        self.gridLayout.addWidget(self.forceAdvancedBtn, 2, 1, 1, 1)
        spacerItem2 = QtGui.QSpacerItem(92, 78, QtGui.QSizePolicy.Expanding,
                                        QtGui.QSizePolicy.Minimum)
        self.gridLayout.addItem(spacerItem2, 2, 2, 2, 1)
        self.forceSimpleBtn = QtGui.QPushButton(self.page_3)
        self.forceSimpleBtn.setObjectName(_fromUtf8("forceSimpleBtn"))
        self.gridLayout.addWidget(self.forceSimpleBtn, 3, 1, 1, 1)
        spacerItem3 = QtGui.QSpacerItem(20, 75, QtGui.QSizePolicy.Minimum,
                                        QtGui.QSizePolicy.Expanding)
        self.gridLayout.addItem(spacerItem3, 4, 1, 1, 1)
        self.stack.addWidget(self.page_3)
        self.page_4 = QtGui.QWidget()
        self.page_4.setObjectName(_fromUtf8("page_4"))
        self.verticalLayout = QtGui.QVBoxLayout(self.page_4)
        self.verticalLayout.setSpacing(0)
        self.verticalLayout.setMargin(0)
        self.verticalLayout.setObjectName(_fromUtf8("verticalLayout"))
        self.splitter_2 = QtGui.QSplitter(self.page_4)
        self.splitter_2.setOrientation(QtCore.Qt.Vertical)
        self.splitter_2.setChildrenCollapsible(False)
        self.splitter_2.setObjectName(_fromUtf8("splitter_2"))
        self.functionText = QtGui.QTextEdit(self.splitter_2)
        self.functionText.setMinimumSize(QtCore.QSize(0, 15))
        self.functionText.setObjectName(_fromUtf8("functionText"))
        self.seqTree = ParameterTree(self.splitter_2)
        self.seqTree.setObjectName(_fromUtf8("seqTree"))
        self.seqTree.headerItem().setText(0, _fromUtf8("1"))
        self.seqTree.header().setVisible(False)
        self.verticalLayout.addWidget(self.splitter_2)
        self.stack.addWidget(self.page_4)
        self.page_2 = QtGui.QWidget()
        self.page_2.setObjectName(_fromUtf8("page_2"))
        self.verticalLayout_2 = QtGui.QVBoxLayout(self.page_2)
        self.verticalLayout_2.setMargin(0)
        self.verticalLayout_2.setObjectName(_fromUtf8("verticalLayout_2"))
        self.textBrowser = QtGui.QTextBrowser(self.page_2)
        self.textBrowser.setObjectName(_fromUtf8("textBrowser"))
        self.verticalLayout_2.addWidget(self.textBrowser)
        self.stack.addWidget(self.page_2)
        self.errorText = QtGui.QTextBrowser(self.splitter)
        self.errorText.setMinimumSize(QtCore.QSize(0, 15))
        self.errorText.setObjectName(_fromUtf8("errorText"))
        self.verticalLayout_4.addWidget(self.splitter)
        self.horizontalLayout = QtGui.QHBoxLayout()
        self.horizontalLayout.setSpacing(0)
        self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout"))
        self.advancedBtn = QtGui.QPushButton(self.frame)
        self.advancedBtn.setCheckable(True)
        self.advancedBtn.setObjectName(_fromUtf8("advancedBtn"))
        self.horizontalLayout.addWidget(self.advancedBtn)
        self.errorBtn = QtGui.QToolButton(self.frame)
        self.errorBtn.setEnabled(True)
        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed,
                                       QtGui.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(
            self.errorBtn.sizePolicy().hasHeightForWidth())
        self.errorBtn.setSizePolicy(sizePolicy)
        font = QtGui.QFont()
        font.setBold(True)
        font.setWeight(75)
        self.errorBtn.setFont(font)
        self.errorBtn.setCheckable(True)
        self.errorBtn.setObjectName(_fromUtf8("errorBtn"))
        self.horizontalLayout.addWidget(self.errorBtn)
        self.helpBtn = QtGui.QToolButton(self.frame)
        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed,
                                       QtGui.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(
            self.helpBtn.sizePolicy().hasHeightForWidth())
        self.helpBtn.setSizePolicy(sizePolicy)
        font = QtGui.QFont()
        font.setBold(True)
        font.setWeight(75)
        self.helpBtn.setFont(font)
        self.helpBtn.setCheckable(True)
        self.helpBtn.setObjectName(_fromUtf8("helpBtn"))
        self.horizontalLayout.addWidget(self.helpBtn)
        spacerItem4 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding,
                                        QtGui.QSizePolicy.Minimum)
        self.horizontalLayout.addItem(spacerItem4)
        self.updateBtn = QtGui.QPushButton(self.frame)
        self.updateBtn.setObjectName(_fromUtf8("updateBtn"))
        self.horizontalLayout.addWidget(self.updateBtn)
        self.autoUpdateCheck = QtGui.QCheckBox(self.frame)
        self.autoUpdateCheck.setObjectName(_fromUtf8("autoUpdateCheck"))
        self.horizontalLayout.addWidget(self.autoUpdateCheck)
        self.verticalLayout_4.addLayout(self.horizontalLayout)
        self.verticalLayout_5.addWidget(self.frame)

        self.retranslateUi(Form)
        self.stack.setCurrentIndex(0)
        QtCore.QMetaObject.connectSlotsByName(Form)
class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName(_fromUtf8("Form"))
        Form.resize(336, 439)
        Form.setMinimumSize(QtCore.QSize(0, 100))
        self.verticalLayout_5 = QtGui.QVBoxLayout(Form)
        self.verticalLayout_5.setSpacing(0)
        self.verticalLayout_5.setMargin(0)
        self.verticalLayout_5.setObjectName(_fromUtf8("verticalLayout_5"))
        self.frame = QtGui.QFrame(Form)
        self.frame.setFrameShape(QtGui.QFrame.StyledPanel)
        self.frame.setFrameShadow(QtGui.QFrame.Raised)
        self.frame.setObjectName(_fromUtf8("frame"))
        self.verticalLayout_4 = QtGui.QVBoxLayout(self.frame)
        self.verticalLayout_4.setSpacing(0)
        self.verticalLayout_4.setMargin(0)
        self.verticalLayout_4.setObjectName(_fromUtf8("verticalLayout_4"))
        self.splitter = QtGui.QSplitter(self.frame)
        self.splitter.setOrientation(QtCore.Qt.Vertical)
        self.splitter.setChildrenCollapsible(False)
        self.splitter.setObjectName(_fromUtf8("splitter"))
        self.stack = QtGui.QStackedWidget(self.splitter)
        self.stack.setObjectName(_fromUtf8("stack"))
        self.page = QtGui.QWidget()
        self.page.setObjectName(_fromUtf8("page"))
        self.verticalLayout_3 = QtGui.QVBoxLayout(self.page)
        self.verticalLayout_3.setSpacing(0)
        self.verticalLayout_3.setMargin(0)
        self.verticalLayout_3.setObjectName(_fromUtf8("verticalLayout_3"))
        self.stimulusTree = ParameterTree(self.page)
        self.stimulusTree.setHeaderHidden(True)
        self.stimulusTree.setObjectName(_fromUtf8("stimulusTree"))
        self.stimulusTree.headerItem().setText(0, _fromUtf8("1"))
        self.verticalLayout_3.addWidget(self.stimulusTree)
        self.stack.addWidget(self.page)
        self.page_3 = QtGui.QWidget()
        self.page_3.setObjectName(_fromUtf8("page_3"))
        self.gridLayout = QtGui.QGridLayout(self.page_3)
        self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
        spacerItem = QtGui.QSpacerItem(20, 76, QtGui.QSizePolicy.Minimum,
                                       QtGui.QSizePolicy.Expanding)
        self.gridLayout.addItem(spacerItem, 0, 1, 1, 1)
        self.label = QtGui.QLabel(self.page_3)
        self.label.setTextFormat(QtCore.Qt.AutoText)
        self.label.setAlignment(QtCore.Qt.AlignCenter)
        self.label.setWordWrap(True)
        self.label.setObjectName(_fromUtf8("label"))
        self.gridLayout.addWidget(self.label, 1, 0, 1, 3)
        spacerItem1 = QtGui.QSpacerItem(93, 78, QtGui.QSizePolicy.Expanding,
                                        QtGui.QSizePolicy.Minimum)
        self.gridLayout.addItem(spacerItem1, 2, 0, 2, 1)
        self.forceAdvancedBtn = QtGui.QPushButton(self.page_3)
        self.forceAdvancedBtn.setObjectName(_fromUtf8("forceAdvancedBtn"))
        self.gridLayout.addWidget(self.forceAdvancedBtn, 2, 1, 1, 1)
        spacerItem2 = QtGui.QSpacerItem(92, 78, QtGui.QSizePolicy.Expanding,
                                        QtGui.QSizePolicy.Minimum)
        self.gridLayout.addItem(spacerItem2, 2, 2, 2, 1)
        self.forceSimpleBtn = QtGui.QPushButton(self.page_3)
        self.forceSimpleBtn.setObjectName(_fromUtf8("forceSimpleBtn"))
        self.gridLayout.addWidget(self.forceSimpleBtn, 3, 1, 1, 1)
        spacerItem3 = QtGui.QSpacerItem(20, 75, QtGui.QSizePolicy.Minimum,
                                        QtGui.QSizePolicy.Expanding)
        self.gridLayout.addItem(spacerItem3, 4, 1, 1, 1)
        self.stack.addWidget(self.page_3)
        self.page_4 = QtGui.QWidget()
        self.page_4.setObjectName(_fromUtf8("page_4"))
        self.verticalLayout = QtGui.QVBoxLayout(self.page_4)
        self.verticalLayout.setSpacing(0)
        self.verticalLayout.setMargin(0)
        self.verticalLayout.setObjectName(_fromUtf8("verticalLayout"))
        self.splitter_2 = QtGui.QSplitter(self.page_4)
        self.splitter_2.setOrientation(QtCore.Qt.Vertical)
        self.splitter_2.setChildrenCollapsible(False)
        self.splitter_2.setObjectName(_fromUtf8("splitter_2"))
        self.functionText = QtGui.QTextEdit(self.splitter_2)
        self.functionText.setMinimumSize(QtCore.QSize(0, 15))
        self.functionText.setObjectName(_fromUtf8("functionText"))
        self.seqTree = ParameterTree(self.splitter_2)
        self.seqTree.setObjectName(_fromUtf8("seqTree"))
        self.seqTree.headerItem().setText(0, _fromUtf8("1"))
        self.seqTree.header().setVisible(False)
        self.verticalLayout.addWidget(self.splitter_2)
        self.stack.addWidget(self.page_4)
        self.page_2 = QtGui.QWidget()
        self.page_2.setObjectName(_fromUtf8("page_2"))
        self.verticalLayout_2 = QtGui.QVBoxLayout(self.page_2)
        self.verticalLayout_2.setMargin(0)
        self.verticalLayout_2.setObjectName(_fromUtf8("verticalLayout_2"))
        self.textBrowser = QtGui.QTextBrowser(self.page_2)
        self.textBrowser.setObjectName(_fromUtf8("textBrowser"))
        self.verticalLayout_2.addWidget(self.textBrowser)
        self.stack.addWidget(self.page_2)
        self.errorText = QtGui.QTextBrowser(self.splitter)
        self.errorText.setMinimumSize(QtCore.QSize(0, 15))
        self.errorText.setObjectName(_fromUtf8("errorText"))
        self.verticalLayout_4.addWidget(self.splitter)
        self.horizontalLayout = QtGui.QHBoxLayout()
        self.horizontalLayout.setSpacing(0)
        self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout"))
        self.advancedBtn = QtGui.QPushButton(self.frame)
        self.advancedBtn.setCheckable(True)
        self.advancedBtn.setObjectName(_fromUtf8("advancedBtn"))
        self.horizontalLayout.addWidget(self.advancedBtn)
        self.errorBtn = QtGui.QToolButton(self.frame)
        self.errorBtn.setEnabled(True)
        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed,
                                       QtGui.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(
            self.errorBtn.sizePolicy().hasHeightForWidth())
        self.errorBtn.setSizePolicy(sizePolicy)
        font = QtGui.QFont()
        font.setBold(True)
        font.setWeight(75)
        self.errorBtn.setFont(font)
        self.errorBtn.setCheckable(True)
        self.errorBtn.setObjectName(_fromUtf8("errorBtn"))
        self.horizontalLayout.addWidget(self.errorBtn)
        self.helpBtn = QtGui.QToolButton(self.frame)
        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed,
                                       QtGui.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(
            self.helpBtn.sizePolicy().hasHeightForWidth())
        self.helpBtn.setSizePolicy(sizePolicy)
        font = QtGui.QFont()
        font.setBold(True)
        font.setWeight(75)
        self.helpBtn.setFont(font)
        self.helpBtn.setCheckable(True)
        self.helpBtn.setObjectName(_fromUtf8("helpBtn"))
        self.horizontalLayout.addWidget(self.helpBtn)
        spacerItem4 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding,
                                        QtGui.QSizePolicy.Minimum)
        self.horizontalLayout.addItem(spacerItem4)
        self.updateBtn = QtGui.QPushButton(self.frame)
        self.updateBtn.setObjectName(_fromUtf8("updateBtn"))
        self.horizontalLayout.addWidget(self.updateBtn)
        self.autoUpdateCheck = QtGui.QCheckBox(self.frame)
        self.autoUpdateCheck.setObjectName(_fromUtf8("autoUpdateCheck"))
        self.horizontalLayout.addWidget(self.autoUpdateCheck)
        self.verticalLayout_4.addLayout(self.horizontalLayout)
        self.verticalLayout_5.addWidget(self.frame)

        self.retranslateUi(Form)
        self.stack.setCurrentIndex(0)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        Form.setWindowTitle(_translate("Form", "Form", None))
        self.label.setText(
            _translate(
                "Form",
                "Warning: Changes have been made to the function in advanced mode. These changes will be overwritten if you exit advanced mode. ",
                None))
        self.forceAdvancedBtn.setText(
            _translate("Form", "Back to\n"
                       "Advanced Mode", None))
        self.forceSimpleBtn.setText(
            _translate("Form", "Change to\n"
                       "Simple Mode", None))
        self.functionText.setHtml(
            _translate(
                "Form",
                "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
                "<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
                "p, li { white-space: pre-wrap; }\n"
                "</style></head><body style=\" font-family:\'MS Shell Dlg 2\'; font-size:8.25pt; font-weight:400; font-style:normal;\">\n"
                "<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:\'Sans Serif\'; font-size:7pt;\"></p></body></html>",
                None))
        self.textBrowser.setHtml(
            _translate(
                "Form",
                "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
                "<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
                "p, li { white-space: pre-wrap; }\n"
                "</style></head><body style=\" font-family:\'MS Shell Dlg 2\'; font-size:8.25pt; font-weight:400; font-style:normal;\">\n"
                "<p align=\"center\" style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Ubuntu\'; font-size:9pt; font-weight:600;\">Waveform Generator Reference</span></p>\n"
                "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Ubuntu\'; font-size:8pt;\">Arbitrary waveforms may be generated by entering a Python expression which returns an array of values. The easiest approach is to use one (or more) of the built-in functions:</span></p>\n"
                "<ul style=\"margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;\"><li style=\" font-family:\'Ubuntu\'; font-size:8pt;\" style=\" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><a href=\"#steps\"><span style=\" text-decoration: underline; color:#0057ae;\">steps</span></a> - step the waveform to new values at specific times</li>\n"
                "<li style=\" font-family:\'Ubuntu\'; font-size:8pt;\" style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><a href=\"#pulse\"><span style=\" text-decoration: underline; color:#0057ae;\">pulse</span></a> - generate one or more square pulses</li>\n"
                "<li style=\" font-family:\'Ubuntu\'; font-size:8pt;\" style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><a href=\"#waves\"><span style=\" text-decoration: underline; color:#0057ae;\">squareWave</span></a> - generate a square wave over a specific time range</li>\n"
                "<li style=\" font-family:\'Ubuntu\'; font-size:8pt;\" style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><a href=\"#waves\"><span style=\" text-decoration: underline; color:#0057ae;\">sineWave</span></a> - generate a sine wave over a specific time range</li>\n"
                "<li style=\" font-family:\'Ubuntu\'; font-size:8pt;\" style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><a href=\"#waves\"><span style=\" text-decoration: underline; color:#0057ae;\">sawWave</span></a> - generate a saw wave over a specific time range</li>\n"
                "<li style=\" font-family:\'Ubuntu\'; font-size:8pt;\" style=\" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><a href=\"#waves\"><span style=\" text-decoration: underline; color:#0057ae;\">listWave</span></a> - repeat a series of values over a specific time range</li></ul>\n"
                "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Ubuntu\'; font-size:8pt;\">Numerical values may be specified with standard scaled-unit variables like &quot;mV&quot; and &quot;kHz&quot; (these values should be multiplied with a number, eg 120*kHz). </span></p>\n"
                "<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:\'Ubuntu\'; font-size:8pt;\"></p>\n"
                "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Ubuntu\'; font-size:8pt; font-weight:600;\">Sequence Parameters</span><span style=\" font-family:\'Ubuntu\'; font-size:8pt;\">: Commonly, we want a function to run multiple times while varying one or more of its parameters. To accomplish this, click &quot;Add Sequence Parameter&quot;, configure the new parameter\'s properties, and substitute any numerical value in the function with the name of the new parameter. Parameters may be renamed or removed by right clicking on their name.</span></p>\n"
                "<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:\'Ubuntu\'; font-size:8pt;\"></p>\n"
                "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Ubuntu\'; font-size:8pt; font-weight:600;\">Function Reference:</span></p>\n"
                "<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:\'Ubuntu\'; font-size:8pt; font-weight:600;\"></p>\n"
                "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Sans Serif\'; font-size:8pt; font-weight:600;\">steps</span><span style=\" font-family:\'Sans Serif\'; font-size:8pt;\">( times, values, [base=0.0] )</span></p>\n"
                "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Sans Serif\'; font-size:8pt;\">Steps the waveform to new values at specific times.</span></p>\n"
                "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Sans Serif\'; font-size:8pt;\">    times - list of times marking each step</span></p>\n"
                "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Sans Serif\'; font-size:8pt;\">                 eg: [1*ms, 10*ms, 30*ms]</span></p>\n"
                "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Sans Serif\'; font-size:8pt;\">    values - list of values</span></p>\n"
                "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Sans Serif\'; font-size:8pt;\">                 eg: [0*mV, 30*mV, 0*mV]</span></p>\n"
                "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Sans Serif\'; font-size:8pt;\">    base - the initial value of the waveform</span></p>\n"
                "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Sans Serif\'; font-size:8pt;\">Example: start at 0mV, step down to -30mV at 50ms, then step up to 30mV at 100ms</span></p>\n"
                "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Sans Serif\'; font-size:8pt;\">    steps([50*ms, 100*ms], [-30*mV, 30*mV])</span></p>\n"
                "<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:\'Sans Serif\'; font-size:8pt;\"></p>\n"
                "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Sans Serif\'; font-size:8pt; font-weight:600;\">pulse</span><span style=\" font-family:\'Sans Serif\'; font-size:8pt;\">( times, widths, values, [base=0.0] )</span></p>\n"
                "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Sans Serif\'; font-size:8pt;\">Generates one or more square pulses</span></p>\n"
                "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Sans Serif\'; font-size:8pt;\">    times - a value or a list of values marking the time of the pulse(s)</span></p>\n"
                "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Sans Serif\'; font-size:8pt;\">    widths - a value or a list of values indicating the width of the pulse(s)</span></p>\n"
                "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Sans Serif\'; font-size:8pt;\">    values - a value or a list of values indicating the height of the pulse(s)</span></p>\n"
                "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Sans Serif\'; font-size:8pt;\">    base - the baseline value of the waveform</span></p>\n"
                "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Sans Serif\'; font-size:8pt;\">Example:  20pA pulse starting at 10ms and ending at 40ms</span></p>\n"
                "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Sans Serif\'; font-size:8pt;\">    pulse(10*ms, 30*ms, 20*pA)</span></p>\n"
                "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Sans Serif\'; font-size:8pt;\">Example:  20 and 30pA pulses, 10ms wide, starting at 20 and 40ms</span></p>\n"
                "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Sans Serif\'; font-size:8pt;\">    pulse([20*ms, 40*ms], 10*ms, [20*pA, 30*pA])</span></p>\n"
                "<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:\'Sans Serif\'; font-size:8pt;\"></p>\n"
                "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Sans Serif\'; font-size:8pt; font-weight:600;\">sineWave</span><span style=\" font-family:\'Sans Serif\'; font-size:8pt;\">(period, amplitude=1.0, phase=0.0, start=0.0, stop=None, base=0.0)</span></p>\n"
                "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Sans Serif\'; font-size:8pt; font-weight:600;\">squareWave</span><span style=\" font-family:\'Sans Serif\'; font-size:8pt;\">(period, amplitude=1.0, phase=0.0, duty=0.5, start=0.0, stop=None, base=0.0)</span></p>\n"
                "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Sans Serif\'; font-size:8pt; font-weight:600;\">sawWave</span><span style=\" font-family:\'Sans Serif\'; font-size:8pt;\">(period, amplitude=1.0, phase=0.0, start=0.0, stop=None, base=0.0)</span></p>\n"
                "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Sans Serif\'; font-size:8pt; font-weight:600;\">listWave</span><span style=\" font-family:\'Sans Serif\'; font-size:8pt;\">(period, values, phase=0.0, start=0.0, stop=None, base=0.0)</span></p>\n"
                "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Sans Serif\'; font-size:8pt;\">These functions generate periodic waveforms using (mostly) identical arguments.</span></p>\n"
                "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Sans Serif\'; font-size:8pt;\">    period - the period of the wave. Eg: 10*us or 1.0/(100*kHz)</span></p>\n"
                "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Sans Serif\'; font-size:8pt;\">    amplitude - the peak amplitude of the wave. Eg: 10*mV</span></p>\n"
                "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Sans Serif\'; font-size:8pt;\">    phase - the starting phase of the wave in cycles (ie, 0.5 means 180 degrees)</span></p>\n"
                "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Sans Serif\'; font-size:8pt;\">    start - the starting time of the waveform. Everything before uses the base value.</span></p>\n"
                "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Sans Serif\'; font-size:8pt;\">    stop - the stopping time of the waveform. Everything after uses the base value.</span></p>\n"
                "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Sans Serif\'; font-size:8pt;\">    base - value to use before start/stop of wave.</span></p>\n"
                "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Sans Serif\'; font-size:8pt;\">Specific to squareWave:</span></p>\n"
                "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Sans Serif\'; font-size:8pt;\">    duty - The duty cycle of the wave (0.0 - 1.0)</span></p>\n"
                "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Sans Serif\'; font-size:8pt;\">Specific to listWave:</span></p>\n"
                "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Sans Serif\'; font-size:8pt;\">    values - the list of values that are iterated over for each cycle of the wave. </span></p>\n"
                "<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:\'Sans Serif\'; font-size:8pt;\"></p>\n"
                "<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:\'Ubuntu\'; font-size:8pt;\"></p>\n"
                "<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:\'Ubuntu\'; font-size:8pt;\"></p></body></html>",
                None))
        self.errorText.setHtml(
            _translate(
                "Form",
                "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
                "<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
                "p, li { white-space: pre-wrap; }\n"
                "</style></head><body style=\" font-family:\'MS Shell Dlg 2\'; font-size:8.25pt; font-weight:400; font-style:normal;\">\n"
                "<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Ubuntu\'; font-size:9pt;\">No Error.</span></p></body></html>",
                None))
        self.advancedBtn.setText(_translate("Form", "Advanced", None))
        self.errorBtn.setText(_translate("Form", "!", None))
        self.helpBtn.setText(_translate("Form", "?", None))
        self.updateBtn.setText(_translate("Form", "Update", None))
        self.autoUpdateCheck.setText(_translate("Form", "Auto", None))
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(840, 504)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
        sizePolicy.setHorizontalStretch(4)
        sizePolicy.setVerticalStretch(1)
        sizePolicy.setHeightForWidth(Form.sizePolicy().hasHeightForWidth())
        Form.setSizePolicy(sizePolicy)
        self.gridLayout_4 = QtWidgets.QGridLayout(Form)
        self.gridLayout_4.setContentsMargins(3, 3, 3, 3)
        self.gridLayout_4.setHorizontalSpacing(9)
        self.gridLayout_4.setVerticalSpacing(2)
        self.gridLayout_4.setObjectName("gridLayout_4")
        self.gridLayout = QtWidgets.QGridLayout()
        self.gridLayout.setSizeConstraint(QtWidgets.QLayout.SetMaximumSize)
        self.gridLayout.setObjectName("gridLayout")
        self.cameraCombo = InterfaceCombo(Form)
        self.cameraCombo.setObjectName("cameraCombo")
        self.gridLayout.addWidget(self.cameraCombo, 0, 1, 1, 1)
        self.loadConfigBtn = QtWidgets.QPushButton(Form)
        self.loadConfigBtn.setObjectName("loadConfigBtn")
        self.gridLayout.addWidget(self.loadConfigBtn, 6, 0, 1, 2)
        self.label = QtWidgets.QLabel(Form)
        self.label.setObjectName("label")
        self.gridLayout.addWidget(self.label, 0, 0, 1, 1)
        self.label_2 = QtWidgets.QLabel(Form)
        self.label_2.setObjectName("label_2")
        self.gridLayout.addWidget(self.label_2, 1, 0, 1, 1)
        self.laserCombo = InterfaceCombo(Form)
        self.laserCombo.setObjectName("laserCombo")
        self.gridLayout.addWidget(self.laserCombo, 1, 1, 1, 1)
        self.simulateShutterCheck = QtWidgets.QCheckBox(Form)
        self.simulateShutterCheck.setObjectName("simulateShutterCheck")
        self.gridLayout.addWidget(self.simulateShutterCheck, 2, 0, 1, 2)
        self.enablePosCtrlCheck = QtWidgets.QCheckBox(Form)
        self.enablePosCtrlCheck.setChecked(True)
        self.enablePosCtrlCheck.setObjectName("enablePosCtrlCheck")
        self.gridLayout.addWidget(self.enablePosCtrlCheck, 3, 0, 1, 2)
        self.enableScanProgCheck = QtWidgets.QCheckBox(Form)
        self.enableScanProgCheck.setChecked(True)
        self.enableScanProgCheck.setObjectName("enableScanProgCheck")
        self.gridLayout.addWidget(self.enableScanProgCheck, 4, 0, 1, 2)
        spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
        self.gridLayout.addItem(spacerItem, 5, 0, 1, 1)
        self.gridLayout_4.addLayout(self.gridLayout, 0, 0, 2, 1)
        self.positionCtrlGroup = QtWidgets.QGroupBox(Form)
        self.positionCtrlGroup.setCheckable(False)
        self.positionCtrlGroup.setChecked(False)
        self.positionCtrlGroup.setObjectName("positionCtrlGroup")
        self.gridLayout_5 = QtWidgets.QGridLayout(self.positionCtrlGroup)
        self.gridLayout_5.setContentsMargins(5, 5, 5, 5)
        self.gridLayout_5.setObjectName("gridLayout_5")
        self.showPosCtrlCheck = QtWidgets.QCheckBox(self.positionCtrlGroup)
        self.showPosCtrlCheck.setEnabled(True)
        self.showPosCtrlCheck.setChecked(True)
        self.showPosCtrlCheck.setObjectName("showPosCtrlCheck")
        self.gridLayout_5.addWidget(self.showPosCtrlCheck, 1, 0, 1, 1)
        self.spotDisplayGroup = GroupBox(self.positionCtrlGroup)
        self.spotDisplayGroup.setObjectName("spotDisplayGroup")
        self.gridLayout_2 = QtWidgets.QGridLayout(self.spotDisplayGroup)
        self.gridLayout_2.setContentsMargins(3, 3, 3, 3)
        self.gridLayout_2.setSpacing(0)
        self.gridLayout_2.setObjectName("gridLayout_2")
        self.sizeFromCalibrationRadio = QtWidgets.QRadioButton(self.spotDisplayGroup)
        self.sizeFromCalibrationRadio.setChecked(True)
        self.sizeFromCalibrationRadio.setObjectName("sizeFromCalibrationRadio")
        self.gridLayout_2.addWidget(self.sizeFromCalibrationRadio, 0, 0, 1, 2)
        self.sizeCustomRadio = QtWidgets.QRadioButton(self.spotDisplayGroup)
        self.sizeCustomRadio.setObjectName("sizeCustomRadio")
        self.gridLayout_2.addWidget(self.sizeCustomRadio, 1, 0, 1, 1)
        self.sizeSpin = SpinBox(self.spotDisplayGroup)
        self.sizeSpin.setSuffix("")
        self.sizeSpin.setMinimum(0.0)
        self.sizeSpin.setMaximum(100000.0)
        self.sizeSpin.setSingleStep(1e-06)
        self.sizeSpin.setProperty("value", 0.0)
        self.sizeSpin.setObjectName("sizeSpin")
        self.gridLayout_2.addWidget(self.sizeSpin, 1, 1, 1, 1)
        self.showLastSpotCheck = QtWidgets.QCheckBox(self.spotDisplayGroup)
        self.showLastSpotCheck.setObjectName("showLastSpotCheck")
        self.gridLayout_2.addWidget(self.showLastSpotCheck, 2, 0, 1, 1)
        self.gridLayout_5.addWidget(self.spotDisplayGroup, 3, 0, 1, 1)
        self.spotSequenceGroup = GroupBox(self.positionCtrlGroup)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.spotSequenceGroup.sizePolicy().hasHeightForWidth())
        self.spotSequenceGroup.setSizePolicy(sizePolicy)
        self.spotSequenceGroup.setObjectName("spotSequenceGroup")
        self.gridLayout_3 = QtWidgets.QGridLayout(self.spotSequenceGroup)
        self.gridLayout_3.setContentsMargins(3, 3, 3, 3)
        self.gridLayout_3.setSpacing(3)
        self.gridLayout_3.setObjectName("gridLayout_3")
        self.minTimeSpin = SpinBox(self.spotSequenceGroup)
        self.minTimeSpin.setSuffix("")
        self.minTimeSpin.setDecimals(2)
        self.minTimeSpin.setMaximum(1000000.0)
        self.minTimeSpin.setObjectName("minTimeSpin")
        self.gridLayout_3.addWidget(self.minTimeSpin, 1, 1, 1, 1)
        self.timeLabel = QtWidgets.QLabel(self.spotSequenceGroup)
        self.timeLabel.setObjectName("timeLabel")
        self.gridLayout_3.addWidget(self.timeLabel, 4, 0, 1, 2)
        self.minDistSpin = SpinBox(self.spotSequenceGroup)
        self.minDistSpin.setSuffix("")
        self.minDistSpin.setMaximum(1000000.0)
        self.minDistSpin.setObjectName("minDistSpin")
        self.gridLayout_3.addWidget(self.minDistSpin, 2, 1, 1, 1)
        self.label_3 = QtWidgets.QLabel(self.spotSequenceGroup)
        self.label_3.setObjectName("label_3")
        self.gridLayout_3.addWidget(self.label_3, 1, 0, 1, 1)
        self.recomputeBtn = QtWidgets.QPushButton(self.spotSequenceGroup)
        self.recomputeBtn.setObjectName("recomputeBtn")
        self.gridLayout_3.addWidget(self.recomputeBtn, 5, 0, 1, 2)
        self.label_4 = QtWidgets.QLabel(self.spotSequenceGroup)
        self.label_4.setObjectName("label_4")
        self.gridLayout_3.addWidget(self.label_4, 2, 0, 1, 1)
        self.tdPlotWidget = PlotWidget(self.spotSequenceGroup)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.tdPlotWidget.sizePolicy().hasHeightForWidth())
        self.tdPlotWidget.setSizePolicy(sizePolicy)
        self.tdPlotWidget.setMinimumSize(Qt.QSize(0, 100))
        self.tdPlotWidget.setMaximumSize(Qt.QSize(16777215, 100))
        self.tdPlotWidget.setObjectName("tdPlotWidget")
        self.gridLayout_3.addWidget(self.tdPlotWidget, 0, 0, 1, 2)
        self.gridLayout_5.addWidget(self.spotSequenceGroup, 2, 0, 1, 1)
        self.itemTree = ParameterTree(self.positionCtrlGroup)
        self.itemTree.setObjectName("itemTree")
        self.itemTree.headerItem().setText(0, "1")
        self.itemTree.header().setVisible(False)
        self.gridLayout_5.addWidget(self.itemTree, 0, 0, 1, 1)
        self.gridLayout_4.addWidget(self.positionCtrlGroup, 0, 1, 2, 1)
        self.scanProgramGroup = QtWidgets.QGroupBox(Form)
        self.scanProgramGroup.setCheckable(False)
        self.scanProgramGroup.setChecked(False)
        self.scanProgramGroup.setObjectName("scanProgramGroup")
        self.gridLayout_6 = QtWidgets.QGridLayout(self.scanProgramGroup)
        self.gridLayout_6.setContentsMargins(5, 5, 5, 5)
        self.gridLayout_6.setObjectName("gridLayout_6")
        self.gridLayout_9 = QtWidgets.QGridLayout()
        self.gridLayout_9.setObjectName("gridLayout_9")
        self.previewBtn = QtWidgets.QPushButton(self.scanProgramGroup)
        self.previewBtn.setCheckable(True)
        self.previewBtn.setObjectName("previewBtn")
        self.gridLayout_9.addWidget(self.previewBtn, 1, 0, 1, 1)
        spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.gridLayout_9.addItem(spacerItem1, 1, 1, 1, 1)
        self.programPreviewSlider = QtWidgets.QSlider(self.scanProgramGroup)
        self.programPreviewSlider.setMaximum(999)
        self.programPreviewSlider.setProperty("value", 666)
        self.programPreviewSlider.setOrientation(Qt.Qt.Horizontal)
        self.programPreviewSlider.setTickPosition(QtWidgets.QSlider.TicksBelow)
        self.programPreviewSlider.setTickInterval(333)
        self.programPreviewSlider.setObjectName("programPreviewSlider")
        self.gridLayout_9.addWidget(self.programPreviewSlider, 1, 2, 1, 1)
        self.gridLayout_6.addLayout(self.gridLayout_9, 1, 0, 1, 1)
        self.scanProgramSplitter = QtWidgets.QSplitter(self.scanProgramGroup)
        self.scanProgramSplitter.setOrientation(Qt.Qt.Vertical)
        self.scanProgramSplitter.setObjectName("scanProgramSplitter")
        self.programTree = ParameterTree(self.scanProgramSplitter)
        self.programTree.setObjectName("programTree")
        self.programTree.headerItem().setText(0, "1")
        self.programTree.header().setVisible(False)
        self.programTimeline = PlotWidget(self.scanProgramSplitter)
        self.programTimeline.setObjectName("programTimeline")
        self.gridLayout_6.addWidget(self.scanProgramSplitter, 0, 0, 1, 1)
        self.gridLayout_4.addWidget(self.scanProgramGroup, 1, 2, 1, 1)

        self.retranslateUi(Form)
        Qt.QMetaObject.connectSlotsByName(Form)
class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(840, 504)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
        sizePolicy.setHorizontalStretch(4)
        sizePolicy.setVerticalStretch(1)
        sizePolicy.setHeightForWidth(Form.sizePolicy().hasHeightForWidth())
        Form.setSizePolicy(sizePolicy)
        self.gridLayout_4 = QtWidgets.QGridLayout(Form)
        self.gridLayout_4.setContentsMargins(3, 3, 3, 3)
        self.gridLayout_4.setHorizontalSpacing(9)
        self.gridLayout_4.setVerticalSpacing(2)
        self.gridLayout_4.setObjectName("gridLayout_4")
        self.gridLayout = QtWidgets.QGridLayout()
        self.gridLayout.setSizeConstraint(QtWidgets.QLayout.SetMaximumSize)
        self.gridLayout.setObjectName("gridLayout")
        self.cameraCombo = InterfaceCombo(Form)
        self.cameraCombo.setObjectName("cameraCombo")
        self.gridLayout.addWidget(self.cameraCombo, 0, 1, 1, 1)
        self.loadConfigBtn = QtWidgets.QPushButton(Form)
        self.loadConfigBtn.setObjectName("loadConfigBtn")
        self.gridLayout.addWidget(self.loadConfigBtn, 6, 0, 1, 2)
        self.label = QtWidgets.QLabel(Form)
        self.label.setObjectName("label")
        self.gridLayout.addWidget(self.label, 0, 0, 1, 1)
        self.label_2 = QtWidgets.QLabel(Form)
        self.label_2.setObjectName("label_2")
        self.gridLayout.addWidget(self.label_2, 1, 0, 1, 1)
        self.laserCombo = InterfaceCombo(Form)
        self.laserCombo.setObjectName("laserCombo")
        self.gridLayout.addWidget(self.laserCombo, 1, 1, 1, 1)
        self.simulateShutterCheck = QtWidgets.QCheckBox(Form)
        self.simulateShutterCheck.setObjectName("simulateShutterCheck")
        self.gridLayout.addWidget(self.simulateShutterCheck, 2, 0, 1, 2)
        self.enablePosCtrlCheck = QtWidgets.QCheckBox(Form)
        self.enablePosCtrlCheck.setChecked(True)
        self.enablePosCtrlCheck.setObjectName("enablePosCtrlCheck")
        self.gridLayout.addWidget(self.enablePosCtrlCheck, 3, 0, 1, 2)
        self.enableScanProgCheck = QtWidgets.QCheckBox(Form)
        self.enableScanProgCheck.setChecked(True)
        self.enableScanProgCheck.setObjectName("enableScanProgCheck")
        self.gridLayout.addWidget(self.enableScanProgCheck, 4, 0, 1, 2)
        spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
        self.gridLayout.addItem(spacerItem, 5, 0, 1, 1)
        self.gridLayout_4.addLayout(self.gridLayout, 0, 0, 2, 1)
        self.positionCtrlGroup = QtWidgets.QGroupBox(Form)
        self.positionCtrlGroup.setCheckable(False)
        self.positionCtrlGroup.setChecked(False)
        self.positionCtrlGroup.setObjectName("positionCtrlGroup")
        self.gridLayout_5 = QtWidgets.QGridLayout(self.positionCtrlGroup)
        self.gridLayout_5.setContentsMargins(5, 5, 5, 5)
        self.gridLayout_5.setObjectName("gridLayout_5")
        self.showPosCtrlCheck = QtWidgets.QCheckBox(self.positionCtrlGroup)
        self.showPosCtrlCheck.setEnabled(True)
        self.showPosCtrlCheck.setChecked(True)
        self.showPosCtrlCheck.setObjectName("showPosCtrlCheck")
        self.gridLayout_5.addWidget(self.showPosCtrlCheck, 1, 0, 1, 1)
        self.spotDisplayGroup = GroupBox(self.positionCtrlGroup)
        self.spotDisplayGroup.setObjectName("spotDisplayGroup")
        self.gridLayout_2 = QtWidgets.QGridLayout(self.spotDisplayGroup)
        self.gridLayout_2.setContentsMargins(3, 3, 3, 3)
        self.gridLayout_2.setSpacing(0)
        self.gridLayout_2.setObjectName("gridLayout_2")
        self.sizeFromCalibrationRadio = QtWidgets.QRadioButton(self.spotDisplayGroup)
        self.sizeFromCalibrationRadio.setChecked(True)
        self.sizeFromCalibrationRadio.setObjectName("sizeFromCalibrationRadio")
        self.gridLayout_2.addWidget(self.sizeFromCalibrationRadio, 0, 0, 1, 2)
        self.sizeCustomRadio = QtWidgets.QRadioButton(self.spotDisplayGroup)
        self.sizeCustomRadio.setObjectName("sizeCustomRadio")
        self.gridLayout_2.addWidget(self.sizeCustomRadio, 1, 0, 1, 1)
        self.sizeSpin = SpinBox(self.spotDisplayGroup)
        self.sizeSpin.setSuffix("")
        self.sizeSpin.setMinimum(0.0)
        self.sizeSpin.setMaximum(100000.0)
        self.sizeSpin.setSingleStep(1e-06)
        self.sizeSpin.setProperty("value", 0.0)
        self.sizeSpin.setObjectName("sizeSpin")
        self.gridLayout_2.addWidget(self.sizeSpin, 1, 1, 1, 1)
        self.showLastSpotCheck = QtWidgets.QCheckBox(self.spotDisplayGroup)
        self.showLastSpotCheck.setObjectName("showLastSpotCheck")
        self.gridLayout_2.addWidget(self.showLastSpotCheck, 2, 0, 1, 1)
        self.gridLayout_5.addWidget(self.spotDisplayGroup, 3, 0, 1, 1)
        self.spotSequenceGroup = GroupBox(self.positionCtrlGroup)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.spotSequenceGroup.sizePolicy().hasHeightForWidth())
        self.spotSequenceGroup.setSizePolicy(sizePolicy)
        self.spotSequenceGroup.setObjectName("spotSequenceGroup")
        self.gridLayout_3 = QtWidgets.QGridLayout(self.spotSequenceGroup)
        self.gridLayout_3.setContentsMargins(3, 3, 3, 3)
        self.gridLayout_3.setSpacing(3)
        self.gridLayout_3.setObjectName("gridLayout_3")
        self.minTimeSpin = SpinBox(self.spotSequenceGroup)
        self.minTimeSpin.setSuffix("")
        self.minTimeSpin.setDecimals(2)
        self.minTimeSpin.setMaximum(1000000.0)
        self.minTimeSpin.setObjectName("minTimeSpin")
        self.gridLayout_3.addWidget(self.minTimeSpin, 1, 1, 1, 1)
        self.timeLabel = QtWidgets.QLabel(self.spotSequenceGroup)
        self.timeLabel.setObjectName("timeLabel")
        self.gridLayout_3.addWidget(self.timeLabel, 4, 0, 1, 2)
        self.minDistSpin = SpinBox(self.spotSequenceGroup)
        self.minDistSpin.setSuffix("")
        self.minDistSpin.setMaximum(1000000.0)
        self.minDistSpin.setObjectName("minDistSpin")
        self.gridLayout_3.addWidget(self.minDistSpin, 2, 1, 1, 1)
        self.label_3 = QtWidgets.QLabel(self.spotSequenceGroup)
        self.label_3.setObjectName("label_3")
        self.gridLayout_3.addWidget(self.label_3, 1, 0, 1, 1)
        self.recomputeBtn = QtWidgets.QPushButton(self.spotSequenceGroup)
        self.recomputeBtn.setObjectName("recomputeBtn")
        self.gridLayout_3.addWidget(self.recomputeBtn, 5, 0, 1, 2)
        self.label_4 = QtWidgets.QLabel(self.spotSequenceGroup)
        self.label_4.setObjectName("label_4")
        self.gridLayout_3.addWidget(self.label_4, 2, 0, 1, 1)
        self.tdPlotWidget = PlotWidget(self.spotSequenceGroup)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.tdPlotWidget.sizePolicy().hasHeightForWidth())
        self.tdPlotWidget.setSizePolicy(sizePolicy)
        self.tdPlotWidget.setMinimumSize(Qt.QSize(0, 100))
        self.tdPlotWidget.setMaximumSize(Qt.QSize(16777215, 100))
        self.tdPlotWidget.setObjectName("tdPlotWidget")
        self.gridLayout_3.addWidget(self.tdPlotWidget, 0, 0, 1, 2)
        self.gridLayout_5.addWidget(self.spotSequenceGroup, 2, 0, 1, 1)
        self.itemTree = ParameterTree(self.positionCtrlGroup)
        self.itemTree.setObjectName("itemTree")
        self.itemTree.headerItem().setText(0, "1")
        self.itemTree.header().setVisible(False)
        self.gridLayout_5.addWidget(self.itemTree, 0, 0, 1, 1)
        self.gridLayout_4.addWidget(self.positionCtrlGroup, 0, 1, 2, 1)
        self.scanProgramGroup = QtWidgets.QGroupBox(Form)
        self.scanProgramGroup.setCheckable(False)
        self.scanProgramGroup.setChecked(False)
        self.scanProgramGroup.setObjectName("scanProgramGroup")
        self.gridLayout_6 = QtWidgets.QGridLayout(self.scanProgramGroup)
        self.gridLayout_6.setContentsMargins(5, 5, 5, 5)
        self.gridLayout_6.setObjectName("gridLayout_6")
        self.gridLayout_9 = QtWidgets.QGridLayout()
        self.gridLayout_9.setObjectName("gridLayout_9")
        self.previewBtn = QtWidgets.QPushButton(self.scanProgramGroup)
        self.previewBtn.setCheckable(True)
        self.previewBtn.setObjectName("previewBtn")
        self.gridLayout_9.addWidget(self.previewBtn, 1, 0, 1, 1)
        spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.gridLayout_9.addItem(spacerItem1, 1, 1, 1, 1)
        self.programPreviewSlider = QtWidgets.QSlider(self.scanProgramGroup)
        self.programPreviewSlider.setMaximum(999)
        self.programPreviewSlider.setProperty("value", 666)
        self.programPreviewSlider.setOrientation(Qt.Qt.Horizontal)
        self.programPreviewSlider.setTickPosition(QtWidgets.QSlider.TicksBelow)
        self.programPreviewSlider.setTickInterval(333)
        self.programPreviewSlider.setObjectName("programPreviewSlider")
        self.gridLayout_9.addWidget(self.programPreviewSlider, 1, 2, 1, 1)
        self.gridLayout_6.addLayout(self.gridLayout_9, 1, 0, 1, 1)
        self.scanProgramSplitter = QtWidgets.QSplitter(self.scanProgramGroup)
        self.scanProgramSplitter.setOrientation(Qt.Qt.Vertical)
        self.scanProgramSplitter.setObjectName("scanProgramSplitter")
        self.programTree = ParameterTree(self.scanProgramSplitter)
        self.programTree.setObjectName("programTree")
        self.programTree.headerItem().setText(0, "1")
        self.programTree.header().setVisible(False)
        self.programTimeline = PlotWidget(self.scanProgramSplitter)
        self.programTimeline.setObjectName("programTimeline")
        self.gridLayout_6.addWidget(self.scanProgramSplitter, 0, 0, 1, 1)
        self.gridLayout_4.addWidget(self.scanProgramGroup, 1, 2, 1, 1)

        self.retranslateUi(Form)
        Qt.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        _translate = Qt.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "Form"))
        self.cameraCombo.setToolTip(_translate("Form", "Selects the camera module to use with the scanner. This, along with the laser device, determines which calibration files will be used."))
        self.loadConfigBtn.setText(_translate("Form", "Load Last Config"))
        self.label.setText(_translate("Form", "Camera Module:"))
        self.label_2.setText(_translate("Form", "Laser Device:"))
        self.laserCombo.setToolTip(_translate("Form", "Selects the laser to be used."))
        self.simulateShutterCheck.setText(_translate("Form", "Simulate Shutter"))
        self.enablePosCtrlCheck.setText(_translate("Form", "Enable position controls"))
        self.enableScanProgCheck.setText(_translate("Form", "Enable scan programs"))
        self.positionCtrlGroup.setTitle(_translate("Form", "Position Controls"))
        self.showPosCtrlCheck.setToolTip(_translate("Form", "Hide all items from view."))
        self.showPosCtrlCheck.setText(_translate("Form", "Show position controls"))
        self.spotDisplayGroup.setTitle(_translate("Form", "Spot Display"))
        self.sizeFromCalibrationRadio.setToolTip(_translate("Form", "Causes target spots to be displayed at the size determined by the calibration file. Does not affect how data is collected."))
        self.sizeFromCalibrationRadio.setText(_translate("Form", "Use size from scanner calibration"))
        self.sizeCustomRadio.setToolTip(_translate("Form", "Lets the user change the display size of target spots. Does not change the way data is collected."))
        self.sizeCustomRadio.setText(_translate("Form", "Use custom size:"))
        self.sizeSpin.setToolTip(_translate("Form", "Specifies the display size of the target spots. Does not change the way data is collected."))
        self.showLastSpotCheck.setText(_translate("Form", "Show last spot"))
        self.spotSequenceGroup.setTitle(_translate("Form", "Spot Sequence"))
        self.minTimeSpin.setToolTip(_translate("Form", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
"<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
"p, li { white-space: pre-wrap; }\n"
"</style></head><body style=\" font-family:\'MS Shell Dlg 2\'; font-size:8.25pt; font-weight:400; font-style:normal;\">\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-size:8pt;\">When stimulating a sequence of points, this is the minimum amount of time that must pass before stimulating the same spot a second time. Points farther away will require smaller delays. Points farther than the minimum distance (specified below) will require no delay.</span></p></body></html>"))
        self.timeLabel.setText(_translate("Form", "Total Time:"))
        self.minDistSpin.setToolTip(_translate("Form", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
"<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
"p, li { white-space: pre-wrap; }\n"
"</style></head><body style=\" font-family:\'MS Shell Dlg 2\'; font-size:8.25pt; font-weight:400; font-style:normal;\">\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-size:8pt;\">When stimulating a sequence of points, this is the minimum distance between two spots such that no time delay is required between stimulating them. Points closer than this distance will require some delay, which is determined in part by the minimum time specified above.</span></p></body></html>"))
        self.label_3.setText(_translate("Form", "Minimum time"))
        self.recomputeBtn.setText(_translate("Form", "Recompute Order"))
        self.label_4.setText(_translate("Form", "Minimum distance"))
        self.scanProgramGroup.setTitle(_translate("Form", "Scan Program Controls"))
        self.previewBtn.setText(_translate("Form", "Preview"))
Exemple #7
0
    def setupUi(self, Form):
        Form.setObjectName(_fromUtf8("Form"))
        Form.resize(703, 428)
        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Preferred)
        sizePolicy.setHorizontalStretch(4)
        sizePolicy.setVerticalStretch(1)
        sizePolicy.setHeightForWidth(Form.sizePolicy().hasHeightForWidth())
        Form.setSizePolicy(sizePolicy)
        self.gridLayout_4 = QtGui.QGridLayout(Form)
        self.gridLayout_4.setMargin(3)
        self.gridLayout_4.setHorizontalSpacing(9)
        self.gridLayout_4.setVerticalSpacing(2)
        self.gridLayout_4.setObjectName(_fromUtf8("gridLayout_4"))
        self.gridLayout = QtGui.QGridLayout()
        self.gridLayout.setSizeConstraint(QtGui.QLayout.SetMaximumSize)
        self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
        self.simulateShutterCheck = QtGui.QCheckBox(Form)
        self.simulateShutterCheck.setObjectName(_fromUtf8("simulateShutterCheck"))
        self.gridLayout.addWidget(self.simulateShutterCheck, 2, 0, 1, 2)
        self.groupBox = QtGui.QGroupBox(Form)
        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Preferred)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.groupBox.sizePolicy().hasHeightForWidth())
        self.groupBox.setSizePolicy(sizePolicy)
        self.groupBox.setMinimumSize(QtCore.QSize(190, 210))
        self.groupBox.setObjectName(_fromUtf8("groupBox"))
        self.gridLayout_3 = QtGui.QGridLayout(self.groupBox)
        self.gridLayout_3.setMargin(3)
        self.gridLayout_3.setSpacing(3)
        self.gridLayout_3.setObjectName(_fromUtf8("gridLayout_3"))
        self.tdPlotWidget = PlotWidget(self.groupBox)
        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.tdPlotWidget.sizePolicy().hasHeightForWidth())
        self.tdPlotWidget.setSizePolicy(sizePolicy)
        self.tdPlotWidget.setObjectName(_fromUtf8("tdPlotWidget"))
        self.gridLayout_3.addWidget(self.tdPlotWidget, 0, 0, 1, 2)
        self.label_3 = QtGui.QLabel(self.groupBox)
        self.label_3.setObjectName(_fromUtf8("label_3"))
        self.gridLayout_3.addWidget(self.label_3, 1, 0, 1, 1)
        self.minTimeSpin = SpinBox(self.groupBox)
        self.minTimeSpin.setSuffix(_fromUtf8(""))
        self.minTimeSpin.setDecimals(2)
        self.minTimeSpin.setMaximum(1000000.0)
        self.minTimeSpin.setObjectName(_fromUtf8("minTimeSpin"))
        self.gridLayout_3.addWidget(self.minTimeSpin, 1, 1, 1, 1)
        self.label_4 = QtGui.QLabel(self.groupBox)
        self.label_4.setObjectName(_fromUtf8("label_4"))
        self.gridLayout_3.addWidget(self.label_4, 2, 0, 1, 1)
        self.minDistSpin = SpinBox(self.groupBox)
        self.minDistSpin.setSuffix(_fromUtf8(""))
        self.minDistSpin.setMaximum(1000000.0)
        self.minDistSpin.setObjectName(_fromUtf8("minDistSpin"))
        self.gridLayout_3.addWidget(self.minDistSpin, 2, 1, 1, 1)
        self.recomputeBtn = QtGui.QPushButton(self.groupBox)
        self.recomputeBtn.setObjectName(_fromUtf8("recomputeBtn"))
        self.gridLayout_3.addWidget(self.recomputeBtn, 5, 0, 1, 2)
        self.timeLabel = QtGui.QLabel(self.groupBox)
        self.timeLabel.setObjectName(_fromUtf8("timeLabel"))
        self.gridLayout_3.addWidget(self.timeLabel, 4, 0, 1, 2)
        self.gridLayout.addWidget(self.groupBox, 5, 0, 1, 2)
        self.groupBox_2 = QtGui.QGroupBox(Form)
        self.groupBox_2.setObjectName(_fromUtf8("groupBox_2"))
        self.gridLayout_2 = QtGui.QGridLayout(self.groupBox_2)
        self.gridLayout_2.setMargin(3)
        self.gridLayout_2.setSpacing(0)
        self.gridLayout_2.setObjectName(_fromUtf8("gridLayout_2"))
        self.sizeFromCalibrationRadio = QtGui.QRadioButton(self.groupBox_2)
        self.sizeFromCalibrationRadio.setChecked(True)
        self.sizeFromCalibrationRadio.setObjectName(_fromUtf8("sizeFromCalibrationRadio"))
        self.gridLayout_2.addWidget(self.sizeFromCalibrationRadio, 0, 0, 1, 2)
        self.sizeCustomRadio = QtGui.QRadioButton(self.groupBox_2)
        self.sizeCustomRadio.setObjectName(_fromUtf8("sizeCustomRadio"))
        self.gridLayout_2.addWidget(self.sizeCustomRadio, 1, 0, 1, 1)
        self.sizeSpin = SpinBox(self.groupBox_2)
        self.sizeSpin.setSuffix(_fromUtf8(""))
        self.sizeSpin.setMinimum(0.0)
        self.sizeSpin.setMaximum(100000.0)
        self.sizeSpin.setSingleStep(1e-06)
        self.sizeSpin.setProperty("value", 0.0)
        self.sizeSpin.setObjectName(_fromUtf8("sizeSpin"))
        self.gridLayout_2.addWidget(self.sizeSpin, 1, 1, 1, 1)
        self.gridLayout.addWidget(self.groupBox_2, 4, 0, 1, 2)
        self.label = QtGui.QLabel(Form)
        self.label.setObjectName(_fromUtf8("label"))
        self.gridLayout.addWidget(self.label, 0, 0, 1, 1)
        spacerItem = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
        self.gridLayout.addItem(spacerItem, 6, 0, 1, 1)
        self.laserCombo = InterfaceCombo(Form)
        self.laserCombo.setObjectName(_fromUtf8("laserCombo"))
        self.gridLayout.addWidget(self.laserCombo, 1, 1, 1, 1)
        self.label_2 = QtGui.QLabel(Form)
        self.label_2.setObjectName(_fromUtf8("label_2"))
        self.gridLayout.addWidget(self.label_2, 1, 0, 1, 1)
        self.cameraCombo = InterfaceCombo(Form)
        self.cameraCombo.setObjectName(_fromUtf8("cameraCombo"))
        self.gridLayout.addWidget(self.cameraCombo, 0, 1, 1, 1)
        self.loadConfigBtn = QtGui.QPushButton(Form)
        self.loadConfigBtn.setObjectName(_fromUtf8("loadConfigBtn"))
        self.gridLayout.addWidget(self.loadConfigBtn, 7, 0, 1, 2)
        spacerItem1 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
        self.gridLayout.addItem(spacerItem1, 3, 0, 1, 1)
        self.gridLayout_4.addLayout(self.gridLayout, 0, 0, 2, 1)
        self.groupBox_3 = QtGui.QGroupBox(Form)
        self.groupBox_3.setObjectName(_fromUtf8("groupBox_3"))
        self.gridLayout_5 = QtGui.QGridLayout(self.groupBox_3)
        self.gridLayout_5.setMargin(5)
        self.gridLayout_5.setObjectName(_fromUtf8("gridLayout_5"))
        self.itemTree = ParameterTree(self.groupBox_3)
        self.itemTree.setObjectName(_fromUtf8("itemTree"))
        self.itemTree.headerItem().setText(0, _fromUtf8("1"))
        self.itemTree.header().setVisible(False)
        self.gridLayout_5.addWidget(self.itemTree, 0, 0, 1, 1)
        self.horizontalLayout_5 = QtGui.QHBoxLayout()
        self.horizontalLayout_5.setObjectName(_fromUtf8("horizontalLayout_5"))
        self.hideCheck = QtGui.QCheckBox(self.groupBox_3)
        self.hideCheck.setEnabled(True)
        self.hideCheck.setChecked(False)
        self.hideCheck.setObjectName(_fromUtf8("hideCheck"))
        self.horizontalLayout_5.addWidget(self.hideCheck)
        spacerItem2 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
        self.horizontalLayout_5.addItem(spacerItem2)
        self.hideMarkerBtn = QtGui.QPushButton(self.groupBox_3)
        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.hideMarkerBtn.sizePolicy().hasHeightForWidth())
        self.hideMarkerBtn.setSizePolicy(sizePolicy)
        self.hideMarkerBtn.setObjectName(_fromUtf8("hideMarkerBtn"))
        self.horizontalLayout_5.addWidget(self.hideMarkerBtn)
        self.gridLayout_5.addLayout(self.horizontalLayout_5, 1, 0, 1, 1)
        self.gridLayout_4.addWidget(self.groupBox_3, 0, 1, 2, 1)
        self.groupBox_4 = QtGui.QGroupBox(Form)
        self.groupBox_4.setObjectName(_fromUtf8("groupBox_4"))
        self.gridLayout_6 = QtGui.QGridLayout(self.groupBox_4)
        self.gridLayout_6.setMargin(5)
        self.gridLayout_6.setObjectName(_fromUtf8("gridLayout_6"))
        self.gridLayout_9 = QtGui.QGridLayout()
        self.gridLayout_9.setObjectName(_fromUtf8("gridLayout_9"))
        spacerItem3 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
        self.gridLayout_9.addItem(spacerItem3, 0, 0, 1, 1)
        self.previewBtn = QtGui.QPushButton(self.groupBox_4)
        self.previewBtn.setEnabled(False)
        self.previewBtn.setObjectName(_fromUtf8("previewBtn"))
        self.gridLayout_9.addWidget(self.previewBtn, 0, 1, 1, 1)
        self.gridLayout_6.addLayout(self.gridLayout_9, 1, 0, 1, 1)
        self.programTree = ParameterTree(self.groupBox_4)
        self.programTree.setObjectName(_fromUtf8("programTree"))
        self.programTree.headerItem().setText(0, _fromUtf8("1"))
        self.programTree.header().setVisible(False)
        self.gridLayout_6.addWidget(self.programTree, 0, 0, 1, 1)
        self.gridLayout_4.addWidget(self.groupBox_4, 1, 2, 1, 1)

        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)
Exemple #8
0
class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName(_fromUtf8("Form"))
        Form.resize(703, 428)
        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Preferred)
        sizePolicy.setHorizontalStretch(4)
        sizePolicy.setVerticalStretch(1)
        sizePolicy.setHeightForWidth(Form.sizePolicy().hasHeightForWidth())
        Form.setSizePolicy(sizePolicy)
        self.gridLayout_4 = QtGui.QGridLayout(Form)
        self.gridLayout_4.setMargin(3)
        self.gridLayout_4.setHorizontalSpacing(9)
        self.gridLayout_4.setVerticalSpacing(2)
        self.gridLayout_4.setObjectName(_fromUtf8("gridLayout_4"))
        self.gridLayout = QtGui.QGridLayout()
        self.gridLayout.setSizeConstraint(QtGui.QLayout.SetMaximumSize)
        self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
        self.simulateShutterCheck = QtGui.QCheckBox(Form)
        self.simulateShutterCheck.setObjectName(_fromUtf8("simulateShutterCheck"))
        self.gridLayout.addWidget(self.simulateShutterCheck, 2, 0, 1, 2)
        self.groupBox = QtGui.QGroupBox(Form)
        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Preferred)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.groupBox.sizePolicy().hasHeightForWidth())
        self.groupBox.setSizePolicy(sizePolicy)
        self.groupBox.setMinimumSize(QtCore.QSize(190, 210))
        self.groupBox.setObjectName(_fromUtf8("groupBox"))
        self.gridLayout_3 = QtGui.QGridLayout(self.groupBox)
        self.gridLayout_3.setMargin(3)
        self.gridLayout_3.setSpacing(3)
        self.gridLayout_3.setObjectName(_fromUtf8("gridLayout_3"))
        self.tdPlotWidget = PlotWidget(self.groupBox)
        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.tdPlotWidget.sizePolicy().hasHeightForWidth())
        self.tdPlotWidget.setSizePolicy(sizePolicy)
        self.tdPlotWidget.setObjectName(_fromUtf8("tdPlotWidget"))
        self.gridLayout_3.addWidget(self.tdPlotWidget, 0, 0, 1, 2)
        self.label_3 = QtGui.QLabel(self.groupBox)
        self.label_3.setObjectName(_fromUtf8("label_3"))
        self.gridLayout_3.addWidget(self.label_3, 1, 0, 1, 1)
        self.minTimeSpin = SpinBox(self.groupBox)
        self.minTimeSpin.setSuffix(_fromUtf8(""))
        self.minTimeSpin.setDecimals(2)
        self.minTimeSpin.setMaximum(1000000.0)
        self.minTimeSpin.setObjectName(_fromUtf8("minTimeSpin"))
        self.gridLayout_3.addWidget(self.minTimeSpin, 1, 1, 1, 1)
        self.label_4 = QtGui.QLabel(self.groupBox)
        self.label_4.setObjectName(_fromUtf8("label_4"))
        self.gridLayout_3.addWidget(self.label_4, 2, 0, 1, 1)
        self.minDistSpin = SpinBox(self.groupBox)
        self.minDistSpin.setSuffix(_fromUtf8(""))
        self.minDistSpin.setMaximum(1000000.0)
        self.minDistSpin.setObjectName(_fromUtf8("minDistSpin"))
        self.gridLayout_3.addWidget(self.minDistSpin, 2, 1, 1, 1)
        self.recomputeBtn = QtGui.QPushButton(self.groupBox)
        self.recomputeBtn.setObjectName(_fromUtf8("recomputeBtn"))
        self.gridLayout_3.addWidget(self.recomputeBtn, 5, 0, 1, 2)
        self.timeLabel = QtGui.QLabel(self.groupBox)
        self.timeLabel.setObjectName(_fromUtf8("timeLabel"))
        self.gridLayout_3.addWidget(self.timeLabel, 4, 0, 1, 2)
        self.gridLayout.addWidget(self.groupBox, 5, 0, 1, 2)
        self.groupBox_2 = QtGui.QGroupBox(Form)
        self.groupBox_2.setObjectName(_fromUtf8("groupBox_2"))
        self.gridLayout_2 = QtGui.QGridLayout(self.groupBox_2)
        self.gridLayout_2.setMargin(3)
        self.gridLayout_2.setSpacing(0)
        self.gridLayout_2.setObjectName(_fromUtf8("gridLayout_2"))
        self.sizeFromCalibrationRadio = QtGui.QRadioButton(self.groupBox_2)
        self.sizeFromCalibrationRadio.setChecked(True)
        self.sizeFromCalibrationRadio.setObjectName(_fromUtf8("sizeFromCalibrationRadio"))
        self.gridLayout_2.addWidget(self.sizeFromCalibrationRadio, 0, 0, 1, 2)
        self.sizeCustomRadio = QtGui.QRadioButton(self.groupBox_2)
        self.sizeCustomRadio.setObjectName(_fromUtf8("sizeCustomRadio"))
        self.gridLayout_2.addWidget(self.sizeCustomRadio, 1, 0, 1, 1)
        self.sizeSpin = SpinBox(self.groupBox_2)
        self.sizeSpin.setSuffix(_fromUtf8(""))
        self.sizeSpin.setMinimum(0.0)
        self.sizeSpin.setMaximum(100000.0)
        self.sizeSpin.setSingleStep(1e-06)
        self.sizeSpin.setProperty("value", 0.0)
        self.sizeSpin.setObjectName(_fromUtf8("sizeSpin"))
        self.gridLayout_2.addWidget(self.sizeSpin, 1, 1, 1, 1)
        self.gridLayout.addWidget(self.groupBox_2, 4, 0, 1, 2)
        self.label = QtGui.QLabel(Form)
        self.label.setObjectName(_fromUtf8("label"))
        self.gridLayout.addWidget(self.label, 0, 0, 1, 1)
        spacerItem = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
        self.gridLayout.addItem(spacerItem, 6, 0, 1, 1)
        self.laserCombo = InterfaceCombo(Form)
        self.laserCombo.setObjectName(_fromUtf8("laserCombo"))
        self.gridLayout.addWidget(self.laserCombo, 1, 1, 1, 1)
        self.label_2 = QtGui.QLabel(Form)
        self.label_2.setObjectName(_fromUtf8("label_2"))
        self.gridLayout.addWidget(self.label_2, 1, 0, 1, 1)
        self.cameraCombo = InterfaceCombo(Form)
        self.cameraCombo.setObjectName(_fromUtf8("cameraCombo"))
        self.gridLayout.addWidget(self.cameraCombo, 0, 1, 1, 1)
        self.loadConfigBtn = QtGui.QPushButton(Form)
        self.loadConfigBtn.setObjectName(_fromUtf8("loadConfigBtn"))
        self.gridLayout.addWidget(self.loadConfigBtn, 7, 0, 1, 2)
        spacerItem1 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
        self.gridLayout.addItem(spacerItem1, 3, 0, 1, 1)
        self.gridLayout_4.addLayout(self.gridLayout, 0, 0, 2, 1)
        self.groupBox_3 = QtGui.QGroupBox(Form)
        self.groupBox_3.setObjectName(_fromUtf8("groupBox_3"))
        self.gridLayout_5 = QtGui.QGridLayout(self.groupBox_3)
        self.gridLayout_5.setMargin(5)
        self.gridLayout_5.setObjectName(_fromUtf8("gridLayout_5"))
        self.itemTree = ParameterTree(self.groupBox_3)
        self.itemTree.setObjectName(_fromUtf8("itemTree"))
        self.itemTree.headerItem().setText(0, _fromUtf8("1"))
        self.itemTree.header().setVisible(False)
        self.gridLayout_5.addWidget(self.itemTree, 0, 0, 1, 1)
        self.horizontalLayout_5 = QtGui.QHBoxLayout()
        self.horizontalLayout_5.setObjectName(_fromUtf8("horizontalLayout_5"))
        self.hideCheck = QtGui.QCheckBox(self.groupBox_3)
        self.hideCheck.setEnabled(True)
        self.hideCheck.setChecked(False)
        self.hideCheck.setObjectName(_fromUtf8("hideCheck"))
        self.horizontalLayout_5.addWidget(self.hideCheck)
        spacerItem2 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
        self.horizontalLayout_5.addItem(spacerItem2)
        self.hideMarkerBtn = QtGui.QPushButton(self.groupBox_3)
        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.hideMarkerBtn.sizePolicy().hasHeightForWidth())
        self.hideMarkerBtn.setSizePolicy(sizePolicy)
        self.hideMarkerBtn.setObjectName(_fromUtf8("hideMarkerBtn"))
        self.horizontalLayout_5.addWidget(self.hideMarkerBtn)
        self.gridLayout_5.addLayout(self.horizontalLayout_5, 1, 0, 1, 1)
        self.gridLayout_4.addWidget(self.groupBox_3, 0, 1, 2, 1)
        self.groupBox_4 = QtGui.QGroupBox(Form)
        self.groupBox_4.setObjectName(_fromUtf8("groupBox_4"))
        self.gridLayout_6 = QtGui.QGridLayout(self.groupBox_4)
        self.gridLayout_6.setMargin(5)
        self.gridLayout_6.setObjectName(_fromUtf8("gridLayout_6"))
        self.gridLayout_9 = QtGui.QGridLayout()
        self.gridLayout_9.setObjectName(_fromUtf8("gridLayout_9"))
        spacerItem3 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
        self.gridLayout_9.addItem(spacerItem3, 0, 0, 1, 1)
        self.previewBtn = QtGui.QPushButton(self.groupBox_4)
        self.previewBtn.setEnabled(False)
        self.previewBtn.setObjectName(_fromUtf8("previewBtn"))
        self.gridLayout_9.addWidget(self.previewBtn, 0, 1, 1, 1)
        self.gridLayout_6.addLayout(self.gridLayout_9, 1, 0, 1, 1)
        self.programTree = ParameterTree(self.groupBox_4)
        self.programTree.setObjectName(_fromUtf8("programTree"))
        self.programTree.headerItem().setText(0, _fromUtf8("1"))
        self.programTree.header().setVisible(False)
        self.gridLayout_6.addWidget(self.programTree, 0, 0, 1, 1)
        self.gridLayout_4.addWidget(self.groupBox_4, 1, 2, 1, 1)

        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        Form.setWindowTitle(_translate("Form", "Form", None))
        self.simulateShutterCheck.setText(_translate("Form", "Simulate Shutter", None))
        self.groupBox.setTitle(_translate("Form", "Spot Sequence", None))
        self.label_3.setText(_translate("Form", "Minimum time", None))
        self.minTimeSpin.setToolTip(_translate("Form", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
"<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
"p, li { white-space: pre-wrap; }\n"
"</style></head><body style=\" font-family:\'MS Shell Dlg 2\'; font-size:8.25pt; font-weight:400; font-style:normal;\">\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-size:8pt;\">When stimulating a sequence of points, this is the minimum amount of time that must pass before stimulating the same spot a second time. Points farther away will require smaller delays. Points farther than the minimum distance (specified below) will require no delay.</span></p></body></html>", None))
        self.label_4.setText(_translate("Form", "Minimum distance", None))
        self.minDistSpin.setToolTip(_translate("Form", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
"<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
"p, li { white-space: pre-wrap; }\n"
"</style></head><body style=\" font-family:\'MS Shell Dlg 2\'; font-size:8.25pt; font-weight:400; font-style:normal;\">\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-size:8pt;\">When stimulating a sequence of points, this is the minimum distance between two spots such that no time delay is required between stimulating them. Points closer than this distance will require some delay, which is determined in part by the minimum time specified above.</span></p></body></html>", None))
        self.recomputeBtn.setText(_translate("Form", "Recompute Order", None))
        self.timeLabel.setText(_translate("Form", "Total Time:", None))
        self.groupBox_2.setTitle(_translate("Form", "Spot Display Size", None))
        self.sizeFromCalibrationRadio.setToolTip(_translate("Form", "Causes target spots to be displayed at the size determined by the calibration file. Does not affect how data is collected.", None))
        self.sizeFromCalibrationRadio.setText(_translate("Form", "Use size from calibration", None))
        self.sizeCustomRadio.setToolTip(_translate("Form", "Lets the user change the display size of target spots. Does not change the way data is collected.", None))
        self.sizeCustomRadio.setText(_translate("Form", "Use custom size:", None))
        self.sizeSpin.setToolTip(_translate("Form", "Specifies the display size of the target spots. Does not change the way data is collected.", None))
        self.label.setText(_translate("Form", "Camera Module:", None))
        self.laserCombo.setToolTip(_translate("Form", "Selects the laser to be used.", None))
        self.label_2.setText(_translate("Form", "Laser Device:", None))
        self.cameraCombo.setToolTip(_translate("Form", "Selects the camera module to use with the scanner. This, along with the laser device, determines which calibration files will be used.", None))
        self.loadConfigBtn.setText(_translate("Form", "Load Last Config", None))
        self.groupBox_3.setTitle(_translate("Form", "Position Control Items", None))
        self.hideCheck.setToolTip(_translate("Form", "Hide all items from view.", None))
        self.hideCheck.setText(_translate("Form", "Hide items", None))
        self.hideMarkerBtn.setText(_translate("Form", "Hide Spot Marker", None))
        self.groupBox_4.setTitle(_translate("Form", "Program Controls", None))
        self.previewBtn.setText(_translate("Form", "Preview", None))
Exemple #9
0
class ImagingModule(AnalysisModule):
    def __init__(self, *args):
        AnalysisModule.__init__(self, *args)
        # self.ui = Ui_Form()
        # self.ui.setupUi(self)
        self.layout = QtGui.QGridLayout()
        self.setLayout(self.layout)
        self.splitter = QtGui.QSplitter()
        self.layout.addWidget(self.splitter)
        self.ptree = ParameterTree()
        self.splitter.addWidget(self.ptree)
        self.imageView = pg.ImageView()
        self.splitter.addWidget(self.imageView)

        self.params = Parameter(name='imager', children=[
            dict(name='scanner', type='interface', interfaceTypes=['scanner']),
            dict(name='detectors', type='group', addText="Add detector.."),
            dict(name='decomb', type='float', readonly=False, value=20e-6, suffix='s', siPrefix=True, bounds=[0, 1e-3], step=1e-6, decimals=5, children=[
                dict(name='auto', type='action'),
                dict(name='subpixel', type='bool', value=False),
                ]),
            dict(name='downsample', type='int', value=1, suffix='x', bounds=[1,None]),
            dict(name='display', type='bool', value=True),
            dict(name='scanProgram', type='list', values=[]),
            ])
        self.ptree.setParameters(self.params, showTop=False)
        self.params.sigTreeStateChanged.connect(self.update)
        self.params.child('detectors').sigAddNew.connect(self.addDetectorClicked)
        self.params.child('decomb', 'auto').sigActivated.connect(self.autoDecomb)

        self.man = getManager()
        self.lastFrame = None
        # self.SUF = SUFA.ScannerUtilities()
        # self.ui.alphaSlider.valueChanged.connect(self.imageAlphaAdjust)        
        self.img = pg.ImageItem()  ## image shown in camera module
        self.img.setLookupTable(self.imageView.ui.histogram.getLookupTable)  # image fetches LUT from the ImageView
        self.imageView.ui.histogram.sigLevelsChanged.connect(self._updateCamModImage)
        self.imageView.imageItem.setAutoDownsample(True)
        # self.ui.scannerComboBox.setTypes('scanner')
        # self.ui.detectorComboBox.setTypes('daqChannelGroup')

    def addDetectorClicked(self):
        self.addNewDetector()

    def addNewDetector(self, name='detector', value=None):
        self.params.child('detectors').addChild(
            dict(name=name, type='interface', interfaceTypes=['daqChannelGroup'], value=value, removable=True),
            autoIncrementName=True)
                
    def quit(self):
        self.clear()
        AnalysisModule.quit(self)
        
    def saveState(self):
        return self.params.saveState(filter='user')

    def restoreState(self, state):
        detectors = {}

        # for backward compat:
        det = state['children'].pop('detector', None)
        if det is not None:
            detectors['detector'] = det['value']
        # current format:
        dets = state['children'].get('detectors', {}).pop('children', {})
        for name, data in dets.items():
            detectors[name] = data['value']

        self.params.restoreState(state, removeChildren=False)
        for name, det in detectors.items():
            self.addNewDetector(name, det)

    def taskSequenceStarted(self, *args):
        pass
    
    def taskFinished(self):
        pass
        
    def newFrame(self, frame):
        """
        Called when task is finished (truly completes, no errors/abort)
        frame contains all of the data returned from all devices
        """
        self.lastFrame = frame
        self.update()  # updates image

        # Store image if requested
        storeFlag = frame['cmd']['protocol']['storeData'] # get flag 
        if storeFlag and len(self.lastResult) > 0:
            result = self.lastResult[0]  # for now we only handle single-component programs

            dirhandle = frame['cmd']['protocol']['storageDir'] # grab storage directory
            
                       
            # to line below, add x, y for the camera (look at camera video output)

            info = [dict(name='Time', units='s', values=result['scanParams'].frameTimes()), 
                    dict(name='X'), dict(name='Y'), {
                        'transform': result['transform'],
                        'imageProcessing': result['params'],
                    }]
            ma = metaarray.MetaArray(result['image'], info=info)
            fh = dirhandle.writeFile(ma, 'Imaging.ma')
            fh.setInfo(transform=result['transform'])

    def autoDecomb(self):
        # Determine decomb duration
        rs = self.lastResult[0]['scanParams']
        pmtdata = self.lastResult[0]['pmtdata']
        lag = rs.measureMirrorLag(pmtdata[0], subpixel=self.params['decomb', 'subpixel'])
        self.params['decomb'] = lag

    def update(self):
        self.lastResult = []
        frame = self.lastFrame
        if frame is None:
            self.clear()
            return
        # imageDownSample = self.ui.downSampling.value() # this is the "image" downsample,
        # get the downsample for the daq. This is far more complicated than it should be...

        # Get PMT signal(s)
        pmtdata = []
        for detector in self.params.param('detectors'):
            data = frame['result'][detector.value()]["Channel":'Input']
            t = data.xvals('Time')
            pmtdata.append(data.asarray())
        
        if len(pmtdata) == 0:
            return

        # parse program options
        scanCmd = frame['cmd'][self.params['scanner']]
        if 'program' not in scanCmd:
            return
        progs = scanCmd['program']
        if len(progs) == 0:
            self.image.setImage(np.zeros((1,1)))
            return

        # Update list so user can select program component
        supportedTypes = ['rect']
        progs = dict([(prog['name'], prog) for prog in progs if prog['type'] in supportedTypes])
        self.params.child('scanProgram').setLimits(progs.keys())
        selectedProg = self.params['scanProgram']
        if selectedProg not in progs:
            return
        prog = progs[selectedProg]
        
        if prog['type'] == 'rect':
            # keep track of some analysis in case it should be stored later
            result = {
                'params': self.params.saveState(filter='user')['children'],
                'pmtdata': pmtdata,
            }
            self.lastResult.append(result)

            rs = RectScan()
            rs.restoreState(prog['scanInfo'])
            result['scanParams'] = rs

            decomb = self.params['decomb']
            
            # Extract from PMT array
            imageData = []
            for chan in pmtdata:
                chanImage = rs.extractImage(chan, offset=decomb, subpixel=self.params['decomb', 'subpixel'])
                imageData.append(chanImage.reshape(chanImage.shape + (1,)))
                
            if len(imageData) == 1:
                imageData = imageData[0]
                levelMode = 'mono'
            else:
                if len(imageData) == 2:
                    imageData.append(np.zeros(imageData[0].shape, dtype=imageData[0].dtype))
                imageData = np.concatenate(imageData, axis=-1)
                levelMode = 'rgba'

            if imageData.size == 0:
                self.clear()
                raise Exception('image Data has zero size')

            # Downsample
            ds = self.params['downsample']
            if ds > 1:
                imageData = pg.downsample(imageData, ds, axis=2)

            # Collected as (frame, row, col) but pg prefers images like (frame, col, row)
            imageData = imageData.transpose((0, 2, 1, 3)[:imageData.ndim])
            result['image'] = imageData

            # compute global transform
            tr = rs.imageTransform()
            st = pg.QtGui.QTransform()
            st.scale(self.params['downsample'], 1)
            tr = st * tr
            result['transform'] = pg.SRTTransform3D(tr)

            frameTimes = rs.frameTimes()

            # Display image locally
            self.imageView.setImage(imageData, xvals=frameTimes, levelMode=levelMode)
            self.imageView.getView().setAspectLocked(True)
#            self.imageView.imageItem.setRect(QtCore.QRectF(0., 0., rs.width, rs.height))  # TODO: rs.width and rs.height might not be correct!
            self.imageView.imageItem.resetTransform()
            self.imageView.imageItem.scale((rs.width/rs.height)/(imageData.shape[1]/imageData.shape[2]), 1.0)
            self.imageView.autoRange()

            # Display image remotely (in the same camera module as used by the scanner device)
            if self.params['display']:
                self.img.setVisible(True)
                sd = self.pr.getDevice(self.params['scanner'])
                camMod = sd.cameraModule().window()
                camMod.addItem(self.img, z=1000)
                self.img.setImage(imageData.mean(axis=0))
                self.img.setTransform(tr)
            else:
                self.img.setVisible(False)
        else:
            raise Exception("Imaging module only supports rect scans (not %s)." % prog['type'])
        
    def clear(self):
        self.imageView.clear()
        scene = self.img.scene()
        if scene is not None:
            scene.removeItem(self.img)

    def imageAlphaAdjust(self):
        if self.img is None:
            return
        alpha = self.ui.alphaSlider.value()
        self.img.setImage(opacity=float(alpha/100.))
        
        
    def _updateCamModImage(self):
        # update image levels
        self.img.setLevels(self.imageView.ui.histogram.getLevels())
Exemple #10
0
    def setupUi(self, Form):
        Form.setObjectName(_fromUtf8("Form"))
        Form.resize(336, 439)
        Form.setMinimumSize(QtCore.QSize(0, 100))
        self.verticalLayout_5 = QtGui.QVBoxLayout(Form)
        self.verticalLayout_5.setSpacing(0)
        self.verticalLayout_5.setMargin(0)
        self.verticalLayout_5.setObjectName(_fromUtf8("verticalLayout_5"))
        self.frame = QtGui.QFrame(Form)
        self.frame.setFrameShape(QtGui.QFrame.StyledPanel)
        self.frame.setFrameShadow(QtGui.QFrame.Raised)
        self.frame.setObjectName(_fromUtf8("frame"))
        self.verticalLayout_4 = QtGui.QVBoxLayout(self.frame)
        self.verticalLayout_4.setSpacing(0)
        self.verticalLayout_4.setMargin(0)
        self.verticalLayout_4.setObjectName(_fromUtf8("verticalLayout_4"))
        self.splitter = QtGui.QSplitter(self.frame)
        self.splitter.setOrientation(QtCore.Qt.Vertical)
        self.splitter.setChildrenCollapsible(False)
        self.splitter.setObjectName(_fromUtf8("splitter"))
        self.stack = QtGui.QStackedWidget(self.splitter)
        self.stack.setObjectName(_fromUtf8("stack"))
        self.page = QtGui.QWidget()
        self.page.setObjectName(_fromUtf8("page"))
        self.verticalLayout_3 = QtGui.QVBoxLayout(self.page)
        self.verticalLayout_3.setSpacing(0)
        self.verticalLayout_3.setMargin(0)
        self.verticalLayout_3.setObjectName(_fromUtf8("verticalLayout_3"))
        self.stimulusTree = ParameterTree(self.page)
        self.stimulusTree.setHeaderHidden(True)
        self.stimulusTree.setObjectName(_fromUtf8("stimulusTree"))
        self.stimulusTree.headerItem().setText(0, _fromUtf8("1"))
        self.verticalLayout_3.addWidget(self.stimulusTree)
        self.stack.addWidget(self.page)
        self.page_3 = QtGui.QWidget()
        self.page_3.setObjectName(_fromUtf8("page_3"))
        self.gridLayout = QtGui.QGridLayout(self.page_3)
        self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
        spacerItem = QtGui.QSpacerItem(20, 76, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
        self.gridLayout.addItem(spacerItem, 0, 1, 1, 1)
        self.label = QtGui.QLabel(self.page_3)
        self.label.setTextFormat(QtCore.Qt.AutoText)
        self.label.setAlignment(QtCore.Qt.AlignCenter)
        self.label.setWordWrap(True)
        self.label.setObjectName(_fromUtf8("label"))
        self.gridLayout.addWidget(self.label, 1, 0, 1, 3)
        spacerItem1 = QtGui.QSpacerItem(93, 78, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
        self.gridLayout.addItem(spacerItem1, 2, 0, 2, 1)
        self.forceAdvancedBtn = QtGui.QPushButton(self.page_3)
        self.forceAdvancedBtn.setObjectName(_fromUtf8("forceAdvancedBtn"))
        self.gridLayout.addWidget(self.forceAdvancedBtn, 2, 1, 1, 1)
        spacerItem2 = QtGui.QSpacerItem(92, 78, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
        self.gridLayout.addItem(spacerItem2, 2, 2, 2, 1)
        self.forceSimpleBtn = QtGui.QPushButton(self.page_3)
        self.forceSimpleBtn.setObjectName(_fromUtf8("forceSimpleBtn"))
        self.gridLayout.addWidget(self.forceSimpleBtn, 3, 1, 1, 1)
        spacerItem3 = QtGui.QSpacerItem(20, 75, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
        self.gridLayout.addItem(spacerItem3, 4, 1, 1, 1)
        self.stack.addWidget(self.page_3)
        self.page_4 = QtGui.QWidget()
        self.page_4.setObjectName(_fromUtf8("page_4"))
        self.verticalLayout = QtGui.QVBoxLayout(self.page_4)
        self.verticalLayout.setSpacing(0)
        self.verticalLayout.setMargin(0)
        self.verticalLayout.setObjectName(_fromUtf8("verticalLayout"))
        self.splitter_2 = QtGui.QSplitter(self.page_4)
        self.splitter_2.setOrientation(QtCore.Qt.Vertical)
        self.splitter_2.setChildrenCollapsible(False)
        self.splitter_2.setObjectName(_fromUtf8("splitter_2"))
        self.functionText = QtGui.QTextEdit(self.splitter_2)
        self.functionText.setMinimumSize(QtCore.QSize(0, 15))
        self.functionText.setObjectName(_fromUtf8("functionText"))
        self.seqTree = ParameterTree(self.splitter_2)
        self.seqTree.setObjectName(_fromUtf8("seqTree"))
        self.seqTree.headerItem().setText(0, _fromUtf8("1"))
        self.seqTree.header().setVisible(False)
        self.verticalLayout.addWidget(self.splitter_2)
        self.stack.addWidget(self.page_4)
        self.page_2 = QtGui.QWidget()
        self.page_2.setObjectName(_fromUtf8("page_2"))
        self.verticalLayout_2 = QtGui.QVBoxLayout(self.page_2)
        self.verticalLayout_2.setMargin(0)
        self.verticalLayout_2.setObjectName(_fromUtf8("verticalLayout_2"))
        self.textBrowser = QtGui.QTextBrowser(self.page_2)
        self.textBrowser.setObjectName(_fromUtf8("textBrowser"))
        self.verticalLayout_2.addWidget(self.textBrowser)
        self.stack.addWidget(self.page_2)
        self.errorText = QtGui.QTextBrowser(self.splitter)
        self.errorText.setMinimumSize(QtCore.QSize(0, 15))
        self.errorText.setObjectName(_fromUtf8("errorText"))
        self.verticalLayout_4.addWidget(self.splitter)
        self.horizontalLayout = QtGui.QHBoxLayout()
        self.horizontalLayout.setSpacing(0)
        self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout"))
        self.advancedBtn = QtGui.QPushButton(self.frame)
        self.advancedBtn.setCheckable(True)
        self.advancedBtn.setObjectName(_fromUtf8("advancedBtn"))
        self.horizontalLayout.addWidget(self.advancedBtn)
        self.errorBtn = QtGui.QToolButton(self.frame)
        self.errorBtn.setEnabled(True)
        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.errorBtn.sizePolicy().hasHeightForWidth())
        self.errorBtn.setSizePolicy(sizePolicy)
        font = QtGui.QFont()
        font.setBold(True)
        font.setWeight(75)
        self.errorBtn.setFont(font)
        self.errorBtn.setCheckable(True)
        self.errorBtn.setObjectName(_fromUtf8("errorBtn"))
        self.horizontalLayout.addWidget(self.errorBtn)
        self.helpBtn = QtGui.QToolButton(self.frame)
        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.helpBtn.sizePolicy().hasHeightForWidth())
        self.helpBtn.setSizePolicy(sizePolicy)
        font = QtGui.QFont()
        font.setBold(True)
        font.setWeight(75)
        self.helpBtn.setFont(font)
        self.helpBtn.setCheckable(True)
        self.helpBtn.setObjectName(_fromUtf8("helpBtn"))
        self.horizontalLayout.addWidget(self.helpBtn)
        spacerItem4 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
        self.horizontalLayout.addItem(spacerItem4)
        self.updateBtn = QtGui.QPushButton(self.frame)
        self.updateBtn.setObjectName(_fromUtf8("updateBtn"))
        self.horizontalLayout.addWidget(self.updateBtn)
        self.autoUpdateCheck = QtGui.QCheckBox(self.frame)
        self.autoUpdateCheck.setObjectName(_fromUtf8("autoUpdateCheck"))
        self.horizontalLayout.addWidget(self.autoUpdateCheck)
        self.verticalLayout_4.addLayout(self.horizontalLayout)
        self.verticalLayout_5.addWidget(self.frame)

        self.retranslateUi(Form)
        self.stack.setCurrentIndex(0)
        QtCore.QMetaObject.connectSlotsByName(Form)
Exemple #11
0
class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName(_fromUtf8("Form"))
        Form.resize(336, 439)
        Form.setMinimumSize(QtCore.QSize(0, 100))
        self.verticalLayout_5 = QtGui.QVBoxLayout(Form)
        self.verticalLayout_5.setSpacing(0)
        self.verticalLayout_5.setMargin(0)
        self.verticalLayout_5.setObjectName(_fromUtf8("verticalLayout_5"))
        self.frame = QtGui.QFrame(Form)
        self.frame.setFrameShape(QtGui.QFrame.StyledPanel)
        self.frame.setFrameShadow(QtGui.QFrame.Raised)
        self.frame.setObjectName(_fromUtf8("frame"))
        self.verticalLayout_4 = QtGui.QVBoxLayout(self.frame)
        self.verticalLayout_4.setSpacing(0)
        self.verticalLayout_4.setMargin(0)
        self.verticalLayout_4.setObjectName(_fromUtf8("verticalLayout_4"))
        self.splitter = QtGui.QSplitter(self.frame)
        self.splitter.setOrientation(QtCore.Qt.Vertical)
        self.splitter.setChildrenCollapsible(False)
        self.splitter.setObjectName(_fromUtf8("splitter"))
        self.stack = QtGui.QStackedWidget(self.splitter)
        self.stack.setObjectName(_fromUtf8("stack"))
        self.page = QtGui.QWidget()
        self.page.setObjectName(_fromUtf8("page"))
        self.verticalLayout_3 = QtGui.QVBoxLayout(self.page)
        self.verticalLayout_3.setSpacing(0)
        self.verticalLayout_3.setMargin(0)
        self.verticalLayout_3.setObjectName(_fromUtf8("verticalLayout_3"))
        self.stimulusTree = ParameterTree(self.page)
        self.stimulusTree.setHeaderHidden(True)
        self.stimulusTree.setObjectName(_fromUtf8("stimulusTree"))
        self.stimulusTree.headerItem().setText(0, _fromUtf8("1"))
        self.verticalLayout_3.addWidget(self.stimulusTree)
        self.stack.addWidget(self.page)
        self.page_3 = QtGui.QWidget()
        self.page_3.setObjectName(_fromUtf8("page_3"))
        self.gridLayout = QtGui.QGridLayout(self.page_3)
        self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
        spacerItem = QtGui.QSpacerItem(20, 76, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
        self.gridLayout.addItem(spacerItem, 0, 1, 1, 1)
        self.label = QtGui.QLabel(self.page_3)
        self.label.setTextFormat(QtCore.Qt.AutoText)
        self.label.setAlignment(QtCore.Qt.AlignCenter)
        self.label.setWordWrap(True)
        self.label.setObjectName(_fromUtf8("label"))
        self.gridLayout.addWidget(self.label, 1, 0, 1, 3)
        spacerItem1 = QtGui.QSpacerItem(93, 78, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
        self.gridLayout.addItem(spacerItem1, 2, 0, 2, 1)
        self.forceAdvancedBtn = QtGui.QPushButton(self.page_3)
        self.forceAdvancedBtn.setObjectName(_fromUtf8("forceAdvancedBtn"))
        self.gridLayout.addWidget(self.forceAdvancedBtn, 2, 1, 1, 1)
        spacerItem2 = QtGui.QSpacerItem(92, 78, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
        self.gridLayout.addItem(spacerItem2, 2, 2, 2, 1)
        self.forceSimpleBtn = QtGui.QPushButton(self.page_3)
        self.forceSimpleBtn.setObjectName(_fromUtf8("forceSimpleBtn"))
        self.gridLayout.addWidget(self.forceSimpleBtn, 3, 1, 1, 1)
        spacerItem3 = QtGui.QSpacerItem(20, 75, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
        self.gridLayout.addItem(spacerItem3, 4, 1, 1, 1)
        self.stack.addWidget(self.page_3)
        self.page_4 = QtGui.QWidget()
        self.page_4.setObjectName(_fromUtf8("page_4"))
        self.verticalLayout = QtGui.QVBoxLayout(self.page_4)
        self.verticalLayout.setSpacing(0)
        self.verticalLayout.setMargin(0)
        self.verticalLayout.setObjectName(_fromUtf8("verticalLayout"))
        self.splitter_2 = QtGui.QSplitter(self.page_4)
        self.splitter_2.setOrientation(QtCore.Qt.Vertical)
        self.splitter_2.setChildrenCollapsible(False)
        self.splitter_2.setObjectName(_fromUtf8("splitter_2"))
        self.functionText = QtGui.QTextEdit(self.splitter_2)
        self.functionText.setMinimumSize(QtCore.QSize(0, 15))
        self.functionText.setObjectName(_fromUtf8("functionText"))
        self.seqTree = ParameterTree(self.splitter_2)
        self.seqTree.setObjectName(_fromUtf8("seqTree"))
        self.seqTree.headerItem().setText(0, _fromUtf8("1"))
        self.seqTree.header().setVisible(False)
        self.verticalLayout.addWidget(self.splitter_2)
        self.stack.addWidget(self.page_4)
        self.page_2 = QtGui.QWidget()
        self.page_2.setObjectName(_fromUtf8("page_2"))
        self.verticalLayout_2 = QtGui.QVBoxLayout(self.page_2)
        self.verticalLayout_2.setMargin(0)
        self.verticalLayout_2.setObjectName(_fromUtf8("verticalLayout_2"))
        self.textBrowser = QtGui.QTextBrowser(self.page_2)
        self.textBrowser.setObjectName(_fromUtf8("textBrowser"))
        self.verticalLayout_2.addWidget(self.textBrowser)
        self.stack.addWidget(self.page_2)
        self.errorText = QtGui.QTextBrowser(self.splitter)
        self.errorText.setMinimumSize(QtCore.QSize(0, 15))
        self.errorText.setObjectName(_fromUtf8("errorText"))
        self.verticalLayout_4.addWidget(self.splitter)
        self.horizontalLayout = QtGui.QHBoxLayout()
        self.horizontalLayout.setSpacing(0)
        self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout"))
        self.advancedBtn = QtGui.QPushButton(self.frame)
        self.advancedBtn.setCheckable(True)
        self.advancedBtn.setObjectName(_fromUtf8("advancedBtn"))
        self.horizontalLayout.addWidget(self.advancedBtn)
        self.errorBtn = QtGui.QToolButton(self.frame)
        self.errorBtn.setEnabled(True)
        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.errorBtn.sizePolicy().hasHeightForWidth())
        self.errorBtn.setSizePolicy(sizePolicy)
        font = QtGui.QFont()
        font.setBold(True)
        font.setWeight(75)
        self.errorBtn.setFont(font)
        self.errorBtn.setCheckable(True)
        self.errorBtn.setObjectName(_fromUtf8("errorBtn"))
        self.horizontalLayout.addWidget(self.errorBtn)
        self.helpBtn = QtGui.QToolButton(self.frame)
        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.helpBtn.sizePolicy().hasHeightForWidth())
        self.helpBtn.setSizePolicy(sizePolicy)
        font = QtGui.QFont()
        font.setBold(True)
        font.setWeight(75)
        self.helpBtn.setFont(font)
        self.helpBtn.setCheckable(True)
        self.helpBtn.setObjectName(_fromUtf8("helpBtn"))
        self.horizontalLayout.addWidget(self.helpBtn)
        spacerItem4 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
        self.horizontalLayout.addItem(spacerItem4)
        self.updateBtn = QtGui.QPushButton(self.frame)
        self.updateBtn.setObjectName(_fromUtf8("updateBtn"))
        self.horizontalLayout.addWidget(self.updateBtn)
        self.autoUpdateCheck = QtGui.QCheckBox(self.frame)
        self.autoUpdateCheck.setObjectName(_fromUtf8("autoUpdateCheck"))
        self.horizontalLayout.addWidget(self.autoUpdateCheck)
        self.verticalLayout_4.addLayout(self.horizontalLayout)
        self.verticalLayout_5.addWidget(self.frame)

        self.retranslateUi(Form)
        self.stack.setCurrentIndex(0)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        Form.setWindowTitle(_translate("Form", "Form", None))
        self.label.setText(_translate("Form", "Warning: Changes have been made to the function in advanced mode. These changes will be overwritten if you exit advanced mode. ", None))
        self.forceAdvancedBtn.setText(_translate("Form", "Back to\n"
"Advanced Mode", None))
        self.forceSimpleBtn.setText(_translate("Form", "Change to\n"
"Simple Mode", None))
        self.functionText.setHtml(_translate("Form", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
"<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
"p, li { white-space: pre-wrap; }\n"
"</style></head><body style=\" font-family:\'MS Shell Dlg 2\'; font-size:8.25pt; font-weight:400; font-style:normal;\">\n"
"<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:\'Sans Serif\'; font-size:7pt;\"></p></body></html>", None))
        self.textBrowser.setHtml(_translate("Form", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
"<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
"p, li { white-space: pre-wrap; }\n"
"</style></head><body style=\" font-family:\'MS Shell Dlg 2\'; font-size:8.25pt; font-weight:400; font-style:normal;\">\n"
"<p align=\"center\" style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Ubuntu\'; font-size:9pt; font-weight:600;\">Waveform Generator Reference</span></p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Ubuntu\'; font-size:8pt;\">Arbitrary waveforms may be generated by entering a Python expression which returns an array of values. The easiest approach is to use one (or more) of the built-in functions:</span></p>\n"
"<ul style=\"margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;\"><li style=\" font-family:\'Ubuntu\'; font-size:8pt;\" style=\" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><a href=\"#steps\"><span style=\" text-decoration: underline; color:#0057ae;\">steps</span></a> - step the waveform to new values at specific times</li>\n"
"<li style=\" font-family:\'Ubuntu\'; font-size:8pt;\" style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><a href=\"#pulse\"><span style=\" text-decoration: underline; color:#0057ae;\">pulse</span></a> - generate one or more square pulses</li>\n"
"<li style=\" font-family:\'Ubuntu\'; font-size:8pt;\" style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><a href=\"#waves\"><span style=\" text-decoration: underline; color:#0057ae;\">squareWave</span></a> - generate a square wave over a specific time range</li>\n"
"<li style=\" font-family:\'Ubuntu\'; font-size:8pt;\" style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><a href=\"#waves\"><span style=\" text-decoration: underline; color:#0057ae;\">sineWave</span></a> - generate a sine wave over a specific time range</li>\n"
"<li style=\" font-family:\'Ubuntu\'; font-size:8pt;\" style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><a href=\"#waves\"><span style=\" text-decoration: underline; color:#0057ae;\">sawWave</span></a> - generate a saw wave over a specific time range</li>\n"
"<li style=\" font-family:\'Ubuntu\'; font-size:8pt;\" style=\" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><a href=\"#waves\"><span style=\" text-decoration: underline; color:#0057ae;\">listWave</span></a> - repeat a series of values over a specific time range</li></ul>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Ubuntu\'; font-size:8pt;\">Numerical values may be specified with standard scaled-unit variables like &quot;mV&quot; and &quot;kHz&quot; (these values should be multiplied with a number, eg 120*kHz). </span></p>\n"
"<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:\'Ubuntu\'; font-size:8pt;\"></p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Ubuntu\'; font-size:8pt; font-weight:600;\">Sequence Parameters</span><span style=\" font-family:\'Ubuntu\'; font-size:8pt;\">: Commonly, we want a function to run multiple times while varying one or more of its parameters. To accomplish this, click &quot;Add Sequence Parameter&quot;, configure the new parameter\'s properties, and substitute any numerical value in the function with the name of the new parameter. Parameters may be renamed or removed by right clicking on their name.</span></p>\n"
"<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:\'Ubuntu\'; font-size:8pt;\"></p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Ubuntu\'; font-size:8pt; font-weight:600;\">Function Reference:</span></p>\n"
"<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:\'Ubuntu\'; font-size:8pt; font-weight:600;\"></p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Sans Serif\'; font-size:8pt; font-weight:600;\">steps</span><span style=\" font-family:\'Sans Serif\'; font-size:8pt;\">( times, values, [base=0.0] )</span></p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Sans Serif\'; font-size:8pt;\">Steps the waveform to new values at specific times.</span></p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Sans Serif\'; font-size:8pt;\">    times - list of times marking each step</span></p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Sans Serif\'; font-size:8pt;\">                 eg: [1*ms, 10*ms, 30*ms]</span></p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Sans Serif\'; font-size:8pt;\">    values - list of values</span></p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Sans Serif\'; font-size:8pt;\">                 eg: [0*mV, 30*mV, 0*mV]</span></p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Sans Serif\'; font-size:8pt;\">    base - the initial value of the waveform</span></p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Sans Serif\'; font-size:8pt;\">Example: start at 0mV, step down to -30mV at 50ms, then step up to 30mV at 100ms</span></p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Sans Serif\'; font-size:8pt;\">    steps([50*ms, 100*ms], [-30*mV, 30*mV])</span></p>\n"
"<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:\'Sans Serif\'; font-size:8pt;\"></p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Sans Serif\'; font-size:8pt; font-weight:600;\">pulse</span><span style=\" font-family:\'Sans Serif\'; font-size:8pt;\">( times, widths, values, [base=0.0] )</span></p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Sans Serif\'; font-size:8pt;\">Generates one or more square pulses</span></p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Sans Serif\'; font-size:8pt;\">    times - a value or a list of values marking the time of the pulse(s)</span></p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Sans Serif\'; font-size:8pt;\">    widths - a value or a list of values indicating the width of the pulse(s)</span></p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Sans Serif\'; font-size:8pt;\">    values - a value or a list of values indicating the height of the pulse(s)</span></p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Sans Serif\'; font-size:8pt;\">    base - the baseline value of the waveform</span></p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Sans Serif\'; font-size:8pt;\">Example:  20pA pulse starting at 10ms and ending at 40ms</span></p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Sans Serif\'; font-size:8pt;\">    pulse(10*ms, 30*ms, 20*pA)</span></p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Sans Serif\'; font-size:8pt;\">Example:  20 and 30pA pulses, 10ms wide, starting at 20 and 40ms</span></p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Sans Serif\'; font-size:8pt;\">    pulse([20*ms, 40*ms], 10*ms, [20*pA, 30*pA])</span></p>\n"
"<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:\'Sans Serif\'; font-size:8pt;\"></p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Sans Serif\'; font-size:8pt; font-weight:600;\">sineWave</span><span style=\" font-family:\'Sans Serif\'; font-size:8pt;\">(period, amplitude=1.0, phase=0.0, start=0.0, stop=None, base=0.0)</span></p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Sans Serif\'; font-size:8pt; font-weight:600;\">squareWave</span><span style=\" font-family:\'Sans Serif\'; font-size:8pt;\">(period, amplitude=1.0, phase=0.0, duty=0.5, start=0.0, stop=None, base=0.0)</span></p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Sans Serif\'; font-size:8pt; font-weight:600;\">sawWave</span><span style=\" font-family:\'Sans Serif\'; font-size:8pt;\">(period, amplitude=1.0, phase=0.0, start=0.0, stop=None, base=0.0)</span></p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Sans Serif\'; font-size:8pt; font-weight:600;\">listWave</span><span style=\" font-family:\'Sans Serif\'; font-size:8pt;\">(period, values, phase=0.0, start=0.0, stop=None, base=0.0)</span></p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Sans Serif\'; font-size:8pt;\">These functions generate periodic waveforms using (mostly) identical arguments.</span></p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Sans Serif\'; font-size:8pt;\">    period - the period of the wave. Eg: 10*us or 1.0/(100*kHz)</span></p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Sans Serif\'; font-size:8pt;\">    amplitude - the peak amplitude of the wave. Eg: 10*mV</span></p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Sans Serif\'; font-size:8pt;\">    phase - the starting phase of the wave in cycles (ie, 0.5 means 180 degrees)</span></p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Sans Serif\'; font-size:8pt;\">    start - the starting time of the waveform. Everything before uses the base value.</span></p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Sans Serif\'; font-size:8pt;\">    stop - the stopping time of the waveform. Everything after uses the base value.</span></p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Sans Serif\'; font-size:8pt;\">    base - value to use before start/stop of wave.</span></p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Sans Serif\'; font-size:8pt;\">Specific to squareWave:</span></p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Sans Serif\'; font-size:8pt;\">    duty - The duty cycle of the wave (0.0 - 1.0)</span></p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Sans Serif\'; font-size:8pt;\">Specific to listWave:</span></p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Sans Serif\'; font-size:8pt;\">    values - the list of values that are iterated over for each cycle of the wave. </span></p>\n"
"<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:\'Sans Serif\'; font-size:8pt;\"></p>\n"
"<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:\'Ubuntu\'; font-size:8pt;\"></p>\n"
"<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:\'Ubuntu\'; font-size:8pt;\"></p></body></html>", None))
        self.errorText.setHtml(_translate("Form", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
"<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
"p, li { white-space: pre-wrap; }\n"
"</style></head><body style=\" font-family:\'MS Shell Dlg 2\'; font-size:8.25pt; font-weight:400; font-style:normal;\">\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Ubuntu\'; font-size:9pt;\">No Error.</span></p></body></html>", None))
        self.advancedBtn.setText(_translate("Form", "Advanced", None))
        self.errorBtn.setText(_translate("Form", "!", None))
        self.helpBtn.setText(_translate("Form", "?", None))
        self.updateBtn.setText(_translate("Form", "Update", None))
        self.autoUpdateCheck.setText(_translate("Form", "Auto", None))