def saveResults(self): try: if SlicerUtil.isSlicerACILLoaded(): saveResultsRemotely = qt.QMessageBox.question( slicer.util.mainWindow(), "Save volume remotely?", "Do you want to save the results remotely?", qt.QMessageBox.Yes | qt.QMessageBox.No) == qt.QMessageBox.Yes else: saveResultsRemotely = False # First, save locally to the results directory (as a backup) labelmap = self.getCurrentLabelMapNode() localPath = os.path.join(self.saveResultsDirectoryButton.directory, labelmap.GetName() + ".nrrd") if saveResultsRemotely: self.caseNavigatorWidget.uploadVolume( labelmap, callbackFunction=self._uploadFileCallback_, localPath=localPath) else: slicer.util.saveNode(labelmap, localPath) slicer.util.infoDisplay( "Results saved to '{}'".format(localPath)) except Exception as ex: Util.print_last_exception() slicer.util.errorDisplay(ex.message)
def restoreStateBeforeExitingModule(self): """Load the last state of the module when the user exited (labelmap, opacity, contrast window, etc.) """ try: if self.savedVolumeID: # There is a previously saved valid state. SlicerUtil.setActiveVolumeIds(self.savedVolumeID) SlicerUtil.changeContrastWindow(self.savedContrastLevel[0], self.savedContrastLevel[1]) # if self.savedLabelmapID: # print "Restoring active labelmap: " + self.savedLabelmapID # # There was a valid labelmap. Restore it # SlicerUtil.displayLabelmapVolume(self.savedLabelmapID) # # Restore previous opacity # SlicerUtil.changeLabelmapOpacity(self.savedLabelmapOpacity) # else: # # Hide labelmap # print "No labelmap saved. Hide all" # SlicerUtil.displayLabelmapVolume(None) # else: # # Hide labelmap # print "No volume saved. Hide labelmap" # SlicerUtil.displayLabelmapVolume(None) # Restore layout SlicerUtil.changeLayout(self.savedLayout) except: Util.print_last_exception() pass
def saveResultsCurrentNode(self): """ Get current active node and save the xml fiducials file """ try: d = self.saveResultsDirectoryButton.directory if not os.path.isdir(d): # Ask the user if he wants to create the folder if qt.QMessageBox.question( slicer.util.mainWindow(), "Create directory?", "The directory '{0}' does not exist. Do you want to create it?" .format(d), qt.QMessageBox.Yes | qt.QMessageBox.No) == qt.QMessageBox.Yes: try: os.makedirs(d) # Make sure that everybody has write permissions (sometimes there are problems because of umask) os.chmod(d, 0o777) except: qt.QMessageBox.warning( slicer.util.mainWindow(), 'Directory incorrect', 'The folder "{0}" could not be created. Please select a valid directory' .format(d)) return else: # Abort process SlicerUtil.logDevelop("Saving results process aborted", includePythonConsole=True) return # self.logic.saveCurrentFiducials(d, self.caseNavigatorWidget, self.uploadFileResult) # qt.QMessageBox.information(slicer.util.mainWindow(), 'Results saved', # "The results have been saved succesfully") # else: if SlicerUtil.isSlicerACILLoaded(): question = qt.QMessageBox.question( slicer.util.mainWindow(), "Save results remotely?", "Your results will be saved locally. Do you also want to save your results in your remote server? (MAD, etc.)", qt.QMessageBox.Yes | qt.QMessageBox.No | qt.QMessageBox.Cancel) if question == qt.QMessageBox.Cancel: return saveInRemoteRepo = question == qt.QMessageBox.Yes else: saveInRemoteRepo = False self.logic.saveCurrentFiducials( d, caseNavigatorWidget=self.caseNavigatorWidget, callbackFunction=self.uploadFileResult, saveInRemoteRepo=saveInRemoteRepo) qt.QMessageBox.information( slicer.util.mainWindow(), 'Results saved', "The results have been saved succesfully") except: Util.print_last_exception() qt.QMessageBox.critical( slicer.util.mainWindow(), "Error when saving the results", "Error when saving the results. Please review the console for additional info" )
def refreshTextboxes(self, reset=False): """ Update the information of the textboxes that give information about the measurements """ self.aortaTextBox.setText("0") self.paTextBox.setText("0") self.ratioTextBox.setText("0") self.ratioTextBox.setStyleSheet( " QLineEdit { background-color: white; color: black}") volumeId = self.volumeSelector.currentNodeID # if volumeId not in self.logic.currentVolumesLoaded: # return if volumeId: self.logic.changeActiveRulersColor(volumeId, self.logic.defaultColor) aorta = None pa = None if not reset: rulerAorta, newAorta = self.logic.getRulerNodeForVolumeAndStructure( self.volumeSelector.currentNodeID, self.logic.AORTA, createIfNotExist=False) rulerPA, newPA = self.logic.getRulerNodeForVolumeAndStructure( self.volumeSelector.currentNodeID, self.logic.PA, createIfNotExist=False) if rulerAorta: aorta = rulerAorta.GetDistanceMeasurement() self.aortaTextBox.setText(str(aorta)) if rulerPA: pa = rulerPA.GetDistanceMeasurement() self.paTextBox.setText(str(pa)) if pa is not None and aorta is not None and aorta != 0: try: ratio = pa / aorta self.ratioTextBox.setText(str(ratio)) if ratio > 1.0: # Switch colors ("alarm") st = " QLineEdit {{ background-color: rgb({0}, {1}, {2}); color: white }}". \ format(int(self.logic.defaultWarningColor[0]*255), int(self.logic.defaultWarningColor[1]*255), int(self.logic.defaultWarningColor[2]*255)) self.ratioTextBox.setStyleSheet(st) self.logic.changeActiveRulersColor( volumeId, self.logic.defaultWarningColor) except Exception: Util.print_last_exception()
def refreshTextboxes(self, reset=False): """ Update the information of the textboxes that give information about the measurements """ self.rvTextBox.setText("0") self.lvTextBox.setText("0") self.ratioTextBox.setText("0") self.ratioTextBox.setStyleSheet( " QLineEdit { background-color: white; color: black}") volumeId = self.volumeSelector.currentNodeID # if volumeId not in self.logic.currentVolumesLoaded: # return rv = None lv = None if not reset: rulerRV, newRV = self.logic.getRulerNodeForVolumeAndStructure( self.volumeSelector.currentNodeID, self.logic.RV, createIfNotExist=False) rulerLV, newLV = self.logic.getRulerNodeForVolumeAndStructure( self.volumeSelector.currentNodeID, self.logic.LV, createIfNotExist=False) if rulerRV: rv = rulerRV.GetDistanceMeasurement() self.rvTextBox.setText(str(rv)) if rulerLV: lv = rulerLV.GetDistanceMeasurement() self.lvTextBox.setText(str(lv)) if lv is not None and rv is not None and rv != 0: try: ratio = lv / rv self.ratioTextBox.setText(str(ratio)) if ratio > 1.0: # Switch colors ("alarm") st = " QLineEdit {{ background-color: rgb({0}, {1}, {2}); color: white }}". \ format(int(self.logic.defaultWarningColor[0]*255), int(self.logic.defaultWarningColor[1]*255), int(self.logic.defaultWarningColor[2]*255)) self.ratioTextBox.setStyleSheet(st) except Exception: Util.print_last_exception()
def saveResultsCurrentNode(self): """ Get current active node and save the xml fiducials file """ try: d = self.saveResultsDirectoryButton.directory if not os.path.isdir(d): # Ask the user if he wants to create the folder if qt.QMessageBox.question( slicer.util.mainWindow(), "Create directory?", "The directory '{0}' does not exist. Do you want to create it?" .format(d), qt.QMessageBox.Yes | qt.QMessageBox.No) == qt.QMessageBox.Yes: try: os.makedirs(d) # Make sure that everybody has write permissions (sometimes there are problems because of umask) os.chmod(d, 0777) except: qt.QMessageBox.warning( slicer.util.mainWindow(), 'Directory incorrect', 'The folder "{0}" could not be created. Please select a valid directory' .format(d)) return self.logic.saveCurrentFiducials(d, self.caseNavigatorWidget, self.uploadFileResult) qt.QMessageBox.information( slicer.util.mainWindow(), 'Results saved', "The results have been saved succesfully") else: self.logic.saveCurrentFiducials(d, self.caseNavigatorWidget, self.uploadFileResult) qt.QMessageBox.information( slicer.util.mainWindow(), 'Results saved', "The results have been saved succesfully") except: Util.print_last_exception() qt.QMessageBox.critical( slicer.util.mainWindow(), "Error when saving the results", "Error when saving the results. Please review the console for additional info" )
def saveStateBeforeEnteringModule(self): """Save the state of the module regarding labelmap, etc. This state will be saved/loaded when exiting/entering the module """ if self.preventSavingState: # Avoid that the first time that the module loads, the state is saved twice self.preventSavingState = False return # Save existing layout self.savedLayout = None if slicer.app.layoutManager() is not None: self.savedLayout = slicer.app.layoutManager().layout # Get the active volume (it it exists) activeVolumeId = SlicerUtil.getFirstActiveVolumeId() if activeVolumeId is None: # Reset state self.resetModuleState() else: # There is a Volume loaded. Save state try: self.savedVolumeID = activeVolumeId displayNode = SlicerUtil.getNode( activeVolumeId).GetDisplayNode() self.savedContrastLevel = (displayNode.GetWindow(), displayNode.GetLevel()) # activeLabelmapId = SlicerUtil.getFirstActiveLabelmapId() # self.savedLabelmapID = activeLabelmapId # if activeLabelmapId is None: # self.savedLabelmapOpacity = None # else: # self.savedLabelmapOpacity = SlicerUtil.getLabelmapOpacity() # # Hide any labelmap # SlicerUtil.displayLabelmapVolume(None) except: Util.print_last_exception() # Not action really needed pass
def refreshTextboxes(self, reset=False): """ Update the information of the textboxes that give information about the measurements """ self.aortaTextBox.setText("0") self.paTextBox.setText("0") self.ratioTextBox.setText("0") self.ratioTextBox.setStyleSheet(" QLineEdit { background-color: white; color: black}") volumeId = self.volumeSelector.currentNodeId if volumeId not in self.logic.currentVolumesLoaded: return if volumeId: self.logic.changeColor(volumeId, self.logic.defaultColor) aorta = None pa = None if not reset: rulerAorta, newAorta = self.logic.getRulerNodeForVolumeAndStructure( self.volumeSelector.currentNodeId, self.logic.AORTA, createIfNotExist=False ) rulerPA, newPA = self.logic.getRulerNodeForVolumeAndStructure( self.volumeSelector.currentNodeId, self.logic.PA, createIfNotExist=False ) if rulerAorta: aorta = rulerAorta.GetDistanceMeasurement() self.aortaTextBox.setText(str(aorta)) if rulerPA: pa = rulerPA.GetDistanceMeasurement() self.paTextBox.setText(str(pa)) if aorta is not None and aorta != 0: try: ratio = pa / aorta self.ratioTextBox.setText(str(ratio)) if ratio > 1: # Switch colors ("alarm") self.ratioTextBox.setStyleSheet(" QLineEdit { background-color: rgb(255, 0, 0); color: white}") self.logic.changeColor(volumeId, self.logic.defaultWarningColor) except Exception: Util.print_last_exception()