Example #1
0
    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