예제 #1
0
    def __init__(self):

        ScriptedModuleGUI.__init__(self)

        self.SetCategory("Vascular Modeling Toolkit")
        self.SetGUIName("Branch Splitting using VMTK")

        self._moduleFrame = slicer.vtkSlicerModuleCollapsibleFrame()

        self._inCenterLineSelector = slicer.vtkSlicerNodeSelectorWidget()
        self._inModelSelector = slicer.vtkSlicerNodeSelectorWidget()

        self._outModelSelector = slicer.vtkSlicerNodeSelectorWidget()

        self._topFrame = slicer.vtkSlicerModuleCollapsibleFrame()

        self._startButton = slicer.vtkKWPushButton()
        self._checkButton = slicer.vtkKWCheckButton()

        self._helper = VMTKBranchSplittingHelper(self)

        self._logic = VMTKBranchSplittingLogic(self)

        self._updating = 0
    def __init__(self):

        ScriptedModuleGUI.__init__(self)

        self.SetCategory("Vascular Modeling Toolkit")
        self.SetGUIName("Branch Splitting using VMTK")

        self._moduleFrame = slicer.vtkSlicerModuleCollapsibleFrame()

        self._inCenterLineSelector = slicer.vtkSlicerNodeSelectorWidget()
        self._inModelSelector = slicer.vtkSlicerNodeSelectorWidget()

        self._outModelSelector = slicer.vtkSlicerNodeSelectorWidget()

        self._topFrame = slicer.vtkSlicerModuleCollapsibleFrame()

        self._startButton = slicer.vtkKWPushButton()
        self._checkButton = slicer.vtkKWCheckButton()

        self._helper = VMTKBranchSplittingHelper(self)

        self._logic = VMTKBranchSplittingLogic(self)

        self._updating = 0
