def test_ThresholdThreading(self): """ Replicate the issue reported in bug 1822 where splitting a grow-cut produced volume causes a multi-threading related issue on mac release builds """ self.delayDisplay("Starting the test") # # first, get some sample data # self.delayDisplay("Get some data") import SampleData head = SampleData.downloadSample("MRHead") # # now, define an ROI in it # roi = slicer.vtkMRMLAnnotationROINode() slicer.mrmlScene.AddNode(roi) roi.SetXYZ(-2, 104, -80) roi.SetRadiusXYZ(30, 30, 30) # # apply the cropping to the head # cropLogic = slicer.modules.cropvolume.logic() cvpn = slicer.vtkMRMLCropVolumeParametersNode() cvpn.SetROINodeID( roi.GetID() ) cvpn.SetInputVolumeNodeID( head.GetID() ) cropLogic.Apply( cvpn ) croppedHead = slicer.mrmlScene.GetNodeByID( cvpn.GetOutputVolumeNodeID() ) # # create a label map and set it for editing # volumesLogic = slicer.modules.volumes.logic() croppedHeadLabel = volumesLogic.CreateAndAddLabelVolume( slicer.mrmlScene, croppedHead, croppedHead.GetName() + '-label' ) selectionNode = slicer.app.applicationLogic().GetSelectionNode() selectionNode.SetActiveVolumeID( croppedHead.GetID() ) selectionNode.SetActiveLabelVolumeID( croppedHeadLabel.GetID() ) slicer.app.applicationLogic().PropagateVolumeSelection(0) # # got to the editor and do some drawing # self.delayDisplay("Paint some things") parameterNode = EditUtil.getParameterNode() lm = slicer.app.layoutManager() paintEffect = EditorLib.PaintEffectOptions() paintEffect.setMRMLDefaults() paintEffect.__del__() sliceWidget = lm.sliceWidget('Red') paintTool = EditorLib.PaintEffectTool(sliceWidget) EditUtil.setLabel(1) paintTool.paintAddPoint(100,100) paintTool.paintApply() EditUtil.setLabel(2) paintTool.paintAddPoint(200,200) paintTool.paintApply() paintTool.cleanup() paintTool = None self.delayDisplay("Now grow cut") # # now do GrowCut # growCutLogic = EditorLib.GrowCutEffectLogic(sliceWidget.sliceLogic()) growCutLogic.growCut() # # now split the volume, merge it back, and see if it looks right # preArray = slicer.util.array(croppedHeadLabel.GetName()) slicer.util.selectModule('Editor') slicer.util.findChildren(text='Split Merge Volume')[0].clicked() slicer.util.findChildren(text='Merge All')[0].clicked() postArray = slicer.util.array(croppedHeadLabel.GetName()) if (postArray - preArray).max() != 0: print("!$!$!#!@#!@!@$%! Test Failed!!") else: print("Ahh... test passed.") self.assertEqual((postArray - preArray).max(), 0) self.delayDisplay("Test passed!")
def test_sceneImport24281(self): """ Ideally you should have several levels of tests. At the lowest level tests should exercise the functionality of the logic with different inputs (both valid and invalid). At higher levels your tests should emulate the way the user would interact with your code and confirm that it still works the way you intended. One of the most important features of the tests is that it should alert other developers when their changes will have an impact on the behavior of your module. For example, if a developer removes a feature that you depend on, your test should break so they know that the feature is needed. """ self.delayDisplay("Starting the test") # # first, get some data # self.delayDisplay("Getting Data") import SampleData head = SampleData.downloadSample("MRHead") # # create a label map and set it for editing # self.delayDisplay("Setting up LabelMap") volumesLogic = slicer.modules.volumes.logic() headLabel = volumesLogic.CreateAndAddLabelVolume( slicer.mrmlScene, head, head.GetName() + '-label' ) selectionNode = slicer.app.applicationLogic().GetSelectionNode() selectionNode.SetActiveVolumeID( head.GetID() ) selectionNode.SetActiveLabelVolumeID( headLabel.GetID() ) slicer.app.applicationLogic().PropagateVolumeSelection(0) # # got to the editor and do some drawing # self.delayDisplay("Setting up Editor and drawing") parameterNode = EditUtil.getParameterNode() lm = slicer.app.layoutManager() paintEffectOptions = EditorLib.PaintEffectOptions() paintEffectOptions.setMRMLDefaults() paintEffectOptions.__del__() self.delayDisplay('Paint radius is %s' % parameterNode.GetParameter('PaintEffect,radius')) sliceWidget = lm.sliceWidget('Red') size = min(sliceWidget.width,sliceWidget.height) step = int(size / 12) center = int(size / 2) parameterNode.SetParameter('PaintEffect,radius', '20') paintTool = EditorLib.PaintEffectTool(sliceWidget) self.delayDisplay('Paint radius is %s, tool radius is %d' % (parameterNode.GetParameter('PaintEffect,radius'),paintTool.radius)) for label in range(1,5): EditUtil.setLabel(label) pos = center - 2*step + (step * label) self.delayDisplay('Painting %d, at (%d,%d)' % (label,pos,pos),200) paintTool.paintAddPoint(pos,pos) paintTool.paintApply() paintTool.cleanup() paintTool = None # # now build: # create a model using the command line module # based on the current editor parameters # - make a new hierarchy node # self.delayDisplay( "Building..." ) parameters = {} parameters["InputVolume"] = headLabel.GetID() # create models for all labels parameters["JointSmoothing"] = True parameters["StartLabel"] = -1 parameters["EndLabel"] = -1 outHierarchy = slicer.vtkMRMLModelHierarchyNode() outHierarchy.SetScene( slicer.mrmlScene ) outHierarchy.SetName( "sceneImport2428Hierachy" ) slicer.mrmlScene.AddNode( outHierarchy ) parameters["ModelSceneFile"] = outHierarchy modelMaker = slicer.modules.modelmaker self.CLINode = None self.CLINode = slicer.cli.runSync(modelMaker, self.CLINode, parameters, delete_temporary_files=False) self.delayDisplay("Models built") success = self.verifyModels() success = success and (slicer.mrmlScene.GetNumberOfNodesByClass( "vtkMRMLModelNode" ) > 3) self.delayDisplay("Test finished") if success: self.delayDisplay("Ahh... test passed.") else: self.delayDisplay("!$!$!#!@#!@!@$%! Test Failed!!") self.assertTrue(success)