def nodeCheck(self): """If there is no parameter node, create one and add it to the scene """ if self.parameterSelector.currentNode() == None: node = slicer.vtkMRMLScriptedModuleNode() slicer.mrmlScene.AddNode(node) self.parameterNodeCreated(node) self.parameterSelector.setCurrentNode(node)
def setup( self ): self.workflow = ctk.ctkWorkflow() workflowWidget = ctk.ctkWorkflowStackedWidget() workflowWidget.setWorkflow( self.workflow ) # create all 4 wizard steps self.selectDataStep = LASegmentationResources.LASegmentationWorkflowSelectDataStep( 'SelectData' ) self.registrationStep = LASegmentationResources.LASegmentationWorkflowImageRegistrationStep( 'ImageRegistration' ) self.endoSegStep = LASegmentationResources.LASegmentationWorkflowEndoSegmentationStep( 'LAEndoSegmentation' ) # add the wizard steps to an array for convenience allSteps = [] allSteps.append( self.selectDataStep ) allSteps.append( self.registrationStep ) allSteps.append( self.endoSegStep ) self.workflow.addTransition( self.selectDataStep, self.registrationStep ) self.workflow.addTransition( self.registrationStep, self.endoSegStep ) nNodes = slicer.mrmlScene.GetNumberOfNodesByClass('vtkMRMLScriptedModuleNode') self.parameterNode = None for n in xrange(nNodes): compNode = slicer.mrmlScene.GetNthNodeByClass(n, 'vtkMRMLScriptedModuleNode') nodeid = None if compNode.GetModuleName() == 'LASegmentationWorkflow': self.parameterNode = compNode print 'Found existing LASegmentationWorkflow parameter node' break if self.parameterNode == None: self.parameterNode = slicer.vtkMRMLScriptedModuleNode() self.parameterNode.SetModuleName('LASegmentationWorkflow') slicer.mrmlScene.AddNode(self.parameterNode) for s in allSteps: s.setParameterNode (self.parameterNode) # restore workflow step currentStep = self.parameterNode.GetParameter('currentStep') if currentStep != '': print 'Restoring workflow step to ', currentStep if currentStep == 'SelectData': self.workflow.setInitialStep(self.selectDataStep) if currentStep == 'ImageRegistration': self.workflow.setInitialStep(self.registrationStep) if currentStep == 'LAEndoSegmentation': self.workflow.setInitialStep(self.endoSegStep) else: print 'currentStep in parameter node is empty!' # Start the workflow and show the widget self.workflow.start() workflowWidget.visible = True self.layout.addWidget( workflowWidget )
def _createParameterNode(self): """create the ColonicAnalysis parameter node - a singleton in the scene This is used internally by getParameterNode - shouldn't really be called for any other reason. """ node = slicer.vtkMRMLScriptedModuleNode() node.SetSingletonTag( "ColonicAnalysis" ) node.SetModuleName( "ColonicAnalysis" ) node.SetParameter( "view", "6HRS" ) slicer.mrmlScene.AddNode(node) # Since we are a singleton, the scene won't add our node into the scene, # but will instead insert a copy, so we find that and return it node = self._findParameterNodeInScene() return node
def createParameterNode(self): """create a new parameter node The node is of vtkMRMLScriptedModuleNode class. Module name is added as an attribute to allow filtering in node selector widgets (attribute name: ModuleName, attribute value: the module's name). This method can be overridden in derived classes to create a default parameter node with all parameter values set to their default. """ node = slicer.vtkMRMLScriptedModuleNode() if self.isSingletonParameterNode: node.SetSingletonTag( self.moduleName ) # Add module name in an attribute to allow filtering in node selector widgets # Note that SetModuleName is not used anymore as it would be redundant with the ModuleName attribute. node.SetAttribute( "ModuleName", self.moduleName ) node.SetName(slicer.mrmlScene.GenerateUniqueName(self.moduleName)) return node
def getEditorParameterNode(): """Get the Editor parameter node - a singleton in the scene""" node = None size = slicer.mrmlScene.GetNumberOfNodesByClass("vtkMRMLScriptedModuleNode") for i in xrange(size): n = slicer.mrmlScene.GetNthNodeByClass( i, "vtkMRMLScriptedModuleNode" ) if n.GetModuleName() == "Editor": node = n if not node: node = slicer.vtkMRMLScriptedModuleNode() node.SetSingletonTag( "Editor" ) node.SetModuleName( "Editor" ) node.SetParameter( "label", "1" ) slicer.mrmlScene.AddNode(node) return node
def createParameterNode(self): """ Create a new parameter node The node is of vtkMRMLScriptedModuleNode class. Module name is added as an attribute to allow filtering in node selector widgets (attribute name: ModuleName, attribute value: the module's name). This method can be overridden in derived classes to create a default parameter node with all parameter values set to their default. """ node = slicer.vtkMRMLScriptedModuleNode() if self.isSingletonParameterNode: node.SetSingletonTag(self.moduleName) # Add module name in an attribute to allow filtering in node selector widgets # Note that SetModuleName is not used anymore as it would be redundant with the ModuleName attribute. node.SetAttribute("ModuleName", self.moduleName) node.SetName(slicer.mrmlScene.GenerateUniqueName(self.moduleName)) return node
def copyNodeContentToNewScriptedModuleNode(oldDataNode, shNode): newDataNode = slicer.vtkMRMLScriptedModuleNode() newDataNode.HideFromEditorsOff() # Copy node attributes attributeNames = vtk.vtkStringArray() oldDataNode.GetAttributeNames(attributeNames) for index in range(attributeNames.GetNumberOfValues()): attributeName = attributeNames.GetValue(index) newDataNode.SetAttribute(attributeName, oldDataNode.GetAttribute(attributeName)) slicer.mrmlScene.AddNode(newDataNode) newDataNode.SetName(oldDataNode.GetName()) # Copy node references newDataNode.CopyReferences(oldDataNode) # Move children childItemIDs = vtk.vtkIdList() #shNode = slicer.vtkMRMLSubjectHierarchyNode.GetSubjectHierarchyNode(slicer.mrmlScene) shNode.GetItemChildren(shNode.GetItemByDataNode(oldDataNode), childItemIDs) for index in range(childItemIDs.GetNumberOfIds()): childItemID = childItemIDs.GetId(index) shNode.ReparentItemByDataNode(childItemID, newDataNode) return newDataNode
def __init__(self, parent=None): if not parent: self.parent = slicer.qMRMLWidget() self.parent.setLayout(qt.QVBoxLayout()) self.parent.setMRMLScene(slicer.mrmlScene) self.layout = self.parent.layout() self.setup() self.parent.show() else: self.parent = parent self.layout = parent.layout() # Reference to the logic that Slicer instantiated self.__logic = slicer.modules.reporting.logic() if not self.__logic: # create a new instance self.__logic = slicer.modulelogic.vtkSlicerReportingModuleLogic() # Get the location and initialize the DICOM DB settings = qt.QSettings() self.__dbFileName = settings.value("DatabaseDirectory", "") if self.__dbFileName == "": Helper.Warning("DICOM Database is not accessible.") else: self.__dbFileName = self.__dbFileName + "/ctkDICOM.sql" if self.__logic.InitializeDICOMDatabase(self.__dbFileName): Helper.Info('DICOM database initialized correctly!') else: Helper.Error('Failed to initialize DICOM database at ' + self.__dbFileName) if not self.__logic.GetMRMLScene(): # set the logic's mrml scene self.__logic.SetMRMLScene(slicer.mrmlScene) # for export self.exportFileName = None self.exportFileDialog = None # initialize parameter node self.__parameterNode = None nNodes = slicer.mrmlScene.GetNumberOfNodesByClass( 'vtkMRMLScriptedModuleNode') for n in xrange(nNodes): compNode = slicer.mrmlScene.GetNthNodeByClass( n, 'vtkMRMLScriptedModuleNode') compNode.SetReferenceCount(compNode.GetReferenceCount() - 1) nodeid = None if compNode.GetModuleName() == 'Reporting': self.__parameterNode = compNode 'Found existing Reporting parameter node' break if self.__parameterNode == None: self.__parameterNode = slicer.vtkMRMLScriptedModuleNode() self.__parameterNode.SetModuleName('Reporting') self.__parameterNode.SetSingletonTag('Reporting') slicer.mrmlScene.AddNode(self.__parameterNode) # keep active report and volume self.__rNode = None self.__vNode = None if self.__parameterNode != None: paramID = self.__parameterNode.GetID() self.__logic.SetActiveParameterNodeID(paramID) else: Helper.Error('Unable to set logic active parameter node') # TODO: figure out why module/class hierarchy is different # between developer builds ans packages try: # for developer build... self.editUtil = EditorLib.EditUtil.EditUtil() except AttributeError: # for release package... self.editUtil = EditorLib.EditUtil()
def setup( self ): """ Slicer seems to call all methods of these classes upon entry. setup creates a workflow from ctk, which simply means that it creates a series of UI steps one can traverse with "next" / "previous" buttons. The steps themselves are contained within SegmentationWizard_Lib. """ # Currently unclear on the difference between ctkWorkflow and # ctkWorkflowStackedWidget, but presumably the latter creates a UI # for the former. self.workflow = ctk.ctkWorkflow() workflowWidget = ctk.ctkWorkflowStackedWidget() workflowWidget.setWorkflow( self.workflow ) # Create workflow steps. self.Step1 = SegmentationWizard_Lib.VolumeSelectStep('VolumeSelectStep') self.Step2 = SegmentationWizard_Lib.RegistrationStep('RegistrationStep') self.Step3 = SegmentationWizard_Lib.NormalizeSubtractStep('NormalizeSubtractStep') self.Step4 = SegmentationWizard_Lib.ROIStep('ROIStep') self.Step5 = SegmentationWizard_Lib.ThresholdStep('ThresholdStep') self.Step6 = SegmentationWizard_Lib.ReviewStep('ReviewStep') # Add the wizard steps to an array for convenience. Much of the following code # is copied wholesale from ChangeTracker. allSteps = [] allSteps.append( self.Step1 ) allSteps.append( self.Step2 ) allSteps.append( self.Step3 ) allSteps.append( self.Step4 ) allSteps.append( self.Step5 ) allSteps.append( self.Step6 ) # Adds transition functionality between steps. self.workflow.addTransition(self.Step1, self.Step2) self.workflow.addTransition(self.Step2, self.Step3) self.workflow.addTransition(self.Step3, self.Step4) self.workflow.addTransition(self.Step4, self.Step5) self.workflow.addTransition(self.Step5, self.Step6) self.workflow.addTransition(self.Step6, self.Step1) """ The following code creates a 'parameter node' from the vtkMRMLScriptedModuleNode class. A parameter node keeps track of module variables from step to step, in the case of ctkWorkflow, and when users leave the module to visit other modules. The code below searches to see if a parameter node already exists for SegmentationWizard among all available parameter nodes, and then creates one if it does not. """ nNodes = slicer.mrmlScene.GetNumberOfNodesByClass('vtkMRMLScriptedModuleNode') self.parameterNode = None for n in xrange(nNodes): compNode = slicer.mrmlScene.GetNthNodeByClass(n, 'vtkMRMLScriptedModuleNode') nodeid = None if compNode.GetModuleName() == 'SegmentationWizard': self.parameterNode = compNode # print 'Found existing SegmentationWizard parameter node' break if self.parameterNode == None: self.parameterNode = slicer.vtkMRMLScriptedModuleNode() self.parameterNode.SetModuleName('SegmentationWizard') slicer.mrmlScene.AddNode(self.parameterNode) # Individual workflow steps need to remember the parameter node too. for s in allSteps: s.setParameterNode(self.parameterNode) # Restores you to the correct step if you leave and then return to the module. currentStep = self.parameterNode.GetParameter('currentStep') if currentStep != '': # print 'Restoring SegmentationWizard workflow step to ', currentStep if currentStep == 'VolumeSelectStep': self.workflow.setInitialStep(self.Step1) if currentStep == 'RegistrationStep': self.workflow.setInitialStep(self.Step2) if currentStep == 'NormalizeSubtractStep': self.workflow.setInitialStep(self.Step3) if currentStep == 'ROIStep': self.workflow.setInitialStep(self.Step4) if currentStep == 'ThresholdStep': self.workflow.setInitialStep(self.Step4) if currentStep == 'ReviewStep': self.workflow.setInitialStep(self.Step4) else: # print 'currentStep in parameter node is empty!' pass # Starts and show the workflow. self.workflow.start() workflowWidget.visible = True self.layout.addWidget( workflowWidget )
def test_RoundTrip(self): """ Test fiducial round trip to and from AIM XML file on disk """ print("ctest, please don't truncate my output: CTEST_FULL_OUTPUT") # enter the module mainWindow = slicer.util.mainWindow() mainWindow.moduleSelector().selectModule('Reporting') # l = slicer.modulelogic.vtkSlicerReportingModuleLogic() l = slicer.modules.reporting.logic() l.GUIHiddenOff() # testDataPath = os.path.normpath(os.path.join(os.path.realpath(__file__), "..", "..", "Prototype/TestData/DICOM.CT/") print("Reporting round trip test, current working directory = " + os.getcwd()) testDataPath = os.path.join(os.getcwd(), "../../Testing/Temporary/DICOM.CT") # testDataPath = "/projects/birn/nicole/Slicer4/Reporting/Prototype/TestData/DICOM.CT" print("test data path = " + testDataPath) # set up a new DICOM database print("Creating a dicomDatabase!") ddb = ctk.ctkDICOMDatabase() if not ddb: print("ERROR: failed to create a new dicom database!") return dbpath = slicer.app.slicerHome + '/Testing/Temporary/TestingDCMDB/ctkDICOM.sql' print('database path set to ' + dbpath) if not os.path.exists(os.path.dirname(dbpath)): print('Creating dir ' + os.path.dirname(dbpath)) os.makedirs(os.path.dirname(dbpath)) ddb.openDatabase(dbpath, "ReportingTesting") if not ddb.isOpen: print("ERROR: failed to open a new dicom database at path " + dbpath) return retval = ddb.initializeDatabase() if not retval: print("ERROR: failed to init database") return l.InitializeDICOMDatabase(dbpath) testFileNames = [] for n in [487, 488, 489]: filename = os.path.join(testDataPath, "instance_" + str(n) + ".dcm") print("Adding file " + filename) testFileNames.append(filename) # check to see if the test data is already in it patients = ddb.patients() if len(patients) == 0: # add the files for filename in testFileNames: print("Inserting file " + filename) retval = ddb.insert(filename) patients = ddb.patients() if len(patients) == 0: print("ERROR: unable to add test files to database!") print(str(testFileNames)) return # get the UID for the series study = ddb.studiesForPatient(patients[0]) series = ddb.seriesForStudy(study[0]) seriesUID = series[0] # seriesUID = "1.2.392.200103.20080913.113635.2.2009.6.22.21.43.10.23432.1" # seriesUID = "2.16.840.1.114362.1.759508.1251415878280.192" # seriesUID = "1.3.12.2.1107.5.1.4.53031.30000011032906120157800000219" print("For test, using the AIM sample volume with series UID of " + seriesUID) fileList = ddb.filesForSeries(seriesUID) print("fileList = " + str(fileList)) if not fileList: print("ERROR: sample series with id " + seriesUID + " not found in database!") return # add a parameter node parameterNode = slicer.vtkMRMLScriptedModuleNode() parameterNode.SetModuleName('Reporting') slicer.mrmlScene.AddNode(parameterNode) # set it to be the active parameter node l.SetActiveParameterNodeID(parameterNode.GetID()) # # create a new report, make it the report in the parameter node, set up hierarchy # reportNode = slicer.mrmlScene.CreateNodeByClass( "vtkMRMLReportingReportNode") reportNode.SetReferenceCount(reportNode.GetReferenceCount() - 1) # set the color id colorID = 'vtkMRMLColorTableNodeFileGenericAnatomyColors.txt' reportNode.SetColorNodeID(colorID) reportNode.SetDICOMDatabaseFileName(dbpath) slicer.mrmlScene.AddNode(reportNode) parameterNode.SetParameter("reportID", reportNode.GetID()) print( "Init hierarchy for report node, set parameter node to report id of " + reportNode.GetID()) l.InitializeHierarchyForReport(reportNode) # # get some sample data from the database # volId = 1 volumeNode = None volName = 'AIM volume ' + str(volId) print("Dicom data base = " + ddb) slicer.dicomDatabase = ddb scalarVolumePlugin = slicer.modules.dicomPlugins[ 'DICOMScalarVolumePlugin']() scalarVolumeLoadables = scalarVolumePlugin.examine([filelist]) volumeNode = scalarVolumePlugin.load(scalarVolumeLoadables[0]) volumeNode.SetName(volName) # print "volumeNode = ",volumeNode print("Initialize Hierarchy For Volume with id " + volumeNode.GetID()) l.InitializeHierarchyForVolume(volumeNode) print("---Now active mark up is " + l.GetActiveMarkupHierarchyID()) print("adding a fiducial") # # define a fiducial # fidNode = slicer.vtkMRMLAnnotationFiducialNode() fidName = "AIM Round Trip Test Fiducial" fidNode.SetName(fidName) fidNode.SetSelected(1) fidNode.SetVisible(1) fidNode.SetLocked(0) print("Calling set fid coords") startCoords = [15.8, 70.8, -126.7] fidNode.SetFiducialCoordinates(startCoords[0], startCoords[1], startCoords[2]) print("Starting fiducial coordinates: " + str(startCoords)) # point it to the volume fidNode.SetAttribute("AssociatedNodeID", volumeNode.GetID()) fidNode.SetScene(slicer.mrmlScene) print("Adding text disp node") fidNode.CreateAnnotationTextDisplayNode() print("Adding point display node") fidNode.CreateAnnotationPointDisplayNode() print("add node:") # slicer.mrmlScene.DebugOn() # l.DebugOn() slicer.mrmlScene.AddNode(fidNode) print("getting slice uid") uid = l.GetSliceUIDFromMarkUp(fidNode) print("fidNode uid = " + uid) # # create a label volume # volumesLogic = slicer.modules.volumes.logic() labelNode = volumesLogic.CreateLabelVolume(slicer.mrmlScene, volumeNode, "Segmentation") labelDisplayNode = labelNode.GetDisplayNode() labelDisplayNode.SetAndObserveColorNodeID( 'vtkMRMLColorTableNodeFileGenericAnatomyColors.txt') l.AddNodeToReport(labelNode) # initialize image content labelImage = labelNode.GetImageData() extent = labelImage.GetExtent() pixelCounter = 0 for k in range(extent[5]): for j in range(extent[3]): for i in range(extent[1]): if pixelCounter in initializedSegmentationVoxels: labelImage.SetScalarComponentFromFloat(i, j, k, 0, 1) else: labelImage.SetScalarComponentFromFloat(i, j, k, 0, 0) pixelCounter = pixelCounter + 1 # test save to mrml # slicer.mrmlScene.SetURL('/spl/tmp/nicole/Testing/aim/RoundTripTest.mrml') # slicer.mrmlScene.Commit() # # output AIM XML # dirName = slicer.app.slicerHome + '/Testing/Temporary/' reportNode.SetStorageDirectoryName(dirName) print("Saving report to " + dirName) retval = l.SaveReportToAIM(reportNode) if (retval != 0): print("ERROR: unable to save report to aim file " + dirName + ", retval=" + retval) else: print("Saved report to " + dirName) self.assertEqual(retval, 0) print("\n\n\nReloading aim file...") # # now clear the scene so can read in # # TBD: this causes a crash # slicer.mrmlScene.Clear(0) # # load in the aim file # newReport = slicer.mrmlScene.CreateNodeByClass( "vtkMRMLReportingReportNode") newReport.SetReferenceCount(newReport.GetReferenceCount() - 1) # set the default color map newReport.SetColorNodeID(colorID) newReport.SetDICOMDatabaseFileName(dbpath) slicer.mrmlScene.AddNode(newReport) parameterNode.SetParameter("reportID", newReport.GetID()) Helper.LoadAIMFile(newReport.GetID(), aimFileName) # check the fiducial endCoords = [0, 0, 0] col = slicer.mrmlScene.GetNodesByClass("vtkMRMLAnnotationFiducialNode") col.SetReferenceCount(col.GetReferenceCount() - 1) # if the scene is not cleared, we should have 2 fiducials nFiducials = col.GetNumberOfItems() if nFiducials != 2: print("Failed to read fiducial form the saved report!") self.assertTrue(False) f = col.GetItemAsObject(1) f.GetFiducialCoordinates(endCoords) print("Start Coords = " + str(startCoords[0]) + "," + str(startCoords[1]) + "," + str(startCoords[2])) print("End Coords = " + str(endCoords)) xdiff = endCoords[0] - startCoords[0] ydiff = endCoords[1] - startCoords[1] zdiff = endCoords[2] - startCoords[2] diffTotal = xdiff + ydiff + zdiff print( "Difference between coordinates after loaded the aim file and value from before stored the aim file: " + str(xdiff) + "," + str(ydiff) + "," + str(zdiff) + ". Total difference = " + str(diffTotal)) if diffTotal > 0.1: print("Fiducial coordinates error exceeds the allowed bounds") self.assertTrue(False) # check the label node sceneVolumes = slicer.mrmlScene.GetNodesByClass( "vtkMRMLScalarVolumeNode") sceneVolumes.SetReferenceCount(sceneVolumes.GetReferenceCount() - 1) sceneLabels = [] for i in range(sceneVolumes.GetNumberOfItems()): vol = sceneVolumes.GetItemAsObject(i) if vol.GetLabelMap(): sceneLabels.append(vol) if len(sceneLabels) != 2: print( "Scene does not have two label nodes after reloading from AIM!" ) self.assertTrue(False) newLabelNode = sceneLabels[1] newLabelImage = newLabelNode.GetImageData() extent = newLabelImage.GetExtent() pixelCounter = 0 for k in range(extent[5]): for j in range(extent[3]): for i in range(extent[1]): pixel = newLabelImage.GetScalarComponentAsFloat(i, j, k, 0) if ((pixelCounter in initializedSegmentationVoxels) and pixel != 1) or (not ( pixelCounter in initializedSegmentationVoxels) and pixel != 0): print("Segmentation content not recovered correctly!") print("Pixel counter " + str(pixelCounter) + " is set to " + str(pixel)) self.assertTrue(False) pixelCounter = pixelCounter + 1 self.assertTrue(True)
def test_RoundTrip(self): """ Test fiducial round trip to and from AIM XML file on disk """ print("ctest, please don't truncate my output: CTEST_FULL_OUTPUT") # enter the module mainWindow = slicer.util.mainWindow() mainWindow.moduleSelector().selectModule('Reporting') # l = slicer.modulelogic.vtkSlicerReportingModuleLogic() l = slicer.modules.reporting.logic() l.GUIHiddenOff() # testDataPath = os.path.normpath(os.path.join(os.path.realpath(__file__), "..", "..", "Prototype/TestData/DICOM.CT/") print("Reporting round trip test, current working directory = "+os.getcwd()) testDataPath = os.path.join(os.getcwd(),"../../Testing/Temporary/DICOM.CT") # testDataPath = "/projects/birn/nicole/Slicer4/Reporting/Prototype/TestData/DICOM.CT" print("test data path = "+testDataPath) # set up a new DICOM database print("Creating a dicomDatabase!") ddb = ctk.ctkDICOMDatabase() if not ddb: print("ERROR: failed to create a new dicom database!") return dbpath = slicer.app.slicerHome + '/Testing/Temporary/TestingDCMDB/ctkDICOM.sql' print('database path set to '+dbpath) if not os.path.exists(os.path.dirname(dbpath)): print('Creating dir '+os.path.dirname(dbpath)) os.makedirs(os.path.dirname(dbpath)) ddb.openDatabase(dbpath,"ReportingTesting") if not ddb.isOpen: print("ERROR: failed to open a new dicom database at path "+dbpath) return retval = ddb.initializeDatabase() if not retval: print("ERROR: failed to init database") return l.InitializeDICOMDatabase(dbpath) testFileNames = [] for n in [487, 488, 489]: filename = os.path.join(testDataPath, "instance_" + str(n) + ".dcm") print("Adding file "+filename) testFileNames.append(filename) # check to see if the test data is already in it patients = ddb.patients() if len(patients) == 0: # add the files for filename in testFileNames: print("Inserting file "+filename) retval = ddb.insert(filename) patients = ddb.patients() if len(patients) == 0: print("ERROR: unable to add test files to database!") print(str(testFileNames)) return # get the UID for the series study = ddb.studiesForPatient(patients[0]) series = ddb.seriesForStudy(study[0]) seriesUID = series[0] # seriesUID = "1.2.392.200103.20080913.113635.2.2009.6.22.21.43.10.23432.1" # seriesUID = "2.16.840.1.114362.1.759508.1251415878280.192" # seriesUID = "1.3.12.2.1107.5.1.4.53031.30000011032906120157800000219" print("For test, using the AIM sample volume with series UID of "+seriesUID) fileList = ddb.filesForSeries(seriesUID) print("fileList = "+str(fileList)) if not fileList: print("ERROR: sample series with id "+seriesUID+" not found in database!") return # add a parameter node parameterNode = slicer.vtkMRMLScriptedModuleNode() parameterNode.SetModuleName('Reporting') slicer.mrmlScene.AddNode(parameterNode) # set it to be the active parameter node l.SetActiveParameterNodeID(parameterNode.GetID()) # # create a new report, make it the report in the parameter node, set up hierarchy # reportNode = slicer.mrmlScene.CreateNodeByClass("vtkMRMLReportingReportNode") reportNode.SetReferenceCount(reportNode.GetReferenceCount() - 1) # set the color id colorID = 'vtkMRMLColorTableNodeFileGenericAnatomyColors.txt' reportNode.SetColorNodeID(colorID) reportNode.SetDICOMDatabaseFileName(dbpath) slicer.mrmlScene.AddNode(reportNode) parameterNode.SetParameter("reportID", reportNode.GetID()) # # get some sample data from the database # volId = 1 volumeNode = None volName = 'AIM volume '+str(volId) # print("Dicom data base = "+ddb) slicer.dicomDatabase = ddb scalarVolumePlugin = slicer.modules.dicomPlugins['DICOMScalarVolumePlugin']() scalarVolumeLoadables = scalarVolumePlugin.examine([fileList]) volumeNode = scalarVolumePlugin.load(scalarVolumeLoadables[0]) volumeNode.SetName(volName) # print "volumeNode = ",volumeNode print("Adding to Report: Volume with id "+volumeNode.GetID()) l.AddVolumeToReport(volumeNode) # set it on the report reportNode.SetVolumeNodeID(volumeNode.GetID()) print("adding a fiducial") # # define a fiducial # fidNode = slicer.vtkMRMLAnnotationFiducialNode() fidName = "AIM Round Trip Test Fiducial" fidNode.SetName(fidName) fidNode.SetSelected(1) fidNode.SetDisplayVisibility(1) fidNode.SetLocked(0) print("Calling set fid coords") startCoords = [15.8, 70.8, -126.7] fidNode.SetFiducialCoordinates(startCoords[0],startCoords[1],startCoords[2]) print("Starting fiducial coordinates: "+str(startCoords)) # point it to the volume fidNode.SetAttribute("AssociatedNodeID", volumeNode.GetID()) # point it to the report fidNode.SetAttribute("ReportingReportNodeID", reportNode.GetID()) fidNode.SetScene(slicer.mrmlScene) print("Adding text disp node") fidNode.CreateAnnotationTextDisplayNode() print("Adding point display node") fidNode.CreateAnnotationPointDisplayNode() print("add node:") # slicer.mrmlScene.DebugOn() # l.DebugOn() slicer.mrmlScene.AddNode(fidNode) print("getting slice uid") uid = l.GetSliceUIDFromMarkUp(fidNode) print("fidNode uid = "+uid) # # create a label volume # volumesLogic = slicer.modules.volumes.logic() labelNode = volumesLogic.CreateAndAddLabelVolume(slicer.mrmlScene, volumeNode, "Segmentation") labelDisplayNode = labelNode.GetDisplayNode() labelDisplayNode.SetAndObserveColorNodeID('vtkMRMLColorTableNodeFileGenericAnatomyColors.txt') l.AddNodeToReport(labelNode) # initialize image content labelImage = labelNode.GetImageData() extent = labelImage.GetExtent() pixelCounter = 0 for k in range(extent[5]): for j in range(extent[3]): for i in range(extent[1]): if pixelCounter in initializedSegmentationVoxels: labelImage.SetScalarComponentFromFloat(i,j,k,0,1) else: labelImage.SetScalarComponentFromFloat(i,j,k,0,0) pixelCounter = pixelCounter + 1 # test save to mrml # slicer.mrmlScene.SetURL('/spl/tmp/nicole/Testing/aim/RoundTripTest.mrml') # slicer.mrmlScene.Commit() # # output AIM XML # dirName = slicer.app.slicerHome + '/Testing/Temporary/' reportNode.SetStorageDirectoryName(dirName) print("Saving report to "+dirName) retval = l.SaveReportToAIM(reportNode) if (retval != 0): print("ERROR: unable to save report to aim file "+dirName+", retval="+retval) else: print("Saved report to "+dirName+" in file "+reportNode.GetAIMFileName()) self.assertEqual(retval, 0) print("\n\n\nReloading aim file"+reportNode.GetAIMFileName()) # # now clear the scene so can read in # # TBD: this causes a crash # slicer.mrmlScene.Clear(0) # # load in the aim file # newReport = slicer.mrmlScene.CreateNodeByClass("vtkMRMLReportingReportNode") newReport.SetReferenceCount(newReport.GetReferenceCount()-1) # set the default color map newReport.SetColorNodeID(colorID) newReport.SetDICOMDatabaseFileName(dbpath) slicer.mrmlScene.AddNode(newReport) parameterNode.SetParameter("reportID", newReport.GetID()) Helper.LoadAIMFile(newReport.GetID(),reportNode.GetAIMFileName()) # check the fiducial endCoords = [0,0,0] col = slicer.mrmlScene.GetNodesByClass("vtkMRMLAnnotationFiducialNode") col.SetReferenceCount(col.GetReferenceCount() - 1) # if the scene is not cleared, we should have 2 fiducials nFiducials = col.GetNumberOfItems() if nFiducials != 2: print("Failed to read a fiducial from the saved report! Expect 2 in the non cleared scene, have " + str(nFiducials)) self.assertTrue(False) f = col.GetItemAsObject(1) f.GetFiducialCoordinates(endCoords) print("Start Coords = "+str(startCoords[0])+","+str(startCoords[1])+","+str(startCoords[2])) print("End Coords = "+str(endCoords)) xdiff = endCoords[0] - startCoords[0] ydiff = endCoords[1] - startCoords[1] zdiff = endCoords[2] - startCoords[2] diffTotal = xdiff + ydiff + zdiff print("Difference between coordinates after loaded the aim file and value from before stored the aim file: "+str(xdiff)+","+str(ydiff)+","+str(zdiff)+". Total difference = "+str(diffTotal)) if diffTotal > 0.1: print("Fiducial coordinates error exceeds the allowed bounds") self.assertTrue(False) # check the label node sceneVolumes = slicer.mrmlScene.GetNodesByClass("vtkMRMLScalarVolumeNode") sceneVolumes.SetReferenceCount(sceneVolumes.GetReferenceCount() - 1) sceneLabels = [] for i in range(sceneVolumes.GetNumberOfItems()): vol = sceneVolumes.GetItemAsObject(i) if vol.GetLabelMap(): sceneLabels.append(vol) if len(sceneLabels) != 2: print("Scene does not have two label nodes after reloading from AIM!") self.assertTrue(False) newLabelNode = sceneLabels[1] newLabelImage = newLabelNode.GetImageData() extent = newLabelImage.GetExtent() pixelCounter = 0 for k in range(extent[5]): for j in range(extent[3]): for i in range(extent[1]): pixel = newLabelImage.GetScalarComponentAsFloat(i,j,k,0) if ((pixelCounter in initializedSegmentationVoxels) and pixel != 1) or (not(pixelCounter in initializedSegmentationVoxels) and pixel != 0): print("Segmentation content not recovered correctly!") print("Pixel counter "+str(pixelCounter)+" is set to "+str(pixel)) self.assertTrue(False) pixelCounter = pixelCounter + 1 self.assertTrue(True)
def setup( self ): ''' Create and start the ChangeTracker workflow. ''' self.workflow = ctk.ctkWorkflow() workflowWidget = ctk.ctkWorkflowStackedWidget() workflowWidget.setWorkflow( self.workflow ) workflowWidget.buttonBoxWidget().nextButtonDefaultText = "" workflowWidget.buttonBoxWidget().backButtonDefaultText = "" # create all wizard steps self.selectScansStep = ChangeTrackerWizard.ChangeTrackerSelectScansStep( 'SelectScans' ) self.defineROIStep = ChangeTrackerWizard.ChangeTrackerDefineROIStep( 'DefineROI' ) self.segmentROIStep = ChangeTrackerWizard.ChangeTrackerSegmentROIStep( 'SegmentROI' ) self.analyzeROIStep = ChangeTrackerWizard.ChangeTrackerAnalyzeROIStep( 'AnalyzeROI' ) self.reportROIStep = ChangeTrackerWizard.ChangeTrackerReportROIStep( 'ReportROI' ) # add the wizard steps to an array for convenience allSteps = [] allSteps.append( self.selectScansStep ) allSteps.append( self.defineROIStep ) allSteps.append( self.segmentROIStep ) allSteps.append( self.analyzeROIStep ) allSteps.append( self.reportROIStep ) # Add transition for the first step which let's the user choose between simple and advanced mode self.workflow.addTransition( self.selectScansStep, self.defineROIStep ) self.workflow.addTransition( self.defineROIStep, self.segmentROIStep ) self.workflow.addTransition( self.segmentROIStep, self.analyzeROIStep ) self.workflow.addTransition( self.analyzeROIStep, self.reportROIStep ) nNodes = slicer.mrmlScene.GetNumberOfNodesByClass('vtkMRMLScriptedModuleNode') self.parameterNode = None for n in xrange(nNodes): compNode = slicer.mrmlScene.GetNthNodeByClass(n, 'vtkMRMLScriptedModuleNode') nodeid = None if compNode.GetModuleName() == 'ChangeTracker': self.parameterNode = compNode print 'Found existing ChangeTracker parameter node' break if self.parameterNode == None: self.parameterNode = slicer.vtkMRMLScriptedModuleNode() self.parameterNode.SetModuleName('ChangeTracker') slicer.mrmlScene.AddNode(self.parameterNode) for s in allSteps: s.setParameterNode (self.parameterNode) # restore workflow step currentStep = self.parameterNode.GetParameter('currentStep') if currentStep != '': print 'Restoring workflow step to ', currentStep if currentStep == 'SelectScans': self.workflow.setInitialStep(self.selectScansStep) if currentStep == 'DefineROI': self.workflow.setInitialStep(self.defineROIStep) if currentStep == 'SegmentROI': self.workflow.setInitialStep(self.segmentROIStep) if currentStep == 'AnalyzeROI': self.workflow.setInitialStep(self.analyzeROIStep) if currentStep == 'ReportROI': self.workflow.setInitialStep(self.reportROIStep) else: print 'currentStep in parameter node is empty!' # start the workflow and show the widget self.workflow.start() workflowWidget.visible = True self.layout.addWidget( workflowWidget )
def setup(self): ScriptedLoadableModuleWidget.setup(self) # Instantiate and connect widgets ... # # Parameters Area # parametersCollapsibleButton = ctk.ctkCollapsibleButton() parametersCollapsibleButton.text = "Parameters" self.layout.addWidget(parametersCollapsibleButton) # Layout within the dummy collapsible button parametersFormLayout = qt.QFormLayout(parametersCollapsibleButton) # # # # fixed image selector # # # self.fixedImageSelector = slicer.qMRMLNodeComboBox() # self.fixedImageSelector.nodeTypes = ( ("vtkMRMLScalarVolumeNode"), "" ) # self.fixedImageSelector.selectNodeUponCreation = True # self.fixedImageSelector.addEnabled = False # self.fixedImageSelector.removeEnabled = False # self.fixedImageSelector.noneEnabled = False # self.fixedImageSelector.showHidden = False # self.fixedImageSelector.showChildNodeTypes = False # self.fixedImageSelector.setMRMLScene( slicer.mrmlScene ) # self.fixedImageSelector.setToolTip( "Fixed image (optional)" ) # parametersFormLayout.addRow("Fixed Image: ", self.fixedImageSelector) # # fixed image label selector # self.fixedImageLabelSelector = slicer.qMRMLNodeComboBox() self.fixedImageLabelSelector.nodeTypes = ( ("vtkMRMLLabelMapVolumeNode"), "" ) self.fixedImageLabelSelector.selectNodeUponCreation = True self.fixedImageLabelSelector.addEnabled = False self.fixedImageLabelSelector.removeEnabled = False self.fixedImageLabelSelector.noneEnabled = False self.fixedImageLabelSelector.showHidden = False self.fixedImageLabelSelector.showChildNodeTypes = False self.fixedImageLabelSelector.setMRMLScene( slicer.mrmlScene ) self.fixedImageLabelSelector.setToolTip( "Segmentation of the fixed image" ) parametersFormLayout.addRow("Segmentation of the fixed Image: ", self.fixedImageLabelSelector) # # fixed image label 1 for similarity # self.fixedImageSimilarityLabel1 = slicer.qMRMLNodeComboBox() self.fixedImageSimilarityLabel1.nodeTypes = ( ("vtkMRMLLabelMapVolumeNode"), "" ) self.fixedImageSimilarityLabel1.selectNodeUponCreation = True self.fixedImageSimilarityLabel1.addEnabled = False self.fixedImageSimilarityLabel1.removeEnabled = False self.fixedImageSimilarityLabel1.noneEnabled = False self.fixedImageSimilarityLabel1.showHidden = False self.fixedImageSimilarityLabel1.showChildNodeTypes = False self.fixedImageSimilarityLabel1.setMRMLScene( slicer.mrmlScene ) self.fixedImageSimilarityLabel1.setToolTip( "Label to compare using Similarity Metric" ) parametersFormLayout.addRow("Fixed Image Similarity Label 1: ", self.fixedImageSimilarityLabel1) # # fixed image label 2 for similarity # self.fixedImageSimilarityLabel2 = slicer.qMRMLNodeComboBox() self.fixedImageSimilarityLabel2.nodeTypes = ( ("vtkMRMLLabelMapVolumeNode"), "" ) self.fixedImageSimilarityLabel2.selectNodeUponCreation = True self.fixedImageSimilarityLabel2.addEnabled = False self.fixedImageSimilarityLabel2.removeEnabled = False self.fixedImageSimilarityLabel2.noneEnabled = False self.fixedImageSimilarityLabel2.showHidden = False self.fixedImageSimilarityLabel2.showChildNodeTypes = False self.fixedImageSimilarityLabel2.setMRMLScene( slicer.mrmlScene ) self.fixedImageSimilarityLabel2.setToolTip( "Label to compare using Similarity Metric" ) parametersFormLayout.addRow("Fixed Image Similarity Label 2: ", self.fixedImageSimilarityLabel2) # # fixed image label 3 for similarity # self.fixedImageSimilarityLabel3 = slicer.qMRMLNodeComboBox() self.fixedImageSimilarityLabel3.nodeTypes = ( ("vtkMRMLLabelMapVolumeNode"), "" ) self.fixedImageSimilarityLabel3.selectNodeUponCreation = True self.fixedImageSimilarityLabel3.addEnabled = False self.fixedImageSimilarityLabel3.removeEnabled = False self.fixedImageSimilarityLabel3.noneEnabled = False self.fixedImageSimilarityLabel3.showHidden = False self.fixedImageSimilarityLabel3.showChildNodeTypes = False self.fixedImageSimilarityLabel3.setMRMLScene( slicer.mrmlScene ) self.fixedImageSimilarityLabel3.setToolTip( "Label to compare using Similarity Metric" ) parametersFormLayout.addRow("Fixed Image Similarity Label 3: ", self.fixedImageSimilarityLabel3) # # fixed image label 4 for similarity # self.fixedImageSimilarityLabel4 = slicer.qMRMLNodeComboBox() self.fixedImageSimilarityLabel4.nodeTypes = ( ("vtkMRMLLabelMapVolumeNode"), "" ) self.fixedImageSimilarityLabel4.selectNodeUponCreation = True self.fixedImageSimilarityLabel4.addEnabled = False self.fixedImageSimilarityLabel4.removeEnabled = False self.fixedImageSimilarityLabel4.noneEnabled = False self.fixedImageSimilarityLabel4.showHidden = False self.fixedImageSimilarityLabel4.showChildNodeTypes = False self.fixedImageSimilarityLabel4.setMRMLScene( slicer.mrmlScene ) self.fixedImageSimilarityLabel4.setToolTip( "Label to compare using Similarity Metric" ) parametersFormLayout.addRow("Fixed Image Similarity Label 4: ", self.fixedImageSimilarityLabel4) # # # # moving image selector # # # self.movingImageSelector = slicer.qMRMLNodeComboBox() # self.movingImageSelector.nodeTypes = ( ("vtkMRMLScalarVolumeNode"), "" ) # self.movingImageSelector.selectNodeUponCreation = True # self.movingImageSelector.addEnabled = False # self.movingImageSelector.removeEnabled = False # self.movingImageSelector.noneEnabled = False # self.movingImageSelector.showHidden = False # self.movingImageSelector.showChildNodeTypes = False # self.movingImageSelector.setMRMLScene( slicer.mrmlScene ) # self.movingImageSelector.setToolTip( "Moving image (optional)" ) # parametersFormLayout.addRow("Moving Image: ", self.movingImageSelector) # # moving image label selector # self.movingImageLabelSelector = slicer.qMRMLNodeComboBox() self.movingImageLabelSelector.nodeTypes = ( ("vtkMRMLLabelMapVolumeNode"), "" ) self.movingImageLabelSelector.selectNodeUponCreation = True self.movingImageLabelSelector.addEnabled = False self.movingImageLabelSelector.removeEnabled = False self.movingImageLabelSelector.noneEnabled = False self.movingImageLabelSelector.showHidden = False self.movingImageLabelSelector.showChildNodeTypes = False self.movingImageLabelSelector.setMRMLScene( slicer.mrmlScene ) self.movingImageLabelSelector.setToolTip( "Segmentation of the moving image" ) parametersFormLayout.addRow("Segmentation of the moving Image: ", self.movingImageLabelSelector) # # moving image label 1 for similarity # self.movingImageSimilarityLabel1 = slicer.qMRMLNodeComboBox() self.movingImageSimilarityLabel1.nodeTypes = ( ("vtkMRMLLabelMapVolumeNode"), "" ) self.movingImageSimilarityLabel1.selectNodeUponCreation = True self.movingImageSimilarityLabel1.addEnabled = False self.movingImageSimilarityLabel1.removeEnabled = False self.movingImageSimilarityLabel1.noneEnabled = False self.movingImageSimilarityLabel1.showHidden = False self.movingImageSimilarityLabel1.showChildNodeTypes = False self.movingImageSimilarityLabel1.setMRMLScene( slicer.mrmlScene ) self.movingImageSimilarityLabel1.setToolTip( "Label to compare using Similarity Metric" ) parametersFormLayout.addRow("Moving Image Similarity Label 1: ", self.movingImageSimilarityLabel1) # # moving image label 2 for similarity # self.movingImageSimilarityLabel2 = slicer.qMRMLNodeComboBox() self.movingImageSimilarityLabel2.nodeTypes = ( ("vtkMRMLLabelMapVolumeNode"), "" ) self.movingImageSimilarityLabel2.selectNodeUponCreation = True self.movingImageSimilarityLabel2.addEnabled = False self.movingImageSimilarityLabel2.removeEnabled = False self.movingImageSimilarityLabel2.noneEnabled = False self.movingImageSimilarityLabel2.showHidden = False self.movingImageSimilarityLabel2.showChildNodeTypes = False self.movingImageSimilarityLabel2.setMRMLScene( slicer.mrmlScene ) self.movingImageSimilarityLabel2.setToolTip( "Label to compare using Similarity Metric" ) parametersFormLayout.addRow("Moving Image Similarity Label 2: ", self.movingImageSimilarityLabel2) # # moving image label 3 for similarity # self.movingImageSimilarityLabel3 = slicer.qMRMLNodeComboBox() self.movingImageSimilarityLabel3.nodeTypes = ( ("vtkMRMLLabelMapVolumeNode"), "" ) self.movingImageSimilarityLabel3.selectNodeUponCreation = True self.movingImageSimilarityLabel3.addEnabled = False self.movingImageSimilarityLabel3.removeEnabled = False self.movingImageSimilarityLabel3.noneEnabled = False self.movingImageSimilarityLabel3.showHidden = False self.movingImageSimilarityLabel3.showChildNodeTypes = False self.movingImageSimilarityLabel3.setMRMLScene( slicer.mrmlScene ) self.movingImageSimilarityLabel3.setToolTip( "Label to compare using Similarity Metric" ) parametersFormLayout.addRow("Moving Image Similarity Label 3: ", self.movingImageSimilarityLabel3) # # moving image label 4 for similarity # self.movingImageSimilarityLabel4 = slicer.qMRMLNodeComboBox() self.movingImageSimilarityLabel4.nodeTypes = ( ("vtkMRMLLabelMapVolumeNode"), "" ) self.movingImageSimilarityLabel4.selectNodeUponCreation = True self.movingImageSimilarityLabel4.addEnabled = False self.movingImageSimilarityLabel4.removeEnabled = False self.movingImageSimilarityLabel4.noneEnabled = False self.movingImageSimilarityLabel4.showHidden = False self.movingImageSimilarityLabel4.showChildNodeTypes = False self.movingImageSimilarityLabel4.setMRMLScene( slicer.mrmlScene ) self.movingImageSimilarityLabel4.setToolTip( "Label to compare using Similarity Metric" ) parametersFormLayout.addRow("Moving Image Similarity Label 4: ", self.movingImageSimilarityLabel4) # # Affine output transform selector # self.affineTransformSelector = slicer.qMRMLNodeComboBox() self.affineTransformSelector.nodeTypes = ( ("vtkMRMLTransformNode"), "" ) self.affineTransformSelector.selectNodeUponCreation = True self.affineTransformSelector.addEnabled = True self.affineTransformSelector.removeEnabled = False self.affineTransformSelector.noneEnabled = False self.affineTransformSelector.showHidden = False self.affineTransformSelector.showChildNodeTypes = False self.affineTransformSelector.baseName = 'Affine Transform' self.affineTransformSelector.setMRMLScene( slicer.mrmlScene ) self.affineTransformSelector.setToolTip( "Registration affine transform" ) parametersFormLayout.addRow("Registration affine transform: ", self.affineTransformSelector) # # # # B-spline output transform selector # # # self.bsplineTransformSelector = slicer.qMRMLNodeComboBox() # self.bsplineTransformSelector.nodeTypes = ( ("vtkMRMLTransformNode"), "" ) # self.bsplineTransformSelector.selectNodeUponCreation = True # self.bsplineTransformSelector.addEnabled = True # self.bsplineTransformSelector.removeEnabled = False # self.bsplineTransformSelector.noneEnabled = False # self.bsplineTransformSelector.showHidden = False # self.bsplineTransformSelector.showChildNodeTypes = False # self.bsplineTransformSelector.baseName = 'Deformable Transform' # self.bsplineTransformSelector.setMRMLScene( slicer.mrmlScene ) # self.bsplineTransformSelector.setToolTip( "Registration b-spline transform" ) # parametersFormLayout.addRow("Registration B-spline Transform: ", self.bsplineTransformSelector) # # Display (before or after transform) # # self.registrationModeGroup = qt.QButtonGroup() # self.noRegistrationRadio = qt.QRadioButton('Before registration') # self.linearRegistrationRadio = qt.QRadioButton('After linear registration') # self.deformableRegistrationRadio = qt.QRadioButton('After deformable registration') # self.noRegistrationRadio.setChecked(1) # self.registrationModeGroup.addButton(self.noRegistrationRadio,1) # self.registrationModeGroup.addButton(self.linearRegistrationRadio,2) # self.registrationModeGroup.addButton(self.deformableRegistrationRadio,3) # parametersFormLayout.addRow(qt.QLabel("Visualization")) # parametersFormLayout.addRow("",self.noRegistrationRadio) # parametersFormLayout.addRow("",self.linearRegistrationRadio) # parametersFormLayout.addRow("",self.deformableRegistrationRadio) # self.registrationModeGroup.connect('buttonClicked(int)',self.onVisualizationModeClicked) # # Apply Button # self.applyButton = qt.QPushButton("Apply") self.applyButton.toolTip = "Run the algorithm." self.applyButton.enabled = True parametersFormLayout.addRow(self.applyButton) # connections self.applyButton.connect('clicked(bool)', self.onApplyButton) # Add vertical spacer self.layout.addStretch(1) # Refresh Apply button state #self.onSelect() self.parameterNode = slicer.vtkMRMLScriptedModuleNode() '''
def __init__(self, widgetClass=None): self.parent = qt.QFrame() self.parent.setLayout(qt.QHBoxLayout()) self.moduleLogic = StylusBasedUSProbeCalibrationLogic() # TODO: should have way to pop up python interactor self.leftFrame = qt.QFrame(self.parent) self.leftFrame.setLayout(qt.QVBoxLayout()) self.parent.layout().addWidget(self.leftFrame, 1) self.layoutSelectorFrame2 = qt.QFrame(self.parent) self.layoutSelectorFrame2.setLayout(qt.QHBoxLayout()) self.leftFrame.layout().addWidget(self.layoutSelectorFrame2) self.layoutSelectorLabel2 = qt.QLabel("Layout Selector: ", self.layoutSelectorFrame2) self.layoutSelectorLabel2.setToolTip("Select the layout ...") self.layoutSelectorFrame2.layout().addWidget(self.layoutSelectorLabel2) self.layoutSelector2 = qt.QComboBox(self.layoutSelectorFrame2) self.layoutSelector2.addItem("FourViews") self.layoutSelector2.addItem("3D View") self.layoutSelector2.addItem("One view") self.layoutSelector2.addItem("Double 3D View") self.layoutSelectorFrame2.layout().addWidget(self.layoutSelector2) self.layoutSelector2.connect('activated(int)', self.onLayoutSelect) self.resetViewButton = qt.QPushButton("Reset") self.layoutSelectorFrame2.layout().addWidget(self.resetViewButton) self.resetViewButton.connect('clicked()', self.moduleLogic.onResetView) self.layoutWidget = slicer.qMRMLLayoutWidget() self.layoutWidget.setMRMLScene(slicer.mrmlScene) # self.layoutManager.setLayout(slicer.vtkMRMLLayoutNode.SlicerLayoutOneUp3DView) # self.layoutManager.setLayout(slicer.vtkMRMLLayoutNode.SlicerLayoutOneUpRedSliceView) # self.layoutManager.setLayout(slicer.vtkMRMLLayoutNode.SlicerLayoutTabbedSliceView) #### Some of the possible layouts # SlicerLayout3DPlusLightboxView SlicerLayoutCompareGridView SlicerLayoutCompareWidescreenView SlicerLayoutConventionalQuantitativeView SlicerLayoutConventionalView SlicerLayoutConventionalWidescreenView # SlicerLayoutCustomView SlicerLayoutDefaultView SlicerLayoutOneUp3DView SlicerLayoutOneUpRedSliceView SlicerLayoutOneUpGreenSliceView SlicerLayoutOneUpYellowSliceView SlicerLayoutDual3DView # SlicerLayoutFourOverFourView SlicerLayoutTabbedSliceView self.layoutWidget.setLayout(slicer.vtkMRMLLayoutNode.SlicerLayoutConventionalView) self.parent.layout().addWidget(self.layoutWidget, 2) self.toolsViewer = ToolsViewer() self.toolsViewer.setModuleLogic(self.moduleLogic) # self.toolsViewer.listenToScene() # item=qt.QListWidgetItem("unItem") # self.modelsViewer.addItem(item) self.leftFrame.layout().addWidget(self.toolsViewer.getToolsWidget(), 1) ''' Create and start the USGuided workflow. ''' self.workflow = ctk.ctkWorkflow() self.workflowWidget = ctk.ctkWorkflowStackedWidget() self.workflowWidget.setWorkflow(self.workflow) bw = self.workflowWidget.buttonBoxWidget() bw.hideInvalidButtons = True groupBox = self.workflowWidget.workflowGroupBox() groupBox.errorTextEnabled = False #bw.nextButtonDefaultText = "" #bw.backButtonDefaultText = "" nextButton=bw.nextButton() backButton=bw.backButton() nextButton.text="" backButton.text="" self.leftFrame.layout().addWidget(self.workflowWidget, 8) # create all wizard steps self.connectToTrackerStep = StylusBasedUSProbeCalibrationWizard.ConnectToTrackerStep('ConnectToTracker') self.connectToTrackerStep.setModuleLogic(self.moduleLogic) self.connectToTrackerStep.setButtonBoxWidget(bw) self.connectToTrackerStep.setToolsViewer(self.toolsViewer) self.placeStylusTipInTheImageStep = StylusBasedUSProbeCalibrationWizard.PlaceStylusTipInTheImageStep('PlaceStylusTipInTheImage') self.placeStylusTipInTheImageStep.setModuleLogic(self.moduleLogic) self.placeStylusTipInTheImageStep.setButtonBoxWidget(bw) self.captureSpatialPositionsStep = StylusBasedUSProbeCalibrationWizard.CaptureSpatialPositionsStep('CaptureSpatialPositions') self.captureSpatialPositionsStep.setModuleLogic(self.moduleLogic) self.captureSpatialPositionsStep.setButtonBoxWidget(bw) self.registrationStep = StylusBasedUSProbeCalibrationWizard.RegistrationStep('Registration') self.registrationStep.setModuleLogic(self.moduleLogic) self.registrationStep.setButtonBoxWidget(bw) # add the wizard steps to an array for convenience allSteps = [] allSteps.append(self.connectToTrackerStep) allSteps.append(self.captureSpatialPositionsStep) allSteps.append(self.placeStylusTipInTheImageStep) allSteps.append(self.registrationStep) # Add transition for the first step which let's the user choose between simple and advanced mode self.workflow.addTransition(self.connectToTrackerStep, self.captureSpatialPositionsStep) self.workflow.addTransition(self.captureSpatialPositionsStep, self.placeStylusTipInTheImageStep) self.workflow.addTransition(self.placeStylusTipInTheImageStep, self.registrationStep) nNodes = slicer.mrmlScene.GetNumberOfNodesByClass('vtkMRMLScriptedModuleNode') self.parameterNode = None for n in xrange(nNodes): compNode = slicer.mrmlScene.GetNthNodeByClass(n, 'vtkMRMLScriptedModuleNode') nodeid = None if compNode.GetModuleName() == 'StylusBasedUSProbeCalibration': self.parameterNode = compNode print 'Found existing StylusBasedUSProbeCalibration parameter node' break if self.parameterNode == None: self.parameterNode = slicer.vtkMRMLScriptedModuleNode() self.parameterNode.SetModuleName('StylusBasedUSProbeCalibration') slicer.mrmlScene.AddNode(self.parameterNode) for s in allSteps: s.setParameterNode (self.parameterNode) # restore workflow step currentStep = self.parameterNode.GetParameter('currentStep') if currentStep != '': print 'Restoring workflow step to ', currentStep if currentStep == 'ConnectToTracker': self.workflow.setInitialStep(self.connectToTrackerStep) if currentStep == 'PlaceStylusInTheImage': self.workflow.setInitialStep(self.placeStylusInTheImageStep) if currentStep == 'CaptureSpatialPositions': self.workflow.setInitialStep(self.captureSpatialPositionsStep) if currentStep == 'Registration': self.workflow.setInitialStep(self.registrationStep) else: print 'currentStep in parameter node is empty!' # start the workflow and show the widget self.workflow.start() self.workflowWidget.visible = True if widgetClass: self.widget = widgetClass(self.parent) self.parent.show()
def setup( self ): """ Slicer seems to call all methods of these classes upon entry. setup creates a workflow from ctk, which simply means that it creates a certies of UI steps one can traverse with "next" / "previous" buttons. The steps themselves are contained within ContrastSubtractionWizard. """ # Currently unclear on the difference between ctkWorkflow and # ctkWorkflowStackedWidget, but presumably the latter creates a UI # for the former self.workflow = ctk.ctkWorkflow() workflowWidget = ctk.ctkWorkflowStackedWidget() workflowWidget.setWorkflow( self.workflow ) # Create workflow steps. self.Step1 = ContrastSubtractionWizard.VolumeSelectStep('VolumeSelectStep') self.Step2 = ContrastSubtractionWizard.RegistrationStep('RegistrationStep') self.Step3 = ContrastSubtractionWizard.NormalizeSubtractStep('NormalizeSubtractStep') self.Step4 = ContrastSubtractionWizard.ROIStep('ROIStep') self.Step5 = ContrastSubtractionWizard.ThresholdStep('ThresholdStep') self.Step6 = ContrastSubtractionWizard.ReviewStep('ReviewStep') # Add the wizard steps to an array for convenience. Much of the following code # is copied wholesale from ChangeTracker. allSteps = [] allSteps.append( self.Step1 ) allSteps.append( self.Step2 ) allSteps.append( self.Step3 ) allSteps.append( self.Step4 ) allSteps.append( self.Step5 ) allSteps.append( self.Step6 ) # Adds transition functionality between steps. self.workflow.addTransition(self.Step1, self.Step2) self.workflow.addTransition(self.Step2, self.Step3) self.workflow.addTransition(self.Step3, self.Step4) self.workflow.addTransition(self.Step4, self.Step5) self.workflow.addTransition(self.Step5, self.Step6) # The following code creates a so-called parameter node referencing the # vtkMRMLScriptedModuleNode class, while checking to make sure one doesn't # already exist for some reason. This node keeps track of changse to MRML scene. nNodes = slicer.mrmlScene.GetNumberOfNodesByClass('vtkMRMLScriptedModuleNode') self.parameterNode = None for n in xrange(nNodes): compNode = slicer.mrmlScene.GetNthNodeByClass(n, 'vtkMRMLScriptedModuleNode') nodeid = None if compNode.GetModuleName() == 'ContrastSubtraction': self.parameterNode = compNode print 'Found existing ContrastSubtraction parameter node' break if self.parameterNode == None: self.parameterNode = slicer.vtkMRMLScriptedModuleNode() self.parameterNode.SetModuleName('ContrastSubtraction') slicer.mrmlScene.AddNode(self.parameterNode) # Individual steps get access to the parameter node too! for s in allSteps: s.setParameterNode (self.parameterNode) # Restores workflow step in case something goes wrong. currentStep = self.parameterNode.GetParameter('currentStep') if currentStep != '': print 'Restoring workflow step to ', currentStep if currentStep == 'VolumeSelectStep': self.workflow.setInitialStep(self.Step1) if currentStep == 'RegistrationStep': self.workflow.setInitialStep(self.Step2) if currentStep == 'NormalizeSubtractStep': self.workflow.setInitialStep(self.Step3) if currentStep == 'ROIStep': self.workflow.setInitialStep(self.Step4) if currentStep == 'ThresholdStep': self.workflow.setInitialStep(self.Step4) if currentStep == 'ReviewStep': self.workflow.setInitialStep(self.Step4) else: print 'currentStep in parameter node is empty!' # Starts and show the workflow. self.workflow.start() workflowWidget.visible = True self.layout.addWidget( workflowWidget )
def setup(self): ''' Create and start the ChangeTracker workflow. ''' self.workflow = ctk.ctkWorkflow() workflowWidget = ctk.ctkWorkflowStackedWidget() workflowWidget.setWorkflow(self.workflow) # create all wizard steps self.selectScansStep = ChangeTrackerWizard.ChangeTrackerSelectScansStep( 'SelectScans') self.defineROIStep = ChangeTrackerWizard.ChangeTrackerDefineROIStep( 'DefineROI') self.segmentROIStep = ChangeTrackerWizard.ChangeTrackerSegmentROIStep( 'SegmentROI') self.analyzeROIStep = ChangeTrackerWizard.ChangeTrackerAnalyzeROIStep( 'AnalyzeROI') self.reportROIStep = ChangeTrackerWizard.ChangeTrackerReportROIStep( 'ReportROI') # add the wizard steps to an array for convenience allSteps = [] allSteps.append(self.selectScansStep) allSteps.append(self.defineROIStep) allSteps.append(self.segmentROIStep) allSteps.append(self.analyzeROIStep) allSteps.append(self.reportROIStep) # Add transition for the first step which let's the user choose between simple and advanced mode self.workflow.addTransition(self.selectScansStep, self.defineROIStep) self.workflow.addTransition(self.defineROIStep, self.segmentROIStep) self.workflow.addTransition(self.segmentROIStep, self.analyzeROIStep) self.workflow.addTransition(self.analyzeROIStep, self.reportROIStep) nNodes = slicer.mrmlScene.GetNumberOfNodesByClass( 'vtkMRMLScriptedModuleNode') self.parameterNode = None for n in xrange(nNodes): compNode = slicer.mrmlScene.GetNthNodeByClass( n, 'vtkMRMLScriptedModuleNode') nodeid = None if compNode.GetModuleName() == 'ChangeTracker': self.parameterNode = compNode print 'Found existing ChangeTracker parameter node' break if self.parameterNode == None: self.parameterNode = slicer.vtkMRMLScriptedModuleNode() self.parameterNode.SetModuleName('ChangeTracker') slicer.mrmlScene.AddNode(self.parameterNode) for s in allSteps: s.setParameterNode(self.parameterNode) # restore workflow step currentStep = self.parameterNode.GetParameter('currentStep') if currentStep != '': print 'Restoring workflow step to ', currentStep if currentStep == 'SelectScans': self.workflow.setInitialStep(self.selectScansStep) if currentStep == 'DefineROI': self.workflow.setInitialStep(self.defineROIStep) if currentStep == 'SegmentROI': self.workflow.setInitialStep(self.segmentROIStep) if currentStep == 'AnalyzeROI': self.workflow.setInitialStep(self.analyzeROIStep) if currentStep == 'ReportROI': self.workflow.setInitialStep(self.reportROIStep) else: print 'currentStep in parameter node is empty!' # start the workflow and show the widget self.workflow.start() workflowWidget.visible = True self.layout.addWidget(workflowWidget)
def setup(self): ScriptedLoadableModuleWidget.setup(self) # Instantiate and connect widgets ... # # Parameters Area # parametersCollapsibleButton = ctk.ctkCollapsibleButton() parametersCollapsibleButton.text = "Parameters" self.layout.addWidget(parametersCollapsibleButton) # Layout within the dummy collapsible button parametersFormLayout = qt.QFormLayout(parametersCollapsibleButton) # # fixed image selector # self.fixedImageSelector = slicer.qMRMLNodeComboBox() self.fixedImageSelector.nodeTypes = (("vtkMRMLScalarVolumeNode"), "") self.fixedImageSelector.selectNodeUponCreation = True self.fixedImageSelector.addEnabled = False self.fixedImageSelector.removeEnabled = False self.fixedImageSelector.noneEnabled = True self.fixedImageSelector.showHidden = False self.fixedImageSelector.showChildNodeTypes = False self.fixedImageSelector.setMRMLScene(slicer.mrmlScene) self.fixedImageSelector.setToolTip("Fixed image (optional)") parametersFormLayout.addRow("Fixed Image: ", self.fixedImageSelector) # # fixed image label selector # self.fixedImageLabelSelector = slicer.qMRMLNodeComboBox() self.fixedImageLabelSelector.nodeTypes = (( "vtkMRMLLabelMapVolumeNode"), "") self.fixedImageLabelSelector.selectNodeUponCreation = True self.fixedImageLabelSelector.addEnabled = False self.fixedImageLabelSelector.removeEnabled = False self.fixedImageLabelSelector.noneEnabled = False self.fixedImageLabelSelector.showHidden = False self.fixedImageLabelSelector.showChildNodeTypes = False self.fixedImageLabelSelector.setMRMLScene(slicer.mrmlScene) self.fixedImageLabelSelector.setToolTip( "Segmentation of the fixed image") parametersFormLayout.addRow("Segmentation of the fixed Image: ", self.fixedImageLabelSelector) # # moving image selector # self.movingImageSelector = slicer.qMRMLNodeComboBox() self.movingImageSelector.nodeTypes = (("vtkMRMLScalarVolumeNode"), "") self.movingImageSelector.selectNodeUponCreation = True self.movingImageSelector.addEnabled = False self.movingImageSelector.removeEnabled = False self.movingImageSelector.noneEnabled = True self.movingImageSelector.showHidden = False self.movingImageSelector.showChildNodeTypes = False self.movingImageSelector.setMRMLScene(slicer.mrmlScene) self.movingImageSelector.setToolTip("Moving image (optional)") parametersFormLayout.addRow("Moving Image: ", self.movingImageSelector) # # moving image label selector # self.movingImageLabelSelector = slicer.qMRMLNodeComboBox() self.movingImageLabelSelector.nodeTypes = (( "vtkMRMLLabelMapVolumeNode"), "") self.movingImageLabelSelector.selectNodeUponCreation = True self.movingImageLabelSelector.addEnabled = False self.movingImageLabelSelector.removeEnabled = False self.movingImageLabelSelector.noneEnabled = False self.movingImageLabelSelector.showHidden = False self.movingImageLabelSelector.showChildNodeTypes = False self.movingImageLabelSelector.setMRMLScene(slicer.mrmlScene) self.movingImageLabelSelector.setToolTip( "Segmentation of the moving image") parametersFormLayout.addRow("Segmentation of the moving Image: ", self.movingImageLabelSelector) # # Affine output transform selector # self.affineTransformSelector = slicer.qMRMLNodeComboBox() self.affineTransformSelector.nodeTypes = (("vtkMRMLTransformNode"), "") self.affineTransformSelector.selectNodeUponCreation = True self.affineTransformSelector.addEnabled = True self.affineTransformSelector.removeEnabled = False self.affineTransformSelector.noneEnabled = False self.affineTransformSelector.showHidden = False self.affineTransformSelector.showChildNodeTypes = False self.affineTransformSelector.baseName = 'Affine Transform' self.affineTransformSelector.setMRMLScene(slicer.mrmlScene) self.affineTransformSelector.setToolTip( "Registration affine transform") parametersFormLayout.addRow("Registration affine transform: ", self.affineTransformSelector) # # B-spline output transform selector # self.bsplineTransformSelector = slicer.qMRMLNodeComboBox() self.bsplineTransformSelector.nodeTypes = (("vtkMRMLTransformNode"), "") self.bsplineTransformSelector.selectNodeUponCreation = True self.bsplineTransformSelector.addEnabled = True self.bsplineTransformSelector.removeEnabled = False self.bsplineTransformSelector.noneEnabled = False self.bsplineTransformSelector.showHidden = False self.bsplineTransformSelector.showChildNodeTypes = False self.bsplineTransformSelector.baseName = 'Deformable Transform' self.bsplineTransformSelector.setMRMLScene(slicer.mrmlScene) self.bsplineTransformSelector.setToolTip( "Registration b-spline transform") parametersFormLayout.addRow("Registration B-spline Transform: ", self.bsplineTransformSelector) # # registered volume selector # ''' self.outputImageSelector = slicer.qMRMLNodeComboBox() self.outputImageSelector.nodeTypes = ( ("vtkMRMLScalarVolumeNode"), "" ) # self.outputImageSelector.nodeTypes = ( ("vtkMRMLLabelMapVolumeNode"), "" ) self.outputImageSelector.selectNodeUponCreation = True self.outputImageSelector.addEnabled = True self.outputImageSelector.removeEnabled = True self.outputImageSelector.noneEnabled = True self.outputImageSelector.showHidden = False self.outputImageSelector.showChildNodeTypes = False self.outputImageSelector.baseName = 'Registered Volume' self.outputImageSelector.setMRMLScene( slicer.mrmlScene ) self.outputImageSelector.setToolTip( "Registered volume (will be generated only if the moving image was provided)" ) parametersFormLayout.addRow("Registered Volume: ", self.outputImageSelector) ''' # # To be added later: advanced parameters # registration modes (rigid/affine/bspline), save rigid/affine transforms, # crop box margin, number of samples, ... # # Add parameter node to facilitate registration from other modules and # command line # self.registrationModeGroup = qt.QButtonGroup() self.noRegistrationRadio = qt.QRadioButton('Before registration') self.linearRegistrationRadio = qt.QRadioButton( 'After linear registration') self.deformableRegistrationRadio = qt.QRadioButton( 'After deformable registration') self.noRegistrationRadio.setChecked(1) self.registrationModeGroup.addButton(self.noRegistrationRadio, 1) self.registrationModeGroup.addButton(self.linearRegistrationRadio, 2) self.registrationModeGroup.addButton(self.deformableRegistrationRadio, 3) parametersFormLayout.addRow(qt.QLabel("Visualization")) parametersFormLayout.addRow("", self.noRegistrationRadio) parametersFormLayout.addRow("", self.linearRegistrationRadio) parametersFormLayout.addRow("", self.deformableRegistrationRadio) self.registrationModeGroup.connect('buttonClicked(int)', self.onVisualizationModeClicked) # # Apply Button # self.applyButton = qt.QPushButton("Apply") self.applyButton.toolTip = "Run the algorithm." self.applyButton.enabled = True parametersFormLayout.addRow(self.applyButton) # connections self.applyButton.connect('clicked(bool)', self.onApplyButton) # Add vertical spacer self.layout.addStretch(1) # Refresh Apply button state #self.onSelect() self.parameterNode = slicer.vtkMRMLScriptedModuleNode() '''
def setup(self): """ Slicer seems to call all methods of these classes upon entry. setup creates a workflow from ctk, which simply means that it creates a certies of UI steps one can traverse with "next" / "previous" buttons. The steps themselves are contained within ContrastSubtractionWizard. """ # Currently unclear on the difference between ctkWorkflow and # ctkWorkflowStackedWidget, but presumably the latter creates a UI # for the former self.workflow = ctk.ctkWorkflow() workflowWidget = ctk.ctkWorkflowStackedWidget() workflowWidget.setWorkflow(self.workflow) # Create workflow steps. self.Step1 = ContrastSubtractionWizard.VolumeSelectStep( 'VolumeSelectStep') self.Step2 = ContrastSubtractionWizard.RegistrationStep( 'RegistrationStep') self.Step3 = ContrastSubtractionWizard.NormalizeSubtractStep( 'NormalizeSubtractStep') self.Step4 = ContrastSubtractionWizard.ROIStep('ROIStep') self.Step5 = ContrastSubtractionWizard.ThresholdStep('ThresholdStep') self.Step6 = ContrastSubtractionWizard.ReviewStep('ReviewStep') # Add the wizard steps to an array for convenience. Much of the following code # is copied wholesale from ChangeTracker. allSteps = [] allSteps.append(self.Step1) allSteps.append(self.Step2) allSteps.append(self.Step3) allSteps.append(self.Step4) allSteps.append(self.Step5) allSteps.append(self.Step6) # Adds transition functionality between steps. self.workflow.addTransition(self.Step1, self.Step2) self.workflow.addTransition(self.Step2, self.Step3) self.workflow.addTransition(self.Step3, self.Step4) self.workflow.addTransition(self.Step4, self.Step5) self.workflow.addTransition(self.Step5, self.Step6) self.workflow.addTransition(self.Step6, self.Step1) # The following code creates a so-called parameter node referencing the # vtkMRMLScriptedModuleNode class, while checking to make sure one doesn't # already exist for some reason. This node keeps track of changse to MRML scene. nNodes = slicer.mrmlScene.GetNumberOfNodesByClass( 'vtkMRMLScriptedModuleNode') self.parameterNode = None for n in xrange(nNodes): compNode = slicer.mrmlScene.GetNthNodeByClass( n, 'vtkMRMLScriptedModuleNode') nodeid = None if compNode.GetModuleName() == 'ContrastSubtraction': self.parameterNode = compNode print 'Found existing ContrastSubtraction parameter node' break if self.parameterNode == None: self.parameterNode = slicer.vtkMRMLScriptedModuleNode() self.parameterNode.SetModuleName('ContrastSubtraction') slicer.mrmlScene.AddNode(self.parameterNode) # Individual steps get access to the parameter node too! for s in allSteps: s.setParameterNode(self.parameterNode) # Restores workflow step in case something goes wrong. currentStep = self.parameterNode.GetParameter('currentStep') if currentStep != '': print 'Restoring workflow step to ', currentStep if currentStep == 'VolumeSelectStep': self.workflow.setInitialStep(self.Step1) if currentStep == 'RegistrationStep': self.workflow.setInitialStep(self.Step2) if currentStep == 'NormalizeSubtractStep': self.workflow.setInitialStep(self.Step3) if currentStep == 'ROIStep': self.workflow.setInitialStep(self.Step4) if currentStep == 'ThresholdStep': self.workflow.setInitialStep(self.Step4) if currentStep == 'ReviewStep': self.workflow.setInitialStep(self.Step4) else: print 'currentStep in parameter node is empty!' # Starts and show the workflow. self.workflow.start() workflowWidget.visible = True self.layout.addWidget(workflowWidget)
def setup( self ): ''' Create and start the workflow. ''' self.workflow = ctk.ctkWorkflow() workflowWidget = ctk.ctkWorkflowStackedWidget() workflowWidget.setWorkflow( self.workflow ) # create all wizard steps self.loadDataStep = PedicleScrewSimulatorWizard_v3.LoadDataStep( 'LoadData' ) self.defineROIStep = PedicleScrewSimulatorWizard_v3.DefineROIStep( 'DefineROI' ) self.measurementsStep = PedicleScrewSimulatorWizard_v3.MeasurementsStep( 'Measurements' ) self.landmarksStep = PedicleScrewSimulatorWizard_v3.LandmarksStep( 'Landmarks' ) self.screwStep = PedicleScrewSimulatorWizard_v3.ScrewStep( 'Screw' ) self.gradeStep = PedicleScrewSimulatorWizard_v3.GradeStep( 'Grade' ) self.endStep = PedicleScrewSimulatorWizard_v3.EndStep( 'Final' ) # add the wizard steps to an array for convenience allSteps = [] allSteps.append( self.loadDataStep ) allSteps.append( self.defineROIStep ) allSteps.append( self.landmarksStep) allSteps.append( self.measurementsStep ) allSteps.append( self.screwStep) allSteps.append( self.gradeStep) allSteps.append( self.endStep ) # Add transition # Check if volume is loaded self.workflow.addTransition( self.loadDataStep, self.defineROIStep ) self.workflow.addTransition( self.defineROIStep, self.landmarksStep, 'pass', ctk.ctkWorkflow.Bidirectional ) self.workflow.addTransition( self.defineROIStep, self.loadDataStep, 'fail', ctk.ctkWorkflow.Bidirectional ) self.workflow.addTransition( self.landmarksStep, self.measurementsStep, 'pass', ctk.ctkWorkflow.Bidirectional ) self.workflow.addTransition( self.landmarksStep, self.measurementsStep, 'fail', ctk.ctkWorkflow.Bidirectional ) self.workflow.addTransition( self.measurementsStep, self.screwStep, 'pass', ctk.ctkWorkflow.Bidirectional ) self.workflow.addTransition( self.measurementsStep, self.screwStep, 'fail', ctk.ctkWorkflow.Bidirectional ) self.workflow.addTransition( self.screwStep, self.gradeStep, 'pass', ctk.ctkWorkflow.Bidirectional ) self.workflow.addTransition( self.screwStep, self.gradeStep, 'fail', ctk.ctkWorkflow.Bidirectional ) self.workflow.addTransition( self.gradeStep, self.endStep ) nNodes = slicer.mrmlScene.GetNumberOfNodesByClass('vtkMRMLScriptedModuleNode') self.parameterNode = None for n in xrange(nNodes): compNode = slicer.mrmlScene.GetNthNodeByClass(n, 'vtkMRMLScriptedModuleNode') nodeid = None if compNode.GetModuleName() == 'PedicleScrewSimulator_v3': self.parameterNode = compNode print 'Found existing PedicleScrewSimulator_v3 parameter node' break if self.parameterNode == None: self.parameterNode = slicer.vtkMRMLScriptedModuleNode() self.parameterNode.SetModuleName('PedicleScrewSimulator_v3') slicer.mrmlScene.AddNode(self.parameterNode) for s in allSteps: s.setParameterNode (self.parameterNode) # restore workflow step currentStep = self.parameterNode.GetParameter('currentStep') if currentStep != '': print 'Restoring workflow step to ', currentStep if currentStep == 'LoadData': self.workflow.setInitialStep(self.loadDataStep) if currentStep == 'DefineROI': self.workflow.setInitialStep(self.defineROIStep) if currentStep == 'Measurements': self.workflow.setInitialStep(self.measurementsStep) if currentStep == 'Landmarks': self.workflow.setInitialStep(self.landmarksStep) if currentStep == 'Screw': self.workflow.setInitialStep(self.screwStep) if currentStep == 'Grade': self.workflow.setInitialStep(self.gradeStep) if currentStep == 'Final': self.workflow.setInitialStep(self.endStep) else: print 'currentStep in parameter node is empty!' # start the workflow and show the widget self.workflow.start() workflowWidget.visible = True self.layout.addWidget( workflowWidget )
def setup(self): self.workflow = ctk.ctkWorkflow() workflowWidget = ctk.ctkWorkflowStackedWidget() workflowWidget.setWorkflow(self.workflow) # create all 4 wizard steps self.selectDataStep = LASegmentationResources.LASegmentationWorkflowSelectDataStep( 'SelectData') self.registrationStep = LASegmentationResources.LASegmentationWorkflowImageRegistrationStep( 'ImageRegistration') self.endoSegStep = LASegmentationResources.LASegmentationWorkflowEndoSegmentationStep( 'LAEndoSegmentation') # add the wizard steps to an array for convenience allSteps = [] allSteps.append(self.selectDataStep) allSteps.append(self.registrationStep) allSteps.append(self.endoSegStep) self.workflow.addTransition(self.selectDataStep, self.registrationStep) self.workflow.addTransition(self.registrationStep, self.endoSegStep) nNodes = slicer.mrmlScene.GetNumberOfNodesByClass( 'vtkMRMLScriptedModuleNode') self.parameterNode = None for n in xrange(nNodes): compNode = slicer.mrmlScene.GetNthNodeByClass( n, 'vtkMRMLScriptedModuleNode') nodeid = None if compNode.GetModuleName() == 'LASegmentationWorkflow': self.parameterNode = compNode print 'Found existing LASegmentationWorkflow parameter node' break if self.parameterNode == None: self.parameterNode = slicer.vtkMRMLScriptedModuleNode() self.parameterNode.SetModuleName('LASegmentationWorkflow') slicer.mrmlScene.AddNode(self.parameterNode) for s in allSteps: s.setParameterNode(self.parameterNode) # restore workflow step currentStep = self.parameterNode.GetParameter('currentStep') if currentStep != '': print 'Restoring workflow step to ', currentStep if currentStep == 'SelectData': self.workflow.setInitialStep(self.selectDataStep) if currentStep == 'ImageRegistration': self.workflow.setInitialStep(self.registrationStep) if currentStep == 'LAEndoSegmentation': self.workflow.setInitialStep(self.endoSegStep) else: print 'currentStep in parameter node is empty!' # Start the workflow and show the widget self.workflow.start() workflowWidget.visible = True self.layout.addWidget(workflowWidget)
def setup(self): ''' Create and start the workflow. ''' self.workflow = ctk.ctkWorkflow() workflowWidget = ctk.ctkWorkflowStackedWidget() workflowWidget.setWorkflow(self.workflow) # create all wizard steps self.loadDataStep = PedicleScrewSimulatorWizard_v3.LoadDataStep( 'LoadData') self.defineROIStep = PedicleScrewSimulatorWizard_v3.DefineROIStep( 'DefineROI') self.measurementsStep = PedicleScrewSimulatorWizard_v3.MeasurementsStep( 'Measurements') self.landmarksStep = PedicleScrewSimulatorWizard_v3.LandmarksStep( 'Landmarks') self.screwStep = PedicleScrewSimulatorWizard_v3.ScrewStep('Screw') self.gradeStep = PedicleScrewSimulatorWizard_v3.GradeStep('Grade') self.endStep = PedicleScrewSimulatorWizard_v3.EndStep('Final') # add the wizard steps to an array for convenience allSteps = [] allSteps.append(self.loadDataStep) allSteps.append(self.defineROIStep) allSteps.append(self.landmarksStep) allSteps.append(self.measurementsStep) allSteps.append(self.screwStep) allSteps.append(self.gradeStep) allSteps.append(self.endStep) # Add transition # Check if volume is loaded self.workflow.addTransition(self.loadDataStep, self.defineROIStep) self.workflow.addTransition(self.defineROIStep, self.landmarksStep, 'pass', ctk.ctkWorkflow.Bidirectional) self.workflow.addTransition(self.defineROIStep, self.loadDataStep, 'fail', ctk.ctkWorkflow.Bidirectional) self.workflow.addTransition(self.landmarksStep, self.measurementsStep, 'pass', ctk.ctkWorkflow.Bidirectional) self.workflow.addTransition(self.landmarksStep, self.measurementsStep, 'fail', ctk.ctkWorkflow.Bidirectional) self.workflow.addTransition(self.measurementsStep, self.screwStep, 'pass', ctk.ctkWorkflow.Bidirectional) self.workflow.addTransition(self.measurementsStep, self.screwStep, 'fail', ctk.ctkWorkflow.Bidirectional) self.workflow.addTransition(self.screwStep, self.gradeStep, 'pass', ctk.ctkWorkflow.Bidirectional) self.workflow.addTransition(self.screwStep, self.gradeStep, 'fail', ctk.ctkWorkflow.Bidirectional) self.workflow.addTransition(self.gradeStep, self.endStep) nNodes = slicer.mrmlScene.GetNumberOfNodesByClass( 'vtkMRMLScriptedModuleNode') self.parameterNode = None for n in xrange(nNodes): compNode = slicer.mrmlScene.GetNthNodeByClass( n, 'vtkMRMLScriptedModuleNode') nodeid = None if compNode.GetModuleName() == 'PedicleScrewSimulator_v3': self.parameterNode = compNode print 'Found existing PedicleScrewSimulator_v3 parameter node' break if self.parameterNode == None: self.parameterNode = slicer.vtkMRMLScriptedModuleNode() self.parameterNode.SetModuleName('PedicleScrewSimulator_v3') slicer.mrmlScene.AddNode(self.parameterNode) for s in allSteps: s.setParameterNode(self.parameterNode) # restore workflow step currentStep = self.parameterNode.GetParameter('currentStep') if currentStep != '': print 'Restoring workflow step to ', currentStep if currentStep == 'LoadData': self.workflow.setInitialStep(self.loadDataStep) if currentStep == 'DefineROI': self.workflow.setInitialStep(self.defineROIStep) if currentStep == 'Measurements': self.workflow.setInitialStep(self.measurementsStep) if currentStep == 'Landmarks': self.workflow.setInitialStep(self.landmarksStep) if currentStep == 'Screw': self.workflow.setInitialStep(self.screwStep) if currentStep == 'Grade': self.workflow.setInitialStep(self.gradeStep) if currentStep == 'Final': self.workflow.setInitialStep(self.endStep) else: print 'currentStep in parameter node is empty!' # start the workflow and show the widget self.workflow.start() workflowWidget.visible = True self.layout.addWidget(workflowWidget)
def __init__( self, parent=None ): if not parent: self.parent = slicer.qMRMLWidget() self.parent.setLayout( qt.QVBoxLayout()) self.parent.setMRMLScene(slicer.mrmlScene) self.layout = self.parent.layout() self.setup() self.parent.show() else: self.parent = parent self.layout = parent.layout() # Reference to the logic that Slicer instantiated self.__logic = slicer.modules.reporting.logic() if not self.__logic: # create a new instance self.__logic = slicer.modulelogic.vtkSlicerReportingModuleLogic() # Get the location and initialize the DICOM DB settings = qt.QSettings() self.__dbFileName = settings.value("DatabaseDirectory","") if self.__dbFileName == "": Helper.Warning("DICOM Database is not accessible.") else: self.__dbFileName = self.__dbFileName+"/ctkDICOM.sql" if self.__logic.InitializeDICOMDatabase(self.__dbFileName): Helper.Info('DICOM database initialized correctly!') else: Helper.Error('Failed to initialize DICOM database at '+self.__dbFileName) if not self.__logic.GetMRMLScene(): # set the logic's mrml scene self.__logic.SetMRMLScene(slicer.mrmlScene) # for export self.exportFileName = None self.exportFileDialog = None # initialize parameter node self.__parameterNode = None nNodes = slicer.mrmlScene.GetNumberOfNodesByClass('vtkMRMLScriptedModuleNode') for n in xrange(nNodes): compNode = slicer.mrmlScene.GetNthNodeByClass(n, 'vtkMRMLScriptedModuleNode') compNode.SetReferenceCount(compNode.GetReferenceCount() - 1) nodeid = None if compNode.GetModuleName() == 'Reporting': self.__parameterNode = compNode 'Found existing Reporting parameter node' break if self.__parameterNode == None: self.__parameterNode = slicer.vtkMRMLScriptedModuleNode() self.__parameterNode.SetModuleName('Reporting') self.__parameterNode.SetSingletonTag('Reporting') slicer.mrmlScene.AddNode(self.__parameterNode) # keep active report and volume self.__rNode = None self.__vNode = None if self.__parameterNode != None: paramID = self.__parameterNode.GetID() self.__logic.SetActiveParameterNodeID(paramID) else: Helper.Error('Unable to set logic active parameter node') # TODO: figure out why module/class hierarchy is different # between developer builds ans packages try: # for developer build... self.editUtil = EditorLib.EditUtil.EditUtil() except AttributeError: # for release package... self.editUtil = EditorLib.EditUtil()
def __init__(self, widgetClass=None): self.parent = qt.QFrame() self.parent.setLayout( qt.QHBoxLayout() ) self.moduleLogic = USGuidedProcedureLogic() # TODO: should have way to pop up python interactor self.leftFrame = qt.QFrame(self.parent) self.leftFrame.setLayout( qt.QVBoxLayout() ) #self.leftFrame.setSizePolicy(qt.QSizePolicy.Maximum,qt.QSizePolicy.Maximum) #self.leftFrame.setSizePolicy(qt.QSizePolicy.MinimumExpanding,qt.QSizePolicy.MinimumExpanding) #self.parent.setStyleSheet( #"QFrame{background: QLinearGradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #eef, stop: 1 #ccf); background-color: qlineargradient(spread:pad, x1:0.989, y1:0.012, x2:0, y2:0, stop:0 rgba(223, 227, 255, 255), stop:0.494318 rgba(164, 157, 194, 255), stop:1 rgba(115, 115, 115, 255));}" #"QComboBox{color: white; background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #88d, stop: 0.1 #99e, stop: 0.49 #77c, stop: 0.5 #66b, stop: 1 #77c); border-width: 1px; border-color: #339; border-style: solid; border-radius: 7; padding: 3px; font-size: 12px; font-weight: bold; padding-left: 5px; padding-right: 5px; /*min-width: 50px;*/ max-width: 150px; /*min-height: 13px;*/ max-height: 150px; }" "QPushButton{color: white; background-color: QLinearGradient( x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #88d, stop: 0.1 #99e, stop: 0.49 #77c, stop: 0.5 #66b, stop: 1 #77c); border-width: 1px; border-color: #339; border-style: solid; border-radius: 7; padding: 3px; font-size: 12px; font-weight: bold; padding-left: 5px; padding-right: 5px; min-width: 20px; max-width: 150px; min-height: 20px; max-height: 40px;}" #"QLabel{color: white; background-color: rgba(255, 255, 255, 0);}" # "QSlider::groove:horizontal{border: 1px solid #bbb;background: white;height: 10px;border-radius: 4px;}" # "QSlider::sub-page:horizontal {background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #66e, stop: 1 #bbf);background:qlineargradient(x1: 0, y1: 0.2, x2: 1, y2: 1, stop: 0 #bbf, stop: 1 #55f);border: 1px solid #777;height: 10px;border-radius:4px;}" # "QSlider::add-page:horizontal {background: #fff;border: 1px solid #777;height: 10px;border-radius: 4px;}" # "QSlider::handle:horizontal {background: qlineargradient(x1:0, y1:0, x2:1, y2:1, stop:0 #eee, stop:1 #ccc);border: 1px solid #777;width: 13px;margin-top: -2px;margin-bottom: -2px;border-radius: 4px;}" # "QSlider::handle:horizontal:hover {background: qlineargradient(x1:0, y1:0, x2:1, y2:1, stop:0 #fff, stop:1 #ddd);border: 1px solid#444;border-radius: 4px;}" # "QSlider::sub-page:horizontal:disabled {background: #bbb;border-color: #999;}" # "QSlider::add-page:horizontal:disabled {background: #eee;border-color: #999;}" # "QSlider::handle:horizontal:disabled {background: #eee;border: 1px solid #aaa;border-radius: 4px;}") self.parent.layout().addWidget(self.leftFrame,1) self.addDataButton = qt.QPushButton("Add Data") self.leftFrame.layout().addWidget(self.addDataButton) self.addDataButton.connect("clicked()",slicer.app.ioManager().openAddDataDialog) self.saveSceneButton = qt.QPushButton("Save Data") self.leftFrame.layout().addWidget(self.saveSceneButton) self.saveSceneButton.connect("clicked()",slicer.app.ioManager().openSaveDataDialog) #self.loadSceneButton = qt.QPushButton("Load Scene") #self.leftFrame.layout().addWidget(self.loadSceneButton) #self.loadSceneButton.connect("clicked()",slicer.app.ioManager().openLoadSceneDialog) self.layoutSelectorFrame2 = qt.QFrame(self.parent) self.layoutSelectorFrame2.setLayout(qt.QHBoxLayout()) self.leftFrame.layout().addWidget(self.layoutSelectorFrame2) self.layoutSelectorLabel2 = qt.QLabel("Layout Selector: ", self.layoutSelectorFrame2) self.layoutSelectorLabel2.setToolTip( "Select the layout ...") self.layoutSelectorFrame2.layout().addWidget(self.layoutSelectorLabel2) self.layoutSelector2 = qt.QComboBox(self.layoutSelectorFrame2) self.layoutSelector2.addItem("FourViews") self.layoutSelector2.addItem("3D View") self.layoutSelector2.addItem("One view") self.layoutSelector2.addItem("Double 3D View") self.layoutSelectorFrame2.layout().addWidget(self.layoutSelector2) self.layoutSelector2.connect('activated(int)', self.onLayoutSelect) self.resetViewButton = qt.QPushButton("R") self.layoutSelectorFrame2.layout().addWidget(self.resetViewButton) self.resetViewButton.connect('clicked()', self.moduleLogic.onResetView) self.layoutWidget = slicer.qMRMLLayoutWidget() self.layoutWidget.setMRMLScene(slicer.mrmlScene) #self.layoutManager.setLayout(slicer.vtkMRMLLayoutNode.SlicerLayoutOneUp3DView) #self.layoutManager.setLayout(slicer.vtkMRMLLayoutNode.SlicerLayoutOneUpRedSliceView) #self.layoutManager.setLayout(slicer.vtkMRMLLayoutNode.SlicerLayoutTabbedSliceView) #### Some of the possible layouts #SlicerLayout3DPlusLightboxView SlicerLayoutCompareGridView SlicerLayoutCompareWidescreenView SlicerLayoutConventionalQuantitativeView SlicerLayoutConventionalView SlicerLayoutConventionalWidescreenView #SlicerLayoutCustomView SlicerLayoutDefaultView SlicerLayoutOneUp3DView SlicerLayoutOneUpRedSliceView SlicerLayoutOneUpGreenSliceView SlicerLayoutOneUpYellowSliceView SlicerLayoutDual3DView #SlicerLayoutFourOverFourView SlicerLayoutTabbedSliceView self.layoutWidget.setLayout(slicer.vtkMRMLLayoutNode.SlicerLayoutConventionalView) self.parent.layout().addWidget(self.layoutWidget,2) print("Previous line of the Constructor of ModelsViewer") self.modelsViewer = ModelsViewer() self.modelsViewer.setModuleLogic(self.moduleLogic) self.modelsViewer.listenToScene() self.volumeRenderingViewer = VolumeRenderingViewer() self.volumeRenderingViewer.setModuleLogic(self.moduleLogic) self.volumeRenderingViewer.listenToScene() #item=qt.QListWidgetItem("unItem") #self.modelsViewer.addItem(item) self.leftFrame.layout().addWidget(self.modelsViewer.getListWidget(),1) self.leftFrame.layout().addWidget(self.volumeRenderingViewer.getListWidget(),1) ''' Create and start the USGuided workflow. ''' self.workflow = ctk.ctkWorkflow() self.workflowWidget = ctk.ctkWorkflowStackedWidget() self.workflowWidget.setWorkflow( self.workflow ) bw=self.workflowWidget.buttonBoxWidget() bw.hideInvalidButtons=True groupBox=self.workflowWidget.workflowGroupBox() groupBox.errorTextEnabled = False self.workflowWidget.buttonBoxWidget().nextButtonDefaultText = "" self.workflowWidget.buttonBoxWidget().backButtonDefaultText = "" self.leftFrame.layout().addWidget( self.workflowWidget,3 ) # create all wizard steps self.loadSceneStep = USGuidedWizard.LoadSceneStep('LoadScene') self.loadSceneStep.setModuleLogic(self.moduleLogic) self.loadSceneStep.setButtonBoxWidget(bw) self.connectToTrackerStep = USGuidedWizard.ConnectToTrackerStep('ConnectToTracker') self.connectToTrackerStep.setModuleLogic(self.moduleLogic) self.connectToTrackerStep.setButtonBoxWidget(bw) self.placeImageFiducialsStep = USGuidedWizard.PlaceImageFiducialsStep( 'PlaceImageFiducials') self.placeImageFiducialsStep.setModuleLogic(self.moduleLogic) self.placeImageFiducialsStep.setButtonBoxWidget(bw) self.placeSpatialFiducialsStep = USGuidedWizard.PlaceSpatialFiducialsStep( 'PlaceSpatialFiducials') self.placeSpatialFiducialsStep.setModuleLogic(self.moduleLogic) self.placeSpatialFiducialsStep.setButtonBoxWidget(bw) self.registrationStep = USGuidedWizard.RegistrationStep( 'Registration') self.registrationStep.setModuleLogic(self.moduleLogic) self.registrationStep.setButtonBoxWidget(bw) self.navigationStep = USGuidedWizard.NavigationStep( 'Navigation') self.navigationStep.setModuleLogic(self.moduleLogic) self.navigationStep.setButtonBoxWidget(bw) #self.selectScansStep = USGuidedWizard.ChangeTrackerSelectScansStep( 'SelectScans' ) #self.defineROIStep = USGuidedWizard.ChangeTrackerDefineROIStep( 'DefineROI' ) #self.segmentROIStep = USGuidedWizard.ChangeTrackerSegmentROIStep( 'SegmentROI' ) #self.analyzeROIStep = USGuidedWizard.ChangeTrackerAnalyzeROIStep( 'AnalyzeROI' ) #self.reportROIStep = USGuidedWizard.ChangeTrackerReportROIStep( 'ReportROI' ) # add the wizard steps to an array for convenience allSteps = [] allSteps.append( self.loadSceneStep ) allSteps.append( self.connectToTrackerStep ) allSteps.append( self.placeImageFiducialsStep ) allSteps.append( self.placeSpatialFiducialsStep ) allSteps.append( self.registrationStep ) allSteps.append( self.navigationStep ) #allSteps.append( self.selectScansStep ) #allSteps.append( self.defineROIStep ) #allSteps.append( self.segmentROIStep ) #allSteps.append( self.analyzeROIStep ) #allSteps.append( self.reportROIStep ) # Add transition for the first step which let's the user choose between simple and advanced mode self.workflow.addTransition( self.loadSceneStep, self.connectToTrackerStep ) self.workflow.addTransition( self.connectToTrackerStep, self.placeImageFiducialsStep ) self.workflow.addTransition( self.placeImageFiducialsStep, self.placeSpatialFiducialsStep ) self.workflow.addTransition( self.placeSpatialFiducialsStep, self.registrationStep ) self.workflow.addTransition( self.registrationStep, self.navigationStep ) #self.workflow.addTransition( self.placeImageFiducials, self.selectScansStep ) #self.workflow.addTransition( self.selectScansStep, self.defineROIStep ) #self.workflow.addTransition( self.defineROIStep, self.segmentROIStep ) #self.workflow.addTransition( self.segmentROIStep, self.analyzeROIStep ) #self.workflow.addTransition( self.analyzeROIStep, self.reportROIStep ) nNodes = slicer.mrmlScene.GetNumberOfNodesByClass('vtkMRMLScriptedModuleNode') self.parameterNode = None for n in xrange(nNodes): compNode = slicer.mrmlScene.GetNthNodeByClass(n, 'vtkMRMLScriptedModuleNode') nodeid = None if compNode.GetModuleName() == 'USGuidedProcedure': self.parameterNode = compNode print 'Found existing USGuidedProcedure parameter node' break if self.parameterNode == None: self.parameterNode = slicer.vtkMRMLScriptedModuleNode() self.parameterNode.SetModuleName('USGuidedProcedure') slicer.mrmlScene.AddNode(self.parameterNode) for s in allSteps: s.setParameterNode (self.parameterNode) # restore workflow step currentStep = self.parameterNode.GetParameter('currentStep') if currentStep != '': print 'Restoring workflow step to ', currentStep if currentStep == 'LoadScene': self.workflow.setInitialStep(self.loadSceneStep) if currentStep == 'ConnectToTracker': self.workflow.setInitialStep(self.connectToTrackerStep) if currentStep == 'PlaceImageFiducials': self.workflow.setInitialStep(self.placeImageFiducialsStep) if currentStep == 'PlaceSpatialFiducials': self.workflow.setInitialStep(self.placeSpatialFiducialsStep) if currentStep == 'Registration': self.workflow.setInitialStep(self.registrationStep) if currentStep == 'Navigation': self.workflow.setInitialStep(self.navigationStep) #if currentStep == 'SelectScans': # self.workflow.setInitialStep(self.selectScansStep) #if currentStep == 'DefineROI': # self.workflow.setInitialStep(self.defineROIStep) #if currentStep == 'SegmentROI': # self.workflow.setInitialStep(self.segmentROIStep) #if currentStep == 'AnalyzeROI': # self.workflow.setInitialStep(self.analyzeROIStep) #if currentStep == 'ReportROI': # self.workflow.setInitialStep(self.reportROIStep) else: print 'currentStep in parameter node is empty!' # start the workflow and show the widget self.workflow.start() self.workflowWidget.visible = True if widgetClass: self.widget = widgetClass(self.parent) self.widget.setup() self.parent.show()
def setup(self): ScriptedLoadableModuleWidget.setup(self) # Instantiate and connect widgets ... # # Parameters Area # parametersCollapsibleButton = ctk.ctkCollapsibleButton() parametersCollapsibleButton.text = "Parameters" self.layout.addWidget(parametersCollapsibleButton) # Layout within the dummy collapsible button parametersFormLayout = qt.QFormLayout(parametersCollapsibleButton) # # fixed image selector # self.fixedImageSelector = slicer.qMRMLNodeComboBox() self.fixedImageSelector.nodeTypes = ( ("vtkMRMLScalarVolumeNode"), "" ) self.fixedImageSelector.selectNodeUponCreation = True self.fixedImageSelector.addEnabled = False self.fixedImageSelector.removeEnabled = False self.fixedImageSelector.noneEnabled = True self.fixedImageSelector.showHidden = False self.fixedImageSelector.showChildNodeTypes = False self.fixedImageSelector.setMRMLScene( slicer.mrmlScene ) self.fixedImageSelector.setToolTip( "Fixed image (optional)" ) parametersFormLayout.addRow("Fixed Image: ", self.fixedImageSelector) # # fixed image label selector # self.fixedImageLabelSelector = slicer.qMRMLNodeComboBox() self.fixedImageLabelSelector.nodeTypes = ( ("vtkMRMLLabelMapVolumeNode"), "" ) self.fixedImageLabelSelector.selectNodeUponCreation = True self.fixedImageLabelSelector.addEnabled = False self.fixedImageLabelSelector.removeEnabled = False self.fixedImageLabelSelector.noneEnabled = False self.fixedImageLabelSelector.showHidden = False self.fixedImageLabelSelector.showChildNodeTypes = False self.fixedImageLabelSelector.setMRMLScene( slicer.mrmlScene ) self.fixedImageLabelSelector.setToolTip( "Segmentation of the fixed image" ) parametersFormLayout.addRow("Segmentation of the fixed Image: ", self.fixedImageLabelSelector) # # moving image selector # self.movingImageSelector = slicer.qMRMLNodeComboBox() self.movingImageSelector.nodeTypes = ( ("vtkMRMLScalarVolumeNode"), "" ) self.movingImageSelector.selectNodeUponCreation = True self.movingImageSelector.addEnabled = False self.movingImageSelector.removeEnabled = False self.movingImageSelector.noneEnabled = True self.movingImageSelector.showHidden = False self.movingImageSelector.showChildNodeTypes = False self.movingImageSelector.setMRMLScene( slicer.mrmlScene ) self.movingImageSelector.setToolTip( "Moving image (optional)" ) parametersFormLayout.addRow("Moving Image: ", self.movingImageSelector) # # moving image label selector # self.movingImageLabelSelector = slicer.qMRMLNodeComboBox() self.movingImageLabelSelector.nodeTypes = ( ("vtkMRMLLabelMapVolumeNode"), "" ) self.movingImageLabelSelector.selectNodeUponCreation = True self.movingImageLabelSelector.addEnabled = False self.movingImageLabelSelector.removeEnabled = False self.movingImageLabelSelector.noneEnabled = False self.movingImageLabelSelector.showHidden = False self.movingImageLabelSelector.showChildNodeTypes = False self.movingImageLabelSelector.setMRMLScene( slicer.mrmlScene ) self.movingImageLabelSelector.setToolTip( "Segmentation of the moving image" ) parametersFormLayout.addRow("Segmentation of the moving Image: ", self.movingImageLabelSelector) # # Affine output transform selector # self.affineTransformSelector = slicer.qMRMLNodeComboBox() self.affineTransformSelector.nodeTypes = ( ("vtkMRMLTransformNode"), "" ) self.affineTransformSelector.selectNodeUponCreation = True self.affineTransformSelector.addEnabled = True self.affineTransformSelector.removeEnabled = False self.affineTransformSelector.noneEnabled = False self.affineTransformSelector.showHidden = False self.affineTransformSelector.showChildNodeTypes = False self.affineTransformSelector.baseName = 'Affine Transform' self.affineTransformSelector.setMRMLScene( slicer.mrmlScene ) self.affineTransformSelector.setToolTip( "Registration affine transform" ) parametersFormLayout.addRow("Registration affine transform: ", self.affineTransformSelector) # # B-spline output transform selector # self.bsplineTransformSelector = slicer.qMRMLNodeComboBox() self.bsplineTransformSelector.nodeTypes = ( ("vtkMRMLTransformNode"), "" ) self.bsplineTransformSelector.selectNodeUponCreation = True self.bsplineTransformSelector.addEnabled = True self.bsplineTransformSelector.removeEnabled = False self.bsplineTransformSelector.noneEnabled = False self.bsplineTransformSelector.showHidden = False self.bsplineTransformSelector.showChildNodeTypes = False self.bsplineTransformSelector.baseName = 'Deformable Transform' self.bsplineTransformSelector.setMRMLScene( slicer.mrmlScene ) self.bsplineTransformSelector.setToolTip( "Registration b-spline transform" ) parametersFormLayout.addRow("Registration B-spline Transform: ", self.bsplineTransformSelector) # # registered volume selector # ''' self.outputImageSelector = slicer.qMRMLNodeComboBox() self.outputImageSelector.nodeTypes = ( ("vtkMRMLScalarVolumeNode"), "" ) # self.outputImageSelector.nodeTypes = ( ("vtkMRMLLabelMapVolumeNode"), "" ) self.outputImageSelector.selectNodeUponCreation = True self.outputImageSelector.addEnabled = True self.outputImageSelector.removeEnabled = True self.outputImageSelector.noneEnabled = True self.outputImageSelector.showHidden = False self.outputImageSelector.showChildNodeTypes = False self.outputImageSelector.baseName = 'Registered Volume' self.outputImageSelector.setMRMLScene( slicer.mrmlScene ) self.outputImageSelector.setToolTip( "Registered volume (will be generated only if the moving image was provided)" ) parametersFormLayout.addRow("Registered Volume: ", self.outputImageSelector) ''' # # To be added later: advanced parameters # registration modes (rigid/affine/bspline), save rigid/affine transforms, # crop box margin, number of samples, ... # # Add parameter node to facilitate registration from other modules and # command line # self.registrationModeGroup = qt.QButtonGroup() self.noRegistrationRadio = qt.QRadioButton('Before registration') self.linearRegistrationRadio = qt.QRadioButton('After linear registration') self.deformableRegistrationRadio = qt.QRadioButton('After deformable registration') self.noRegistrationRadio.setChecked(1) self.registrationModeGroup.addButton(self.noRegistrationRadio,1) self.registrationModeGroup.addButton(self.linearRegistrationRadio,2) self.registrationModeGroup.addButton(self.deformableRegistrationRadio,3) parametersFormLayout.addRow(qt.QLabel("Visualization")) parametersFormLayout.addRow("",self.noRegistrationRadio) parametersFormLayout.addRow("",self.linearRegistrationRadio) parametersFormLayout.addRow("",self.deformableRegistrationRadio) self.registrationModeGroup.connect('buttonClicked(int)',self.onVisualizationModeClicked) # # Apply Button # self.applyButton = qt.QPushButton("Apply") self.applyButton.toolTip = "Run the algorithm." self.applyButton.enabled = True parametersFormLayout.addRow(self.applyButton) # connections self.applyButton.connect('clicked(bool)', self.onApplyButton) # Add vertical spacer self.layout.addStretch(1) # Refresh Apply button state #self.onSelect() self.parameterNode = slicer.vtkMRMLScriptedModuleNode() '''
def setup( self ): self.workflow = ctk.ctkWorkflow() workflowWidget = ctk.ctkWorkflowStackedWidget() workflowWidget.setWorkflow( self.workflow ) #workflowWidget.buttonBoxWidget().nextButtonDefaultText = "" #workflowWidget.buttonBoxWidget().backButtonDefaultText = "" # create all 9 wizard steps self.selectMRIDataStep = Resources.CMRToolkitWizardSelectDataStep( 'SelectMRIData' ) self.endoSegStep = Resources.CMRToolkitWizardEndoSegmentationStep( 'LAEndoSegmentation' ) self.axialDilateStep = Resources.CMRToolkitWizardAxialDilateStep( 'AxialDilate' ) self.booleanRemoveStep = Resources.CMRToolkitWizardBooleanRemoveStep( 'BooleanRemove' ) self.wallCleanupStep = Resources.CMRToolkitWizardWallCleanupStep( 'LAWallCleanup' ) self.antrumCutStep = Resources.CMRToolkitWizardAntrumCutStep( 'PVAntrumCut' ) self.endoNVIsoStep = Resources.CMRToolkitWizardEndoNVIsosurfaceStep( 'EndoNVIsosurface' ) self.autoScarStep = Resources.CMRToolkitWizardAutoScarStep( 'AutomaticLeftAtrialScar' ) #self.scarIsoStep = Resources.CMRToolkitWizardScarIsosurfaceStep( 'ScarIsosurface' ) # add the wizard steps to an array for convenience allSteps = [] allSteps.append( self.selectMRIDataStep ) allSteps.append( self.endoSegStep ) allSteps.append( self.axialDilateStep ) allSteps.append( self.booleanRemoveStep ) allSteps.append( self.wallCleanupStep ) allSteps.append( self.antrumCutStep ) allSteps.append( self.endoNVIsoStep ) allSteps.append( self.autoScarStep ) #allSteps.append( self.scarIsoStep ) self.workflow.addTransition( self.selectMRIDataStep, self.endoSegStep ) self.workflow.addTransition( self.endoSegStep, self.axialDilateStep ) self.workflow.addTransition( self.axialDilateStep, self.booleanRemoveStep ) self.workflow.addTransition( self.booleanRemoveStep, self.wallCleanupStep ) self.workflow.addTransition( self.wallCleanupStep, self.antrumCutStep ) self.workflow.addTransition( self.antrumCutStep, self.endoNVIsoStep ) self.workflow.addTransition( self.endoNVIsoStep, self.autoScarStep ) nNodes = slicer.mrmlScene.GetNumberOfNodesByClass('vtkMRMLScriptedModuleNode') self.parameterNode = None for n in xrange(nNodes): compNode = slicer.mrmlScene.GetNthNodeByClass(n, 'vtkMRMLScriptedModuleNode') nodeid = None if compNode.GetModuleName() == 'CMRToolkitWizard': self.parameterNode = compNode print 'Found existing CMRToolkitWizard parameter node' break if self.parameterNode == None: self.parameterNode = slicer.vtkMRMLScriptedModuleNode() self.parameterNode.SetModuleName('CMRToolkitWizard') slicer.mrmlScene.AddNode(self.parameterNode) for s in allSteps: s.setParameterNode (self.parameterNode) # restore workflow step currentStep = self.parameterNode.GetParameter('currentStep') if currentStep != '': print 'Restoring workflow step to ', currentStep if currentStep == 'SelectMRIData': self.workflow.setInitialStep(self.selectMRIDataStep) if currentStep == 'LAEndoSegmentation': self.workflow.setInitialStep(self.endoSegStep) if currentStep == 'AxialDilate': self.workflow.setInitialStep(self.axialDilateStep) if currentStep == 'BooleanRemove': self.workflow.setInitialStep(self.booleanRemoveStep) if currentStep == 'LAWallSegmentation': self.workflow.setInitialStep(self.wallCleanupStep) if currentStep == 'PVAntrumCut': self.workflow.setInitialStep(self.antrumCutStep) if currentStep == 'EndoNVIsosurface': self.workflow.setInitialStep(self.endoNVIsoStep) if currentStep == 'AutomaticLeftAtrialScar': self.workflow.setInitialStep(self.autoScarStep) #if currentStep == 'ScarIsosurface': # self.workflow.setInitialStep(self.scarIsoStep) else: print 'currentStep in parameter node is empty!' # Start the workflow and show the widget self.workflow.start() workflowWidget.visible = True self.layout.addWidget( workflowWidget )