def onSaveButtonClicked(self): bundle = EditUtil.EditUtil().getParameterNode().GetParameter('QuickTCGAEffect,erich') tran = json.loads(bundle) layers = [] for key in tran: nn = tran[key] nn["file"] = key + '.tif' layers.append(tran[key]) j = {} j['layers'] = layers j['username'] = self.setupUserName.text j['sourcetile'] = self.tilename j['generator'] = "3DSlicer-4.5.0 with SlicerPathology v1.0a" j['timestamp'] = datetime.datetime.now().strftime("%Y%m%d%H%M%S") labelNodes = slicer.util.getNodes('vtkMRMLLabelMapVolumeNode*') savedMessage = 'Segmentations for the following series were saved:\n\n' for label in labelNodes.values(): labelName = label.GetName() labelFileName = os.path.join(self.dataDirButton.directory, labelName + '.tif') print "labelFileName : "+labelFileName sNode = slicer.vtkMRMLVolumeArchetypeStorageNode() sNode.SetFileName(labelFileName) sNode.SetWriteFileFormat('tif') sNode.SetURI(None) success = sNode.WriteData(label) if success: print "successful writing "+labelFileName else: print "failed writing "+labelFileName jstr = json.dumps(j,sort_keys=True, indent=4, separators=(',', ': ')) f = open(os.path.join(self.dataDirButton.directory, self.tilename + '.json'),'w') f.write(jstr) f.close()
def readFrame(self, file): sNode = slicer.vtkMRMLVolumeArchetypeStorageNode() sNode.ResetFileNameList() sNode.SetFileName(file) sNode.SetSingleFile(0) frame = slicer.vtkMRMLScalarVolumeNode() success = sNode.ReadData(frame) return (success, frame)
def onSaveButtonClicked(self): import zipfile bundle = EditUtil.EditUtil().getParameterNode().GetParameter('QuickTCGAEffect,erich') tran = json.loads(bundle) layers = [] for key in tran: nn = tran[key] nn["file"] = key + '.tif' layers.append(tran[key]) self.j['layers'] = layers self.j['username'] = self.setupUserName.text self.j['sourcetile'] = self.tilename self.j['generator'] = slicer.app.applicationVersion self.j['timestamp'] = datetime.datetime.now().strftime("%Y%m%d%H%M%S") labelNodes = slicer.util.getNodes('vtkMRMLLabelMapVolumeNode*') savedMessage = 'Segmentations for the following series were saved:\n\n' zfname = os.path.join(self.dataDirButton.directory, self.tilename + '.zip') print "zipfile name" print zfname zf = zipfile.ZipFile(zfname, mode='w') for label in labelNodes.values(): labelName = label.GetName() labelFileName = os.path.join(self.dataDirButton.directory, labelName + '.tif') print "labelFileName : "+labelFileName sNode = slicer.vtkMRMLVolumeArchetypeStorageNode() sNode.SetFileName(labelFileName) sNode.SetWriteFileFormat('tif') sNode.SetURI(None) success = sNode.WriteData(label) if success: print "adding "+labelFileName+" to zipfile" zf.write(labelFileName) os.remove(labelFileName) else: print "failed writing "+labelFileName jstr = json.dumps(self.j,sort_keys=True, indent=4, separators=(',', ': ')) mfname = os.path.join(self.dataDirButton.directory, 'manifest.json') f = open(mfname,'w') f.write(jstr) f.close() zf.write(mfname) zf.close() os.remove(mfname)
def onClick(caller, event): coordinates = self.interactor.GetLastEventPosition() ctrlKey = self.interactor.GetControlKey() rasPoint = ConvertCoordinates2RAS(coordinates) ijkPoint = ConvertCoordinates2IJK(coordinates) ijk = [int(round(i)) for i in ijkPoint[0:3]] labeledImage = self.LabeledVolumeSelector.currentNode( ).GetImageData() #GetImageData() selectedImage = self.SelectedVolumeSelector.currentNode( ).GetImageData() pointId = labeledImage.ComputePointId(ijk) #* targetLabel = int( round( labeledImage.GetScalarComponentAsFloat( ijk[0], ijk[1], ijk[2], 0))) selectedLabel = int( round( selectedImage.GetScalarComponentAsFloat( ijk[0], ijk[1], ijk[2], 0))) labeledArray = slicer.util.arrayFromVolume( self.LabeledVolumeSelector.currentNode()) labeledSlice = labeledArray[ijk[2], ...] selectedArray = slicer.util.arrayFromVolume( self.SelectedVolumeSelector.currentNode()) selectedSlice = selectedArray[ijk[2], ...] if not ctrlKey: selectedSlice[labeledSlice == targetLabel] = targetLabel else: selectedSlice[selectedSlice == selectedLabel] = 0 self.SelectedVolumeSelector.currentNode().Modified() storageNode = slicer.vtkMRMLVolumeArchetypeStorageNode() storageNode.SetFileName(self.SaveFile) #SAVE storageNode.WriteData( self.SelectedVolumeSelector.currentNode()) print("SAVED")
def onSaveButtonClicked(self): bundle = EditUtil.EditUtil().getParameterNode().GetParameter( 'QuickTCGAEffect,erich') tran = json.loads(bundle) layers = [] for key in tran: nn = tran[key] nn["file"] = key + '.tif' layers.append(tran[key]) j = {} j['layers'] = layers j['username'] = self.setupUserName.text j['sourcetile'] = self.tilename j['generator'] = "3DSlicer-4.5.0 with SlicerPathology v1.0a" j['timestamp'] = datetime.datetime.now().strftime("%Y%m%d%H%M%S") labelNodes = slicer.util.getNodes('vtkMRMLLabelMapVolumeNode*') savedMessage = 'Segmentations for the following series were saved:\n\n' for label in labelNodes.values(): labelName = label.GetName() labelFileName = os.path.join(self.dataDirButton.directory, labelName + '.tif') print "labelFileName : " + labelFileName sNode = slicer.vtkMRMLVolumeArchetypeStorageNode() sNode.SetFileName(labelFileName) sNode.SetWriteFileFormat('tif') sNode.SetURI(None) success = sNode.WriteData(label) if success: print "successful writing " + labelFileName else: print "failed writing " + labelFileName jstr = json.dumps(j, sort_keys=True, indent=4, separators=(',', ': ')) f = open( os.path.join(self.dataDirButton.directory, self.tilename + '.json'), 'w') f.write(jstr) f.close()
def load(self, loadable): """Load the selection as a MultiVolume, if multivolume attribute is present """ mvNode = '' try: mvNode = loadable.multivolume except AttributeError: return None nFrames = int(mvNode.GetAttribute('MultiVolume.NumberOfFrames')) files = string.split(mvNode.GetAttribute('MultiVolume.FrameFileList'), ',') nFiles = len(files) filesPerFrame = nFiles / nFrames frames = [] baseName = loadable.name loadAsVolumeSequence = hasattr( loadable, 'loadAsVolumeSequence') and loadable.loadAsVolumeSequence if loadAsVolumeSequence: volumeSequenceNode = slicer.mrmlScene.AddNewNodeByClass( "vtkMRMLSequenceNode", slicer.mrmlScene.GenerateUniqueName(baseName)) volumeSequenceNode.SetIndexName("") volumeSequenceNode.SetIndexUnit("") else: mvImage = vtk.vtkImageData() mvImageArray = None scalarVolumePlugin = slicer.modules.dicomPlugins[ 'DICOMScalarVolumePlugin']() instanceUIDs = "" for file in files: uid = slicer.dicomDatabase.fileValue(file, self.tags['instanceUID']) if uid == "": uid = "Unknown" instanceUIDs += uid + " " instanceUIDs = instanceUIDs[:-1] mvNode.SetAttribute("DICOM.instanceUIDs", instanceUIDs) progressbar = slicer.util.createProgressDialog( labelText="Loading " + baseName, value=0, maximum=nFrames, windowModality=qt.Qt.WindowModal) try: # read each frame into scalar volume for frameNumber in range(nFrames): progressbar.value = frameNumber slicer.app.processEvents() if progressbar.wasCanceled: break sNode = slicer.vtkMRMLVolumeArchetypeStorageNode() sNode.ResetFileNameList() frameFileList = files[frameNumber * filesPerFrame:(frameNumber + 1) * filesPerFrame] # sv plugin will sort the filenames by geometric order svLoadables = scalarVolumePlugin.examine([frameFileList]) if len(svLoadables) == 0: raise IOError("volume frame %d is invalid" % frameNumber) frame = scalarVolumePlugin.load(svLoadables[0]) if frame.GetImageData() == None: raise IOError("volume frame %d is invalid" % frameNumber) if loadAsVolumeSequence: # Load into volume sequence # volumeSequenceNode.SetDataNodeAtValue would deep-copy the volume frame. # To avoid memory reallocation, add an empty node and shallow-copy the contents # of the volume frame. # Create an empty volume node in the sequence node proxyVolume = slicer.mrmlScene.AddNewNodeByClass( frame.GetClassName()) indexValue = str(frameNumber) volumeSequenceNode.SetDataNodeAtValue( proxyVolume, indexValue) slicer.mrmlScene.RemoveNode(proxyVolume) # Update the data node shallowCopy = True volumeSequenceNode.UpdateDataNodeAtValue( frame, indexValue, shallowCopy) else: # Load into multi-volume if frameNumber == 0: frameImage = frame.GetImageData() frameExtent = frameImage.GetExtent() frameSize = frameExtent[1] * frameExtent[ 3] * frameExtent[5] mvImage.SetExtent(frameExtent) if vtk.VTK_MAJOR_VERSION <= 5: mvImage.SetNumberOfScalarComponents(nFrames) mvImage.SetScalarType( frame.GetImageData().GetScalarType()) mvImage.AllocateScalars() else: mvImage.AllocateScalars( frame.GetImageData().GetScalarType(), nFrames) mvImageArray = vtk.util.numpy_support.vtk_to_numpy( mvImage.GetPointData().GetScalars()) mvNode.SetScene(slicer.mrmlScene) mat = vtk.vtkMatrix4x4() frame.GetRASToIJKMatrix(mat) mvNode.SetRASToIJKMatrix(mat) frame.GetIJKToRASMatrix(mat) mvNode.SetIJKToRASMatrix(mat) frameImage = frame.GetImageData() frameImageArray = vtk.util.numpy_support.vtk_to_numpy( frameImage.GetPointData().GetScalars()) mvImageArray.T[frameNumber] = frameImageArray # Remove temporary volume node if frame.GetDisplayNode(): slicer.mrmlScene.RemoveNode(frame.GetDisplayNode()) if frame.GetStorageNode(): slicer.mrmlScene.RemoveNode(frame.GetStorageNode()) slicer.mrmlScene.RemoveNode(frame) if loadAsVolumeSequence: # Finalize volume sequence import # For user convenience, add a browser node and show the volume in the slice viewer. # Add browser node sequenceBrowserNode = slicer.mrmlScene.AddNewNodeByClass( 'vtkMRMLSequenceBrowserNode', slicer.mrmlScene.GenerateUniqueName(baseName + " browser")) sequenceBrowserNode.SetAndObserveMasterSequenceNodeID( volumeSequenceNode.GetID()) # If save changes are allowed then proxy nodes are updated using shallow copy, which is much # faster for images. Images are usually not modified, so the risk of accidentally modifying # data in the sequence is low. sequenceBrowserNode.SetSaveChanges(volumeSequenceNode, True) # Show frame number in proxy volume node name sequenceBrowserNode.SetOverwriteProxyName( volumeSequenceNode, True) # Automatically select the volume to display imageProxyVolumeNode = sequenceBrowserNode.GetProxyNode( volumeSequenceNode) appLogic = slicer.app.applicationLogic() selNode = appLogic.GetSelectionNode() selNode.SetReferenceActiveVolumeID( imageProxyVolumeNode.GetID()) appLogic.PropagateVolumeSelection() # Show sequence browser toolbar sequenceBrowserModule = slicer.modules.sequencebrowser if sequenceBrowserModule.autoShowToolBar: sequenceBrowserModule.setToolBarActiveBrowserNode( sequenceBrowserNode) sequenceBrowserModule.setToolBarVisible(True) else: # Finalize multi-volume import mvDisplayNode = slicer.mrmlScene.AddNewNodeByClass( 'vtkMRMLMultiVolumeDisplayNode') mvDisplayNode.SetDefaultColorMap() mvNode.SetAndObserveDisplayNodeID(mvDisplayNode.GetID()) mvNode.SetAndObserveImageData(mvImage) mvNode.SetNumberOfFrames(nFrames) mvNode.SetName(loadable.name) slicer.mrmlScene.AddNode(mvNode) # # automatically select the volume to display # appLogic = slicer.app.applicationLogic() selNode = appLogic.GetSelectionNode() selNode.SetReferenceActiveVolumeID(mvNode.GetID()) appLogic.PropagateVolumeSelection() # file list is no longer needed - remove the attribute mvNode.RemoveAttribute('MultiVolume.FrameFileList') except Exception as e: logging.error("Failed to read a multivolume: {0}".format( e.message)) import traceback traceback.print_exc() mvNode = None finally: progressbar.close() return mvNode
if len(dcm)-dcm.rfind('.dcm') == 4: rwvmList.append(rwvmDir+'/'+dcm) rwvmList = rwvmList[:1] rwvmPlugin = slicer.modules.dicomPlugins['DICOMRWVMPlugin']() # index input DICOM series indexer = ctk.ctkDICOMIndexer() indexer.addDirectory(slicer.dicomDatabase, petDir) indexer.waitForImportFinished() indexer.addDirectory(slicer.dicomDatabase, rwvmDir) indexer.waitForImportFinished() loadables = rwvmPlugin.examine([rwvmList]) if len(loadables) == 0: print 'Could not parse the DICOM Study!' exit() # load input DICOM volume dcmVolume = rwvmPlugin.load(loadables[0]) # save DICOM volume as single file nrrd format dcmStorage = slicer.vtkMRMLVolumeArchetypeStorageNode() dcmStorage.SetWriteFileFormat('nrrd') dcmStorage.SetFileName(os.path.join(outputDir,'SUVbw.nrrd')) dcmStorage.WriteData(dcmVolume) sys.exit()
def SaveEditorButtonClicked(self): storageNode = slicer.vtkMRMLVolumeArchetypeStorageNode() storageNode.SetFileName(self.SaveFile) storageNode.WriteData(self.SelectedVolumeSelector.currentNode()) print("SAVED EDITOR")
def load(self,loadable): """Load the selection as a MultiVolume, if multivolume attribute is present """ mvNode = '' try: mvNode = loadable.multivolume except AttributeError: return None nFrames = int(mvNode.GetAttribute('MultiVolume.NumberOfFrames')) files = mvNode.GetAttribute('MultiVolume.FrameFileList').split(',') nFiles = len(files) filesPerFrame = int(nFiles/nFrames) frames = [] baseName = loadable.name loadAsVolumeSequence = hasattr(loadable, 'loadAsVolumeSequence') and loadable.loadAsVolumeSequence if loadAsVolumeSequence: volumeSequenceNode = slicer.mrmlScene.AddNewNodeByClass("vtkMRMLSequenceNode", slicer.mrmlScene.GenerateUniqueName(baseName)) volumeSequenceNode.SetIndexName("") volumeSequenceNode.SetIndexUnit("") else: mvImage = vtk.vtkImageData() mvImageArray = None scalarVolumePlugin = slicer.modules.dicomPlugins['DICOMScalarVolumePlugin']() instanceUIDs = "" for file in files: uid = slicer.dicomDatabase.fileValue(file,self.tags['instanceUID']) if uid == "": uid = "Unknown" instanceUIDs += uid+" " instanceUIDs = instanceUIDs[:-1] mvNode.SetAttribute("DICOM.instanceUIDs", instanceUIDs) progressbar = slicer.util.createProgressDialog(labelText="Loading "+baseName, value=0, maximum=nFrames, windowModality = qt.Qt.WindowModal) try: # read each frame into scalar volume for frameNumber in range(nFrames): progressbar.value = frameNumber slicer.app.processEvents() if progressbar.wasCanceled: break sNode = slicer.vtkMRMLVolumeArchetypeStorageNode() sNode.ResetFileNameList(); frameFileList = files[frameNumber*filesPerFrame:(frameNumber+1)*filesPerFrame] # sv plugin will sort the filenames by geometric order svLoadables = scalarVolumePlugin.examine([frameFileList]) if len(svLoadables) == 0: raise IOError("volume frame %d is invalid" % frameNumber) frame = scalarVolumePlugin.load(svLoadables[0]) if frame.GetImageData() == None: raise IOError("volume frame %d is invalid" % frameNumber) if loadAsVolumeSequence: # Load into volume sequence # volumeSequenceNode.SetDataNodeAtValue would deep-copy the volume frame. # To avoid memory reallocation, add an empty node and shallow-copy the contents # of the volume frame. # Create an empty volume node in the sequence node proxyVolume = slicer.mrmlScene.AddNewNodeByClass(frame.GetClassName()) indexValue = str(frameNumber) volumeSequenceNode.SetDataNodeAtValue(proxyVolume, indexValue) slicer.mrmlScene.RemoveNode(proxyVolume) # Update the data node shallowCopy = True volumeSequenceNode.UpdateDataNodeAtValue(frame, indexValue, shallowCopy) else: # Load into multi-volume if frameNumber == 0: frameImage = frame.GetImageData() frameExtent = frameImage.GetExtent() frameSize = frameExtent[1]*frameExtent[3]*frameExtent[5] mvImage.SetExtent(frameExtent) if vtk.VTK_MAJOR_VERSION <= 5: mvImage.SetNumberOfScalarComponents(nFrames) mvImage.SetScalarType(frame.GetImageData().GetScalarType()) mvImage.AllocateScalars() else: mvImage.AllocateScalars(frame.GetImageData().GetScalarType(), nFrames) mvImageArray = vtk.util.numpy_support.vtk_to_numpy(mvImage.GetPointData().GetScalars()) mvNode.SetScene(slicer.mrmlScene) mat = vtk.vtkMatrix4x4() frame.GetRASToIJKMatrix(mat) mvNode.SetRASToIJKMatrix(mat) frame.GetIJKToRASMatrix(mat) mvNode.SetIJKToRASMatrix(mat) frameImage = frame.GetImageData() frameImageArray = vtk.util.numpy_support.vtk_to_numpy(frameImage.GetPointData().GetScalars()) mvImageArray.T[frameNumber] = frameImageArray # Remove temporary volume node if frame.GetDisplayNode(): slicer.mrmlScene.RemoveNode(frame.GetDisplayNode()) if frame.GetStorageNode(): slicer.mrmlScene.RemoveNode(frame.GetStorageNode()) slicer.mrmlScene.RemoveNode(frame) if loadAsVolumeSequence: # Finalize volume sequence import # For user convenience, add a browser node and show the volume in the slice viewer. # Add browser node sequenceBrowserNode = slicer.mrmlScene.AddNewNodeByClass('vtkMRMLSequenceBrowserNode', slicer.mrmlScene.GenerateUniqueName(baseName + " browser")) sequenceBrowserNode.SetAndObserveMasterSequenceNodeID(volumeSequenceNode.GetID()) # If save changes are allowed then proxy nodes are updated using shallow copy, which is much # faster for images. Images are usually not modified, so the risk of accidentally modifying # data in the sequence is low. sequenceBrowserNode.SetSaveChanges(volumeSequenceNode, True) # Show frame number in proxy volume node name sequenceBrowserNode.SetOverwriteProxyName(volumeSequenceNode, True); # Automatically select the volume to display imageProxyVolumeNode = sequenceBrowserNode.GetProxyNode(volumeSequenceNode) appLogic = slicer.app.applicationLogic() selNode = appLogic.GetSelectionNode() selNode.SetReferenceActiveVolumeID(imageProxyVolumeNode.GetID()) appLogic.PropagateVolumeSelection() # Show sequence browser toolbar sequenceBrowserModule = slicer.modules.sequencebrowser if sequenceBrowserModule.autoShowToolBar: sequenceBrowserModule.setToolBarActiveBrowserNode(sequenceBrowserNode) sequenceBrowserModule.setToolBarVisible(True) else: # Finalize multi-volume import mvDisplayNode = slicer.mrmlScene.AddNewNodeByClass('vtkMRMLMultiVolumeDisplayNode') mvDisplayNode.SetDefaultColorMap() mvNode.SetAndObserveDisplayNodeID(mvDisplayNode.GetID()) mvNode.SetAndObserveImageData(mvImage) mvNode.SetNumberOfFrames(nFrames) mvNode.SetName(loadable.name) slicer.mrmlScene.AddNode(mvNode) # # automatically select the volume to display # appLogic = slicer.app.applicationLogic() selNode = appLogic.GetSelectionNode() selNode.SetReferenceActiveVolumeID(mvNode.GetID()) appLogic.PropagateVolumeSelection() # file list is no longer needed - remove the attribute mvNode.RemoveAttribute('MultiVolume.FrameFileList') except Exception as e: logging.error("Failed to read a multivolume: {0}".format(e.message)) import traceback traceback.print_exc() mvNode = None finally: progressbar.close() return mvNode
def onSaveButtonClicked(self): import zipfile import os.path import uuid bundle = EditUtil.EditUtil().getParameterNode().GetParameter('QuickTCGAEffect,erich') tran = json.loads(bundle) layers = [] for key in tran: nn = tran[key] nn["file"] = key + '.tif' layers.append(tran[key]) self.j['layers'] = layers self.j['username'] = self.setupUserName.text self.j['sourcetile'] = self.tilename self.j['generator'] = slicer.app.applicationVersion self.j['timestamp'] = datetime.datetime.now().strftime("%Y%m%d%H%M%S") self.j['execution_id'] = self.setupExecutionID.text + "-"+ uuid.uuid4().get_urn() labelNodes = slicer.util.getNodes('vtkMRMLLabelMapVolumeNode*') savedMessage = 'Segmentations for the following series were saved:\n\n' zfname = os.path.join(self.dataDirButton.directory, self.tilename + "_" + datetime.datetime.now().strftime("%Y%m%d%H%M%S") + '.zip') print "zipfile name" print zfname zf = zipfile.ZipFile(zfname, mode='w') red_logic = slicer.app.layoutManager().sliceWidget("Red").sliceLogic() red_cn = red_logic.GetSliceCompositeNode() fg = red_cn.GetForegroundVolumeID() ff = slicer.util.getNode(fg) sNode = slicer.vtkMRMLVolumeArchetypeStorageNode() sNode.SetFileName("original.tif") sNode.SetWriteFileFormat('tif') sNode.SetURI(None) success = sNode.WriteData(ff) zf.write("original.tif") os.remove("original.tif") for label in labelNodes.values(): labelName = label.GetName() labelFileName = os.path.join(self.dataDirButton.directory, labelName + '.tif') compFileName = os.path.join(self.dataDirButton.directory, labelName + '-comp.tif') sNode.SetFileName(labelFileName) success = sNode.WriteData(label) if success: print "adding "+labelFileName+" to zipfile" zf.write(labelFileName,os.path.basename(labelFileName)) os.remove(labelFileName) else: print "failed writing "+labelFileName comp = self.WriteLonI(label.GetImageData(),ff.GetImageData()) volumeNode = slicer.vtkMRMLVectorVolumeNode() volumeNode.SetName("COMP") volumeNode.SetAndObserveImageData(comp) sNode.SetFileName(compFileName) success = sNode.WriteData(volumeNode) if success: print "adding "+compFileName+" to zipfile" zf.write(compFileName,os.path.basename(compFileName)) os.remove(compFileName) else: print "failed writing "+compFileName jstr = json.dumps(self.j,sort_keys=True, indent=4, separators=(',', ': ')) mfname = os.path.join(self.dataDirButton.directory, 'manifest.json') f = open(mfname,'w') f.write(jstr) f.close() zf.write(mfname,os.path.basename(mfname)) zf.close() os.remove(mfname)
if len(dcm) - dcm.rfind('.dcm') == 4: rwvmList.append(rwvmDir + '/' + dcm) rwvmList = rwvmList[:1] rwvmPlugin = slicer.modules.dicomPlugins['DICOMRWVMPlugin']() # index input DICOM series indexer = ctk.ctkDICOMIndexer() indexer.addDirectory(slicer.dicomDatabase, petDir) indexer.waitForImportFinished() indexer.addDirectory(slicer.dicomDatabase, rwvmDir) indexer.waitForImportFinished() loadables = rwvmPlugin.examine([rwvmList]) if len(loadables) == 0: print 'Could not parse the DICOM Study!' exit() # load input DICOM volume dcmVolume = rwvmPlugin.load(loadables[0]) # save DICOM volume as single file nrrd format dcmStorage = slicer.vtkMRMLVolumeArchetypeStorageNode() dcmStorage.SetWriteFileFormat('nrrd') dcmStorage.SetFileName(os.path.join(outputDir, 'SUVbw.nrrd')) dcmStorage.WriteData(dcmVolume) sys.exit()
def load(self,loadable): """Load the selection as a MultiVolume, if multivolume attribute is present """ mvNode = '' try: mvNode = loadable.multivolume except AttributeError: return None nFrames = int(mvNode.GetAttribute('MultiVolume.NumberOfFrames')) files = string.split(mvNode.GetAttribute('MultiVolume.FrameFileList'),',') nFiles = len(files) filesPerFrame = nFiles/nFrames frames = [] mvImage = vtk.vtkImageData() mvImageArray = None scalarVolumePlugin = slicer.modules.dicomPlugins['DICOMScalarVolumePlugin']() instanceUIDs = "" for file in files: uid = slicer.dicomDatabase.fileValue(file,self.tags['instanceUID']) if uid == "": uid = "Unknown" instanceUIDs += uid+" " instanceUIDs = instanceUIDs[:-1] mvNode.SetAttribute("DICOM.instanceUIDs", instanceUIDs) # read each frame into scalar volume for frameNumber in range(nFrames): sNode = slicer.vtkMRMLVolumeArchetypeStorageNode() sNode.ResetFileNameList(); frameFileList = files[frameNumber*filesPerFrame:(frameNumber+1)*filesPerFrame] # sv plugin will sort the filenames by geometric order svLoadables = scalarVolumePlugin.examine([frameFileList]) if len(svLoadables) == 0: return None for f in svLoadables[0].files: sNode.AddFileName(f) sNode.SetFileName(frameFileList[0]) # only used when num files/frame = 1 sNode.SetSingleFile(0) frame = slicer.vtkMRMLScalarVolumeNode() sNode.ReadData(frame) if frame.GetImageData() == None: logging.error('Failed to read a multivolume frame!') return None if frameNumber == 0: frameImage = frame.GetImageData() frameExtent = frameImage.GetExtent() frameSize = frameExtent[1]*frameExtent[3]*frameExtent[5] mvImage.SetExtent(frameExtent) if vtk.VTK_MAJOR_VERSION <= 5: mvImage.SetNumberOfScalarComponents(nFrames) mvImage.SetScalarType(frame.GetImageData().GetScalarType()) mvImage.AllocateScalars() else: mvImage.AllocateScalars(frame.GetImageData().GetScalarType(), nFrames) mvImageArray = vtk.util.numpy_support.vtk_to_numpy(mvImage.GetPointData().GetScalars()) mvNode.SetScene(slicer.mrmlScene) mat = vtk.vtkMatrix4x4() frame.GetRASToIJKMatrix(mat) mvNode.SetRASToIJKMatrix(mat) frame.GetIJKToRASMatrix(mat) mvNode.SetIJKToRASMatrix(mat) frameImage = frame.GetImageData() frameImageArray = vtk.util.numpy_support.vtk_to_numpy(frameImage.GetPointData().GetScalars()) mvImageArray.T[frameNumber] = frameImageArray mvDisplayNode = slicer.mrmlScene.CreateNodeByClass('vtkMRMLMultiVolumeDisplayNode') mvDisplayNode.SetReferenceCount(mvDisplayNode.GetReferenceCount()-1) mvDisplayNode.SetScene(slicer.mrmlScene) mvDisplayNode.SetDefaultColorMap() slicer.mrmlScene.AddNode(mvDisplayNode) mvNode.SetAndObserveDisplayNodeID(mvDisplayNode.GetID()) mvNode.SetAndObserveImageData(mvImage) mvNode.SetNumberOfFrames(nFrames) mvNode.SetName(loadable.name) slicer.mrmlScene.AddNode(mvNode) # # automatically select the volume to display # appLogic = slicer.app.applicationLogic() selNode = appLogic.GetSelectionNode() selNode.SetReferenceActiveVolumeID(mvNode.GetID()) appLogic.PropagateVolumeSelection() # file list is no longer needed - remove the attribute mvNode.RemoveAttribute('MultiVolume.FrameFileList') return mvNode