예제 #3
0
class VMTKBranchSplittingGUI(ScriptedModuleGUI):
    def __init__(self):

        ScriptedModuleGUI.__init__(self)

        self.SetCategory("Vascular Modeling Toolkit")
        self.SetGUIName("Branch Splitting using VMTK")

        self._moduleFrame = slicer.vtkSlicerModuleCollapsibleFrame()

        self._inCenterLineSelector = slicer.vtkSlicerNodeSelectorWidget()
        self._inModelSelector = slicer.vtkSlicerNodeSelectorWidget()

        self._outModelSelector = slicer.vtkSlicerNodeSelectorWidget()

        self._topFrame = slicer.vtkSlicerModuleCollapsibleFrame()

        self._startButton = slicer.vtkKWPushButton()
        self._checkButton = slicer.vtkKWCheckButton()

        self._helper = VMTKBranchSplittingHelper(self)

        self._logic = VMTKBranchSplittingLogic(self)

        self._updating = 0

    def Destructor(self):

        self._helper = None
        self._logic = None

    def RemoveMRMLNodeObservers(self):
        pass

    def RemoveLogicObservers(self):
        pass

    def AddGUIObservers(self):
        self._startButtonTag = self.AddObserverByNumber(
            self._startButton, vtkKWPushButton_InvokedEvent)

    def RemoveGUIObservers(self):
        pass

    def ProcessGUIEvents(self, caller, event):
        if not self._updating:

            if caller == self._startButton and event == vtkKWPushButton_InvokedEvent:
                self.Splitting()

    def Splitting(self):
        inCeLine = self._inCenterLineSelector.GetSelected()
        inModel = self._inModelSelector.GetSelected()
        outModel = self._outModelSelector.GetSelected()
        split = self._checkButton.GetSelectedState()

        vmtkFound = self.CheckForVmtkLibrary()

        if inCeLine and inModel and outModel and vmtkFound:

            result = slicer.vtkPolyData()
            r = self._logic.branchSplitting(inCeLine.GetPolyData(),
                                            inModel.GetPolyData())
            result.DeepCopy(r)
            result.Update()
            outModel.SetAndObservePolyData(result)
            outModel.SetModifiedSinceRead(1)
            displayNode = outModel.GetModelDisplayNode()
            if not displayNode:
                displayNode = slicer.vtkMRMLModelDisplayNode()
            displayNode.SetPolyData(outModel.GetPolyData())
            displayNode.SetColor(1, 0, 0)
            displayNode.SetScalarVisibility(1)
            displayNode.SetActiveScalarName(self._logic._GroupIdsArrayName)
            displayNode.SetAndObserveColorNodeID(
                self.GetLogic().GetMRMLScene().GetNodesByName(
                    "Labels").GetItemAsObject(0).GetID())
            displayNode.SetVisibility(1)
            displayNode.SetOpacity(1.0)
            self.GetLogic().GetMRMLScene().AddNode(displayNode)

            outModel.SetAndObserveDisplayNodeID(displayNode.GetID())

            dNode = inModel.GetModelDisplayNode()
            dNode.SetOpacity(0.0)
            inModel.SetAndObserveDisplayNodeID(dNode.GetID())

            if split == 1:
                ctr = 0
                newPdList = self._logic.splitModels(result)
                for i in newPdList:
                    if i.GetNumberOfCells() == 0:
                        continue

                    self._helper.debug("Number of Cells are: " +
                                       str(i.GetNumberOfCells()))

                    ctr += 1
                    scene = self.GetLogic().GetMRMLScene()

                    newNode = slicer.vtkMRMLModelNode()
                    newNode.SetName("VMTKBranchSplittingOut_Branch" + str(ctr))
                    newNode.SetScene(scene)
                    newNode.SetAndObservePolyData(i)
                    scene.AddNode(newNode)

                    dn = slicer.vtkMRMLModelDisplayNode()
                    dn.SetPolyData(newNode.GetPolyData())
                    dn.SetColor(random.random(), random.random(),
                                random.random())
                    dn.SetBackfaceCulling(0)
                    dn.SetSliceIntersectionVisibility(1)
                    dn.SetVisibility(1)
                    dn.SetOpacity(1.0)
                    scene.AddNode(dn)

                    newNode.SetAndObserveDisplayNodeID(dn.GetName())

    def CheckForVmtkLibrary(self):

        try:
            t = slicer.vtkvmtkFastMarchingUpwindGradientImageFilter()

        except Exception:

            d = slicer.vtkKWMessageDialog()
            d.SetParent(slicer.ApplicationGUI.GetMainSlicerWindow())
            d.SetMasterWindow(slicer.ApplicationGUI.GetMainSlicerWindow())
            d.SetStyleToMessage()
            d.SetText(
                "VmtkSlicerModule not found! Please install the VmtkSlicerModule extension to use this module!"
            )
            d.Create()
            d.Invoke()

            return 0

        return 1

    def UpdateMRML(self):

        if not self._updating:

            self._updating = 1

            self._updating = 0

    def UpdateGUI(self):

        if not self._updating:

            self._updating = 1

            self._updating = 0

    def ProcessMRMLEvents(self, caller, event):

        if caller == self.GetLogic().GetMRMLScene(
        ) and event == vtkMRMLScene_CloseEvent:
            self.OnSceneClose()

        elif caller == self.GetScriptedModuleNode():
            self.UpdateGUI()

    def BuildGUI(self):

        self.GetUIPanel().AddPage("BranchSplitting", "BranchSplitting", "")
        self._centerlinePage = self.GetUIPanel().GetPageWidget(
            "BranchSplitting")
        helpText = "**Branch Splitting using VMTK**, developed by Johannes Schick."
        aboutText = "This work is supported by NA-MIC, NAC, BIRN, NCIGT, and the Slicer community."
        self._helpAboutFrame = self.BuildHelpAndAboutFrame(
            self._centerlinePage, helpText, aboutText)

        self._helper.debug("Creating BranchSplitting GUI")

        self._moduleFrame.SetParent(self._centerlinePage)
        self._moduleFrame.Create()
        self._moduleFrame.SetLabelText("VMTKBranchSplitting")
        self._moduleFrame.ExpandFrame()
        slicer.TkCall(
            "pack %s -side top -anchor nw -fill x -padx 2 -pady 2 -in %s" %
            (self._moduleFrame.GetWidgetName(),
             self._centerlinePage.GetWidgetName()))

        self._topFrame.SetParent(self._moduleFrame.GetFrame())
        self._topFrame.Create()
        self._topFrame.SetLabelText("Input/Output")
        self._topFrame.ExpandFrame()
        slicer.TkCall("pack %s -side top -anchor nw -fill x -padx 2 -pady 2" %
                      self._topFrame.GetWidgetName())

        self._inModelSelector.SetNodeClass("vtkMRMLModelNode", "", "", "")
        self._inModelSelector.SetParent(self._topFrame.GetFrame())
        self._inModelSelector.Create()
        self._inModelSelector.SetMRMLScene(self.GetLogic().GetMRMLScene())
        self._inModelSelector.UpdateMenu()
        self._inModelSelector.SetBorderWidth(2)
        self._inModelSelector.SetLabelText("Input Model: ")
        self._inModelSelector.SetBalloonHelpString(
            "select an input model from the current mrml scene.")
        slicer.TkCall("pack %s -side top -anchor e -padx 20 -pady 4" %
                      self._inModelSelector.GetWidgetName())

        self._inCenterLineSelector.SetNodeClass("vtkMRMLModelNode", "", "", "")
        self._inCenterLineSelector.SetParent(self._topFrame.GetFrame())
        self._inCenterLineSelector.Create()
        self._inCenterLineSelector.SetMRMLScene(self.GetLogic().GetMRMLScene())
        self._inCenterLineSelector.UpdateMenu()
        self._inCenterLineSelector.SetBorderWidth(2)
        self._inCenterLineSelector.SetLabelText("Input Centerline: ")
        self._inCenterLineSelector.SetBalloonHelpString(
            "select an input model from the current mrml scene.")
        slicer.TkCall("pack %s -side top -anchor e -padx 20 -pady 4" %
                      self._inCenterLineSelector.GetWidgetName())

        self._outModelSelector.SetNodeClass("vtkMRMLModelNode", "", "1",
                                            "VMTKBranchSplittingOut")
        self._outModelSelector.SetNewNodeEnabled(1)
        self._outModelSelector.SetParent(self._topFrame.GetFrame())
        self._outModelSelector.Create()
        self._outModelSelector.SetMRMLScene(self.GetLogic().GetMRMLScene())
        self._outModelSelector.UpdateMenu()
        self._outModelSelector.SetBorderWidth(2)
        self._outModelSelector.SetLabelText("Branch Output Model: ")
        self._outModelSelector.SetBalloonHelpString(
            "select an output model from the current mrml scene.")
        slicer.TkCall("pack %s -side top -anchor e -padx 20 -pady 4" %
                      self._outModelSelector.GetWidgetName())

        self._checkButton.SetParent(self._topFrame.GetFrame())
        self._checkButton.Create()
        self._checkButton.SetEnabled(1)
        self._checkButton.SetText("Split into models")
        self._checkButton.SetBalloonHelpString(
            "Split model into different surface models")
        slicer.TkCall("pack %s -side top -anchor e -padx 2 -pady 2" %
                      self._checkButton.GetWidgetName())

        self._startButton.SetParent(self._topFrame.GetFrame())
        self._startButton.Create()
        self._startButton.SetEnabled(1)
        self._startButton.SetText("Split Branchs")
        self._startButton.SetBalloonHelpString(
            "Click to start the network extraction")
        slicer.TkCall("pack %s -side top -anchor e -padx 2 -pady 2" %
                      self._startButton.GetWidgetName())

        #self.CreateOutModelNodes()

        self._helper.debug("Done Creating BranchSplitting GUI")

    def TearDownGUI(self):
        if self.GetUIPanel().GetUserInterfaceManager():
            self.GetUIPanel().RemovePage("BranchSplitting")

    def GetHelper(self):
        return self._helper

    def GetMyLogic(self):
        return self._logic
