Skip to content

Commit

Permalink
ENH: exporting from label statistics to table node right away once se…
Browse files Browse the repository at this point in the history
…gments change (issue QIICR#74)
  • Loading branch information
che85 committed Sep 20, 2016
1 parent c0857ea commit 247f055
Showing 1 changed file with 35 additions and 15 deletions.
50 changes: 35 additions & 15 deletions Py/Reporting.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,16 +46,21 @@ def __init__(self, parent=None):
def initializeMembers(self):
self.tNode = None
self.tableNode = None
self.segNode = None
self.segmentation = None
self.segmentationObservers = []
self.segReferencedMasterVolume = {} # TODO: maybe also add created table so that there is no need to recalculate everything?
self.segmentationsLogic = slicer.modules.segmentations.logic()
self.segmentationLabelMapDummy = None

def onReload(self):
super(ReportingWidget, self).onReload()
self.cleanup()

def cleanup(self):
self.removeSegmentationObserver()
if self.tableNode:
slicer.mrmlScene.RemoveNode(self.tableNode)
self.initializeMembers()

def setup(self):
Expand Down Expand Up @@ -84,8 +89,8 @@ def setupSelectionArea(self):
selectNodeUponCreation=True, toolTip="Select image volume to annotate")
self.imageVolumeSelector.addAttribute("vtkMRMLScalarVolumeNode", "DICOM.instanceUIDs", None)
self.measurementReportSelector = self.createComboBox(nodeTypes=["vtkMRMLTableNode", ""], showChildNodeTypes=False,
selectNodeUponCreation=True, toolTip="Select measurement report",
addEnabled=True)
selectNodeUponCreation=True, toolTip="Select measurement report")
self.imageVolumeSelector.addAttribute("vtkMRMLTableNode", "Reporting", None)
self.layout.addWidget(self.createHLayout([qt.QLabel("Image volume to annotate"), self.imageVolumeSelector]))
self.layout.addWidget(self.createHLayout([qt.QLabel("Measurement report"), self.measurementReportSelector]))

Expand Down Expand Up @@ -135,10 +140,10 @@ def setupMeasurementsArea(self):
self.labelStatisticsWidget = LabelStatisticsWidget(parent=self.measurementsWidget)
self.labelStatisticsWidget.setup()
self.measurementsWidget.children()[1].hide()
self.labelStatisticsWidget.grayscaleSelectorFrame.hide()
self.labelStatisticsWidget.labelSelectorFrame.hide()
self.labelStatisticsWidget.applyButton.hide()
self.layout.addWidget(self.measurementsWidget)
# self.labelStatisticsWidget.grayscaleSelectorFrame.hide()
# self.labelStatisticsWidget.labelSelectorFrame.hide()
# self.labelStatisticsWidget.applyButton.hide()
# self.layout.addWidget(self.measurementsWidget)

def setupActionButtons(self):
self.saveReportButton = self.createButton("Save Report")
Expand All @@ -163,6 +168,7 @@ def removeSegmentationObserver(self):
self.segmentation.RemoveObserver(observer)
self.segmentationObservers = []
self.segmentation = None
self.segNode = None

def onImageVolumeSelectorChanged(self, node):
self.removeSegmentationObserver()
Expand All @@ -177,17 +183,16 @@ def onImageVolumeSelectorChanged(self, node):
if node:
# TODO: check if there is a segmentation Node for the selected image volume available instead of creating a new one each time
if node in self.segReferencedMasterVolume.keys():
segNode = self.segReferencedMasterVolume[node]
self.editorWidget.editor.setSegmentationNode(segNode)
self.segNode = self.segReferencedMasterVolume[node]
self.editorWidget.editor.setSegmentationNode(self.segNode)
else:
segNode = slicer.vtkMRMLSegmentationNode()
slicer.mrmlScene.AddNode(segNode)
self.editorWidget.editor.setSegmentationNode(segNode)
self.segNode = slicer.vtkMRMLSegmentationNode()
slicer.mrmlScene.AddNode(self.segNode)
self.editorWidget.editor.setSegmentationNode(self.segNode)
self.editorWidget.editor.setMasterVolumeNode(node)
self.segReferencedMasterVolume[node] = segNode
self.labelStatisticsWidget.labelSelector.setCurrentNode(segNode)
self.segReferencedMasterVolume[node] = self.segNode
self.labelStatisticsWidget.grayscaleSelector.setCurrentNode(node)
self.segmentation = segNode.GetSegmentation()
self.segmentation = self.segNode.GetSegmentation()
self.segmentationObservers.append(self.segmentation.AddObserver(vtkCoreSeg.vtkSegmentation.SegmentAdded,
self.onSegmentationNodeChanged))
self.segmentationObservers.append(self.segmentation.AddObserver(vtkCoreSeg.vtkSegmentation.SegmentRemoved,
Expand All @@ -196,7 +201,21 @@ def onImageVolumeSelectorChanged(self, node):
self.onSegmentationNodeChanged))

def onSegmentationNodeChanged(self, observer=None, caller=None):
self.labelStatisticsWidget.applyButton.click()
if self.segmentationLabelMapDummy:
slicer.mrmlScene.RemoveNode(self.segmentationLabelMapDummy)
self.segmentationLabelMapDummy = slicer.vtkMRMLLabelMapVolumeNode()
slicer.mrmlScene.AddNode(self.segmentationLabelMapDummy)
if self.tableNode and self.tableNode.GetID() == self.getActiveSlicerTableID():
slicer.mrmlScene.RemoveNode(self.tableNode)
if self.segmentationsLogic.ExportAllSegmentsToLabelmapNode(self.segNode, self.segmentationLabelMapDummy):
self.labelStatisticsWidget.labelSelector.setCurrentNode(self.segmentationLabelMapDummy)
self.labelStatisticsWidget.applyButton.click()
self.labelStatisticsWidget.logic.exportToTable()
self.tableNode = slicer.mrmlScene.GetNodeByID(self.getActiveSlicerTableID())
self.tableNode.SetAttribute("Reporting", "Yes")

def getActiveSlicerTableID(self):
return slicer.app.applicationLogic().GetSelectionNode().GetActiveTableID()

def onSaveReportButtonClicked(self):
print "on save report button clicked"
Expand All @@ -209,6 +228,7 @@ def onAnnotationReady(self):
pass

def updateTableNode(self):
# TODO: maybe remove this method and or move some code to logic. label statistics widget is not needed
data = self.logic.calculateLabelStatistics(self.editorWidget.editor.segmentationNode())
# TODO: apply data to tableNode
if not self.tableNode:
Expand Down

0 comments on commit 247f055

Please sign in to comment.