def makeDeleteApiDialoge(self): okButton = qt.QPushButton("OK") cancelButton = qt.QPushButton("Cancel") messageLabel = qt.QTextEdit() messageLabel.setReadOnly(True) messageLabel.insertPlainText("Are you sure you want to delete the selected API?") messageLabel.setFontWeight(100) messageLabel.setFixedHeight(40) messageLabel.setFrameShape(0) currLayout = qt.QVBoxLayout() currLayout.addWidget(messageLabel) #currLayout.addStretch(1) buttonLayout = qt.QHBoxLayout() buttonLayout.addStretch(1) buttonLayout.addWidget(cancelButton) buttonLayout.addWidget(okButton) masterForm = qt.QFormLayout() masterForm.addRow(currLayout) masterForm.addRow(buttonLayout) deleteApiDialog = qt.QDialog(self.apiTable) deleteApiDialog.setWindowTitle("Delete API") deleteApiDialog.setLayout(masterForm) deleteApiDialog.setWindowModality(1) cancelButton.connect("clicked()", deleteApiDialog.hide) okButton.connect("clicked()", self.deleteApi) return deleteApiDialog
def __init__(self, parent): vLayout = qt.QVBoxLayout(parent) formLayout = qt.QFormLayout() self.nameEdit = qt.QLineEdit() formLayout.addRow("Name:", self.nameEdit) self.categoryEdit = qt.QLineEdit() formLayout.addRow("Category:", self.categoryEdit) self.descriptionEdit = qt.QTextEdit() self.descriptionEdit.acceptRichText = False formLayout.addRow("Description:", self.descriptionEdit) self.contributorsList = EditableTreeWidget() self.contributorsList.rootIsDecorated = False self.contributorsList.selectionBehavior = qt.QAbstractItemView.SelectRows self.contributorsList.selectionMode = qt.QAbstractItemView.ExtendedSelection self.contributorsList.setHeaderLabels(["Name", "Organization"]) formLayout.addRow("Contributors:", self.contributorsList) vLayout.addLayout(formLayout) vLayout.addStretch(1) self.buttonBox = qt.QDialogButtonBox() self.buttonBox.setStandardButtons(qt.QDialogButtonBox.Ok | qt.QDialogButtonBox.Cancel) vLayout.addWidget(self.buttonBox)
def setup(self): tests = ( ('Get Sample Data', self.downloadMRHead), ('Reslicing', self.reslicing), # ( 'timeProbe', self.timeProbe ), # ( 'sizeProbe', self.sizeProbe), # ( 'fakewin', self.fakewin ), ) for test in tests: b = qt.QPushButton(test[0]) self.layout.addWidget(b) b.connect('clicked()', test[1]) self.tclEnabled = qt.QCheckBox("Tcl Enabled") self.layout.addWidget(self.tclEnabled) self.tclEnabled.setToolTip( "Toggles processing of tcl events - disables tcl-based functionality including pan/zoom, window/level, and Editor module." ) self.tclEnabled.setChecked( not bool(int(tcl('set ::SWidget::DISABLE_CALLBACKS')))) self.tclEnabled.connect("clicked()", self.onTclEnabled) self.log = qt.QTextEdit() self.log.readOnly = True self.layout.addWidget(self.log) self.log.insertHtml('<p>Status: <i>Idle</i>\n') self.log.insertPlainText('\n') self.log.ensureCursorVisible() # Add spacer to layout self.layout.addStretch(1)
def __init__(self, Setting=None): """ @param Setting: The Setting to associate with the widget (i.e. Setting_Details) @type Setting: Setting """ super(NodeDetails, self).__init__() self.storedDetailsDict = None self.Setting = Setting self.currFont = NodeDetails.DEFAULT_FONT self._layout = qt.QFormLayout() self._layout.setContentsMargins(0, 0, 0, 0) self.numColumns = 2 self.__textViewer = qt.QTextEdit(self) self.__textViewer.setReadOnly(True) self.__textViewer.setObjectName('nodeDetails') self.__textViewer.setStyleSheet('#nodeDetails{border: none;}') self.__textViewer.verticalScrollBar().setFixedWidth(15) self._layout.addWidget(self.__textViewer) self.setLayout(self._layout) self.__showEmptyMetadata = True self.Setting.Events.onEvent('SHOWEMPTY', self.__toggleEmptyMetadata) #-------------------- # NOTE: We call this so that the callback above will sync before load. #-------------------- self.Setting.syncToFile() self.updateFromSettings()
def setup(self): # Instantiate and connect widgets ... # Collapsible button parametersCollapsibleButton = ctk.ctkCollapsibleButton() parametersCollapsibleButton.text = "Parameters" self.layout.addWidget(parametersCollapsibleButton) # Layout within the parameters collapsible button parametersFormLayout = qt.QFormLayout(parametersCollapsibleButton) # fiber self.fiberSelector = slicer.qMRMLNodeComboBox( parametersCollapsibleButton) self.fiberSelector.nodeTypes = (("vtkMRMLFiberBundleNode"), "") self.fiberSelector.selectNodeUponCreation = False self.fiberSelector.addEnabled = False self.fiberSelector.removeEnabled = False self.fiberSelector.noneEnabled = True self.fiberSelector.showHidden = False self.fiberSelector.showChildNodeTypes = False self.fiberSelector.setMRMLScene(slicer.mrmlScene) self.fiberSelector.setToolTip( "Pick the full-brain tractography in VTK format: It must be a vtkPolyData object where all the cells are lines." ) parametersFormLayout.addRow("Fiber Bundle", self.fiberSelector) # label map self.labelSelector = slicer.qMRMLNodeComboBox( parametersCollapsibleButton) self.labelSelector.nodeTypes = (("vtkMRMLScalarVolumeNode"), "") #self.labelSelector.addAttribute( "vtkMRMLScalarVolumeNode", "LabelMap", 1 ) self.labelSelector.selectNodeUponCreation = False self.labelSelector.addEnabled = False self.labelSelector.removeEnabled = False self.labelSelector.noneEnabled = True self.labelSelector.showHidden = False self.labelSelector.showChildNodeTypes = False self.labelSelector.setMRMLScene(slicer.mrmlScene) self.labelSelector.setToolTip( "Pick A brain parcellation, obtained from freesurfer in the same space as the full-brain tractography." ) parametersFormLayout.addRow("Brain Parcellation ", self.labelSelector) # query script self.queryScript = qt.QTextEdit() self.queryScript.setToolTip("WMQL query text.") #self.labelValue.setValue(1) parametersFormLayout.addWidget(self.queryScript) # apply self.applyButton = qt.QPushButton(parametersCollapsibleButton) self.applyButton.text = "Apply" parametersFormLayout.addWidget(self.applyButton) self.applyButton.connect('clicked()', self.onApply) # Add vertical spacer self.layout.addStretch(1)
def setup(self): # reload button self.reloadButton = qt.QPushButton("Reload") self.reloadButton.name = "WebServer Reload" self.reloadButton.toolTip = "Reload this module." self.layout.addWidget(self.reloadButton) self.reloadButton.connect('clicked(bool)', self.onReload) self.log = qt.QTextEdit() self.log.readOnly = True self.layout.addWidget(self.log) self.logMessage('<p>Status: <i>Idle</i>\n') # log to console self.logToConsole = qt.QCheckBox('Log to Console') self.logToConsole.setChecked(self.consoleMessages) self.logToConsole.toolTip = "Copy log messages to the python console and parent terminal" self.layout.addWidget(self.logToConsole) self.logToConsole.connect('clicked()', self.setLogging) # log to GUI self.logToGUI = qt.QCheckBox('Log to GUI') self.logToGUI.setChecked(self.guiMessages) self.logToGUI.toolTip = "Copy log messages to the log widget" self.layout.addWidget(self.logToGUI) self.logToGUI.connect('clicked()', self.setLogging) # clear log button self.clearLogButton = qt.QPushButton("Clear Log") self.clearLogButton.toolTip = "Clear the log window." self.layout.addWidget(self.clearLogButton) self.clearLogButton.connect('clicked()', self.log.clear) # TODO: button to start/stop server # TODO: warning dialog on first connect # TODO: config option for port # open local connection button self.localConnectionButton = qt.QPushButton("Open Page") self.localConnectionButton.toolTip = "Open a connection to the server on the local machine." self.layout.addWidget(self.localConnectionButton) self.localConnectionButton.connect('clicked()', self.openLocalConnection) self.logic = WebServerLogic(logMessage=self.logMessage) self.logic.start() # Add spacer to layout self.layout.addStretch(1)
def __init__(self, text='Empty Text', title=''): """ @param text: The rich text value to display. @type text: string @param title: The window title. @type title: string """ super(XnatTextPopup, self).__init__(title=title) self.setFixedHeight(70) self.textEdit = qt.QTextEdit(text) self.textEdit.setAlignment(0x0084) self.textEdit.setStyleSheet('border: none') emptyRow = qt.QLabel('') self.masterLayout.addRow(emptyRow) self.masterLayout.addRow(self.textEdit)
def setup(self): collapsibleButton = ctk.ctkCollapsibleButton() collapsibleButton.text = "Robex Brain Extraction" self.layout.addWidget(collapsibleButton) self.formLayout = qt.QFormLayout(collapsibleButton) self.formFrame = qt.QFrame(collapsibleButton) self.formFrame.setLayout(qt.QHBoxLayout()) self.formLayout.addWidget(self.formFrame) # folder text field # will search under this folder and 1 level below this folder self.textfield = qt.QTextEdit() self.formLayout.addRow("folder", self.textfield) # input file name text field # will search for files matching this name self.brainfileTextfield = qt.QTextEdit() self.formLayout.addRow("input files", self.brainfileTextfield) button = qt.QPushButton("Generate brain.obj and brainmask.nii") button.connect("clicked(bool)", self.robexBrainExtractionButtonClicked) self.formLayout.addRow(button) # output file name # input file names and output file names will match line by line self.brainOutputTextfield = qt.QTextEdit() self.formLayout.addRow("output files", self.brainOutputTextfield) collapsibleButtonB = ctk.ctkCollapsibleButton() collapsibleButtonB.text = "Tumor Segmentation" self.layout.addWidget(collapsibleButtonB) self.formLayoutB = qt.QFormLayout(collapsibleButtonB) self.formFrameB = qt.QFrame(collapsibleButtonB) self.formFrameB.setLayout(qt.QHBoxLayout()) self.formLayoutB.addWidget(self.formFrameB) self.textfieldB = qt.QTextEdit() self.formLayoutB.addRow("folder", self.textfieldB) self.segmentationfileTextfield = qt.QTextEdit() self.formLayoutB.addRow("input files", self.segmentationfileTextfield) buttonB = qt.QPushButton("Generate segmentation.obj") buttonB.connect("clicked(bool)", self.informationButtonClicked) self.formLayoutB.addRow(buttonB) self.segmentationOutputTextfield = qt.QTextEdit() self.formLayoutB.addRow("output files", self.segmentationOutputTextfield)
def setup(self): # Instantiate and connect widgets ... # Collapsible button sampleCollapsibleButton = ctk.ctkCollapsibleButton() sampleCollapsibleButton.text = "Directory to Monitor" self.layout.addWidget(sampleCollapsibleButton) # Layout within the sample collapsible button sampleFormLayout = qt.QFormLayout(sampleCollapsibleButton) #directory selector self.outputDirSelector = ctk.ctkPathLineEdit() self.outputDirSelector.filters = ctk.ctkPathLineEdit.Dirs self.outputDirSelector.settingKey = 'BlenderMonitorDir' sampleFormLayout.addRow("Blender tmp directory:", self.outputDirSelector) if not self.outputDirSelector.currentPath: self_dir = os.path.dirname(os.path.abspath(__file__)) defaultOutputPath = os.path.join(self_dir, "tmp") if not os.path.exists(defaultOutputPath): print(defaultOutputPath) defaultOutputPath = slicer.app.defaultScenePath self.outputDirSelector.setCurrentPath(defaultOutputPath) # Play button playButton = qt.QPushButton("Start") playButton.toolTip = "Start Monitoring Directory." playButton.checkable = True sampleFormLayout.addRow(playButton) playButton.connect('toggled(bool)', self.onPlayButtonToggled) self.playButton = playButton #Report Window self.text_report = qt.QTextEdit() self.text_report.setText('Report file changes here') sampleFormLayout.addRow('Dir Status:', self.text_report)
def __init__(self, MODULE=None): """ Init function. """ #-------------------- # Call parent init. #-------------------- super(XnatNodeDetails, self).__init__() self.MODULE = MODULE #self.settingsButton = self.MODULE.utils.makeSettingsButton(self.MODULE.XnatDetailsSettings) self.textEdit = qt.QTextEdit(self) self.currFont = self.MODULE.GLOBALS.LABEL_FONT self.textEdit.setFont(self.currFont) self.textEdit.setReadOnly(True) self._layout = qt.QGridLayout() self._layout.setContentsMargins(0, 0, 0, 0) #-------------------- # Call parent init. #-------------------- self.numColumns = 2 self.textEdit.setStyleSheet( 'border: none; padding: 0px; margin-left: 0px; margin-right: 0px') #-------------------- # NOTE: fixes a scaling error that occurs with the scroll # bar. Have yet to pinpoint why this happens. #-------------------- self.textEdit.verticalScrollBar().setStyleSheet('width: 15px;') self._layout.addWidget(self.textEdit, 0, 0) self.setLayout(self._layout)
def setup(self): tests = ( ('Get Sample Data', self.downloadMRHead), ('Reslicing', self.reslicing), ('Chart Test', self.chartTest), ('Web View Test', self.webViewTest), ('Memory Check', self.memoryCheck), ) for test in tests: b = qt.QPushButton(test[0]) self.layout.addWidget(b) b.connect('clicked()', test[1]) self.log = qt.QTextEdit() self.log.readOnly = True self.layout.addWidget(self.log) self.log.insertHtml('<p>Status: <i>Idle</i>\n') self.log.insertPlainText('\n') self.log.ensureCursorVisible() # Add spacer to layout self.layout.addStretch(1)
def addDownloadRow(self, uri, size=-1): """ Constructs a download row object based on the URI """ #------------------- # Cancel button row #------------------- rowWidget = qt.QWidget() rowWidget.setObjectName('downloadRowWidget') rowWidget.setStyleSheet( '#downloadRowWidget {border: 1px ' + ' solid rgb(160,160,160); border-radius: 2px; width: 100%;}') #rowWidget.setFixedHeight(self.rowWidgetHeight) #rowWidget.setSizePolicy(qt.QSizePolicy.MinimumExpanding, # qt.QSizePolicy.MinimumExpanding) layout = qt.QVBoxLayout() rowWidget.setLayout(layout) #------------------- # Text Edit #------------------- textEdit = qt.QTextEdit() textEdit.setStyleSheet("border: none") textEdit.setFixedHeight(55) textEdit.verticalScrollBar().hide() textEdit.setFont( qt.QFont(XnatDownloadPopup.FONT_NAME, XnatDownloadPopup.FONT_SIZE, 10, False)) layout.addWidget(textEdit) #------------------- # Progress Bar #------------------- progressBar = qt.QProgressBar(rowWidget) progressBar.setFixedHeight(17) progressBar.setFixedWidth(600) progressBar.setMinimum(0) progressBar.setMaximum(100) progressBar.setAlignment(0x0084) #------------------- # Cancel button row #------------------- cancelButton = qt.QPushButton() cancelButton.setText("Cancel") cancelButton.setFont(XnatDownloadPopup.LABEL_FONT) cancelButton.setFixedWidth(60) cancelButton.setFixedHeight(19) #------------------- # Progress bar row #------------------- progressRow = qt.QHBoxLayout() progressRow.addWidget(progressBar) progressRow.addStretch() progressRow.addWidget(cancelButton) layout.addLayout(progressRow) #------------------- # Row dict #------------------- downloadRow = { 'queuePosition': len(self.downloadRows), 'size': 0, 'downloaded': 0, 'textEdit': textEdit, 'pathDict': XnatSlicerUtils.getXnatPathDict(uri), 'progressBar': progressBar, 'widget': rowWidget, 'cancelButton': cancelButton } #------------------- # default text #------------------- dlStr = self.makeDownloadPath(downloadRow['pathDict']) textEdit.setText("QUEUED<br>%s<br>Please wait...<br>" % (dlStr)) #------------------- # Cancel callback #------------------- def cancelClick(): rowWidget.setEnabled(False) #print "Cancelling download '%s'"%(dlStr) textEdit.setText(textEdit.toHtml().replace('DOWNLOADING', 'CANCELLED')) for key, item in self.downloadRows.iteritems(): if item['progressBar'] == progressBar: item['progressBar'].setEnabled(False) item['progressBar'].setMaximum(100) self.cancelCallback(key) cancelButton.connect('pressed()', cancelClick) self.downloadRows[uri] = downloadRow self.remakeWidget()
def makeDeleteHostModal(hostEditor): """ As stated. """ #-------------------- # get selected strings from host list #-------------------- selHost = hostEditor.hostTable.currentRowItems #-------------------- # Buttons #-------------------- okButton = qt.QPushButton("OK") cancelButton = qt.QPushButton("Cancel") #-------------------- # Labels #-------------------- messageLabel = qt.QTextEdit() messageLabel.setReadOnly(True) messageLabel.insertPlainText("Are you sure you want to delete the host ") messageLabel.setFontItalic(True) messageLabel.setFontWeight(100) messageLabel.insertPlainText(selHost['name']) messageLabel.setFontWeight(0) messageLabel.insertPlainText(" ?") messageLabel.setFixedHeight(40) messageLabel.setFrameShape(0) #-------------------- # Layouts #-------------------- currLayout = qt.QVBoxLayout() currLayout.addWidget(messageLabel) currLayout.addStretch(1) buttonLayout = qt.QHBoxLayout() buttonLayout.addStretch(1) buttonLayout.addWidget(cancelButton) buttonLayout.addWidget(okButton) masterForm = qt.QFormLayout() masterForm.addRow(currLayout) masterForm.addRow(buttonLayout) #-------------------- # Window #-------------------- deleteHostModal = qt.QDialog(hostEditor.addButton) deleteHostModal.setWindowTitle("Delete Host") deleteHostModal.setLayout(masterForm) deleteHostModal.setWindowModality(2) #-------------------- # Button Connectors #-------------------- cancelButton.connect("clicked()", deleteHostModal.close) okButton.connect("clicked()", hostEditor.deleteHost) return deleteHostModal
def onEntry(self, comingFrom, transitionType): Helper.Info('Report step: entering onEntry()') super(ChangeTrackerReportROIStep, self).onEntry(comingFrom, transitionType) pNode = self.parameterNode() Helper.Info('Report step: onEntry') # create the tabs self.__metricsTabs.clear() metrics = pNode.GetParameter('metrics') self.__metricTabsList = {} self.__metricsVolumes = {} print 'Metrics list: ', metrics metricsReports = string.split(pNode.GetParameter('resultReports'), ',') metricsVolumesIDs = string.split(pNode.GetParameter('resultVolumes'), ',') i = 0 metricsList = string.split(metrics, ',') if len(metricsVolumesIDs) != len(metricsList): Helper.Error('Missing metric processing results!') for m in metricsList: metricWidget = qt.QWidget() metricLayout = qt.QFormLayout(metricWidget) textWidget = qt.QTextEdit() textWidget.setReadOnly(1) self.__metricsVolumes[m] = metricsVolumesIDs[i] currentVolume = Helper.getNodeByID(metricsVolumesIDs[i]) textWidget.setText(currentVolume.GetDescription()) metricLayout.addRow(textWidget) self.__metricsTabs.addTab(metricWidget, m) self.__metricTabsList[m] = textWidget i = i + 1 self.__metricsTabs.connect("currentChanged(int)", self.onTabChanged) # change the layout to Compare lm = slicer.app.layoutManager() lm.setLayout(12) lm.setLayoutNumberOfCompareViewRows(2) pNode = self.parameterNode() # use GetLayoutName() to identify the corresponding slice node and slice # composite node # find the compare nodes and initialize them as we wish sliceNodes = slicer.mrmlScene.GetNodesByClass('vtkMRMLSliceNode') sliceNodes.SetReferenceCount(sliceNodes.GetReferenceCount() - 1) sliceCompositeNodes = slicer.mrmlScene.GetNodesByClass( 'vtkMRMLSliceCompositeNode') sliceCompositeNodes.SetReferenceCount( sliceCompositeNodes.GetReferenceCount() - 1) # setup slice nodes for s in range(0, sliceNodes.GetNumberOfItems()): sNode = sliceNodes.GetItemAsObject(s) thisLayoutName = sNode.GetLayoutName() # TODO: check they should have the same layout name! if thisLayoutName.find('Compare') == 0: sNode.SetLayoutGrid(1, 6) # setup slice composite nodes for s in range(0, sliceCompositeNodes.GetNumberOfItems()): scNode = sliceCompositeNodes.GetItemAsObject(s) thisLayoutName = scNode.GetLayoutName() if thisLayoutName == 'Compare1': scNode.SetBackgroundVolumeID( pNode.GetParameter('croppedBaselineVolumeID')) scNode.SetForegroundVolumeID('') scNode.SetLabelVolumeID('') scNode.SetLinkedControl(1) if thisLayoutName == 'Compare2': scNode.SetBackgroundVolumeID( pNode.GetParameter('croppedFollowupVolumeID')) scNode.SetForegroundVolumeID('') scNode.SetLabelVolumeID('') scNode.SetLinkedControl(1) qt.QTimer.singleShot(0, self.fitSlices) # Enable crosshairs # Is there only one crosshair node? xnodes = slicer.mrmlScene.GetNodesByClass('vtkMRMLCrosshairNode') xnodes.SetReferenceCount(xnodes.GetReferenceCount() - 1) self.__xnode = xnodes.GetItemAsObject(0) if self.__xnode != None: self.__xnode.SetCrosshairMode(5) else: print 'Failed to find crosshair node!' ''' setup for volume rendering ''' if self.__vrDisplayNode == None: # self.__vrDisplayNode = self.__vrLogic.CreateVolumeRenderingDisplayNode() # reuse existing node vrDisplayNodeID = pNode.GetParameter('vrDisplayNodeID') self.__vrDisplayNode = slicer.mrmlScene.GetNodeByID( vrDisplayNodeID) #viewNode = slicer.util.getNode('vtkMRMLViewNode1') #self.__vrDisplayNode.SetCurrentVolumeMapper(0) #self.__vrDisplayNode.AddViewNodeID(viewNode.GetID()) ''' trigger volume rendering and label update ''' self.onTabChanged(0) pNode.SetParameter('currentStep', self.stepid) Helper.Info('Report step: leaving onEntry()') qt.QTimer.singleShot(0, self.killButton)
def createTextarea(self, parentLayout): # self.textNote = qt.QTextEdit() # self.formFrame.layout().addWidget(self.textNote) textarea = qt.QTextEdit() parentLayout.addWidget(textarea) return textarea
def setup(self): # clpStart self.clpStart, self.formLyout, self.formFrame = self.createClp('Start', self.layout, qt.QVBoxLayout()) # labPrjpath self.labPath = self.createLabel('Project Path: ', self.formFrame.layout()) self.labPrjpath = self.createLabel('', self.formFrame.layout()) # btnGetpath # self.btnGetpath = self.createBtn('Choose Project Folder', self.getPath, # self.formFrame.layout(), # 'Choose the top level folder') # winMain self.winMain, self.pLayout = self.createWin((100, 50, 500, 700), 'Python Assisted Registration Pipeline', qt.QVBoxLayout(), maxW=500, minW=400, maxH=750, minH=650) self.pInitiated = False # winFilePanel self.winFilePanel, self.treeVol, self.treeTfm = self.createFilePanel() # Note area self.labNote = self.createLabel('Note', self.formFrame.layout()) self.textNote = qt.QTextEdit() self.formFrame.layout().addWidget(self.textNote) # btnShowmain self.btnShowmain = self.createBtn('Main Panel', self.showMain, self.layout, 'Start the registration process and show the panel') # btnFiles self.btnFiles = self.createBtn('File List', self.showFilePanel, self.layout, 'Open the file list') # btnShowCopyHeader self.btnShowCopyHeader = self.createBtn('Copy Header', lambda: self.winCopyHeader.show(), self.layout, 'Copy the header from a reference image') self.btnShowCopyHeader.enabled = False # btnShowFlipImage self.btnShowFlipImage = self.createBtn('Flip Image', lambda: self.winFlipImage.show(), self.layout, 'Flip an image along an axis') self.btnShowFlipImage.enabled = False # btnSaveSetting self.btnSaveSetting = self.createBtn('Save', self.saveSetting, self.layout, 'Save the current progress.') self.btnSaveSetting.enabled = False # # btnLoadSetting # self.btnLoadSetting = self.createBtn('Load', lambda: (self.addtoFilePanel(self.inFilePanel), self.refreshStatus()), # self.layout, 'Load the progress from setting.') # self.btnLoadSetting.enabled = False # Other settings self.prjPath = None # self.bPathchosen = False self.patient_number = None self.outputs = {} # {'step1_1': {fullpath: True/False}} self.statusLight = {} # {'step1_1', the_label_obj} self.completed = {} # {'step1_1', True} self.volumes = {} # {filename: fullpath} for .nii self.transfms = {} # {filename: fullpath} for .tfm self.sessFrames = {} # {'step1_1': ref_to_widget} self.inFilePanel = [] self.imagej_path = path.join(topFolder, r'Tools/ImageJ/ImageJ.exe') self.cmtk_path = path.join(topFolder, r'Tools/CMTK-2.3.0-Windows-x86/bin') self.bash_path = path.join(topFolder, r'Tools/cmder/vendor/git-for-windows/bin/bash.exe') self.cmtkOutput = [ '(in_3d_log_masked)_into_(ex_3d_cropped)_deformable.nii', '(in_3d)_into_(ex_3d_cropped)_deformable.nii'] self.pkMaps = ['in_dce_gd.nii', 'in_dce_auc.nii', 'in_dce_ire.nii', 'in_dce_irw.nii', 'in_dce_me.nii', 'in_dce_tonset.nii', 'in_dce_twashout.nii', 'in_dce_ttp.nii', 'in_ktrans_left_femoral.nii', 'in_ktrans_right_femoral.nii', 'in_ktrans_weinmann.nii', 'in_ktrans_parker.nii', 'in_ve_left_femoral.nii', 'in_ve_right_femoral.nii', 'in_ve_weinmann.nii', 'in_ve_parker.nii', 'in_iaugc60.nii']