Example #1
0
 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
Example #6
0
 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
Example #7
0
  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
Example #8
0
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
Example #9
0
    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 )
Example #11
0
    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)
Example #13
0
  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()

    '''
Example #15
0
  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)
Example #18
0
    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)
Example #22
0
    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()
Example #24
0
  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 )