def __init__( self, layerStackModel, sliceProjection ): super(ImagePump, self).__init__() self._layerStackModel = layerStackModel self._projection = sliceProjection self._layerToSliceSrcs = {} ## setup image source stack and slice sources self._stackedImageSources = StackedImageSources( layerStackModel ) self._syncedSliceSources = SyncedSliceSources() for layer in layerStackModel: self._addLayer( layer ) ## handle layers removed from layerStackModel def onRowsAboutToBeRemoved( parent, start, end): for i in xrange(start, end + 1): layer = self._layerStackModel[i] self._removeLayer( layer ) layerStackModel.rowsAboutToBeRemoved.connect(onRowsAboutToBeRemoved) ## handle new layers in layerStackModel def onDataChanged( startIndexItem, endIndexItem): start = startIndexItem.row() stop = endIndexItem.row() + 1 for i in xrange(start, stop): layer = self._layerStackModel[i] # model implementation removes and adds the same layer instance to move selections up/down # therefore, check if the layer is already registered before adding as new if not self._stackedImageSources.isRegistered(layer): self._addLayer(layer) layerStackModel.dataChanged.connect(onDataChanged)
def __init__( self, layerStackModel, sliceProjection ): super(ImagePump, self).__init__() self._layerStackModel = layerStackModel self._projection = sliceProjection self._layerToSliceSrcs = {} ## setup image source stack and slice sources self._syncedSliceSources = SyncedSliceSources( len(sliceProjection.along) * (0,) ) self._stackedImageSources = StackedImageSources( layerStackModel ) self._stackedImageSources.stackId = self._syncedSliceSources.id for layer in self._layerStackModel: self._addLayer( layer ) self._syncedSliceSources.idChanged.connect( self._onIdChanged ) self._layerStackModel.layerAdded.connect( self._onLayerAdded ) self._layerStackModel.layerRemoved.connect( self._onLayerRemoved ) self._layerStackModel.stackCleared.connect( self._onStackCleared )
class ImagePump( object ): @property def syncedSliceSources( self ): return self._syncedSliceSources @property def stackedImageSources( self ): return self._stackedImageSources def __init__( self, layerStackModel, sliceProjection ): super(ImagePump, self).__init__() self._layerStackModel = layerStackModel self._projection = sliceProjection self._layerToSliceSrcs = {} ## setup image source stack and slice sources self._syncedSliceSources = SyncedSliceSources( len(sliceProjection.along) * (0,) ) self._stackedImageSources = StackedImageSources( layerStackModel ) self._stackedImageSources.stackId = self._syncedSliceSources.id for layer in self._layerStackModel: self._addLayer( layer ) self._syncedSliceSources.idChanged.connect( self._onIdChanged ) self._layerStackModel.layerAdded.connect( self._onLayerAdded ) self._layerStackModel.layerRemoved.connect( self._onLayerRemoved ) self._layerStackModel.stackCleared.connect( self._onStackCleared ) def _onLayerAdded( self, layer, row ): self._addLayer( layer ) def _onLayerRemoved( self, layer, row ): self._removeLayer( layer ) def _onStackCleared( self ): self._stackedImageSources.clear() assert(len(self._stackedImageSources.getRegisteredLayers()) == 0) for layer, sss in self._layerToSliceSrcs.iteritems(): for ss in sss: self._syncedSliceSources.remove(ss) assert(len(self._syncedSliceSources) == 0 ) self._layerToSliceSrcs = {} def _onIdChanged( self, old, new ): self._stackedImageSources.stackId = new def _createSources( self, layer ): def sliceSrcOrNone( datasrc ): if datasrc: return SliceSource( datasrc, self._projection ) return None slicesrcs = map( sliceSrcOrNone, layer.datasources ) ims = createImageSource( layer, slicesrcs ) # remove Nones slicesrcs = [ src for src in slicesrcs if src != None] return slicesrcs, ims def _addLayer( self, layer ): sliceSources, imageSource = self._createSources(layer) for ss in sliceSources: self._syncedSliceSources.add(ss) self._layerToSliceSrcs[layer] = sliceSources self._stackedImageSources.register(layer, imageSource) def _removeLayer( self, layer ): for ss in self._layerToSliceSrcs[layer]: self._syncedSliceSources.remove(ss) del self._layerToSliceSrcs[layer]
class ImagePump( object ): @property def syncedSliceSources( self ): return self._syncedSliceSources @property def stackedImageSources( self ): return self._stackedImageSources def __init__( self, layerStackModel, sliceProjection ): super(ImagePump, self).__init__() self._layerStackModel = layerStackModel self._projection = sliceProjection self._layerToSliceSrcs = {} ## setup image source stack and slice sources self._stackedImageSources = StackedImageSources( layerStackModel ) self._syncedSliceSources = SyncedSliceSources() for layer in layerStackModel: self._addLayer( layer ) ## handle layers removed from layerStackModel def onRowsAboutToBeRemoved( parent, start, end): for i in xrange(start, end + 1): layer = self._layerStackModel[i] self._removeLayer( layer ) layerStackModel.rowsAboutToBeRemoved.connect(onRowsAboutToBeRemoved) ## handle new layers in layerStackModel def onDataChanged( startIndexItem, endIndexItem): start = startIndexItem.row() stop = endIndexItem.row() + 1 for i in xrange(start, stop): layer = self._layerStackModel[i] # model implementation removes and adds the same layer instance to move selections up/down # therefore, check if the layer is already registered before adding as new if not self._stackedImageSources.isRegistered(layer): self._addLayer(layer) layerStackModel.dataChanged.connect(onDataChanged) def _createSources( self, layer ): def sliceSrcOrNone( datasrc ): if datasrc: return SliceSource( datasrc, self._projection ) return None slicesrcs = map( sliceSrcOrNone, layer.datasources ) ims = createImageSource( layer, slicesrcs ) # remove Nones slicesrcs = [ src for src in slicesrcs if src != None] return slicesrcs, ims def _addLayer( self, layer ): sliceSources, imageSource = self._createSources(layer) for ss in sliceSources: self._syncedSliceSources.add(ss) self._layerToSliceSrcs[layer] = sliceSources self._stackedImageSources.register(layer, imageSource) def _removeLayer( self, layer ): self._stackedImageSources.deregister(layer) for ss in self._layerToSliceSrcs[layer]: self._syncedSliceSources.remove(ss) del self._layerToSliceSrcs[layer]