def __init__(self, layerStackModel, parent, labelsink=None, crosshair=True, syncAlongAxes=(0, 1)): super(VolumeEditor, self).__init__(parent=parent) self._sync_along = tuple(syncAlongAxes) ## ## properties ## self._showDebugPatches = False self._showTileProgress = True ## ## base components ## self.layerStack = layerStackModel self.posModel = PositionModel(self) self.brushingModel = BrushingModel() self.cropModel = CropExtentsModel(self) self.imageScenes = [ ImageScene2D(self.posModel, (0, 1, 4), swapped_default=True), ImageScene2D(self.posModel, (0, 2, 4)), ImageScene2D(self.posModel, (0, 3, 4)) ] self.imageViews = [ ImageView2D(parent, self.cropModel, self.imageScenes[i]) for i in [0, 1, 2] ] self.imageViews[0].focusChanged.connect( lambda arg=0: self.lastImageViewFocus(arg)) self.imageViews[1].focusChanged.connect( lambda arg=1: self.lastImageViewFocus(arg)) self.imageViews[2].focusChanged.connect( lambda arg=2: self.lastImageViewFocus(arg)) self._lastImageViewFocus = 0 if not crosshair: for view in self.imageViews: view._crossHairCursor.enabled = False self.imagepumps = self._initImagePumps() self.view3d = self._initView3d() if useVTK else QWidget() names = ['x', 'y', 'z'] for scene, name, pump in zip(self.imageScenes, names, self.imagepumps): scene.setObjectName(name) scene.stackedImageSources = pump.stackedImageSources self.cacheSize = 50 ## ## interaction ## # event switch self.eventSwitch = EventSwitch(self.imageViews) # navigation control v3d = self.view3d if useVTK else None self.navCtrl = NavigationController(self.imageViews, self.imagepumps, self.posModel, view3d=v3d) self.navInterpret = NavigationInterpreter(self.navCtrl) # brushing control if crosshair: self.crosshairController = CrosshairController( self.brushingModel, self.imageViews) self.brushingController = BrushingController(self.brushingModel, self.posModel, labelsink) self.brushingInterpreter = BrushingInterpreter(self.navCtrl, self.brushingController) for v in self.imageViews: self.brushingController._brushingModel.brushSizeChanged.connect( v._sliceIntersectionMarker._set_diameter) # thresholding control self.thresInterpreter = ThresholdingInterpreter( self.navCtrl, self.layerStack, self.posModel) # initial interaction mode self.eventSwitch.interpreter = self.navInterpret # By default, don't show cropping controls self.showCropLines(False) ## ## connect ## self.posModel.timeChanged.connect(self.navCtrl.changeTime) self.posModel.slicingPositionChanged.connect( self.navCtrl.moveSlicingPosition) if crosshair: self.posModel.cursorPositionChanged.connect( self.navCtrl.moveCrosshair) self.posModel.slicingPositionSettled.connect( self.navCtrl.settleSlicingPosition) self.layerStack.layerAdded.connect(self._onLayerAdded) self.parent = parent