class VMTKBranchSplittingGUI(ScriptedModuleGUI):

    def __init__(self):

        ScriptedModuleGUI.__init__(self)

        self.SetCategory("Vascular Modeling Toolkit")
        self.SetGUIName("Branch Splitting using VMTK")

        self._moduleFrame = slicer.vtkSlicerModuleCollapsibleFrame()

        self._inCenterLineSelector = slicer.vtkSlicerNodeSelectorWidget()
        self._inModelSelector = slicer.vtkSlicerNodeSelectorWidget()

        self._outModelSelector = slicer.vtkSlicerNodeSelectorWidget()

        self._topFrame = slicer.vtkSlicerModuleCollapsibleFrame()

        self._startButton = slicer.vtkKWPushButton()
        self._checkButton = slicer.vtkKWCheckButton()

        self._helper = VMTKBranchSplittingHelper(self)

        self._logic = VMTKBranchSplittingLogic(self)

        self._updating = 0

    def Destructor(self):



        self._helper = None
        self._logic = None

    def RemoveMRMLNodeObservers(self):
        pass
    
    def RemoveLogicObservers(self):
        pass

    def AddGUIObservers(self):
        self._startButtonTag = self.AddObserverByNumber(self._startButton,vtkKWPushButton_InvokedEvent)


    def RemoveGUIObservers(self):
        pass

    def ProcessGUIEvents(self,caller,event):
        if not self._updating:

            if caller == self._startButton and event == vtkKWPushButton_InvokedEvent:
                self.Splitting()

    def Splitting(self):
        inCeLine = self._inCenterLineSelector.GetSelected()
        inModel = self._inModelSelector.GetSelected()
        outModel = self._outModelSelector.GetSelected()
        split = self._checkButton.GetSelectedState()

        vmtkFound=self.CheckForVmtkLibrary()

        if inCeLine and inModel and outModel and vmtkFound:

            result = slicer.vtkPolyData()
            r=self._logic.branchSplitting(inCeLine.GetPolyData(),inModel.GetPolyData())
            result.DeepCopy(r)
            result.Update()
            outModel.SetAndObservePolyData(result)
            outModel.SetModifiedSinceRead(1)
            displayNode = outModel.GetModelDisplayNode()
            if not displayNode:
                displayNode = slicer.vtkMRMLModelDisplayNode()
            displayNode.SetPolyData(outModel.GetPolyData())
            displayNode.SetColor(1, 0, 0)
            displayNode.SetScalarVisibility(1)
            displayNode.SetActiveScalarName(self._logic._GroupIdsArrayName)
            displayNode.SetAndObserveColorNodeID(self.GetLogic().GetMRMLScene().GetNodesByName("Labels").GetItemAsObject(0).GetID())
            displayNode.SetVisibility(1)
            displayNode.SetOpacity(1.0)
            self.GetLogic().GetMRMLScene().AddNode(displayNode)

            outModel.SetAndObserveDisplayNodeID(displayNode.GetID())

            dNode = inModel.GetModelDisplayNode()
            dNode.SetOpacity(0.0)
            inModel.SetAndObserveDisplayNodeID(dNode.GetID())

            if split == 1:
              ctr=0
              newPdList=self._logic.splitModels(result)
              for i in newPdList:		
                if i.GetNumberOfCells() == 0:
                  continue

                self._helper.debug("Number of Cells are: "+str(i.GetNumberOfCells()))

                ctr+=1
                scene=self.GetLogic().GetMRMLScene()

                newNode=slicer.vtkMRMLModelNode()
                newNode.SetName("VMTKBranchSplittingOut_Branch"+str(ctr))
                newNode.SetScene(scene)
                newNode.SetAndObservePolyData(i)
                scene.AddNode(newNode)

                dn=slicer.vtkMRMLModelDisplayNode()
                dn.SetPolyData(newNode.GetPolyData())
                dn.SetColor(random.random() ,random.random() ,random.random() )		    
                dn.SetBackfaceCulling(0)
                dn.SetSliceIntersectionVisibility(1)
                dn.SetVisibility(1)
                dn.SetOpacity(1.0)
                scene.AddNode(dn)
                
                newNode.SetAndObserveDisplayNodeID(dn.GetName())


    def CheckForVmtkLibrary(self):

        try:
            t = slicer.vtkvmtkFastMarchingUpwindGradientImageFilter()

        except Exception:

            d = slicer.vtkKWMessageDialog()
            d.SetParent(slicer.ApplicationGUI.GetMainSlicerWindow())
            d.SetMasterWindow(slicer.ApplicationGUI.GetMainSlicerWindow())
            d.SetStyleToMessage()
            d.SetText("VmtkSlicerModule not found! Please install the VmtkSlicerModule extension to use this module!")
            d.Create()
            d.Invoke()

            return 0

        return 1


    def UpdateMRML(self):

        if not self._updating:

            self._updating = 1

            self._updating = 0


    def UpdateGUI(self):

        if not self._updating:

            self._updating = 1

            self._updating = 0

    def ProcessMRMLEvents(self,caller,event):

        if caller == self.GetLogic().GetMRMLScene() and event == vtkMRMLScene_CloseEvent:
            self.OnSceneClose()

        elif caller == self.GetScriptedModuleNode():
            self.UpdateGUI()


    def BuildGUI(self):

        self.GetUIPanel().AddPage("BranchSplitting","BranchSplitting","")
        self._centerlinePage = self.GetUIPanel().GetPageWidget("BranchSplitting")
        helpText = "**Branch Splitting using VMTK**, developed by Johannes Schick."
        aboutText = "This work is supported by NA-MIC, NAC, BIRN, NCIGT, and the Slicer community."
        self._helpAboutFrame = self.BuildHelpAndAboutFrame(self._centerlinePage,helpText,aboutText)

        self._helper.debug("Creating BranchSplitting GUI")

        self._moduleFrame.SetParent(self._centerlinePage)
        self._moduleFrame.Create()
        self._moduleFrame.SetLabelText("VMTKBranchSplitting")
        self._moduleFrame.ExpandFrame()
        slicer.TkCall("pack %s -side top -anchor nw -fill x -padx 2 -pady 2 -in %s" % (self._moduleFrame.GetWidgetName(),self._centerlinePage.GetWidgetName()))

        self._topFrame.SetParent(self._moduleFrame.GetFrame())
        self._topFrame.Create()
        self._topFrame.SetLabelText("Input/Output")
        self._topFrame.ExpandFrame()
        slicer.TkCall("pack %s -side top -anchor nw -fill x -padx 2 -pady 2" % self._topFrame.GetWidgetName())

        self._inModelSelector.SetNodeClass("vtkMRMLModelNode","","","")
        self._inModelSelector.SetParent(self._topFrame.GetFrame())
        self._inModelSelector.Create()
        self._inModelSelector.SetMRMLScene(self.GetLogic().GetMRMLScene())
        self._inModelSelector.UpdateMenu()
        self._inModelSelector.SetBorderWidth(2)
        self._inModelSelector.SetLabelText("Input Model: ")
        self._inModelSelector.SetBalloonHelpString("select an input model from the current mrml scene.")
        slicer.TkCall("pack %s -side top -anchor e -padx 20 -pady 4" % self._inModelSelector.GetWidgetName())

        self._inCenterLineSelector.SetNodeClass("vtkMRMLModelNode","","","")
        self._inCenterLineSelector.SetParent(self._topFrame.GetFrame())
        self._inCenterLineSelector.Create()
        self._inCenterLineSelector.SetMRMLScene(self.GetLogic().GetMRMLScene())
        self._inCenterLineSelector.UpdateMenu()
        self._inCenterLineSelector.SetBorderWidth(2)
        self._inCenterLineSelector.SetLabelText("Input Centerline: ")
        self._inCenterLineSelector.SetBalloonHelpString("select an input model from the current mrml scene.")
        slicer.TkCall("pack %s -side top -anchor e -padx 20 -pady 4" % self._inCenterLineSelector.GetWidgetName())

        self._outModelSelector.SetNodeClass("vtkMRMLModelNode","","1","VMTKBranchSplittingOut")
        self._outModelSelector.SetNewNodeEnabled(1)
        self._outModelSelector.SetParent(self._topFrame.GetFrame())
        self._outModelSelector.Create()
        self._outModelSelector.SetMRMLScene(self.GetLogic().GetMRMLScene())
        self._outModelSelector.UpdateMenu()
        self._outModelSelector.SetBorderWidth(2)
        self._outModelSelector.SetLabelText("Branch Output Model: ")
        self._outModelSelector.SetBalloonHelpString("select an output model from the current mrml scene.")
        slicer.TkCall("pack %s -side top -anchor e -padx 20 -pady 4" % self._outModelSelector.GetWidgetName())

        self._checkButton.SetParent(self._topFrame.GetFrame())
        self._checkButton.Create()
        self._checkButton.SetEnabled(1)
        self._checkButton.SetText("Split into models")
        self._checkButton.SetBalloonHelpString("Split model into different surface models")
        slicer.TkCall("pack %s -side top -anchor e -padx 2 -pady 2" % self._checkButton.GetWidgetName())

        self._startButton.SetParent(self._topFrame.GetFrame())
        self._startButton.Create()
        self._startButton.SetEnabled(1)
        self._startButton.SetText("Split Branchs")
        self._startButton.SetBalloonHelpString("Click to start the network extraction")
        slicer.TkCall("pack %s -side top -anchor e -padx 2 -pady 2" % self._startButton.GetWidgetName())

        #self.CreateOutModelNodes()

        self._helper.debug("Done Creating BranchSplitting GUI")


    def TearDownGUI(self):
        if self.GetUIPanel().GetUserInterfaceManager():
            self.GetUIPanel().RemovePage("BranchSplitting")

    def GetHelper(self):
        return self._helper

    def GetMyLogic(self):
        return self._logic