def chartContact(self, screwCount): # Get the Chart View Node cvns = slicer.mrmlScene.GetNodesByClass('vtkMRMLChartViewNode') cvns.InitTraversal() cvn = cvns.GetNextItemAsObject() cn = slicer.mrmlScene.AddNode(slicer.vtkMRMLChartNode()) arrayNodes = [] for i in range(0,screwCount): # Create an Array Node and add some data dn = slicer.mrmlScene.AddNode(slicer.vtkMRMLDoubleArrayNode()) arrayNodes.insert(i,dn) a = dn.GetArray() a.SetNumberOfTuples(10) x = range(0, 10) screwValues = self.screwContact[i] for j in range(len(x)): a.SetComponent(j, 0, (j * 10) + 5) a.SetComponent(j, 1, screwValues[j]) a.SetComponent(j, 2, 0) print j print screwValues[j] cn.AddArray('Screw %s' % i, dn.GetID()) dnCort = slicer.mrmlScene.AddNode(slicer.vtkMRMLDoubleArrayNode()) dnCanc = slicer.mrmlScene.AddNode(slicer.vtkMRMLDoubleArrayNode()) a1 = dnCort.GetArray() a2 = dnCanc.GetArray() a1.SetNumberOfTuples(2) a2.SetNumberOfTuples(2) a1.SetComponent(0, 0, 0) a1.SetComponent(0, 1, 250) a1.SetComponent(0, 2, 0) a1.SetComponent(1, 0, 100) a1.SetComponent(1, 1, 250) a1.SetComponent(1, 2, 0) a2.SetComponent(0, 0, 0) a2.SetComponent(0, 1, 130) a2.SetComponent(0, 2, 0) a2.SetComponent(1, 0, 100) a2.SetComponent(1, 1, 130) a2.SetComponent(1, 2, 0) cn.AddArray('Cortical Bone', dnCort.GetID()) cn.AddArray('Cancellous Bone', dnCanc.GetID()) #cn.SetProperty('default', 'title', 'Information for Screw at point %s' % fidName) cn.SetProperty('default', 'title', 'Screw - Bone Contact') cn.SetProperty('default', 'xAxisLabel', 'Screw Percentile (Head - Tip)') #cn.SetProperty('default', 'xAxisType', 'categorical') cn.SetProperty('default', 'yAxisLabel', 'Average HU Contact') cn.SetProperty('default', 'showLegend', 'on') cn.SetProperty('default', 'type', 'Line') cn.SetProperty('default', 'xAxisPad', '0') #cn.SetProperty('default', 'xAxisPad', '0') cvn.SetChartNodeID(cn.GetID())
def chartRatios(self): ratiosAr = slicer.mrmlScene.AddNode(slicer.vtkMRMLDoubleArrayNode()) ratiosArinv = slicer.mrmlScene.AddNode(slicer.vtkMRMLDoubleArrayNode()) firstName=self.firstSelector.currentNode().GetName() secondName=self.secondSelector.currentNode().GetName() ratiosAr.SetName(firstName+"-"+secondName+"-ratios") ratiosArinv.SetName(firstName+"-"+secondName+"-inverse-ratios") arrayD = ratiosAr.GetArray() arrayDinv = ratiosArinv.GetArray() arrayD.SetNumberOfTuples(self.table.rowCount) arrayDinv.SetNumberOfTuples(self.table.rowCount) for n in range(self.table.rowCount): if self.table.item(n,3): arrayD.SetComponent(n, 0, n) arrayDinv.SetComponent(n, 0, n) arrayD.SetComponent(n, 1, float(self.table.item(n,3).text())) arrayDinv.SetComponent(n, 1, float(self.table.item(self.table.rowCount-1-n,3).text())) layoutNodes = slicer.mrmlScene.GetNodesByClass('vtkMRMLLayoutNode') layoutNodes.SetReferenceCount(layoutNodes.GetReferenceCount()-1) layoutNodes.InitTraversal() layoutNode = layoutNodes.GetNextItemAsObject() layoutNode.SetViewArrangement(slicer.vtkMRMLLayoutNode.SlicerLayoutFourUpQuantitativeView) chartViewNodes = slicer.mrmlScene.GetNodesByClass('vtkMRMLChartViewNode') chartViewNodes.SetReferenceCount(chartViewNodes.GetReferenceCount()-1) chartViewNodes.InitTraversal() chartViewNode = chartViewNodes.GetNextItemAsObject() chartNode = slicer.mrmlScene.GetNodesByClassByName("vtkMRMLChartNode","Ratios").GetItemAsObject(0) if not chartNode: chartNode = slicer.mrmlScene.AddNode(slicer.vtkMRMLChartNode()) chartNode.SetName("Ratios") print("set properties") chartNode.SetProperty('default', 'title', 'Ratios') chartNode.SetProperty('default', 'xAxisLabel', 'slice') chartNode.SetProperty('default', 'yAxisLabel', 'Ratio') chartNode.SetProperty('default', 'type', 'Line') chartNode.SetProperty('default', 'showLegend', 'on') chartNode.SetProperty('default', 'Markers', 'on') chartViewNode.SetChartNodeID(chartNode.GetID()) chartNode.AddArray("Ratio", ratiosAr.GetID()) chartNode.AddArray("Ratioinv", ratiosArinv.GetID())
def showChart(self, samples, names): lm = slicer.app.layoutManager() lm.setLayout(slicer.vtkMRMLLayoutNode.SlicerLayoutFourUpQuantitativeView) doubleArrays = [] for sample in samples: arrayNode = slicer.mrmlScene.AddNode(slicer.vtkMRMLDoubleArrayNode()) array = arrayNode.GetArray() nDataPoints = sample.GetNumberOfTuples() array.SetNumberOfTuples(nDataPoints) array.SetNumberOfComponents(3) for i in range(nDataPoints): array.SetComponent(i, 0, i) array.SetComponent(i, 1, sample.GetTuple1(i)) array.SetComponent(i, 2, 0) doubleArrays.append(arrayNode) chartNode = slicer.mrmlScene.AddNode(slicer.vtkMRMLChartNode()) cvNodes = slicer.mrmlScene.GetNodesByClass('vtkMRMLChartViewNode') cvNodes.SetReferenceCount(cvNodes.GetReferenceCount()-1) cvNodes.InitTraversal() cvNode = cvNodes.GetNextItemAsObject() for pairs in zip(names,doubleArrays): chartNode.AddArray(pairs[0],pairs[1].GetID()) cvNode.SetChartNodeID(chartNode.GetID()) return
def createStatsChart(self, labelNode, valueToPlot, ignoreZero=False): """Make a MRML chart of the current stats """ layoutNodes = slicer.mrmlScene.GetNodesByClass('vtkMRMLLayoutNode') layoutNodes.SetReferenceCount(layoutNodes.GetReferenceCount() - 1) layoutNodes.InitTraversal() layoutNode = layoutNodes.GetNextItemAsObject() layoutNode.SetViewArrangement( slicer.vtkMRMLLayoutNode.SlicerLayoutConventionalQuantitativeView) chartViewNodes = slicer.mrmlScene.GetNodesByClass( 'vtkMRMLChartViewNode') chartViewNodes.SetReferenceCount(chartViewNodes.GetReferenceCount() - 1) chartViewNodes.InitTraversal() chartViewNode = chartViewNodes.GetNextItemAsObject() arrayNode = slicer.mrmlScene.AddNode(slicer.vtkMRMLDoubleArrayNode()) array = arrayNode.GetArray() samples = len(self.labelStats["Labels"]) tuples = samples if ignoreZero and self.labelStats["Labels"].__contains__(0): tuples -= 1 array.SetNumberOfTuples(tuples) tuple = 0 for i in xrange(samples): index = self.labelStats["Labels"][i] if not (ignoreZero and index == 0): array.SetComponent(tuple, 0, index + 1) array.SetComponent(tuple, 1, self.labelStats[index, valueToPlot]) array.SetComponent(tuple, 2, 0) tuple += 1 chartNode = slicer.mrmlScene.AddNode(slicer.vtkMRMLChartNode()) chartNode.AddArray(valueToPlot, arrayNode.GetID()) chartViewNode.SetChartNodeID(chartNode.GetID()) chartNode.SetProperty('default', 'title', 'Label Statistics') chartNode.SetProperty('default', 'xAxisLabel', 'Label') chartNode.SetProperty('default', 'yAxisLabel', valueToPlot) chartNode.SetProperty('default', 'type', 'Line') chartNode.SetProperty('default', 'xAxisType', 'categorical') chartNode.SetProperty('default', 'showLegend', 'off') # series level properties if labelNode.IsA("vtkMRMLSequenceNode"): if labelNode.GetNthDataNode( 0).GetDisplayNode() != None and labelNode.GetNthDataNode( 0).GetDisplayNode().GetColorNode() != None: chartNode.SetProperty( valueToPlot, 'lookupTable', labelNode.GetNthDataNode( 0).GetDisplayNode().GetColorNodeID()) else: chartNode.SetProperty( valueToPlot, 'lookupTable', slicer.mrmlScene.GetNodeByID('vtkMRMLColorTableNodeRed'))
def createStatsChart(self, labelNode, valueToPlot, ignoreZero=False): """Make a MRML chart of the current stats """ layoutNodes = slicer.mrmlScene.GetNodesByClass('vtkMRMLLayoutNode') layoutNodes.SetReferenceCount(layoutNodes.GetReferenceCount()-1) layoutNodes.InitTraversal() layoutNode = layoutNodes.GetNextItemAsObject() layoutNode.SetViewArrangement(slicer.vtkMRMLLayoutNode.SlicerLayoutConventionalQuantitativeView) chartViewNodes = slicer.mrmlScene.GetNodesByClass('vtkMRMLChartViewNode') chartViewNodes.SetReferenceCount(chartViewNodes.GetReferenceCount()-1) chartViewNodes.InitTraversal() chartViewNode = chartViewNodes.GetNextItemAsObject() arrayNode = slicer.mrmlScene.AddNode(slicer.vtkMRMLDoubleArrayNode()) array = arrayNode.GetArray() samples = len(self.labelStats["Labels"]) tuples = samples if ignoreZero and self.labelStats["Labels"].__contains__(0): tuples -= 1 array.SetNumberOfTuples(tuples) tuple = 0 for i in xrange(samples): index = self.labelStats["Labels"][i] if not (ignoreZero and index == 0): array.SetComponent(tuple, 0, index) try: v = float(self.labelStats[index,valueToPlot]) except (KeyError, TypeError): v = float(0) array.SetComponent(tuple, 1, v) array.SetComponent(tuple, 2, 0) tuple += 1 chartNode = slicer.mrmlScene.AddNode(slicer.vtkMRMLChartNode()) state = chartNode.StartModify() chartNode.AddArray(valueToPlot, arrayNode.GetID()) chartViewNode.SetChartNodeID(chartNode.GetID()) chartNode.SetProperty('default', 'title', 'Label Statistics') chartNode.SetProperty('default', 'xAxisLabel', 'Label') chartNode.SetProperty('default', 'yAxisLabel', valueToPlot) chartNode.SetProperty('default', 'type', 'Bar'); chartNode.SetProperty('default', 'xAxisType', 'categorical') chartNode.SetProperty('default', 'showLegend', 'off') # series level properties if labelNode.GetDisplayNode() != None and labelNode.GetDisplayNode().GetColorNode() != None: chartNode.SetProperty(valueToPlot, 'lookupTable', labelNode.GetDisplayNode().GetColorNodeID()); chartNode.EndModify(state)
def Chart(self,dists): """Make a MRML chart of the current stats """ if dists: layoutNodes = slicer.mrmlScene.GetNodesByClass('vtkMRMLLayoutNode') layoutNodes.SetReferenceCount(layoutNodes.GetReferenceCount()-1) layoutNodes.InitTraversal() layoutNode = layoutNodes.GetNextItemAsObject() layoutNode.SetViewArrangement(slicer.vtkMRMLLayoutNode.SlicerLayoutFourUpQuantitativeView) chartViewNodes = slicer.mrmlScene.GetNodesByClass('vtkMRMLChartViewNode') chartViewNodes.SetReferenceCount(chartViewNodes.GetReferenceCount()-1) chartViewNodes.InitTraversal() chartViewNode = chartViewNodes.GetNextItemAsObject() arrayNode = slicer.mrmlScene.AddNode(slicer.vtkMRMLDoubleArrayNode()) array = arrayNode.GetArray() #dists=self.sides + self.diagonals # samples=len(dists) minimum=min(dists) maximum=max(dists) nbins=10.0 binsize=(maximum-minimum)/nbins hist=self.createHst(binsize,dists) samples=len(hist['bin']) print("samples: " + str(samples)) array.SetNumberOfTuples(samples) # for n in range(samples): # array.SetComponent(n, 0, n) # array.SetComponent(n, 1, dists[n]) for n in range(samples): array.SetComponent(n, 0, hist['bin'][n]) array.SetComponent(n, 1, hist['freq'][n]) chartNode = slicer.mrmlScene.AddNode(slicer.vtkMRMLChartNode()) chartNode.SetName("Freq") chartNode.AddArray("Distances", arrayNode.GetID()) chartViewNode.SetChartNodeID(chartNode.GetID()) print("set properties") chartNode.SetProperty('default', 'title', 'Measured Distances') chartNode.SetProperty('default', 'xAxisLabel', 'Distance') chartNode.SetProperty('default', 'yAxisLabel', 'N') #chartNode.SetProperty('default', 'type', 'Bar'); chartNode.SetProperty('default', 'type', 'Scatter'); #chartNode.SetProperty('default', 'xAxisType', 'categorical') chartNode.SetProperty('default', 'showLegend', 'off')
def setSlicerDoubleArray(self): if self.dn is not None: return from __main__ import slicer self.dn = slicer.mrmlScene.AddNode(slicer.vtkMRMLDoubleArrayNode()) array = self.dn.GetArray() #Trim zeroes x = np.trim_zeros(self.x,'b') array.SetNumberOfTuples(len(x)) for i in range(len(x)): array.SetComponent(i, 0, x[i]) array.SetComponent(i, 1, self.y[i]) array.SetComponent(i, 2, self.err[i])
def createStatsChart(self, labelNode, valueToPlot, ignoreZero=False): """Make a MRML chart of the current stats """ layoutNodes = slicer.mrmlScene.GetNodesByClass("vtkMRMLLayoutNode") layoutNodes.SetReferenceCount(layoutNodes.GetReferenceCount() - 1) layoutNodes.InitTraversal() layoutNode = layoutNodes.GetNextItemAsObject() layoutNode.SetViewArrangement(slicer.vtkMRMLLayoutNode.SlicerLayoutConventionalQuantitativeView) chartViewNodes = slicer.mrmlScene.GetNodesByClass("vtkMRMLChartViewNode") chartViewNodes.SetReferenceCount(chartViewNodes.GetReferenceCount() - 1) chartViewNodes.InitTraversal() chartViewNode = chartViewNodes.GetNextItemAsObject() arrayNode = slicer.mrmlScene.AddNode(slicer.vtkMRMLDoubleArrayNode()) array = arrayNode.GetArray() samples = len(self.labelStats["Labels"]) tuples = samples if ignoreZero and self.labelStats["Labels"].__contains__(0): tuples -= 1 array.SetNumberOfTuples(tuples) tuple = 0 for i in xrange(samples): index = self.labelStats["Labels"][i] if not (ignoreZero and index == 0): array.SetComponent(tuple, 0, index) array.SetComponent(tuple, 1, self.labelStats[index, valueToPlot]) array.SetComponent(tuple, 2, 0) tuple += 1 chartNode = slicer.mrmlScene.AddNode(slicer.vtkMRMLChartNode()) state = chartNode.StartModify() chartNode.AddArray(valueToPlot, arrayNode.GetID()) chartViewNode.SetChartNodeID(chartNode.GetID()) chartNode.SetProperty("default", "title", "Label Statistics") chartNode.SetProperty("default", "xAxisLabel", "Label") chartNode.SetProperty("default", "yAxisLabel", valueToPlot) chartNode.SetProperty("default", "type", "Bar") chartNode.SetProperty("default", "xAxisType", "categorical") chartNode.SetProperty("default", "showLegend", "off") # series level properties if labelNode.GetDisplayNode() != None and labelNode.GetDisplayNode().GetColorNode() != None: chartNode.SetProperty(valueToPlot, "lookupTable", labelNode.GetDisplayNode().GetColorNodeID()) chartNode.EndModify(state)
def createStatsChart(self, labelNode, valueToPlot, ignoreZero=False): """Make a MRML chart of the current stats """ layoutNodes = slicer.mrmlScene.GetNodesByClass('vtkMRMLLayoutNode') layoutNodes.SetReferenceCount(layoutNodes.GetReferenceCount() - 1) layoutNodes.InitTraversal() layoutNode = layoutNodes.GetNextItemAsObject() layoutNode.SetViewArrangement( slicer.vtkMRMLLayoutNode.SlicerLayoutConventionalQuantitativeView) chartViewNodes = slicer.mrmlScene.GetNodesByClass( 'vtkMRMLChartViewNode') chartViewNodes.SetReferenceCount(chartViewNodes.GetReferenceCount() - 1) chartViewNodes.InitTraversal() chartViewNode = chartViewNodes.GetNextItemAsObject() arrayNode = slicer.mrmlScene.AddNode(slicer.vtkMRMLDoubleArrayNode()) array = arrayNode.GetArray() samples = len(self.regionTags) tuples = samples array.SetNumberOfTuples(tuples) tuple = 0 cycle = 'insp' for i in xrange(samples): index = self.regionTags[i] array.SetComponent(tuple, 0, i) array.SetComponent(tuple, 1, self.labelStats[cycle, valueToPlot, index]) array.SetComponent(tuple, 2, 0) tuple += 1 chartNode = slicer.mrmlScene.AddNode(slicer.vtkMRMLChartNode()) chartNode.AddArray(valueToPlot, arrayNode.GetID()) chartViewNode.SetChartNodeID(chartNode.GetID()) chartNode.SetProperty('default', 'title', 'Parenchyma Statistics') chartNode.SetProperty('default', 'xAxisLabel', 'Label') chartNode.SetProperty('default', 'yAxisLabel', valueToPlot) chartNode.SetProperty('default', 'type', 'Bar') chartNode.SetProperty('default', 'xAxisType', 'categorical') chartNode.SetProperty('default', 'showLegend', 'off') # series level properties if labelNode.GetDisplayNode() != None and labelNode.GetDisplayNode( ).GetColorNode() != None: chartNode.SetProperty(valueToPlot, 'lookupTable', labelNode.GetDisplayNode().GetColorNodeID())
def CreateAndFillArray(self,hist,name): arrayNode = slicer.mrmlScene.GetNodesByClassByName("vtkMRMLDoubleArrayNode",name).GetItemAsObject(0) if not arrayNode: arrayNode = slicer.mrmlScene.AddNode(slicer.vtkMRMLDoubleArrayNode()) arrayNode.SetName(name) arrayD = arrayNode.GetArray() arrayD.SetNumberOfTuples(len(hist[0])) for n in range(len(hist[0])): arrayD.SetComponent(n, 0, hist[0][n]) arrayD.SetComponent(n, 1, hist[1][n]) return arrayNode
def initializeCharting(self): # Enable iCharting Settings self.iCharting.setChecked(True) self.iCharting.enabled = True self.iChartingCollapsibleButton.collapsed = False # Initialize image data (pre-contrast node at index '0') self.nComponents = len(self.volumeNodes) self.nodeImageData = [] for node in xrange(self.nComponents): self.nodeImageData.append(self.volumeNodes[node].GetImageData()) self.extent = self.nodeImageData[0].GetExtent() # Change active volume nodes in scene appLogic = slicer.app.applicationLogic() selectionNode = appLogic.GetSelectionNode() selectionNode.SetReferenceActiveVolumeID(self.nodePre.GetID()) selectionNode.SetReferenceActiveLabelVolumeID( self.nodeSegmentCAD.GetID()) selectionNode.SetReferenceSecondaryVolumeID(self.node1.GetID()) appLogic.PropagateVolumeSelection() # Change scene layout to conventional quantitative view layoutNodes = slicer.mrmlScene.GetNodesByClass('vtkMRMLLayoutNode') layoutNodes.InitTraversal() layoutNode = layoutNodes.GetNextItemAsObject() layoutNode.SetViewArrangement( slicer.vtkMRMLLayoutNode.SlicerLayoutConventionalQuantitativeView) # Set up chart within the scene self.chartViewNodes = slicer.mrmlScene.GetNodesByClass( 'vtkMRMLChartViewNode') self.chartViewNodes.InitTraversal() self.chartViewNode = self.chartViewNodes.GetNextItemAsObject() self.arrayNode = slicer.mrmlScene.AddNode( slicer.vtkMRMLDoubleArrayNode()) self.chartNode = slicer.mrmlScene.AddNode(slicer.vtkMRMLChartNode()) self.chartNode.AddArray('voxelijk', self.arrayNode.GetID()) self.chartNode.SetProperty('default', 'title', 'Interactive Charting') self.chartNode.SetProperty('default', 'xAxisLabel', 'DCE-MRI Volumes') self.chartNode.SetProperty('default', 'yAxisLabel', 'Percentage Increase from Baseline') self.chartNode.SetProperty('default', 'type', 'Line') self.chartNode.SetProperty('default', 'xAxisType', 'quantitative') self.chartNode.SetProperty('default', 'showGrid', 'on') self.chartNode.SetProperty('default', 'showLegend', 'on') self.chartNode.SetProperty('default', 'showMarkers', 'on') self.chartNode.SetProperty('default', 'xAxisPad', '1') self.chartViewNode.SetChartNodeID(self.chartNode.GetID())
def createStatsChart(self, labelNode, valueToPlot, ignoreZero=False): """Make a MRML chart of the current stats """ layoutNodes = slicer.mrmlScene.GetNodesByClass('vtkMRMLLayoutNode') layoutNodes.SetReferenceCount(layoutNodes.GetReferenceCount()-1) layoutNodes.InitTraversal() layoutNode = layoutNodes.GetNextItemAsObject() layoutNode.SetViewArrangement(slicer.vtkMRMLLayoutNode.SlicerLayoutConventionalQuantitativeView) chartViewNodes = slicer.mrmlScene.GetNodesByClass('vtkMRMLChartViewNode') chartViewNodes.SetReferenceCount(chartViewNodes.GetReferenceCount()-1) chartViewNodes.InitTraversal() chartViewNode = chartViewNodes.GetNextItemAsObject() arrayNode = slicer.mrmlScene.AddNode(slicer.vtkMRMLDoubleArrayNode()) array = arrayNode.GetArray() samples = len(self.regionTags) tuples = samples array.SetNumberOfTuples(tuples) tuple = 0 cycle = 'insp' for i in xrange(samples): index = self.regionTags[i] array.SetComponent(tuple, 0, i) array.SetComponent(tuple, 1, self.labelStats[cycle,valueToPlot,index]) array.SetComponent(tuple, 2, 0) tuple += 1 chartNode = slicer.mrmlScene.AddNode(slicer.vtkMRMLChartNode()) chartNode.AddArray(valueToPlot, arrayNode.GetID()) chartViewNode.SetChartNodeID(chartNode.GetID()) chartNode.SetProperty('default', 'title', 'Parenchyma Statistics') chartNode.SetProperty('default', 'xAxisLabel', 'Label') chartNode.SetProperty('default', 'yAxisLabel', valueToPlot) chartNode.SetProperty('default', 'type', 'Bar'); chartNode.SetProperty('default', 'xAxisType', 'categorical') chartNode.SetProperty('default', 'showLegend', 'off') # series level properties if labelNode.GetDisplayNode() != None and labelNode.GetDisplayNode().GetColorNode() != None: chartNode.SetProperty(valueToPlot, 'lookupTable', labelNode.GetDisplayNode().GetColorNodeID());
def initializeCharting(self): # Enable iCharting Settings self.iCharting.setChecked(True) self.iCharting.enabled = True self.iChartingCollapsibleButton.collapsed = False # Initialize image data (pre-contrast node at index '0') self.nComponents = len(self.volumeNodes) self.nodeImageData = [] for node in xrange (self.nComponents): self.nodeImageData.append(self.volumeNodes[node].GetImageData()) self.extent = self.nodeImageData[0].GetExtent() # Change active volume nodes in scene appLogic = slicer.app.applicationLogic() selectionNode = appLogic.GetSelectionNode() selectionNode.SetReferenceActiveVolumeID(self.nodePre.GetID()) selectionNode.SetReferenceActiveLabelVolumeID(self.nodeSegmentCAD.GetID()) selectionNode.SetReferenceSecondaryVolumeID(self.node1.GetID()) appLogic.PropagateVolumeSelection() # Change scene layout to conventional quantitative view layoutNodes = slicer.mrmlScene.GetNodesByClass('vtkMRMLLayoutNode') layoutNodes.InitTraversal() layoutNode = layoutNodes.GetNextItemAsObject() layoutNode.SetViewArrangement(slicer.vtkMRMLLayoutNode.SlicerLayoutConventionalQuantitativeView) # Set up chart within the scene self.chartViewNodes = slicer.mrmlScene.GetNodesByClass('vtkMRMLChartViewNode') self.chartViewNodes.InitTraversal() self.chartViewNode = self.chartViewNodes.GetNextItemAsObject() self.arrayNode = slicer.mrmlScene.AddNode(slicer.vtkMRMLDoubleArrayNode()) self.chartNode = slicer.mrmlScene.AddNode(slicer.vtkMRMLChartNode()) self.chartNode.AddArray('voxelijk', self.arrayNode.GetID()) self.chartNode.SetProperty('default', 'title', 'Interactive Charting') self.chartNode.SetProperty('default', 'xAxisLabel', 'DCE-MRI Volumes') self.chartNode.SetProperty('default', 'yAxisLabel', 'Percentage Increase from Baseline') self.chartNode.SetProperty('default', 'type', 'Line') self.chartNode.SetProperty('default', 'xAxisType', 'quantitative') self.chartNode.SetProperty('default', 'showGrid', 'on') self.chartNode.SetProperty('default', 'showLegend', 'on') self.chartNode.SetProperty('default', 'showMarkers', 'on') self.chartNode.SetProperty('default', 'xAxisPad', '1') self.chartViewNode.SetChartNodeID(self.chartNode.GetID())
def showChart(self, samples, names): print("Logic showing chart") print 'samples: ', samples lm = slicer.app.layoutManager() lm.setLayout(slicer.vtkMRMLLayoutNode.SlicerLayoutFourUpQuantitativeView) # initialize double array MRML node for each sample list, # since this is what chart view MRML node needs doubleArrays = [] for sample in samples: print sample arrayNode = slicer.mrmlScene.AddNode(slicer.vtkMRMLDoubleArrayNode()) array = arrayNode.GetArray() nDataPoints = sample.GetNumberOfTuples() array.SetNumberOfTuples(nDataPoints) array.SetNumberOfComponents(3) #print 'sample.GetTuple(0): ', sample.GetTuple(0) for i in range(nDataPoints): array.SetComponent(i, 0, i) array.SetComponent(i, 1, sample.GetTuple1(i)) array.SetComponent(i, 2, 0) doubleArrays.append(arrayNode) chartNode = slicer.mrmlScene.AddNode(slicer.vtkMRMLChartNode()) # get chart view MRML node cvNodes = slicer.mrmlScene.GetNodesByClass('vtkMRMLChartViewNode') cvNodes.SetReferenceCount(cvNodes.GetReferenceCount()-1) cvNodes.InitTraversal() cvNode = cvNodes.GetNextItemAsObject() # create a new chart node chartNode = slicer.mrmlScene.AddNode(slicer.vtkMRMLChartNode()) for pairs in zip(names, doubleArrays): chartNode.AddArray(pairs[0], pairs[1].GetID()) cvNode.SetChartNodeID( chartNode.GetID() ) return
def calculateLabeledVoxelsMeanAndInitiateChartArray(self): # calculate the mean in each frame for each label and add to the chart array nComponents = self.multiVolumeNode.GetNumberOfFrames() self.dataNodes = {} for k in self.labeledVoxels.keys(): self.dataNodes[k] = slicer.mrmlScene.AddNode(slicer.vtkMRMLDoubleArrayNode()) self.dataNodes[k].GetArray().SetNumberOfTuples(nComponents) mvImage = self.multiVolumeNode.GetImageData() for c in range(nComponents): for k in self.labeledVoxels.keys(): arr = self.dataNodes[k].GetArray() mean = 0. cnt = 0. for v in self.labeledVoxels[k]: val = mvImage.GetScalarComponentAsFloat(v[0], v[1], v[2], c) if math.isnan(val): val = 0 mean = mean + val cnt += 1 arr.SetComponent(c, 0, self.multiVolumeLabels[c]) arr.SetComponent(c, 1, mean / cnt) arr.SetComponent(c, 2, 0)
def showChart(self, samples, names, distanceArrays, chartNode): print("Logic showing chart") # Switch to a layut containing a chart viewer lm = slicer.app.layoutManager() lm.setLayout(slicer.vtkMRMLLayoutNode.SlicerLayoutFourUpQuantitativeView) # initialize double array MRML node for each sample list, # since this is what chart view MRML node needs doubleArrays = [] for sample in zip(distanceArrays, samples): arrayNode = slicer.mrmlScene.AddNode(slicer.vtkMRMLDoubleArrayNode()) array = arrayNode.GetArray() nDataPoints = len(sample[0]) array.SetNumberOfTuples(nDataPoints) array.SetNumberOfComponents(3) for i in range(nDataPoints): array.SetComponent(i, 0, sample[0][i]) array.SetComponent(i, 1, sample[1].GetTuple1(i)) array.SetComponent(i, 2, 0) doubleArrays.append(arrayNode) # get the chart view MRML node cvNodes = slicer.mrmlScene.GetNodesByClass('vtkMRMLChartViewNode') cvNodes.SetReferenceCount(cvNodes.GetReferenceCount()-1) cvNodes.InitTraversal() cvNode = cvNodes.GetNextItemAsObject() # ChartNode is passed from the widget chartNode.ClearArrays() colorScheme = ["#FF0000","#7CFC00"] # "#FF0000" is red, "#7CFC00" is green, by default is green for pairs in zip(names, doubleArrays, colorScheme): chartNode.AddArray(pairs[0], pairs[1].GetID()) chartNode.SetProperty(pairs[0], "color", pairs[2]) cvNode.SetChartNodeID(chartNode.GetID()) return
def initializeChart(self, data, dataName): # set the layout that includes a chart viewer lm = slicer.app.layoutManager() lm.setLayout(slicer.vtkMRMLLayoutNode.SlicerLayoutFourUpQuantitativeView) # chartViewNodes = slicer.mrmlScene.GetNodesByClass('vtkMRMLChartViewNode') chartViewNodes.SetReferenceCount(chartViewNodes.GetReferenceCount()-1) chartViewNodes.InitTraversal() chartViewNode = chartViewNodes.GetNextItemAsObject() # populate DoubleArrayNode with the result of the probing arrayNode = slicer.mrmlScene.AddNode(slicer.vtkMRMLDoubleArrayNode()) array = arrayNode.GetArray() samples = data.GetNumberOfTuples() array.SetNumberOfTuples(samples) tuple = 0 for i in xrange(samples): array.SetComponent(tuple, 0, i) array.SetComponent(tuple, 1, data.GetTuple1(i)) array.SetComponent(tuple, 2, 0) tuple += 1 # create a new ChartNode chartNode = slicer.mrmlScene.AddNode(slicer.vtkMRMLChartNode()) state = chartNode.StartModify() chartNode.AddArray(dataName, arrayNode.GetID()) chartViewNode.SetChartNodeID(chartNode.GetID()) chartNode.SetProperty('default', 'title', 'Image line probe') chartNode.SetProperty('default', 'xAxisLabel', 'Sample point') chartNode.SetProperty('default', 'yAxisLabel', 'Intensity') chartNode.SetProperty('default', 'type', 'Line'); chartNode.SetProperty('default', 'showLegend', 'on') chartNode.EndModify(state)
def onLabelVolumeChanged(self): # iterate over the label image and collect the IJK for each label element labelNode = self.__fSelector.currentNode() mvNode = self.__mvSelector.currentNode() if labelNode != None and mvNode != None: labelID = labelNode.GetID() img = labelNode.GetImageData() extent = img.GetWholeExtent() labeledVoxels = {} for i in range(extent[1]): for j in range(extent[3]): for k in range(extent[5]): labelValue = img.GetScalarComponentAsFloat(i, j, k, 0) if labelValue: if labelValue in labeledVoxels.keys(): labeledVoxels[labelValue].append([i, j, k]) else: labeledVoxels[labelValue] = [] labeledVoxels[labelValue].append([i, j, k]) # go over all elements, calculate the mean in each frame for each label # and add to the chart array nComponents = self.__mvNode.GetNumberOfFrames() dataNodes = {} for k in labeledVoxels.keys(): dataNodes[k] = slicer.mrmlScene.AddNode( slicer.vtkMRMLDoubleArrayNode()) dataNodes[k].GetArray().SetNumberOfTuples(nComponents) mvImage = self.__mvNode.GetImageData() for c in range(nComponents): for k in labeledVoxels.keys(): arr = dataNodes[k].GetArray() mean = 0. cnt = 0. for v in labeledVoxels[k]: mean = mean + mvImage.GetScalarComponentAsFloat( v[0], v[1], v[2], c) cnt = cnt + 1 arr.SetComponent(c, 0, self.__mvLabels[c]) arr.SetComponent(c, 1, mean / cnt) arr.SetComponent(c, 2, 0) # setup color node colorNodeID = labelNode.GetDisplayNode().GetColorNodeID() colorNode = labelNode.GetDisplayNode().GetColorNode() lut = colorNode.GetLookupTable() # add initialized data nodes to the chart self.__cn.ClearArrays() for k in labeledVoxels.keys(): name = colorNode.GetColorName(k) self.__cn.AddArray(name, dataNodes[k].GetID()) #self.__cn.SetProperty(name, "lookupTable", colorNodeID) rgb = lut.GetTableValue(int(k)) colorStr = self.RGBtoHex(rgb[0] * 255, rgb[1] * 255, rgb[2] * 255) self.__cn.SetProperty(name, "color", colorStr) self.__cvn.Modified() tag = str( self.__mvNode.GetAttribute( 'MultiVolume.FrameIdentifyingDICOMTagName')) units = str( self.__mvNode.GetAttribute( 'MultiVolume.FrameIdentifyingDICOMTagUnits')) xTitle = tag + ', ' + units self.__cn.SetProperty('default', 'xAxisLabel', xTitle) self.__cn.SetProperty('default', 'yAxisLabel', 'mean signal intensity') self.__cvn.SetChartNodeID(self.__cn.GetID())
def chartTest(self): import math,random lns = slicer.mrmlScene.GetNodesByClass('vtkMRMLLayoutNode') lns.InitTraversal() ln = lns.GetNextItemAsObject() ln.SetViewArrangement(24) chartView = findChildren(className='qMRMLChartView')[0] print(chartView.connect("dataMouseOver(const char *,int,double,double)", self.chartMouseOverCallback)) print(chartView.connect("dataPointClicked(const char *,int,double,double)", self.chartCallback)) cvns = slicer.mrmlScene.GetNodesByClass('vtkMRMLChartViewNode') cvns.InitTraversal() cvn = cvns.GetNextItemAsObject() dn = slicer.mrmlScene.AddNode(slicer.vtkMRMLDoubleArrayNode()) a = dn.GetArray() a.SetNumberOfTuples(600) x = range(0, 600) phase = random.random() for i in range(len(x)): a.SetComponent(i, 0, x[i]/50.0) a.SetComponent(i, 1, math.sin(phase+x[i]/50.0)) a.SetComponent(i, 2, 0) dn2 = slicer.mrmlScene.AddNode(slicer.vtkMRMLDoubleArrayNode()) a = dn2.GetArray() a.SetNumberOfTuples(600) x = range(0, 600) for i in range(len(x)): a.SetComponent(i, 0, x[i]/50.0) a.SetComponent(i, 1, math.cos(phase+x[i]/50.0)) a.SetComponent(i, 2, 0) cn = slicer.mrmlScene.AddNode(slicer.vtkMRMLChartNode()) cn.AddArray('A double array', dn.GetID()) cn.AddArray('Another double array', dn2.GetID()) cvn.SetChartNodeID(cn.GetID()) cn.SetProperty('default', 'title', 'A simple chart with 2 curves') cn.SetProperty('default', 'xAxisLabel', 'Something in x') cn.SetProperty('default', 'yAxisLabel', 'Something in y') cvn.SetChartNodeID(cn.GetID()) cn = slicer.mrmlScene.AddNode(slicer.vtkMRMLChartNode()) print cn.GetID() cn.AddArray('Just one array', dn.GetID()) cn.SetProperty('default', 'title', 'A simple chart with 1 curve') cn.SetProperty('default', 'xAxisLabel', 'Just x') cn.SetProperty('default', 'yAxisLabel', 'Just y') cn = slicer.mrmlScene.AddNode(slicer.vtkMRMLChartNode()) print cn.GetID() cn.AddArray('The other array', dn2.GetID()) cn.SetProperty('default', 'title', 'A simple chart with another curve') cn.SetProperty('default', 'xAxisLabel', 'time') cn.SetProperty('default', 'yAxisLabel', 'velocity') cn.SetProperty('The other array', 'showLines', 'on') cn.SetProperty('The other array', 'showMarkers', 'off') cn.SetProperty('The other array', 'color', '#fe7d20') dn3 = slicer.mrmlScene.AddNode(slicer.vtkMRMLDoubleArrayNode()) print dn3.GetID() a = dn3.GetArray() a.SetNumberOfTuples(12) x = range(0, 12) for i in range(len(x)): a.SetComponent(i, 0, x[i]/4.0) a.SetComponent(i, 1, math.sin(x[i]/4.0)) a.SetComponent(i, 2, 0) cn = slicer.mrmlScene.AddNode(slicer.vtkMRMLChartNode()) print cn.GetID() cn.AddArray('Periodic', dn3.GetID()) cn.SetProperty('default', 'title', 'A bar chart') cn.SetProperty('default', 'xAxisLabel', 'time') cn.SetProperty('default', 'yAxisLabel', 'velocity') cn.SetProperty('default', 'type', 'Bar');
def getSliceThk(self,meanProfile=False): profiles=self.getProfile(self.direction) self.spacing=self.input.GetSpacing()[self.direction] #todo: adjust if not meanProfile: profile=profiles[int(len(profiles)/2)] X=range(len(profile)) else: [X,profile]=self.meanTprofiles(profiles) if self.type==0: ramp=list(numpy.diff(profile)/numpy.diff(X)) else: ramp=profile FWHMres=self.getFWHM(ramp,X) self.FWHM=FWHMres[0] FWHMcurve=[[FWHMres[1],FWHMres[1],FWHMres[2],FWHMres[2]],[0,FWHMres[3],FWHMres[3],0]] layoutNodes = slicer.mrmlScene.GetNodesByClass('vtkMRMLLayoutNode') layoutNodes.SetReferenceCount(layoutNodes.GetReferenceCount()-1) layoutNodes.InitTraversal() layoutNode = layoutNodes.GetNextItemAsObject() layoutNode.SetViewArrangement(slicer.vtkMRMLLayoutNode.SlicerLayoutFourUpQuantitativeView) chartViewNodes = slicer.mrmlScene.GetNodesByClass('vtkMRMLChartViewNode') chartViewNodes.SetReferenceCount(chartViewNodes.GetReferenceCount()-1) chartViewNodes.InitTraversal() chartViewNode = chartViewNodes.GetNextItemAsObject() ProfileNode = slicer.mrmlScene.AddNode(slicer.vtkMRMLDoubleArrayNode()) ProfileNode.SetName("Profile-"+self.input.GetName()+"-"+self.ROI.GetName()+"-array") self.arrayName=ProfileNode.GetName() Profile = ProfileNode.GetArray() Profile.SetNumberOfTuples(len(ramp)) for n in range(len(ramp)): Profile.SetComponent(n, 0, self.spacing*X[n]) Profile.SetComponent(n, 1, ramp[n]) FWHMNode = slicer.mrmlScene.AddNode(slicer.vtkMRMLDoubleArrayNode()) FWHMNode.SetName("FWHM-"+self.input.GetName()+"-"+self.ROI.GetName()+"-array") FWHMarray = FWHMNode.GetArray() FWHMarray.SetNumberOfTuples(len(FWHMcurve[0])) for n in range(len(FWHMcurve[0])): FWHMarray.SetComponent(n, 0, FWHMcurve[0][n]) FWHMarray.SetComponent(n, 1, FWHMcurve[1][n]) chartNode = slicer.mrmlScene.AddNode(slicer.vtkMRMLChartNode()) chartNode.SetName("Profile") chartNode.AddArray("Profile", ProfileNode.GetID()) chartNode.AddArray("FWHM", FWHMNode.GetID()) chartViewNode.SetChartNodeID(chartNode.GetID()) print("set properties") chartNode.SetProperty('default', 'title', 'Profile') chartNode.SetProperty('default', 'xAxisLabel', 'Distance(mm)') chartNode.SetProperty('default', 'yAxisLabel', 'Profile') chartNode.SetProperty('default', 'type', 'Line') chartNode.SetProperty('default', 'showLegend', 'on') chartNode.SetProperty('default', 'Markers', 'on')
def onCalculateLength(self): self.inputPolyData = self.vtkNode.GetPolyData() points = self.inputPolyData.GetPoints() lines = self.inputPolyData.GetLines() lines.InitTraversal() self.distanceTable = list() for i in range(self.inputPolyData.GetNumberOfCells()): fiberLength = 0 ids = vtk.vtkIdList() lines.GetNextCell(ids) #print(ids.GetNumberOfIds()) for j in range(ids.GetNumberOfIds() - 1): point1 = [0, 0, 0] point2 = [0, 0, 0] points.GetPoint(ids.GetId(j), point1) points.GetPoint(ids.GetId(j + 1), point2) x = point2[0] - point1[0] y = point2[1] - point1[1] z = point2[2] - point1[2] step = (x * x + y * y + z * z)**.5 fiberLength += step self.distanceTable.append(fiberLength) min, max = self.getDistanceBound() self.thresholdMin.setValue(min) self.thresholdMin.enabled = True self.thresholdMax.setValue(max + 1) self.thresholdMax.enabled = True self.applyThresholdButton.enabled = True layoutNodes = slicer.mrmlScene.GetNodesByClass('vtkMRMLLayoutNode') layoutNodes.InitTraversal() layoutNode = layoutNodes.GetNextItemAsObject() layoutNode.SetViewArrangement( slicer.vtkMRMLLayoutNode.SlicerLayoutConventionalQuantitativeView) chartViewNodes = slicer.mrmlScene.GetNodesByClass( 'vtkMRMLChartViewNode') chartViewNodes.InitTraversal() chartViewNode = chartViewNodes.GetNextItemAsObject() arrayNode = slicer.mrmlScene.AddNode(slicer.vtkMRMLDoubleArrayNode()) array = arrayNode.GetArray() array.SetNumberOfTuples(10) step = (max - min) / 10 interMin = min interMax = min + step for i in range(10): numberOfFibers = 0 for length in self.distanceTable: if length <= interMax and length >= interMin and length <= self.thresholdMax.value and length >= self.thresholdMin.value: numberOfFibers += 1 array.SetComponent(i, 0, (interMin + interMax) / 2) array.SetComponent(i, 1, numberOfFibers) array.SetComponent(i, 2, 0) interMin += step interMax += step chartNode = slicer.mrmlScene.AddNode(slicer.vtkMRMLChartNode()) chartNode.AddArray("Fiber Length", arrayNode.GetID()) chartViewNode.SetChartNodeID(chartNode.GetID()) chartNode.SetProperty('default', 'title', 'Length Distribution') chartNode.SetProperty('default', 'xAxisLabel', 'Length') chartNode.SetProperty('default', 'yAxisLabel', 'Distribution') chartNode.SetProperty('default', 'type', 'Bar')
def onChartRequested(self): # iterate over the label image and collect the IJK for each label element labelNode = self.__fSelector.currentNode() mvNode = self.__mvSelector.currentNode() if labelNode == None or mvNode == None: return labelID = labelNode.GetID() img = labelNode.GetImageData() extent = img.GetWholeExtent() labeledVoxels = {} for i in range(extent[1]): for j in range(extent[3]): for k in range(extent[5]): labelValue = img.GetScalarComponentAsFloat(i, j, k, 0) if labelValue: if labelValue in labeledVoxels.keys(): labeledVoxels[labelValue].append([i, j, k]) else: labeledVoxels[labelValue] = [] labeledVoxels[labelValue].append([i, j, k]) # go over all elements, calculate the mean in each frame for each label # and add to the chart array nComponents = self.__mvNode.GetNumberOfFrames() dataNodes = {} for k in labeledVoxels.keys(): dataNodes[k] = slicer.mrmlScene.AddNode( slicer.vtkMRMLDoubleArrayNode()) dataNodes[k].GetArray().SetNumberOfTuples(nComponents) mvImage = self.__mvNode.GetImageData() for c in range(nComponents): for k in labeledVoxels.keys(): arr = dataNodes[k].GetArray() mean = 0. cnt = 0. for v in labeledVoxels[k]: mean = mean + mvImage.GetScalarComponentAsFloat( v[0], v[1], v[2], c) cnt = cnt + 1 arr.SetComponent(c, 0, self.__mvLabels[c]) arr.SetComponent(c, 1, mean / cnt) arr.SetComponent(c, 2, 0) if self.iChartingPercent.checked: nBaselines = min(self.baselineFrames.value, nComponents) for k in labeledVoxels.keys(): arr = dataNodes[k].GetArray() baseline = 0 for bc in range(nBaselines): baseline += arr.GetComponent(bc, 1) baseline /= nBaselines if baseline != 0: for ic in range(nComponents): intensity = arr.GetComponent(ic, 1) percentChange = (intensity / baseline - 1) * 100. arr.SetComponent(ic, 1, percentChange) layoutNodes = slicer.mrmlScene.GetNodesByClass('vtkMRMLLayoutNode') layoutNodes.SetReferenceCount(layoutNodes.GetReferenceCount() - 1) layoutNodes.InitTraversal() layoutNode = layoutNodes.GetNextItemAsObject() layoutNode.SetViewArrangement( slicer.vtkMRMLLayoutNode.SlicerLayoutConventionalQuantitativeView) chartViewNodes = slicer.mrmlScene.GetNodesByClass( 'vtkMRMLChartViewNode') chartViewNodes.SetReferenceCount(chartViewNodes.GetReferenceCount() - 1) chartViewNodes.InitTraversal() chartViewNode = chartViewNodes.GetNextItemAsObject() chartNode = slicer.mrmlScene.AddNode(slicer.vtkMRMLChartNode()) # setup color node colorNodeID = labelNode.GetDisplayNode().GetColorNodeID() colorNode = labelNode.GetDisplayNode().GetColorNode() lut = colorNode.GetLookupTable() # add initialized data nodes to the chart chartNode.ClearArrays() for k in labeledVoxels.keys(): name = colorNode.GetColorName(k) chartNode.AddArray(name, dataNodes[k].GetID()) rgb = lut.GetTableValue(int(k)) colorStr = self.RGBtoHex(rgb[0] * 255, rgb[1] * 255, rgb[2] * 255) chartNode.SetProperty(name, "color", colorStr) tag = str( self.__mvNode.GetAttribute( 'MultiVolume.FrameIdentifyingDICOMTagName')) units = str( self.__mvNode.GetAttribute( 'MultiVolume.FrameIdentifyingDICOMTagUnits')) xTitle = tag + ', ' + units chartNode.SetProperty('default', 'xAxisLabel', xTitle) if self.iChartingPercent.checked: chartNode.SetProperty('default', 'yAxisLabel', 'change relative to baseline, %') else: chartNode.SetProperty('default', 'yAxisLabel', 'mean signal intensity') chartViewNode.SetChartNodeID(chartNode.GetID())
def onCalculateLength(self): self.inputPolyData = self.vtkNode.GetPolyData() points = self.inputPolyData.GetPoints() lines = self.inputPolyData.GetLines() lines.InitTraversal() self.distanceTable = list() for i in range(self.inputPolyData.GetNumberOfCells()): fiberLength = 0 ids = vtk.vtkIdList() lines.GetNextCell(ids) #print(ids.GetNumberOfIds()) for j in range(ids.GetNumberOfIds() - 1): point1 = [0,0,0] point2 = [0,0,0] points.GetPoint(ids.GetId(j), point1) points.GetPoint(ids.GetId(j+1), point2) x = point2[0] - point1[0] y = point2[1] - point1[1] z = point2[2] - point1[2] step = (x*x + y*y + z*z)**.5 fiberLength += step self.distanceTable.append(fiberLength) min,max=self.getDistanceBound() self.thresholdMin.setValue(min) self.thresholdMin.enabled = True self.thresholdMax.setValue(max+1) self.thresholdMax.enabled = True self.applyThresholdButton.enabled = True layoutNodes = slicer.mrmlScene.GetNodesByClass('vtkMRMLLayoutNode') layoutNodes.InitTraversal() layoutNode = layoutNodes.GetNextItemAsObject() layoutNode.SetViewArrangement(slicer.vtkMRMLLayoutNode.SlicerLayoutConventionalQuantitativeView) chartViewNodes = slicer.mrmlScene.GetNodesByClass('vtkMRMLChartViewNode') chartViewNodes.InitTraversal() chartViewNode = chartViewNodes.GetNextItemAsObject() arrayNode = slicer.mrmlScene.AddNode(slicer.vtkMRMLDoubleArrayNode()) array = arrayNode.GetArray() array.SetNumberOfTuples(10) step = (max-min)/10 interMin = min interMax = min+step for i in range(10): numberOfFibers = 0 for length in self.distanceTable: if length<=interMax and length>=interMin and length<=self.thresholdMax.value and length>=self.thresholdMin.value: numberOfFibers += 1 array.SetComponent(i,0,(interMin+interMax)/2) array.SetComponent(i,1,numberOfFibers) array.SetComponent(i,2,0) interMin += step interMax += step chartNode = slicer.mrmlScene.AddNode(slicer.vtkMRMLChartNode()) chartNode.AddArray("Fiber Length",arrayNode.GetID()) chartViewNode.SetChartNodeID(chartNode.GetID()) chartNode.SetProperty('default', 'title', 'Length Distribution') chartNode.SetProperty('default', 'xAxisLabel', 'Length') chartNode.SetProperty('default', 'yAxisLabel', 'Distribution') chartNode.SetProperty('default', 'type', 'Bar')
def test_Charting1(self): """ Testing charting """ self.delayDisplay("Starting the test") # # first, get some data # #import urllib #downloads = ( # ('http://slicer.kitware.com/midas3/download?items=5767', 'FA.nrrd', slicer.util.loadVolume), # ) # #for url,name,loader in downloads: # filePath = slicer.app.temporaryPath + '/' + name # if not os.path.exists(filePath) or os.stat(filePath).st_size == 0: # print('Requesting download %s from %s...\n' % (name, url)) # urllib.urlretrieve(url, filePath) # if loader: # print('Loading %s...\n' % (name,)) # loader(filePath) #self.delayDisplay('Finished with download and loading\n') #volumeNode = slicer.util.getNode(pattern="FA") #logic = ChartingLogic() #self.assertTrue( logic.hasImageData(volumeNode) ) # Change the layout to one that has a chart. This created the ChartView ln = slicer.util.getNode(pattern='vtkMRMLLayoutNode*') ln.SetViewArrangement(24) # Get the first ChartView node cvn = slicer.util.getNode(pattern='vtkMRMLChartViewNode*') # Create arrays of data dn = slicer.mrmlScene.AddNode(slicer.vtkMRMLDoubleArrayNode()) a = dn.GetArray() a.SetNumberOfTuples(600) x = range(0, 600) for i in range(len(x)): a.SetComponent(i, 0, x[i] / 50.0) a.SetComponent(i, 1, math.sin(x[i] / 50.0)) a.SetComponent(i, 2, 0) dn2 = slicer.mrmlScene.AddNode(slicer.vtkMRMLDoubleArrayNode()) a = dn2.GetArray() a.SetNumberOfTuples(600) x = range(0, 600) for i in range(len(x)): a.SetComponent(i, 0, x[i] / 50.0) a.SetComponent(i, 1, math.cos(x[i] / 50.0)) a.SetComponent(i, 2, 0) # Create the ChartNode, cn = slicer.mrmlScene.AddNode(slicer.vtkMRMLChartNode()) # Add data to the Chart cn.AddArray('A double array', dn.GetID()) cn.AddArray('Another double array', dn2.GetID()) # Configure properties of the Chart cn.SetProperty('default', 'title', 'A simple chart with 2 curves') cn.SetProperty('default', 'xAxisLabel', 'Something in x') cn.SetProperty('default', 'yAxisLabel', 'Something in y') # Set the chart to display cvn.SetChartNodeID(cn.GetID()) self.delayDisplay('A simple chart with 2 curves') # Create another ChartNode cn = slicer.mrmlScene.AddNode(slicer.vtkMRMLChartNode()) # Add data to the Chart cn.AddArray('Just one array', dn.GetID()) # Configure properties of the chart cn.SetProperty('default', 'title', 'A simple chart with 1 curve') cn.SetProperty('default', 'xAxisLabel', 'Just x') cn.SetProperty('default', 'yAxisLabel', 'Just y') # Set the chart to display cvn.SetChartNodeID(cn.GetID()) self.delayDisplay('A simple chart with 1 curve') # Create another ChartNode cn = slicer.mrmlScene.AddNode(slicer.vtkMRMLChartNode()) # Add data to the Chart cn.AddArray('The other array', dn2.GetID()) # Set properties on the chart cn.SetProperty('default', 'title', 'A simple chart with another curve') cn.SetProperty('default', 'xAxisLabel', 'time') cn.SetProperty('default', 'yAxisLabel', 'velocity') cn.SetProperty('The other array', 'showLines', 'on') cn.SetProperty('The other array', 'showMarkers', 'off') cn.SetProperty('The other array', 'color', '#fe7d20') # Set the chart to display cvn.SetChartNodeID(cn.GetID()) self.delayDisplay('A simple chart with another curve') # Create another data array dn3 = slicer.mrmlScene.AddNode(slicer.vtkMRMLDoubleArrayNode()) a = dn3.GetArray() a.SetNumberOfTuples(12) x = range(0, 12) for i in range(len(x)): a.SetComponent(i, 0, x[i] / 4.0) a.SetComponent(i, 1, math.sin(x[i] / 4.0)) a.SetComponent(i, 2, 0) # Create another ChartNode cn = slicer.mrmlScene.AddNode(slicer.vtkMRMLChartNode()) # Add data to the chart cn.AddArray('Periodic', dn3.GetID()) # Configure properties of the Chart cn.SetProperty('default', 'title', 'A bar chart') cn.SetProperty('default', 'xAxisLabel', 'time') cn.SetProperty('default', 'yAxisLabel', 'velocity') cn.SetProperty('default', 'type', 'Bar') # Set the chart to display cvn.SetChartNodeID(cn.GetID()) self.delayDisplay('A bar chart') # self.delayDisplay('Test passed!')
def chartTest(self): import math, random lns = slicer.mrmlScene.GetNodesByClass("vtkMRMLLayoutNode") lns.InitTraversal() ln = lns.GetNextItemAsObject() ln.SetViewArrangement(24) chartView = findChildren(className="qMRMLChartView")[0] print (chartView.connect("dataMouseOver(const char *,int,double,double)", self.chartMouseOverCallback)) print (chartView.connect("dataPointClicked(const char *,int,double,double)", self.chartCallback)) cvns = slicer.mrmlScene.GetNodesByClass("vtkMRMLChartViewNode") cvns.InitTraversal() cvn = cvns.GetNextItemAsObject() dn = slicer.mrmlScene.AddNode(slicer.vtkMRMLDoubleArrayNode()) a = dn.GetArray() a.SetNumberOfTuples(600) x = range(0, 600) phase = random.random() for i in range(len(x)): a.SetComponent(i, 0, x[i] / 50.0) a.SetComponent(i, 1, math.sin(phase + x[i] / 50.0)) a.SetComponent(i, 2, 0) dn2 = slicer.mrmlScene.AddNode(slicer.vtkMRMLDoubleArrayNode()) a = dn2.GetArray() a.SetNumberOfTuples(600) x = range(0, 600) for i in range(len(x)): a.SetComponent(i, 0, x[i] / 50.0) a.SetComponent(i, 1, math.cos(phase + x[i] / 50.0)) a.SetComponent(i, 2, 0) cn = slicer.mrmlScene.AddNode(slicer.vtkMRMLChartNode()) cn.AddArray("A double array", dn.GetID()) cn.AddArray("Another double array", dn2.GetID()) cvn.SetChartNodeID(cn.GetID()) cn.SetProperty("default", "title", "A simple chart with 2 curves") cn.SetProperty("default", "xAxisLabel", "Something in x") cn.SetProperty("default", "yAxisLabel", "Something in y") cvn.SetChartNodeID(cn.GetID()) cn = slicer.mrmlScene.AddNode(slicer.vtkMRMLChartNode()) print cn.GetID() cn.AddArray("Just one array", dn.GetID()) cn.SetProperty("default", "title", "A simple chart with 1 curve") cn.SetProperty("default", "xAxisLabel", "Just x") cn.SetProperty("default", "yAxisLabel", "Just y") cn = slicer.mrmlScene.AddNode(slicer.vtkMRMLChartNode()) print cn.GetID() cn.AddArray("The other array", dn2.GetID()) cn.SetProperty("default", "title", "A simple chart with another curve") cn.SetProperty("default", "xAxisLabel", "time") cn.SetProperty("default", "yAxisLabel", "velocity") cn.SetProperty("The other array", "showLines", "on") cn.SetProperty("The other array", "showMarkers", "off") cn.SetProperty("The other array", "color", "#fe7d20") dn3 = slicer.mrmlScene.AddNode(slicer.vtkMRMLDoubleArrayNode()) print dn3.GetID() a = dn3.GetArray() a.SetNumberOfTuples(12) x = range(0, 12) for i in range(len(x)): a.SetComponent(i, 0, x[i] / 4.0) a.SetComponent(i, 1, math.sin(x[i] / 4.0)) a.SetComponent(i, 2, 0) cn = slicer.mrmlScene.AddNode(slicer.vtkMRMLChartNode()) print cn.GetID() cn.AddArray("Periodic", dn3.GetID()) cn.SetProperty("default", "title", "A bar chart") cn.SetProperty("default", "xAxisLabel", "time") cn.SetProperty("default", "yAxisLabel", "velocity") cn.SetProperty("default", "type", "Bar")
def computeDPH(self, inputDoseVolumeNode, referenceDoseVolumeNode, inputContourNode, numberOfSimulations, numberOfFractions, systemError, randomError, doseGrowSizeX, doseGrowSizeY, doseGrowSizeZ, doseGrowOption): # Step 1: morph dose outputDoseVolumeNode = slicer.vtkMRMLScalarVolumeNode() slicer.mrmlScene.AddNode(outputDoseVolumeNode) from vtkSlicerDoseMorphologyModuleLogic import vtkMRMLDoseMorphologyNode doseMorphologyNode = vtkMRMLDoseMorphologyNode() slicer.mrmlScene.AddNode(doseMorphologyNode) doseMorphologyNode.SetAndObserveInputDoseVolumeNode(inputDoseVolumeNode) doseMorphologyNode.SetAndObserveReferenceDoseVolumeNode(referenceDoseVolumeNode) doseMorphologyNode.SetAndObserveOutputDoseVolumeNode(outputDoseVolumeNode) if doseGrowOption == "Dilation": doseMorphologyNode.SetOperationToExpandByDilation() elif doseGrowOption == "Scaling": doseMorphologyNode.SetOperationToExpandByScaling() doseMorphologyNode.SetXSize(doseGrowSizeX) doseMorphologyNode.SetYSize(doseGrowSizeY) doseMorphologyNode.SetZSize(doseGrowSizeZ) doseMorphologyLogic = slicer.modules.dosemorphology.logic() doseMorphologyLogic.SetAndObserveDoseMorphologyNode(doseMorphologyNode) doseMorphologyLogic.MorphDose() # print "finished step1" # Step 2: simulate patient motion # #first convert ribbon model to labelmap # inputContourNode.SetAndObserveRasterizationReferenceVolumeNodeId(referenceDoseVolumeNode.GetID()) # inputContourNode.SetRasterizationOversamplingFactor(1.0) # tempLabelmapNode = inputContourNode.GetIndexedLabelmapVolumeNode() from vtkSlicerMotionSimulatorDoubleArrayModuleMRML import vtkMRMLMotionSimulatorDoubleArrayNode motionSimulatorDoubleArrayNode = vtkMRMLMotionSimulatorDoubleArrayNode() slicer.mrmlScene.AddNode(motionSimulatorDoubleArrayNode) from vtkSlicerMotionSimulatorModuleLogic import vtkMRMLMotionSimulatorNode motionSimulatorNode = vtkMRMLMotionSimulatorNode() slicer.mrmlScene.AddNode(motionSimulatorNode) motionSimulatorNode.SetAndObserveInputDoseVolumeNode(outputDoseVolumeNode) motionSimulatorNode.SetAndObserveInputContourNode(inputContourNode) motionSimulatorNode.SetAndObserveOutputDoubleArrayNode(motionSimulatorDoubleArrayNode) motionSimulatorNode.SetNumberOfSimulation(numberOfSimulations) motionSimulatorNode.SetNumberOfFraction(numberOfFractions) motionSimulatorNode.SetXSysSD(systemError) motionSimulatorNode.SetYSysSD(systemError) motionSimulatorNode.SetZSysSD(systemError) motionSimulatorNode.SetXRdmSD(randomError) motionSimulatorNode.SetYRdmSD(randomError) motionSimulatorNode.SetZRdmSD(randomError) motionSimualtorLogic = slicer.modules.motionsimulator.logic() motionSimualtorLogic.SetAndObserveMotionSimulatorNode(motionSimulatorNode) motionSimualtorLogic.RunSimulation() # print "finished step2" # Step 3: dose population histogram from vtkSlicerDosePopulationHistogramModuleLogic import vtkMRMLDosePopulationHistogramNode dosePopulationHistogramNode = vtkMRMLDosePopulationHistogramNode() slicer.mrmlScene.AddNode(dosePopulationHistogramNode) outputDoubleArrayNode = slicer.vtkMRMLDoubleArrayNode() slicer.mrmlScene.AddNode(outputDoubleArrayNode) dosePopulationHistogramNode.SetAndObserveDoubleArrayNode(motionSimulatorDoubleArrayNode) dosePopulationHistogramNode.SetAndObserveDoseVolumeNode(inputDoseVolumeNode) dosePopulationHistogramNode.SetAndObserveContourNode(inputContourNode) dosePopulationHistogramNode.SetAndObserveOutputDoubleArrayNode(outputDoubleArrayNode) dosePopulationHistogramNode.SetUseDoseOptionToD98() dosePopulationHistogramLogic = slicer.modules.dosepopulationhistogram.logic() dosePopulationHistogramLogic.SetAndObserveDosePopulationHistogramNode(dosePopulationHistogramNode) dosePopulationHistogramLogic.ComputeDPH() # print "finished step3" arrayNode = outputDoubleArrayNode doubleArray = arrayNode.GetArray() numberOfTuples = doubleArray.GetNumberOfTuples() value = doubleArray.GetComponent(97, 1) # remove all the nodes slicer.mrmlScene.RemoveNode(outputDoseVolumeNode) del outputDoseVolumeNode slicer.mrmlScene.RemoveNode(doseMorphologyNode) del doseMorphologyNode slicer.mrmlScene.RemoveNode(motionSimulatorDoubleArrayNode) del motionSimulatorDoubleArrayNode slicer.mrmlScene.RemoveNode(motionSimulatorNode) del motionSimulatorNode slicer.mrmlScene.RemoveNode(dosePopulationHistogramNode) del dosePopulationHistogramNode slicer.mrmlScene.RemoveNode(outputDoubleArrayNode) del outputDoubleArrayNode return value/100.0 """
def onLabelVolumeChanged(self): # iterate over the label image and collect the IJK for each label element labelNode = self.__fSelector.currentNode() mvNode = self.__mvSelector.currentNode() if labelNode != None and mvNode != None: labelID = labelNode.GetID() img = labelNode.GetImageData() extent = img.GetWholeExtent() labeledVoxels = {} for i in range(extent[1]): for j in range(extent[3]): for k in range(extent[5]): labelValue = img.GetScalarComponentAsFloat(i,j,k,0) if labelValue: if labelValue in labeledVoxels.keys(): labeledVoxels[labelValue].append([i,j,k]) else: labeledVoxels[labelValue] = [] labeledVoxels[labelValue].append([i,j,k]) # go over all elements, calculate the mean in each frame for each label # and add to the chart array nComponents = self.__mvNode.GetNumberOfFrames() dataNodes = {} for k in labeledVoxels.keys(): dataNodes[k] = slicer.mrmlScene.AddNode(slicer.vtkMRMLDoubleArrayNode()) dataNodes[k].GetArray().SetNumberOfTuples(nComponents) mvImage = self.__mvNode.GetImageData() for c in range(nComponents): for k in labeledVoxels.keys(): arr = dataNodes[k].GetArray() mean = 0. cnt = 0. for v in labeledVoxels[k]: mean = mean+mvImage.GetScalarComponentAsFloat(v[0],v[1],v[2],c) cnt = cnt+1 arr.SetComponent(c, 0, self.__mvLabels[c]) arr.SetComponent(c, 1, mean/cnt) arr.SetComponent(c, 2, 0) # setup color node colorNodeID = labelNode.GetDisplayNode().GetColorNodeID() colorNode = labelNode.GetDisplayNode().GetColorNode() lut = colorNode.GetLookupTable() # add initialized data nodes to the chart self.__cn.ClearArrays() for k in labeledVoxels.keys(): name = colorNode.GetColorName(k) self.__cn.AddArray(name, dataNodes[k].GetID()) #self.__cn.SetProperty(name, "lookupTable", colorNodeID) rgb = lut.GetTableValue(int(k)) colorStr = self.RGBtoHex(rgb[0]*255,rgb[1]*255,rgb[2]*255) self.__cn.SetProperty(name, "color", colorStr) self.__cvn.Modified() tag = str(self.__mvNode.GetAttribute('MultiVolume.FrameIdentifyingDICOMTagName')) units = str(self.__mvNode.GetAttribute('MultiVolume.FrameIdentifyingDICOMTagUnits')) xTitle = tag+', '+units self.__cn.SetProperty('default','xAxisLabel',xTitle) self.__cn.SetProperty('default','yAxisLabel','mean signal intensity') self.__cvn.SetChartNodeID(self.__cn.GetID())
def chartTest(self): import math, random lns = slicer.mrmlScene.GetNodesByClass('vtkMRMLLayoutNode') lns.InitTraversal() ln = lns.GetNextItemAsObject() ln.SetViewArrangement(24) chartView = findChildren(className='qMRMLChartView')[0] print( chartView.connect("dataMouseOver(const char *,int,double,double)", self.chartMouseOverCallback)) print( chartView.connect( "dataPointClicked(const char *,int,double,double)", self.chartCallback)) cvns = slicer.mrmlScene.GetNodesByClass('vtkMRMLChartViewNode') cvns.InitTraversal() cvn = cvns.GetNextItemAsObject() dn = slicer.mrmlScene.AddNode(slicer.vtkMRMLDoubleArrayNode()) a = dn.GetArray() a.SetNumberOfTuples(600) x = range(0, 600) phase = random.random() for i in range(len(x)): a.SetComponent(i, 0, x[i] / 50.0) a.SetComponent(i, 1, math.sin(phase + x[i] / 50.0)) a.SetComponent(i, 2, 0) dn2 = slicer.mrmlScene.AddNode(slicer.vtkMRMLDoubleArrayNode()) a = dn2.GetArray() a.SetNumberOfTuples(600) x = range(0, 600) for i in range(len(x)): a.SetComponent(i, 0, x[i] / 50.0) a.SetComponent(i, 1, math.cos(phase + x[i] / 50.0)) a.SetComponent(i, 2, 0) cn = slicer.mrmlScene.AddNode(slicer.vtkMRMLChartNode()) cn.AddArray('A double array', dn.GetID()) cn.AddArray('Another double array', dn2.GetID()) cvn.SetChartNodeID(cn.GetID()) cn.SetProperty('default', 'title', 'A simple chart with 2 curves') cn.SetProperty('default', 'xAxisLabel', 'Something in x') cn.SetProperty('default', 'yAxisLabel', 'Something in y') cvn.SetChartNodeID(cn.GetID()) cn = slicer.mrmlScene.AddNode(slicer.vtkMRMLChartNode()) print cn.GetID() cn.AddArray('Just one array', dn.GetID()) cn.SetProperty('default', 'title', 'A simple chart with 1 curve') cn.SetProperty('default', 'xAxisLabel', 'Just x') cn.SetProperty('default', 'yAxisLabel', 'Just y') cn = slicer.mrmlScene.AddNode(slicer.vtkMRMLChartNode()) print cn.GetID() cn.AddArray('The other array', dn2.GetID()) cn.SetProperty('default', 'title', 'A simple chart with another curve') cn.SetProperty('default', 'xAxisLabel', 'time') cn.SetProperty('default', 'yAxisLabel', 'velocity') cn.SetProperty('The other array', 'showLines', 'on') cn.SetProperty('The other array', 'showMarkers', 'off') cn.SetProperty('The other array', 'color', '#fe7d20') dn3 = slicer.mrmlScene.AddNode(slicer.vtkMRMLDoubleArrayNode()) print dn3.GetID() a = dn3.GetArray() a.SetNumberOfTuples(12) x = range(0, 12) for i in range(len(x)): a.SetComponent(i, 0, x[i] / 4.0) a.SetComponent(i, 1, math.sin(x[i] / 4.0)) a.SetComponent(i, 2, 0) cn = slicer.mrmlScene.AddNode(slicer.vtkMRMLChartNode()) print cn.GetID() cn.AddArray('Periodic', dn3.GetID()) cn.SetProperty('default', 'title', 'A bar chart') cn.SetProperty('default', 'xAxisLabel', 'time') cn.SetProperty('default', 'yAxisLabel', 'velocity') cn.SetProperty('default', 'type', 'Bar')
def onApplyThreshold(self): min,max = self.getDistanceBound() newPoints = vtk.vtkPoints() newLines = vtk.vtkCellArray() newTensors = vtk.vtkFloatArray() newTensors.SetNumberOfComponents(9) newScalars = vtk.vtkFloatArray() points = self.inputPolyData.GetPoints() lines = self.inputPolyData.GetLines() tensors = self.inputPolyData.GetPointData().GetTensors() lines.InitTraversal() newId = 0 for length in self.distanceTable: if length<=self.thresholdMax.value and length>=self.thresholdMin.value: ids = vtk.vtkIdList() lines.GetNextCell(ids) newLine = vtk.vtkPolyLine() #print(ids.GetNumberOfIds()) newLine.GetPointIds().SetNumberOfIds(ids.GetNumberOfIds()) #print(((length-min)/(max-min))*100) for i in range(ids.GetNumberOfIds()): newPoints.InsertNextPoint(points.GetPoint(ids.GetId(i))) newLine.GetPointIds().SetId(i,newId) newScalars.InsertNextValue(((length-min)/(max-min))) newId += 1 tensorValue = [0]*9 if(tensors != None): for j in range(9): tensorValue[j] = tensors.GetComponent(ids.GetId(i),j) newTensors.InsertNextTuple(tensorValue) newLines.InsertNextCell(newLine) self.outputPolyData = vtk.vtkPolyData() self.outputPolyData.SetPoints(newPoints) self.outputPolyData.SetLines(newLines) self.outputPolyData.GetPointData().SetTensors(newTensors) newScalars.SetName("Length") self.outputPolyData.GetPointData().AddArray(newScalars) self.outputNode.SetAndObservePolyData(self.outputPolyData) chartViewNodes = slicer.mrmlScene.GetNodesByClass('vtkMRMLChartViewNode') chartViewNodes.InitTraversal() chartViewNode = chartViewNodes.GetNextItemAsObject() arrayNode = slicer.mrmlScene.AddNode(slicer.vtkMRMLDoubleArrayNode()) array = arrayNode.GetArray() array.SetNumberOfTuples(10) step = (max-min)/10 interMin = min interMax = min+step for i in range(10): numberOfFibers = 0 for length in self.distanceTable: if length<=interMax and length>=interMin and length<=self.thresholdMax.value and length>=self.thresholdMin.value: numberOfFibers += 1 array.SetComponent(i,0,(interMin+interMax)/2) array.SetComponent(i,1,numberOfFibers) array.SetComponent(i,2,0) interMin += step interMax += step chartNode = slicer.mrmlScene.AddNode(slicer.vtkMRMLChartNode()) chartNode.AddArray("Fiber Length",arrayNode.GetID()) chartViewNode.SetChartNodeID(chartNode.GetID()) chartNode.SetProperty('default', 'title', 'Length Distribution') chartNode.SetProperty('default', 'xAxisLabel', 'Length') chartNode.SetProperty('default', 'yAxisLabel', 'Distribution') chartNode.SetProperty('default', 'type', 'Bar')
def onChartRequested(self): # iterate over the label image and collect the IJK for each label element labelNode = self.__fSelector.currentNode() mvNode = self.__mvSelector.currentNode() if labelNode == None or mvNode == None: return labelID = labelNode.GetID() img = labelNode.GetImageData() extent = img.GetWholeExtent() labeledVoxels = {} for i in range(extent[1]): for j in range(extent[3]): for k in range(extent[5]): labelValue = img.GetScalarComponentAsFloat(i,j,k,0) if labelValue: if labelValue in labeledVoxels.keys(): labeledVoxels[labelValue].append([i,j,k]) else: labeledVoxels[labelValue] = [] labeledVoxels[labelValue].append([i,j,k]) # go over all elements, calculate the mean in each frame for each label # and add to the chart array nComponents = self.__mvNode.GetNumberOfFrames() dataNodes = {} for k in labeledVoxels.keys(): dataNodes[k] = slicer.mrmlScene.AddNode(slicer.vtkMRMLDoubleArrayNode()) dataNodes[k].GetArray().SetNumberOfTuples(nComponents) mvImage = self.__mvNode.GetImageData() for c in range(nComponents): for k in labeledVoxels.keys(): arr = dataNodes[k].GetArray() mean = 0. cnt = 0. for v in labeledVoxels[k]: mean = mean+mvImage.GetScalarComponentAsFloat(v[0],v[1],v[2],c) cnt = cnt+1 arr.SetComponent(c, 0, self.__mvLabels[c]) arr.SetComponent(c, 1, mean/cnt) arr.SetComponent(c, 2, 0) if self.iChartingPercent.checked: nBaselines = min(self.baselineFrames.value,nComponents) for k in labeledVoxels.keys(): arr = dataNodes[k].GetArray() baseline = 0 for bc in range(nBaselines): baseline += arr.GetComponent(bc,1) baseline /= nBaselines if baseline != 0: for ic in range(nComponents): intensity = arr.GetComponent(ic,1) percentChange = (intensity/baseline-1)*100. arr.SetComponent(ic,1,percentChange) layoutNodes = slicer.mrmlScene.GetNodesByClass('vtkMRMLLayoutNode') layoutNodes.SetReferenceCount(layoutNodes.GetReferenceCount()-1) layoutNodes.InitTraversal() layoutNode = layoutNodes.GetNextItemAsObject() layoutNode.SetViewArrangement(slicer.vtkMRMLLayoutNode.SlicerLayoutConventionalQuantitativeView) chartViewNodes = slicer.mrmlScene.GetNodesByClass('vtkMRMLChartViewNode') chartViewNodes.SetReferenceCount(chartViewNodes.GetReferenceCount()-1) chartViewNodes.InitTraversal() chartViewNode = chartViewNodes.GetNextItemAsObject() chartNode = slicer.mrmlScene.AddNode(slicer.vtkMRMLChartNode()) # setup color node colorNodeID = labelNode.GetDisplayNode().GetColorNodeID() colorNode = labelNode.GetDisplayNode().GetColorNode() lut = colorNode.GetLookupTable() # add initialized data nodes to the chart chartNode.ClearArrays() for k in labeledVoxels.keys(): name = colorNode.GetColorName(k) chartNode.AddArray(name, dataNodes[k].GetID()) rgb = lut.GetTableValue(int(k)) colorStr = self.RGBtoHex(rgb[0]*255,rgb[1]*255,rgb[2]*255) chartNode.SetProperty(name, "color", colorStr) tag = str(self.__mvNode.GetAttribute('MultiVolume.FrameIdentifyingDICOMTagName')) units = str(self.__mvNode.GetAttribute('MultiVolume.FrameIdentifyingDICOMTagUnits')) xTitle = tag+', '+units chartNode.SetProperty('default','xAxisLabel',xTitle) if self.iChartingPercent.checked: chartNode.SetProperty('default','yAxisLabel','change relative to baseline, %') else: chartNode.SetProperty('default','yAxisLabel','mean signal intensity') chartViewNode.SetChartNodeID(chartNode.GetID())
def grafTiempo(self): # Switch to a layout (24) that contains a Chart View to initiate the construction of the widget and Chart View Node lns = slicer.mrmlScene.GetNodesByClass('vtkMRMLLayoutNode') lns.InitTraversal() ln = lns.GetNextItemAsObject() ln.SetViewArrangement(24) vectorintensidad = [] # Get the Chart View Node cvns = slicer.mrmlScene.GetNodesByClass('vtkMRMLChartViewNode') cvns.InitTraversal() cvn = cvns.GetNextItemAsObject() # Create an Array Node and add some data dn = slicer.mrmlScene.AddNode(slicer.vtkMRMLDoubleArrayNode()) a = dn.GetArray() a.SetNumberOfTuples(27) #Volumen escena = slicer.mrmlScene #Se recupera la escena cargada volumen4D = self.inputSelector5.currentNode() imagenvtk4D = volumen4D.GetImageData() numero_imagenes = volumen4D.GetNumberOfFrames() for i in range(0, numero_imagenes, 1): extract2 = vtk.vtkImageExtractComponents() extract2.SetInputData(imagenvtk4D) imagen_movil = extract2.SetComponents(i) extract2.Update() #Matriz de transformacion ras2ijk = vtk.vtkMatrix4x4() ijk2ras = vtk.vtkMatrix4x4() #Se solicita al volumen original que devuelva las matrices volumen4D.GetRASToIJKMatrix(ras2ijk) volumen4D.GetIJKToRASMatrix(ijk2ras) #Se crea un volumen movil, y se realiza el mismo procedimiento que con el fijo volumenMovil = slicer.vtkMRMLScalarVolumeNode() volumenMovil.SetRASToIJKMatrix(ras2ijk) volumenMovil.SetIJKToRASMatrix(ijk2ras) volumenMovil.SetAndObserveImageData(extract2.GetOutput()) escena.AddNode(volumenMovil) z = slicer.util.arrayFromVolume(volumenMovil) m = np.mean(z[:]) vectorintensidad.append((m / 15000) - 1) for i in range(0, numero_imagenes): a.SetComponent(i, 0, i * 11.11) a.SetComponent(i, 1, vectorintensidad[i]) a.SetComponent(i, 2, 0) # Create a Chart Node. cn = slicer.mrmlScene.AddNode(slicer.vtkMRMLChartNode()) # Add the Array Nodes to the Chart. The first argument is a string used for the legend and to refer to the Array when setting properties. # Set a few properties on the Chart. The first argument is a string identifying which Array to assign the property. # 'default' is used to assign a property to the Chart itself (as opposed to an Array Node). cn.SetProperty('default', 'title', 'intesidad vs tiempo') cn.SetProperty('default', 'xAxisLabel', 'Tiempo(s)') cn.SetProperty('default', 'yAxisLabel', 'Intensidad') # Tell the Chart View which Chart to display cvn.SetChartNodeID(cn.GetID())
def onApplyThreshold(self): min, max = self.getDistanceBound() newPoints = vtk.vtkPoints() newLines = vtk.vtkCellArray() newTensors = vtk.vtkFloatArray() newTensors.SetNumberOfComponents(9) newScalars = vtk.vtkFloatArray() points = self.inputPolyData.GetPoints() lines = self.inputPolyData.GetLines() tensors = self.inputPolyData.GetPointData().GetTensors() lines.InitTraversal() newId = 0 for length in self.distanceTable: if length <= self.thresholdMax.value and length >= self.thresholdMin.value: ids = vtk.vtkIdList() lines.GetNextCell(ids) newLine = vtk.vtkPolyLine() #print(ids.GetNumberOfIds()) newLine.GetPointIds().SetNumberOfIds(ids.GetNumberOfIds()) #print(((length-min)/(max-min))*100) for i in range(ids.GetNumberOfIds()): newPoints.InsertNextPoint(points.GetPoint(ids.GetId(i))) newLine.GetPointIds().SetId(i, newId) newScalars.InsertNextValue(((length - min) / (max - min))) newId += 1 tensorValue = [0] * 9 if (tensors != None): for j in range(9): tensorValue[j] = tensors.GetComponent( ids.GetId(i), j) newTensors.InsertNextTuple(tensorValue) newLines.InsertNextCell(newLine) self.outputPolyData = vtk.vtkPolyData() self.outputPolyData.SetPoints(newPoints) self.outputPolyData.SetLines(newLines) self.outputPolyData.GetPointData().SetTensors(newTensors) newScalars.SetName("Length") self.outputPolyData.GetPointData().AddArray(newScalars) self.outputNode.SetAndObservePolyData(self.outputPolyData) chartViewNodes = slicer.mrmlScene.GetNodesByClass( 'vtkMRMLChartViewNode') chartViewNodes.InitTraversal() chartViewNode = chartViewNodes.GetNextItemAsObject() arrayNode = slicer.mrmlScene.AddNode(slicer.vtkMRMLDoubleArrayNode()) array = arrayNode.GetArray() array.SetNumberOfTuples(10) step = (max - min) / 10 interMin = min interMax = min + step for i in range(10): numberOfFibers = 0 for length in self.distanceTable: if length <= interMax and length >= interMin and length <= self.thresholdMax.value and length >= self.thresholdMin.value: numberOfFibers += 1 array.SetComponent(i, 0, (interMin + interMax) / 2) array.SetComponent(i, 1, numberOfFibers) array.SetComponent(i, 2, 0) interMin += step interMax += step chartNode = slicer.mrmlScene.AddNode(slicer.vtkMRMLChartNode()) chartNode.AddArray("Fiber Length", arrayNode.GetID()) chartViewNode.SetChartNodeID(chartNode.GetID()) chartNode.SetProperty('default', 'title', 'Length Distribution') chartNode.SetProperty('default', 'xAxisLabel', 'Length') chartNode.SetProperty('default', 'yAxisLabel', 'Distribution') chartNode.SetProperty('default', 'type', 'Bar')
def test_Charting1(self): """ Testing charting """ self.delayDisplay("Starting the test") # # first, get some data # #import urllib #downloads = ( # ('http://slicer.kitware.com/midas3/download?items=5767', 'FA.nrrd', slicer.util.loadVolume), # ) # #for url,name,loader in downloads: # filePath = slicer.app.temporaryPath + '/' + name # if not os.path.exists(filePath) or os.stat(filePath).st_size == 0: # print('Requesting download %s from %s...\n' % (name, url)) # urllib.urlretrieve(url, filePath) # if loader: # print('Loading %s...\n' % (name,)) # loader(filePath) #self.delayDisplay('Finished with download and loading\n') #volumeNode = slicer.util.getNode(pattern="FA") #logic = ChartingLogic() #self.assertTrue( logic.hasImageData(volumeNode) ) # Change the layout to one that has a chart. This created the ChartView ln = slicer.util.getNode(pattern='vtkMRMLLayoutNode*') ln.SetViewArrangement(24) # Get the first ChartView node cvn = slicer.util.getNode(pattern='vtkMRMLChartViewNode*') # Create arrays of data dn = slicer.mrmlScene.AddNode(slicer.vtkMRMLDoubleArrayNode()) a = dn.GetArray() a.SetNumberOfTuples(600) x = range(0, 600) for i in range(len(x)): a.SetComponent(i, 0, x[i]/50.0) a.SetComponent(i, 1, math.sin(x[i]/50.0)) a.SetComponent(i, 2, 0) dn2 = slicer.mrmlScene.AddNode(slicer.vtkMRMLDoubleArrayNode()) a = dn2.GetArray() a.SetNumberOfTuples(600) x = range(0, 600) for i in range(len(x)): a.SetComponent(i, 0, x[i]/50.0) a.SetComponent(i, 1, math.cos(x[i]/50.0)) a.SetComponent(i, 2, 0) # Create the ChartNode, cn = slicer.mrmlScene.AddNode(slicer.vtkMRMLChartNode()) # Add data to the Chart cn.AddArray('A double array', dn.GetID()) cn.AddArray('Another double array', dn2.GetID()) # Configure properties of the Chart cn.SetProperty('default', 'title', 'A simple chart with 2 curves') cn.SetProperty('default', 'xAxisLabel', 'Something in x') cn.SetProperty('default', 'yAxisLabel', 'Something in y') # Set the chart to display cvn.SetChartNodeID(cn.GetID()) self.delayDisplay('A simple chart with 2 curves') # Create another ChartNode cn = slicer.mrmlScene.AddNode(slicer.vtkMRMLChartNode()) # Add data to the Chart cn.AddArray('Just one array', dn.GetID()) # Configure properties of the chart cn.SetProperty('default', 'title', 'A simple chart with 1 curve') cn.SetProperty('default', 'xAxisLabel', 'Just x') cn.SetProperty('default', 'yAxisLabel', 'Just y') # Set the chart to display cvn.SetChartNodeID(cn.GetID()) self.delayDisplay('A simple chart with 1 curve') # Create another ChartNode cn = slicer.mrmlScene.AddNode(slicer.vtkMRMLChartNode()) # Add data to the Chart cn.AddArray('The other array', dn2.GetID()) # Set properties on the chart cn.SetProperty('default', 'title', 'A simple chart with another curve') cn.SetProperty('default', 'xAxisLabel', 'time') cn.SetProperty('default', 'yAxisLabel', 'velocity') cn.SetProperty('The other array', 'showLines', 'on') cn.SetProperty('The other array', 'showMarkers', 'off') cn.SetProperty('The other array', 'color', '#fe7d20') # Set the chart to display cvn.SetChartNodeID(cn.GetID()) self.delayDisplay('A simple chart with another curve') # Create another data array dn3 = slicer.mrmlScene.AddNode(slicer.vtkMRMLDoubleArrayNode()) a = dn3.GetArray() a.SetNumberOfTuples(12) x = range(0, 12) for i in range(len(x)): a.SetComponent(i, 0, x[i]/4.0) a.SetComponent(i, 1, math.sin(x[i]/4.0)) a.SetComponent(i, 2, 0) # Create another ChartNode cn = slicer.mrmlScene.AddNode(slicer.vtkMRMLChartNode()) # Add data to the chart cn.AddArray('Periodic', dn3.GetID()) # Configure properties of the Chart cn.SetProperty('default', 'title', 'A bar chart') cn.SetProperty('default', 'xAxisLabel', 'time') cn.SetProperty('default', 'yAxisLabel', 'velocity') cn.SetProperty('default', 'type', 'Bar'); # Set the chart to display cvn.SetChartNodeID(cn.GetID()) self.delayDisplay('A bar chart') # self.delayDisplay('Test passed!')
def test_Charting1(self): """ Testing charting """ self.delayDisplay("Starting the test") # # first, get some data # # import urllib # downloads = ( # ('http://slicer.kitware.com/midas3/download?items=5767', 'FA.nrrd', slicer.util.loadVolume), # ) # # for url,name,loader in downloads: # filePath = slicer.app.temporaryPath + '/' + name # if not os.path.exists(filePath) or os.stat(filePath).st_size == 0: # print('Requesting download %s from %s...\n' % (name, url)) # urllib.urlretrieve(url, filePath) # if loader: # print('Loading %s...\n' % (name,)) # loader(filePath) # self.delayDisplay('Finished with download and loading\n') # volumeNode = slicer.util.getNode(pattern="FA") # logic = ChartingLogic() # self.assertTrue( logic.hasImageData(volumeNode) ) # Change the layout to one that has a chart. This created the ChartView ln = slicer.util.getNode(pattern="vtkMRMLLayoutNode*") ln.SetViewArrangement(24) # Get the first ChartView node cvn = slicer.util.getNode(pattern="vtkMRMLChartViewNode*") # Create arrays of data dn = slicer.mrmlScene.AddNode(slicer.vtkMRMLDoubleArrayNode()) a = dn.GetArray() a.SetNumberOfTuples(600) x = range(0, 600) for i in range(len(x)): a.SetComponent(i, 0, x[i] / 50.0) a.SetComponent(i, 1, math.sin(x[i] / 50.0)) a.SetComponent(i, 2, 0) dn2 = slicer.mrmlScene.AddNode(slicer.vtkMRMLDoubleArrayNode()) a = dn2.GetArray() a.SetNumberOfTuples(600) x = range(0, 600) for i in range(len(x)): a.SetComponent(i, 0, x[i] / 50.0) a.SetComponent(i, 1, math.cos(x[i] / 50.0)) a.SetComponent(i, 2, 0) # Create the ChartNode, cn = slicer.mrmlScene.AddNode(slicer.vtkMRMLChartNode()) # Add data to the Chart cn.AddArray("A double array", dn.GetID()) cn.AddArray("Another double array", dn2.GetID()) # Configure properties of the Chart cn.SetProperty("default", "title", "A simple chart with 2 curves") cn.SetProperty("default", "xAxisLabel", "Something in x") cn.SetProperty("default", "yAxisLabel", "Something in y") # Set the chart to display cvn.SetChartNodeID(cn.GetID()) self.delayDisplay("A simple chart with 2 curves") # Create another ChartNode cn = slicer.mrmlScene.AddNode(slicer.vtkMRMLChartNode()) # Add data to the Chart cn.AddArray("Just one array", dn.GetID()) # Configure properties of the chart cn.SetProperty("default", "title", "A simple chart with 1 curve") cn.SetProperty("default", "xAxisLabel", "Just x") cn.SetProperty("default", "yAxisLabel", "Just y") # Set the chart to display cvn.SetChartNodeID(cn.GetID()) self.delayDisplay("A simple chart with 1 curve") # Create another ChartNode cn = slicer.mrmlScene.AddNode(slicer.vtkMRMLChartNode()) # Add data to the Chart cn.AddArray("The other array", dn2.GetID()) # Set properties on the chart cn.SetProperty("default", "title", "A simple chart with another curve") cn.SetProperty("default", "xAxisLabel", "time") cn.SetProperty("default", "yAxisLabel", "velocity") cn.SetProperty("The other array", "showLines", "on") cn.SetProperty("The other array", "showMarkers", "off") cn.SetProperty("The other array", "color", "#fe7d20") # Set the chart to display cvn.SetChartNodeID(cn.GetID()) self.delayDisplay("A simple chart with another curve") # Create another data array dn3 = slicer.mrmlScene.AddNode(slicer.vtkMRMLDoubleArrayNode()) a = dn3.GetArray() a.SetNumberOfTuples(12) x = range(0, 12) for i in range(len(x)): a.SetComponent(i, 0, x[i] / 4.0) a.SetComponent(i, 1, math.sin(x[i] / 4.0)) a.SetComponent(i, 2, 0) # Create another ChartNode cn = slicer.mrmlScene.AddNode(slicer.vtkMRMLChartNode()) # Add data to the chart cn.AddArray("Periodic", dn3.GetID()) # Configure properties of the Chart cn.SetProperty("default", "title", "A bar chart") cn.SetProperty("default", "xAxisLabel", "time") cn.SetProperty("default", "yAxisLabel", "velocity") cn.SetProperty("default", "type", "Bar") # Set the chart to display cvn.SetChartNodeID(cn.GetID()) self.delayDisplay("A bar chart") # Test using a date axis # # Create another data array dn4 = slicer.mrmlScene.AddNode(slicer.vtkMRMLDoubleArrayNode()) a = dn4.GetArray() # ugh, python uses localtime dates = [ "3/27/2010", "6/15/2010", "12/14/2010", "3/8/2011", "9/5/2011", "12/20/2011", "3/17/2012", "6/12/2012", "9/22/2012", "12/14/2012", "3/23/2012", ] # dates = ["3/27/2010","6/15/2010","9/21/2010","12/14/2010","3/8/2011","5/31/2011","9/5/2011","12/20/2011","3/17/2012","6/12/2012","9/22/2012","12/14/2012","3/23/2012"] times = [] for i in range(len(dates)): times.append(time.mktime(datetime.datetime.strptime(dates[i], "%m/%d/%Y").timetuple())) a.SetNumberOfTuples(len(times)) for i in range(len(times)): a.SetComponent(i, 0, times[i]) a.SetComponent(i, 1, math.sin(x[i] / 4.0) + 4) a.SetComponent(i, 2, 0) # Create another ChartNode cn = slicer.mrmlScene.AddNode(slicer.vtkMRMLChartNode()) # Add data to the chart cn.AddArray("Lesion #1", dn4.GetID()) # Configure properties of the Chart cn.SetProperty("default", "title", "A chart with dates") cn.SetProperty("default", "xAxisLabel", "date") cn.SetProperty("default", "xAxisType", "date") cn.SetProperty("default", "yAxisLabel", "size (cm)") cn.SetProperty("default", "type", "Bar") # Set the chart to display cvn.SetChartNodeID(cn.GetID()) self.delayDisplay("A chart with dates") # Test using a color table to look up label names # # # Create another data array dn5 = slicer.mrmlScene.AddNode(slicer.vtkMRMLDoubleArrayNode()) a = dn5.GetArray() a.SetNumberOfTuples(4) a.SetComponent(0, 0, 6) a.SetComponent(0, 1, 32) a.SetComponent(1, 0, 3) a.SetComponent(1, 1, 12) a.SetComponent(2, 0, 4) a.SetComponent(2, 1, 20) a.SetComponent(3, 0, 5) a.SetComponent(3, 1, 6) # Create another ChartNode cn = slicer.mrmlScene.AddNode(slicer.vtkMRMLChartNode()) # Add data to the chart cn.AddArray("Volumes", dn5.GetID()) # Configure properties of the Chart cn.SetProperty("default", "title", "A chart with labels") cn.SetProperty("default", "xAxisLabel", "structure") cn.SetProperty("default", "xAxisType", "categorical") cn.SetProperty("default", "yAxisLabel", "size (cm)") cn.SetProperty("default", "type", "Bar") cn.SetProperty("Volumes", "lookupTable", slicer.util.getNode("GenericAnatomyColors").GetID()) # Set the chart to display cvn.SetChartNodeID(cn.GetID()) self.delayDisplay("A chart with labels") # Test box plots # # # Create another data array dn6 = slicer.mrmlScene.AddNode(slicer.vtkMRMLDoubleArrayNode()) a = dn6.GetArray() a.SetNumberOfTuples(40) for i in range(a.GetNumberOfTuples()): a.SetComponent(i, 0, 1) a.SetComponent(i, 1, (2.0 * random.random() - 0.5) + 20.0) # Create another data array dn7 = slicer.mrmlScene.AddNode(slicer.vtkMRMLDoubleArrayNode()) a = dn7.GetArray() a.SetNumberOfTuples(25) for i in range(20): a.SetComponent(i, 0, 2) a.SetComponent(i, 1, 2.0 * (2.0 * random.random() - 1.0) + 27.0) for i in range(5): a.SetComponent(20 + i, 0, 2) a.SetComponent(20 + i, 1, 10.0 * (2.0 * random.random() - 1.0) + 27.0) # Create another data array dn8 = slicer.mrmlScene.AddNode(slicer.vtkMRMLDoubleArrayNode()) a = dn8.GetArray() a.SetNumberOfTuples(25) for i in range(20): a.SetComponent(i, 0, 3) a.SetComponent(i, 1, 3.0 * (2.0 * random.random() - 1.0) + 24.0) for i in range(5): a.SetComponent(20 + i, 0, 2) a.SetComponent(20 + i, 1, 10.0 * (2.0 * random.random() - 1.0) + 24.0) # Create another ChartNode cn = slicer.mrmlScene.AddNode(slicer.vtkMRMLChartNode()) # Add data to the chart cn.AddArray("Controls", dn6.GetID()) cn.AddArray("Group A", dn7.GetID()) cn.AddArray("Group B", dn8.GetID()) # Configure properties of the Chart cn.SetProperty("default", "title", "A box chart") cn.SetProperty("default", "xAxisLabel", "population") cn.SetProperty("default", "xAxisType", "categorical") cn.SetProperty("default", "yAxisLabel", "size (ml)") cn.SetProperty("default", "type", "Box") # Set the chart to display cvn.SetChartNodeID(cn.GetID()) self.delayDisplay("A box chart") # self.delayDisplay("Test passed!")
def test_Charting1(self): """ Testing charting """ self.delayDisplay("Starting the test") # # first, get some data # #import urllib #downloads = ( # ('http://slicer.kitware.com/midas3/download?items=5767', 'FA.nrrd', slicer.util.loadVolume), # ) # #for url,name,loader in downloads: # filePath = slicer.app.temporaryPath + '/' + name # if not os.path.exists(filePath) or os.stat(filePath).st_size == 0: # print('Requesting download %s from %s...\n' % (name, url)) # urllib.urlretrieve(url, filePath) # if loader: # print('Loading %s...\n' % (name,)) # loader(filePath) #self.delayDisplay('Finished with download and loading\n') #volumeNode = slicer.util.getNode(pattern="FA") #logic = ChartingLogic() #self.assertTrue( logic.hasImageData(volumeNode) ) # Change the layout to one that has a chart. This created the ChartView ln = slicer.util.getNode(pattern='vtkMRMLLayoutNode*') ln.SetViewArrangement(24) # Get the first ChartView node cvn = slicer.util.getNode(pattern='vtkMRMLChartViewNode*') # Create arrays of data dn = slicer.mrmlScene.AddNode(slicer.vtkMRMLDoubleArrayNode()) a = dn.GetArray() a.SetNumberOfTuples(600) x = range(0, 600) for i in range(len(x)): a.SetComponent(i, 0, x[i]/50.0) a.SetComponent(i, 1, math.sin(x[i]/50.0)) a.SetComponent(i, 2, 0) dn2 = slicer.mrmlScene.AddNode(slicer.vtkMRMLDoubleArrayNode()) a = dn2.GetArray() a.SetNumberOfTuples(600) x = range(0, 600) for i in range(len(x)): a.SetComponent(i, 0, x[i]/50.0) a.SetComponent(i, 1, math.cos(x[i]/50.0)) a.SetComponent(i, 2, 0) # Create the ChartNode, cn = slicer.mrmlScene.AddNode(slicer.vtkMRMLChartNode()) # Add data to the Chart cn.AddArray('A double array', dn.GetID()) cn.AddArray('Another double array', dn2.GetID()) # Configure properties of the Chart cn.SetProperty('default', 'title', 'A simple chart with 2 curves') cn.SetProperty('default', 'xAxisLabel', 'Something in x') cn.SetProperty('default', 'yAxisLabel', 'Something in y') # Set the chart to display cvn.SetChartNodeID(cn.GetID()) self.delayDisplay('A simple chart with 2 curves') # Create another ChartNode cn = slicer.mrmlScene.AddNode(slicer.vtkMRMLChartNode()) # Add data to the Chart cn.AddArray('Just one array', dn.GetID()) # Configure properties of the chart cn.SetProperty('default', 'title', 'A simple chart with 1 curve') cn.SetProperty('default', 'xAxisLabel', 'Just x') cn.SetProperty('default', 'yAxisLabel', 'Just y') # Set the chart to display cvn.SetChartNodeID(cn.GetID()) self.delayDisplay('A simple chart with 1 curve') # Create another ChartNode cn = slicer.mrmlScene.AddNode(slicer.vtkMRMLChartNode()) # Add data to the Chart cn.AddArray('The other array', dn2.GetID()) # Set properties on the chart cn.SetProperty('default', 'title', 'A simple chart with another curve') cn.SetProperty('default', 'xAxisLabel', 'time') cn.SetProperty('default', 'yAxisLabel', 'velocity') cn.SetProperty('The other array', 'showLines', 'on') cn.SetProperty('The other array', 'showMarkers', 'off') cn.SetProperty('The other array', 'color', '#fe7d20') # Set the chart to display cvn.SetChartNodeID(cn.GetID()) self.delayDisplay('A simple chart with another curve') # Create another data array dn3 = slicer.mrmlScene.AddNode(slicer.vtkMRMLDoubleArrayNode()) a = dn3.GetArray() a.SetNumberOfTuples(12) x = range(0, 12) for i in range(len(x)): a.SetComponent(i, 0, x[i]/4.0) a.SetComponent(i, 1, math.sin(x[i]/4.0)) a.SetComponent(i, 2, 0) # Create another ChartNode cn = slicer.mrmlScene.AddNode(slicer.vtkMRMLChartNode()) # Add data to the chart cn.AddArray('Periodic', dn3.GetID()) # Configure properties of the Chart cn.SetProperty('default', 'title', 'A bar chart') cn.SetProperty('default', 'xAxisLabel', 'time') cn.SetProperty('default', 'yAxisLabel', 'velocity') cn.SetProperty('default', 'type', 'Bar'); # Set the chart to display cvn.SetChartNodeID(cn.GetID()) self.delayDisplay('A bar chart') # Test using a date axis # # Create another data array dn4 = slicer.mrmlScene.AddNode(slicer.vtkMRMLDoubleArrayNode()) a = dn4.GetArray() # ugh, python uses localtime dates = ["3/27/2010","6/15/2010","12/14/2010","3/8/2011","9/5/2011","12/20/2011","3/17/2012","6/12/2012","9/22/2012","12/14/2012","3/23/2012"] #dates = ["3/27/2010","6/15/2010","9/21/2010","12/14/2010","3/8/2011","5/31/2011","9/5/2011","12/20/2011","3/17/2012","6/12/2012","9/22/2012","12/14/2012","3/23/2012"] times = [] for i in range(len(dates)): times.append(time.mktime(datetime.datetime.strptime(dates[i], "%m/%d/%Y").timetuple())) a.SetNumberOfTuples(len(times)) for i in range(len(times)): a.SetComponent(i, 0, times[i]) a.SetComponent(i, 1, math.sin(x[i]/4.0) + 4) a.SetComponent(i, 2, 0) # Create another ChartNode cn = slicer.mrmlScene.AddNode(slicer.vtkMRMLChartNode()) # Add data to the chart cn.AddArray('Lesion #1', dn4.GetID()) # Configure properties of the Chart cn.SetProperty('default', 'title', 'A chart with dates') cn.SetProperty('default', 'xAxisLabel', 'date') cn.SetProperty('default', 'xAxisType', 'date') cn.SetProperty('default', 'yAxisLabel', 'size (cm)') cn.SetProperty('default', 'type', 'Bar'); # Set the chart to display cvn.SetChartNodeID(cn.GetID()) self.delayDisplay('A chart with dates') # Test using a color table to look up label names # # # Create another data array dn5 = slicer.mrmlScene.AddNode(slicer.vtkMRMLDoubleArrayNode()) a = dn5.GetArray() a.SetNumberOfTuples(4) a.SetComponent(0, 0, 6) a.SetComponent(0, 1, 32) a.SetComponent(1, 0, 3) a.SetComponent(1, 1, 12) a.SetComponent(2, 0, 4) a.SetComponent(2, 1, 20) a.SetComponent(3, 0, 5) a.SetComponent(3, 1, 6) # Create another ChartNode cn = slicer.mrmlScene.AddNode(slicer.vtkMRMLChartNode()) # Add data to the chart cn.AddArray('Volumes', dn5.GetID()) # Configure properties of the Chart cn.SetProperty('default', 'title', 'A chart with labels') cn.SetProperty('default', 'xAxisLabel', 'structure') cn.SetProperty('default', 'xAxisType', 'categorical') cn.SetProperty('default', 'yAxisLabel', 'size (cm)') cn.SetProperty('default', 'type', 'Bar'); cn.SetProperty('Volumes', 'lookupTable', slicer.util.getNode('GenericAnatomyColors').GetID() ) # Set the chart to display cvn.SetChartNodeID(cn.GetID()) self.delayDisplay('A chart with labels') # Test box plots # # # Create another data array dn6 = slicer.mrmlScene.AddNode(slicer.vtkMRMLDoubleArrayNode()) a = dn6.GetArray() a.SetNumberOfTuples(40) for i in range(a.GetNumberOfTuples()): a.SetComponent(i, 0, 1) a.SetComponent(i, 1, (2.0*random.random() - 0.5) + 20.0) # Create another data array dn7 = slicer.mrmlScene.AddNode(slicer.vtkMRMLDoubleArrayNode()) a = dn7.GetArray() a.SetNumberOfTuples(25) for i in range(20): a.SetComponent(i, 0, 2) a.SetComponent(i, 1, 2.0*(2.0*random.random()-1.0) + 27.0) for i in range(5): a.SetComponent(20+i, 0, 2) a.SetComponent(20+i, 1, 10.0*(2.0*random.random()-1.0) + 27.0) # Create another data array dn8 = slicer.mrmlScene.AddNode(slicer.vtkMRMLDoubleArrayNode()) a = dn8.GetArray() a.SetNumberOfTuples(25) for i in range(20): a.SetComponent(i, 0, 3) a.SetComponent(i, 1, 3.0*(2.0*random.random()-1.0) + 24.0) for i in range(5): a.SetComponent(20+i, 0, 2) a.SetComponent(20+i, 1, 10.0*(2.0*random.random()-1.0) + 24.0) # Create another ChartNode cn = slicer.mrmlScene.AddNode(slicer.vtkMRMLChartNode()) # Add data to the chart cn.AddArray('Controls', dn6.GetID()) cn.AddArray('Group A', dn7.GetID()) cn.AddArray('Group B', dn8.GetID()) # Configure properties of the Chart cn.SetProperty('default', 'title', 'A box chart') cn.SetProperty('default', 'xAxisLabel', 'population') cn.SetProperty('default', 'xAxisType', 'categorical') cn.SetProperty('default', 'yAxisLabel', 'size (ml)') cn.SetProperty('default', 'type', 'Box'); # Set the chart to display cvn.SetChartNodeID(cn.GetID()) self.delayDisplay('A box chart') # self.delayDisplay('Test passed!')