Example #1
0
    def __init__(self,parent = None,imagePath = None,name='',**keys) :
        qt.QWidget.__init__(self,parent,name,qt.Qt.WDestructiveClose)
        layout = qt.QHBoxLayout(self)
        self.__mainView = QubPixmapDisplayView(parent=self)
        self.__mainView.setScrollbarMode('Auto')
        layout.addWidget(self.__mainView)

        self.__mainPlug = QubPixmapZoomPlug(self.__mainView)
        self.__image2Pixmap = QubImage2Pixmap()
        self.__image2Pixmap.plug(self.__mainPlug)
        self.putImagePath(imagePath)

        actions = []
        
                      ####### ZOOM LIST #######
        zoomActionList = QubZoomListAction(place = "toolbar",
                                           initZoom = 1,zoomValList = [0.25,0.5,0.75,1,1.5,2],
                                           show = 1,group = "image")
        actions.append(zoomActionList)
                     ####### ZOOM Action #######
        zoomFitOrFill = QubZoomAction(place = "toolbar",group = "image")
        actions.append(zoomFitOrFill)
                   ####### LINK ZOOM ACTION #######
        zoomFitOrFill.setList(zoomActionList)
        zoomActionList.setActionZoomMode(zoomFitOrFill)

                     ####### PRINT ACTION #######
        printAction = QubPrintPreviewAction(name="print",group="admin")
        printAction.previewConnect(getPrintPreviewDialog())
        actions.append(printAction)

        self.__mainView.addAction(actions)
Example #2
0
    def __init__(self, *args):
        BlissWidget.__init__(self, *args)

        actions = []

        self.__zoomList = QubZoomListAction(
            place="toolbar",
            zoomValList=[0.1, 0.25, 0.5, 1, 1.5, 2, 2.5, 3, 3.5, 4],
            show=1,
            group="zoom",
        )
        actions.append(self.__zoomList)

        self.__zoomFitOrFill = QubZoomAction(place="toolbar",
                                             keepROI=True,
                                             group="zoom")
        self.__zoomFitOrFill.setList(self.__zoomList)
        self.__zoomList.setActionZoomMode(self.__zoomFitOrFill)
        actions.append(self.__zoomFitOrFill)

        zoomAction = QubZoomRectangle(
            label="Zoom Crop",
            place="toolbar",
            show=1,
            group="zoom",
            activate_click_drag=True,
            drawingObjectLayer=2**31,
            unactiveActionWhenDub=True,
        )
        qt.QObject.connect(zoomAction, qt.PYSIGNAL("RectangleSelected"),
                           self.__rectangleZoomChanged)
        actions.append(zoomAction)

        ####### CHANGE FOREGROUND COLOR #######
        fcoloraction = QubForegroundColorAction(name="color", group="image")
        actions.append(fcoloraction)

        ####### MEASURE #######
        measureAction = QubOpenDialogAction(
            parent=self,
            name="measure",
            iconName="measure",
            label="Measure",
            group="Tools",
        )
        measureAction.setConnectCallBack(self._measure_dialog_new)
        actions.append(measureAction)

        self.__mainView = QubMosaicView(self, actions=actions)

        layout = qt.QHBoxLayout(self)
        layout.addWidget(self.__mainView)

        ####### SLOT #######
        self.defineSlot("getView", ())
Example #3
0
    def __init__(self, *args):
        BlissWidget.__init__(self, *args)

        actions = []

        self.__zoomList = QubZoomListAction(
            place="toolbar",
            zoomValList=[0.1, 0.25, 0.5, 1, 1.5, 2, 2.5, 3, 3.5, 4],
            show=1,
            group="zoom",
        )
        actions.append(self.__zoomList)

        self.__zoomFitOrFill = QubZoomAction(
            place="toolbar", keepROI=True, group="zoom"
        )
        self.__zoomFitOrFill.setList(self.__zoomList)
        self.__zoomList.setActionZoomMode(self.__zoomFitOrFill)
        actions.append(self.__zoomFitOrFill)

        zoomAction = QubZoomRectangle(
            label="Zoom Crop",
            place="toolbar",
            show=1,
            group="zoom",
            activate_click_drag=True,
            drawingObjectLayer=2 ** 31,
            unactiveActionWhenDub=True,
        )
        qt.QObject.connect(
            zoomAction, qt.PYSIGNAL("RectangleSelected"), self.__rectangleZoomChanged
        )
        actions.append(zoomAction)

        ####### CHANGE FOREGROUND COLOR #######
        fcoloraction = QubForegroundColorAction(name="color", group="image")
        actions.append(fcoloraction)

        ####### MEASURE #######
        measureAction = QubOpenDialogAction(
            parent=self,
            name="measure",
            iconName="measure",
            label="Measure",
            group="Tools",
        )
        measureAction.setConnectCallBack(self._measure_dialog_new)
        actions.append(measureAction)

        self.__mainView = QubMosaicView(self, actions=actions)

        layout = qt.QHBoxLayout(self)
        layout.addWidget(self.__mainView)

        ####### SLOT #######
        self.defineSlot("getView", ())
Example #4
0
    def __init__(self, *args):
        BlissWidget.__init__(self, *args)

        self.camera = None
        self.update_disabled = False
        self.__cameraName = None

        self.__zoomList = [1.5, 2, 2.5, 3, 3.5, 4]
        self.__initZoom = 2

        self.__fixWidth = -1
        self.__fixHeight = -1

        self.__swapRgb = True
        ####### PRINT #######
        self.__printWidget = QubPrintPreview(self)
        self.__printWidget.resize(400, 500)
        printer = qt.QPrinter()
        printer.setOutputToFile(1)
        printer.setOutputFileName('/tmp/print_file.ps')
        self.__printWidget.setPrinter(printer)
        self.__printWidget.update()

        self.__beamAction = None
        self.__scaleAction = None
        self.__chosenActions = {}
        self.__wholeActions = []
        self.__measureDialog = None

        ####### PRINT ACTION #######
        printAction = QubPrintPreviewAction(
            name="print", group="admin", withVectorMenu=True)
        printAction.previewConnect(self.__printWidget)
        self.__wholeActions.append(printAction)

        ####### SAVE IMAGE #######
        self.__saveAction = QubSaveImageAction(parent=self, label='Save falcon image',
                                               name="save", group="admin")
        self.__saveAction.setConnectCallBack(self._save_dialog_new)
        self.__wholeActions.append(self.__saveAction)
        self.__defaultSavePath = '/tmp'

        ####### UPDATE #######
        update = QubToggleAction(name="update", group="image", initState=True)
        self.connect(update, qt.PYSIGNAL("StateChanged"), self.__cameraUpdate)
        self.__wholeActions.append(update)

        ####### Start Camera ######
        startCamera = QubToggleAction(
            name="startCamera",
            group="image",
            iconName='bright-cont',
            initState=True)
        self.connect(startCamera, qt.PYSIGNAL("StateChanged"), self.__cameraStart)
        self.__wholeActions.append(startCamera)

        ####### BRIGHTNESS/CONTRAST #######
        self.__brightcount = QubOpenDialogAction(name="bright-cont",
                                                 iconName='bright-cont', group="image")
        self.__brightcount.setDialog(QubBrightnessContrastDialog(self))
        self.__wholeActions.append(self.__brightcount)

        ###### Grid TOOL ######
        self.__gridToolAction = QubOpenDialogAction(parent=self, name='grid_tool',
                                                    iconName='rectangle', label='Grid tool',
                                                    group="Tools")  # place="contextmenu")
        self.__gridDialog = GridDialog(
            self, "Grid Dialog", flags=qt.Qt.WStyle_StaysOnTop)
        self.__gridToolAction.setConnectCallBack(self._grid_dialog_connect_hdlr)
        self.__wholeActions.append(self.__gridToolAction)

        self.__previous_pos_dict = {}
        self.__beamWidth = 0
        self.__beamHeight = 0

        ####### BEAM ACTION #######
        self.__beamAction = QubBeamAction(name="beam", group="Tools")
        self.__wholeActions.append(self.__beamAction)
        self.connect(self.__beamAction, qt.PYSIGNAL("BeamSelected"),
                     self.beamSelection)

        ####### SCALE #######
        self.__scaleAction = QubScaleAction(name='scale', group='Tools')
        self.__wholeActions.append(self.__scaleAction)
        self.__wholeActions.extend(self.__creatStdActions())

        ####### ACTION INFO #######
        actionInfo = QubInfoAction(name="actionInfo", group="image", place="statusbar")
        self.__wholeActions.append(actionInfo)

        ####### CHANGE FOREGROUND COLOR #######
        self.__fcoloraction = QubForegroundColorAction(name="color", group="image")
        self.__wholeActions.append(self.__fcoloraction)

        ####### MEASURE #######
        self.__measureAction = QubOpenDialogAction(parent=self, name='measure',
                                                   iconName='measure', label='Measure',
                                                   group="Tools")
        self.__measureAction.setConnectCallBack(self._measure_dialog_new)
        self.__wholeActions.append(self.__measureAction)

        # ###### POSITION TOOL ######
        # self.__posToolAction = QubOpenDialogAction(parent=self, name='pos_tool',
        #                                            iconName='circle', label='Position tool',
        #                                            group="Tools")
        # self.__posToolAction.setConnectCallBack(self._line_dialog_new)
        # self.__wholeActions.append(self.__posToolAction)

        ####### ZOOM LIST #######
        zoomActionList = QubZoomListAction(place="toolbar",
                                           initZoom=1, zoomValList=[0.1, 0.25, 0.5, 0.75, 1, 1.5, 2],
                                           show=1, group="zoom")
        self.__wholeActions.append(zoomActionList)

        ####### ZOOM Action #######
        self.__zoomFitOrFill = QubZoomAction(place="toolbar", group="zoom")
        self.__wholeActions.append(self.__zoomFitOrFill)

        ####### LINK ZOOM ACTION #######
        self.__zoomFitOrFill.setList(zoomActionList)
        zoomActionList.setActionZoomMode(self.__zoomFitOrFill)

        ####### ZOOM WINDOW #######
        self.__zoomAction = QubZoomRectangle(
            label='Zoom Crop', place="toolbar", show=1, group="zoom")
        self.connect(self.__zoomAction, qt.PYSIGNAL("Actif"), self.__hide_show_zoom)
        self.__wholeActions.append(self.__zoomAction)

        self.__splitter = qt.QSplitter(qt.Qt.Horizontal, self)
        self.__splitter.show()

        self.__mainVideo = QubPixmapDisplayView(self.__splitter)
        self.__mainVideo.show()
        self.__mainVideo.setScrollbarMode('Auto')
        self.__mainPlug = _MainVideoPlug(self.__mainVideo, self.__zoomAction)

        actions = self.__creatStdActions()

        ####### ZOOM LIST #######
        self.__zoomActionList = QubZoomListAction(place="toolbar", keepROI=True,
                                                  initZoom=self.__initZoom, zoomValList=self.__zoomList,
                                                  show=1, group="zoom")
        actions.insert(0, self.__zoomActionList)

        ####### ZOOM Action #######
        zoomFitOrFill = QubZoomAction(place="toolbar", keepROI=True, group="zoom")
        zoomFitOrFill.setList(self.__zoomActionList)
        self.__zoomActionList.setActionZoomMode(zoomFitOrFill)
        actions.append(zoomFitOrFill)

        self.__zoomVideo = QubPixmapDisplayView(self.__splitter, None, actions)
        self.__zoomVideo.hide()
        self.__zoomPlug = _ZoomPlug(self.__zoomVideo)
        self.__zoomPlug.zoom().setZoom(2, 2)
        self.__cbk = _rectangleZoom(self.__zoomAction, self.__zoomPlug)

        layout = qt.QHBoxLayout(self, 0, 0, "layout")
        layout.addWidget(self.__splitter)

        self.__image2Pixmap = QubImage2Pixmap()
        self.__image2Pixmap.plug(self.__mainPlug)
        self.__zoomPlug.setPoller(self.__image2Pixmap)

        self.__jpegDecompress = QubStdData2Image()
        self.__jpegDecompress.setSwapRGB(True)
        self.__jpeg2image = None

        ####### PROPERTY #######
        self.addProperty('camera', 'string', '')
        self.addProperty('zoom list', 'string', ','.join(
            [str(x) for x in self.__zoomList]))
        self.addProperty('init zoom', 'integer', self.__initZoom)
        self.addProperty('swap rgb', 'boolean', True)

        self.addProperty('fix : width', 'integer', -1)
        self.addProperty('fix : height', 'integer', -1)

        self.addProperty('action : print', 'boolean', True)
        self.addProperty('action : save image', 'boolean', True)
        self.addProperty('action : update', 'boolean', True)
        self.addProperty('action : startCamera', 'boolean', True)
        self.addProperty('action : brightness contrast', 'boolean', True)
        self.addProperty('action : beam', 'boolean', True)
        self.addProperty('action : scale', 'boolean', True)
        self.addProperty('action : change foreground color', 'boolean', True)
        self.addProperty('action : measure', 'boolean', True)
        self.addProperty('action : measure (place)', 'combo',
                         ('toolbar', 'contextmenu'), 'toolbar')
        self.addProperty('action : zoom window', 'boolean', True)
        self.addProperty('action : zoom fit or fill', 'boolean', True)
        self.addProperty('action : zoom list', 'boolean', True)
        self.addProperty('action : x,y coordinates', 'boolean', True)
        self.addProperty('action : default color', 'combo',
                         ('black', 'red', 'green'), 'black')

        self.addProperty('action : save image (place)', "combo",
                         ('toolbar', 'contextmenu'), 'toolbar')
        self.addProperty('action : save image (default path)', "string", '/tmp')
        self.addProperty('action : save image (show always configure)', "boolean", True)

        self.addProperty("diffractometer", "string", "")
        self.diffractometerHwobj = None

        ####### SIGNAL #######
        self.defineSignal("BeamPositionChanged", ())

        ####### SLOT #######
        self.defineSlot("changeBeamPosition", ())
        self.defineSlot("changePixelScale", ())
        self.defineSlot('getView', ())
        self.defineSlot('getImage', ())

        ####### LINK VIEW AND SUB VIEW #######
        mainView = self.__mainVideo.view()
        zoomView = self.__zoomVideo.view()
        mainView.addEventMgrLink(zoomView,
                                 mainView.canvas(), zoomView.canvas(),
                                 mainView.matrix(), zoomView.matrix())

        self.imageReceivedConnected = None
Example #5
0
class CameraBrick(BlissWidget):
    def __init__(self, *args):
        BlissWidget.__init__(self, *args)

        self.camera = None
        self.update_disabled = False
        self.__cameraName = None

        self.__zoomList = [1.5, 2, 2.5, 3, 3.5, 4]
        self.__initZoom = 2

        self.__fixWidth = -1
        self.__fixHeight = -1

        self.__swapRgb = True
        ####### PRINT #######
        self.__printWidget = QubPrintPreview(self)
        self.__printWidget.resize(400, 500)
        printer = qt.QPrinter()
        printer.setOutputToFile(1)
        printer.setOutputFileName('/tmp/print_file.ps')
        self.__printWidget.setPrinter(printer)
        self.__printWidget.update()

        self.__beamAction = None
        self.__scaleAction = None
        self.__chosenActions = {}
        self.__wholeActions = []
        self.__measureDialog = None

        ####### PRINT ACTION #######
        printAction = QubPrintPreviewAction(
            name="print", group="admin", withVectorMenu=True)
        printAction.previewConnect(self.__printWidget)
        self.__wholeActions.append(printAction)

        ####### SAVE IMAGE #######
        self.__saveAction = QubSaveImageAction(parent=self, label='Save falcon image',
                                               name="save", group="admin")
        self.__saveAction.setConnectCallBack(self._save_dialog_new)
        self.__wholeActions.append(self.__saveAction)
        self.__defaultSavePath = '/tmp'

        ####### UPDATE #######
        update = QubToggleAction(name="update", group="image", initState=True)
        self.connect(update, qt.PYSIGNAL("StateChanged"), self.__cameraUpdate)
        self.__wholeActions.append(update)

        ####### Start Camera ######
        startCamera = QubToggleAction(
            name="startCamera",
            group="image",
            iconName='bright-cont',
            initState=True)
        self.connect(startCamera, qt.PYSIGNAL("StateChanged"), self.__cameraStart)
        self.__wholeActions.append(startCamera)

        ####### BRIGHTNESS/CONTRAST #######
        self.__brightcount = QubOpenDialogAction(name="bright-cont",
                                                 iconName='bright-cont', group="image")
        self.__brightcount.setDialog(QubBrightnessContrastDialog(self))
        self.__wholeActions.append(self.__brightcount)

        ###### Grid TOOL ######
        self.__gridToolAction = QubOpenDialogAction(parent=self, name='grid_tool',
                                                    iconName='rectangle', label='Grid tool',
                                                    group="Tools")  # place="contextmenu")
        self.__gridDialog = GridDialog(
            self, "Grid Dialog", flags=qt.Qt.WStyle_StaysOnTop)
        self.__gridToolAction.setConnectCallBack(self._grid_dialog_connect_hdlr)
        self.__wholeActions.append(self.__gridToolAction)

        self.__previous_pos_dict = {}
        self.__beamWidth = 0
        self.__beamHeight = 0

        ####### BEAM ACTION #######
        self.__beamAction = QubBeamAction(name="beam", group="Tools")
        self.__wholeActions.append(self.__beamAction)
        self.connect(self.__beamAction, qt.PYSIGNAL("BeamSelected"),
                     self.beamSelection)

        ####### SCALE #######
        self.__scaleAction = QubScaleAction(name='scale', group='Tools')
        self.__wholeActions.append(self.__scaleAction)
        self.__wholeActions.extend(self.__creatStdActions())

        ####### ACTION INFO #######
        actionInfo = QubInfoAction(name="actionInfo", group="image", place="statusbar")
        self.__wholeActions.append(actionInfo)

        ####### CHANGE FOREGROUND COLOR #######
        self.__fcoloraction = QubForegroundColorAction(name="color", group="image")
        self.__wholeActions.append(self.__fcoloraction)

        ####### MEASURE #######
        self.__measureAction = QubOpenDialogAction(parent=self, name='measure',
                                                   iconName='measure', label='Measure',
                                                   group="Tools")
        self.__measureAction.setConnectCallBack(self._measure_dialog_new)
        self.__wholeActions.append(self.__measureAction)

        # ###### POSITION TOOL ######
        # self.__posToolAction = QubOpenDialogAction(parent=self, name='pos_tool',
        #                                            iconName='circle', label='Position tool',
        #                                            group="Tools")
        # self.__posToolAction.setConnectCallBack(self._line_dialog_new)
        # self.__wholeActions.append(self.__posToolAction)

        ####### ZOOM LIST #######
        zoomActionList = QubZoomListAction(place="toolbar",
                                           initZoom=1, zoomValList=[0.1, 0.25, 0.5, 0.75, 1, 1.5, 2],
                                           show=1, group="zoom")
        self.__wholeActions.append(zoomActionList)

        ####### ZOOM Action #######
        self.__zoomFitOrFill = QubZoomAction(place="toolbar", group="zoom")
        self.__wholeActions.append(self.__zoomFitOrFill)

        ####### LINK ZOOM ACTION #######
        self.__zoomFitOrFill.setList(zoomActionList)
        zoomActionList.setActionZoomMode(self.__zoomFitOrFill)

        ####### ZOOM WINDOW #######
        self.__zoomAction = QubZoomRectangle(
            label='Zoom Crop', place="toolbar", show=1, group="zoom")
        self.connect(self.__zoomAction, qt.PYSIGNAL("Actif"), self.__hide_show_zoom)
        self.__wholeActions.append(self.__zoomAction)

        self.__splitter = qt.QSplitter(qt.Qt.Horizontal, self)
        self.__splitter.show()

        self.__mainVideo = QubPixmapDisplayView(self.__splitter)
        self.__mainVideo.show()
        self.__mainVideo.setScrollbarMode('Auto')
        self.__mainPlug = _MainVideoPlug(self.__mainVideo, self.__zoomAction)

        actions = self.__creatStdActions()

        ####### ZOOM LIST #######
        self.__zoomActionList = QubZoomListAction(place="toolbar", keepROI=True,
                                                  initZoom=self.__initZoom, zoomValList=self.__zoomList,
                                                  show=1, group="zoom")
        actions.insert(0, self.__zoomActionList)

        ####### ZOOM Action #######
        zoomFitOrFill = QubZoomAction(place="toolbar", keepROI=True, group="zoom")
        zoomFitOrFill.setList(self.__zoomActionList)
        self.__zoomActionList.setActionZoomMode(zoomFitOrFill)
        actions.append(zoomFitOrFill)

        self.__zoomVideo = QubPixmapDisplayView(self.__splitter, None, actions)
        self.__zoomVideo.hide()
        self.__zoomPlug = _ZoomPlug(self.__zoomVideo)
        self.__zoomPlug.zoom().setZoom(2, 2)
        self.__cbk = _rectangleZoom(self.__zoomAction, self.__zoomPlug)

        layout = qt.QHBoxLayout(self, 0, 0, "layout")
        layout.addWidget(self.__splitter)

        self.__image2Pixmap = QubImage2Pixmap()
        self.__image2Pixmap.plug(self.__mainPlug)
        self.__zoomPlug.setPoller(self.__image2Pixmap)

        self.__jpegDecompress = QubStdData2Image()
        self.__jpegDecompress.setSwapRGB(True)
        self.__jpeg2image = None

        ####### PROPERTY #######
        self.addProperty('camera', 'string', '')
        self.addProperty('zoom list', 'string', ','.join(
            [str(x) for x in self.__zoomList]))
        self.addProperty('init zoom', 'integer', self.__initZoom)
        self.addProperty('swap rgb', 'boolean', True)

        self.addProperty('fix : width', 'integer', -1)
        self.addProperty('fix : height', 'integer', -1)

        self.addProperty('action : print', 'boolean', True)
        self.addProperty('action : save image', 'boolean', True)
        self.addProperty('action : update', 'boolean', True)
        self.addProperty('action : startCamera', 'boolean', True)
        self.addProperty('action : brightness contrast', 'boolean', True)
        self.addProperty('action : beam', 'boolean', True)
        self.addProperty('action : scale', 'boolean', True)
        self.addProperty('action : change foreground color', 'boolean', True)
        self.addProperty('action : measure', 'boolean', True)
        self.addProperty('action : measure (place)', 'combo',
                         ('toolbar', 'contextmenu'), 'toolbar')
        self.addProperty('action : zoom window', 'boolean', True)
        self.addProperty('action : zoom fit or fill', 'boolean', True)
        self.addProperty('action : zoom list', 'boolean', True)
        self.addProperty('action : x,y coordinates', 'boolean', True)
        self.addProperty('action : default color', 'combo',
                         ('black', 'red', 'green'), 'black')

        self.addProperty('action : save image (place)', "combo",
                         ('toolbar', 'contextmenu'), 'toolbar')
        self.addProperty('action : save image (default path)', "string", '/tmp')
        self.addProperty('action : save image (show always configure)', "boolean", True)

        self.addProperty("diffractometer", "string", "")
        self.diffractometerHwobj = None

        ####### SIGNAL #######
        self.defineSignal("BeamPositionChanged", ())

        ####### SLOT #######
        self.defineSlot("changeBeamPosition", ())
        self.defineSlot("changePixelScale", ())
        self.defineSlot('getView', ())
        self.defineSlot('getImage', ())

        ####### LINK VIEW AND SUB VIEW #######
        mainView = self.__mainVideo.view()
        zoomView = self.__zoomVideo.view()
        mainView.addEventMgrLink(zoomView,
                                 mainView.canvas(), zoomView.canvas(),
                                 mainView.matrix(), zoomView.matrix())

        self.imageReceivedConnected = None

    def safeConnect(self):
        if not self.imageReceivedConnected and self.camera is not None:
            #print "CONNECTING 0"
            self.camera.connect('imageReceived', self.__imageReceived)
            # self.connect(self.camera,qt.PYSIGNAL('imageReceived'),self.__imageReceived)
            self.imageReceivedConnected = False

    def safeDisconnect(self):
        if self.imageReceivedConnected and self.camera is not None:
            #print "DISCONNECTING 3"
            self.camera.disconnect('imageReceived', self.__imageReceived)
            # self.disconnect(self.camera,qt.PYSIGNAL('imageReceived'),self.__imageReceived)
            self.imageReceivedConnected = False

    def disable_update(self):
        # self.__imageReceived(DISABLED_JPEG,DISABLED_WIDTH,DISABLED_HEIGHT)
        self.update_disabled = True

    def enable_update(self):
        self.update_disabled = False

    def __imageReceived(self, image, width, height, force_update=False):
        if self.update_disabled:
            return

        if not force_update:
            if not self.isVisible():
                return

        if isinstance(image, qt.QImage):
            if self.__swapRgb:
                image = image.swapRGB()
            self.__jpeg2image.setImage(image, image)
        else:
            self.__jpegDecompress.putData(image, width, height)

    def propertyChanged(self, property, oldValue, newValue):
        if property == 'camera':
            # if self.camera is not None and not self.isRunning():
            #    self.safeDisconnect()
            self.safeDisconnect()
            self.camera = self.getHardwareObject(newValue)
            self.__hwoName = newValue

            if self.camera is not None:
                try:
                    self.__tangoName = self.camera.tangoname
                except BaseException:
                    self.__tangoName = ""

                try:
                    camera_role = self.camera.getDeviceByRole('camera')
                    if camera_role is not None:
                        self.camera = camera_role
                except AttributeError:
                    pass

                self.__brightcount.setCamera(self.camera)

        elif property == 'zoom list':
            zoomList = [float(x) for x in newValue.split(',')]
            if zoomList != self.__zoomList:
                self.__zoomList = zoomList
                self.__zoomActionList.changeZoomList(zoomList, self.__initZoom)
        elif property == 'init zoom':
            if newValue != self.__initZoom:
                self.__initZoom = newValue
                self.__zoomActionList.changeZoomList(self.__zoomList, newValue)
        elif property == 'swap rgb':
            self.__jpegDecompress.setSwapRGB(newValue)
            self.__swapRgb = newValue
        elif property == 'action : print':
            self.__chosenActions['print'] = newValue
        elif property == 'action : save image':
            self.__chosenActions['save'] = newValue
        elif property == 'action : update':
            self.__chosenActions['update'] = newValue
        elif property == 'action : startCamera':
            self.__chosenActions['startCamera'] = newValue
        elif property == 'action : brightness contrast':
            self.__chosenActions['bright-cont'] = newValue
        elif property == 'action : beam':
            self.__chosenActions['beam'] = newValue
        elif property == 'action : scale':
            self.__chosenActions['scale'] = newValue
        elif property == 'action : change foreground color':
            self.__chosenActions['color'] = newValue
        elif property == 'action : measure':
            self.__chosenActions['measure'] = newValue
        elif property == 'action : zoom window':
            self.__chosenActions['zoomrect'] = newValue
        elif property == 'action : zoom fit or fill':
            self.__chosenActions['Zoom tools'] = newValue
        elif property == 'action : zoom list':
            self.__chosenActions['zoomlist'] = newValue
        elif property == 'action : x,y coordinates':
            self.__chosenActions['position'] = newValue
        elif property == 'action : default color':
            self.__chosenDefaultColor = newValue
        elif property == 'action : save image (place)':
            self.__saveAction.setPlace(newValue, True)
        elif property == 'action : measure (place)':
            self.__measureAction.setPlace(newValue, True)
        elif property == 'action : save image (default path)':
            self.__defaultSavePath = newValue
        elif property == 'action : save image (show always configure)':
            self.__saveAction.setConfigureOnClick(newValue)

        elif property == 'fix : width':
            self.__fixWidth = newValue
        elif property == 'fix : height':
            self.__fixHeight = newValue
        elif property == "diffractometer":
            self.diffractometerHwobj = self.getHardwareObject(newValue)
            if self.diffractometerHwobj is not None:
                self.__previous_pos_dict = self.diffractometerHwobj.getPositions()
                self.diffractometerHwobj.connect("minidiffStateChanged",
                                                 self.diffractometerChanged)
                if self.diffractometerHwobj.zoomMotor is not None:
                    zoom = self.diffractometerHwobj.zoomMotor.getPosition()
                    xSize, ySize = self.diffractometerHwobj.getCalibrationData(zoom)
                    #xSize,ySize = self.__scaleAction.xPixelSize(), self.__scaleAction.yPixelSize()
                    self.diffractometerHwobj.getBeamInfo(self.__getBeamInfo)
                    beam_pos_x = self.diffractometerHwobj.getBeamPosX()
                    beam_pos_y = self.diffractometerHwobj.getBeamPosY()

                    self.__gridDialog.set_x_pixel_size(xSize)
                    self.__gridDialog.set_y_pixel_size(ySize)
                    self.__gridDialog.set_beam_position(beam_pos_x, beam_pos_y,
                                                        self.__beamWidth, self.__beamHeight)

    def run(self):
        chosenActions = []

        for action in self.__wholeActions:
            if self.__chosenActions.get(action.name(), True):
                chosenActions.append(action)

        self.__mainVideo.addAction(chosenActions)

        if not self.__chosenActions.get('update', False):
            self.__cameraUpdate(True)

        if not self.__chosenActions.get('startCamera', False):
            self.__cameraStart(True)

        if self.__fixWidth != -1 and self.__fixHeight != -1:
            self.__mainVideo.view().setFixedSize(self.__fixWidth + 4, self.__fixHeight + 4)

        self.__startIdle = qt.QTimer(self)
        qt.QObject.connect(self.__startIdle, qt.SIGNAL('timeout()'), self.__idleRun)
        self.__startIdle.start(0)

    def __idleRun(self):
        self.__startIdle.stop()
        self.__fcoloraction.setColor(self.__chosenDefaultColor)
        self.__mainVideo.view().setForegroundColor(qt.QColor(self.__chosenDefaultColor))

    def stop(self):
        self.safeDisconnect()

    def beamSelection(self, x, y):
        self.emit(qt.PYSIGNAL("BeamPositionChanged"), (x, y))
        self.changeBeamPosition(x, y)

    def changeBeamPosition(self, x, y, beam_width=None, beam_height=None):
        self.__beamAction.setBeamPosition(x, y)
        try:
            if not beam_width:
                beam_width = self.__beamWidth

            if not beam_height:
                beam_height = self.__beamHeight

            self.__gridDialog.set_beam_position(x, y, beam_width, beam_height)
        except BaseException:
            pass

    def changePixelScale(self, sizex, sizey):
        self.__scaleAction.setXPixelSize(sizex)
        self.__scaleAction.setYPixelSize(sizey)
        if self.__measureDialog:
            self.__measureDialog.setXPixelSize(sizex)
            self.__measureDialog.setYPixelSize(sizey)

        self.__gridDialog.set_x_pixel_size(sizex)
        self.__gridDialog.set_y_pixel_size(sizey)

    def getView(self, key):
        try:
            key['drawing'] = self.__mainVideo.view()
            key['view'] = self.__mainVideo
            key['hwname'] = self.__hwoName
            key['dsname'] = self.__tangoName
        except BaseException:
            pass

    def getImage(self, key):
        if self.__jpeg2image is not None:
            try:
                key['image'] = self.__jpeg2image.getLastImage()
            except BaseException:
                pass

    def __creatStdActions(self):
        actions = []
        ####### MOUSE POSITION #######
        posaction = QubPositionAction(name="position", group="image", place="statusbar")
        actions.append(posaction)

        return actions

    def __cameraUpdate(self, onoff):
        if onoff:
            self.__jpeg2image = _Jpeg2ImagePlug(self.__image2Pixmap)
            self.__jpegDecompress.plug(self.__jpeg2image)
            if self.camera is not None:
                imageInfo = self.camera.imageType()
            else:
                imageInfo = None
            imType = self.__jpegDecompress.STANDARD
            if imageInfo:
                if imageInfo.type() == 'bayer':
                    imType = self.__jpegDecompress.BAYER_RG
                elif imageInfo.type() == 'raw':
                    imType = self.__jpegDecompress.RAW
            self.__jpegDecompress.setImageType(imType)
            self.safeConnect()
        else:
            self.safeDisconnect()
            self.__jpeg2image.setEnd()

    def __cameraStart(self, onoff):
        if onoff:
            print "********************************************************Set the camera ON"
            if self.camera is not None:
                self.camera.setLive(True)
            else:
                print "camera is none"
        else:
            print "****************************************************Set the camera off"
            if self.camera is not None:
                print "camera :"
                print self.camera
                self.camera.setLive(False)
            else:
                print "camera is none"

    def __hide_show_zoom(self, actif):
        if actif:
            if self.__chosenActions['Zoom tools']:
                self.__zoomFitOrFill.setState(True)
            else:
                self.__mainVideo.setScrollbarMode('Fit2Screen')
            self.__zoomPlug.start()
            self.__zoomVideo.show()
            splitterWidth = self.__splitter.width()
            self.__splitter.setSizes(
                [splitterWidth / 3, splitterWidth - splitterWidth / 3])
        else:
            if self.__chosenActions['Zoom tools']:
                self.__zoomFitOrFill.setState(False)
            else:
                self.__mainVideo.setScrollbarMode('Auto')
            self.__zoomPlug.stop()
            self.__zoomVideo.hide()

    def _measure_dialog_new(self, openDialogAction, aQubImage):
        try:
            self.__measureDialog = QubMeasureListDialog(self,
                                                        canvas=aQubImage.canvas(),
                                                        matrix=aQubImage.matrix(),
                                                        eventMgr=aQubImage)
            xSize, ySize = self.__scaleAction.xPixelSize(), self.__scaleAction.yPixelSize()
            self.__measureDialog.setXPixelSize(xSize)
            self.__measureDialog.setYPixelSize(ySize)
            self.__measureDialog.connect(aQubImage, qt.PYSIGNAL("ForegroundColorChanged"),
                                         self.__measureDialog.setDefaultColor)
            openDialogAction.setDialog(self.__measureDialog)
        except BaseException:
            import traceback
            traceback.print_exc()

    def _grid_dialog_connect_hdlr(self, openDialogAction, aQubImage):
        try:
            self.__gridDialog.set_qub_event_mgr(aQubImage)
            openDialogAction.setDialog(self.__gridDialog)
        except BaseException:
            import traceback
            traceback.print_exc()

    def __getBeamInfo(self, ret):
        self.__beamWidth = float(ret["size_x"])
        self.__beamHeight = float(ret["size_y"])
        #self.__beamShape = ret["shape"]

    def _save_dialog_new(self, openDialogAction, aQubImage):
        saveDialog = QubSaveImageDialog(
            self, matrix=aQubImage.matrix(), canvas=aQubImage.canvas())
        saveDialog.setImage2Pixmap(self.__image2Pixmap)
        saveDialog.setSavePath(self.__defaultSavePath)
        openDialogAction.setDialog(saveDialog)

    def instanceMirrorChanged(self, mirror):
        #print "INSTANCEMIRRORCHANGED",mirror,BlissWidget.isInstanceMirrorAllow()
        return
        if BlissWidget.isInstanceModeSlave():
            if BlissWidget.isInstanceMirrorAllow():
                self.safeConnect()
            else:
                self.safeDisconnect()

    def diffractometerChanged(self, *args):
        """
        Handles diffractometer change events, connected to the signal
        minidiffStateChanged of the diffractometer hardware object.
        """

        if self.diffractometerHwobj.isReady():
            pos_dict = self.diffractometerHwobj.getPositions()
            p1 = self.diffractometerHwobj.motor_positions_to_screen(
                self.__previous_pos_dict)
            p2 = (self.diffractometerHwobj.getBeamPosX(),
                  self.diffractometerHwobj.getBeamPosY())

            dx = p2[0] - p1[0]
            dy = p2[1] - p1[1]

            if dy != 0:
                self.__gridDialog.move_grid_ver(-dy)

            if dx != 0:
                self.__gridDialog.move_grid_hor(-dx)

            #print dx, dy

            self.__previous_pos_dict = pos_dict
class CameraMosaicBrick(BlissWidget) :
    def __init__(self,*args) :
        BlissWidget.__init__(self,*args)

        actions = []

        self.__zoomList = QubZoomListAction(place = "toolbar",
                                   zoomValList = [0.1,.25,.5,1,1.5,2,2.5,3,3.5,4],
                                   show = 1,group = "zoom")
        actions.append(self.__zoomList)

        self.__zoomFitOrFill = QubZoomAction(place = "toolbar",keepROI = True,group = "zoom")
        self.__zoomFitOrFill.setList(self.__zoomList)
        self.__zoomList.setActionZoomMode(self.__zoomFitOrFill)
        actions.append(self.__zoomFitOrFill)
        
        zoomAction = QubZoomRectangle(label='Zoom Crop',place="toolbar", show=1, group="zoom",
                                      activate_click_drag = True,drawingObjectLayer = 2 ** 31,
                                      unactiveActionWhenDub = True)
        qt.QObject.connect(zoomAction,qt.PYSIGNAL('RectangleSelected'),self.__rectangleZoomChanged)
        actions.append(zoomAction)

               ####### CHANGE FOREGROUND COLOR #######
        fcoloraction = QubForegroundColorAction(name="color", group="image")
        actions.append(fcoloraction)

                        ####### MEASURE #######
        measureAction = QubOpenDialogAction(parent=self,name='measure',iconName='measure',label='Measure',group="Tools")
        measureAction.setConnectCallBack(self._measure_dialog_new)
        actions.append(measureAction)
        
        self.__mainView = QubMosaicView(self,actions = actions)

        layout = qt.QHBoxLayout(self)
        layout.addWidget(self.__mainView)

                         ####### SLOT #######
        self.defineSlot('getView',())
                    
    def getView(self,key) :
        try:
            key['drawing'] = self.__mainView.view()
            key['view'] = self.__mainView
        except:
            pass

    def __rectangleZoomChanged(self,drawingMgr) :
        self.__zoomFitOrFill.setState(False)
        rect = drawingMgr.rect()
        canvas = self.__mainView.view()

        matrix = canvas.matrix()

        vp = canvas.viewport()
        viewWidth,viewHeight = vp.width(),vp.height()
        zoomX = float(viewWidth) / rect.width()
        zoomY = float(viewHeight) / rect.height()
        zoom = max(zoomX,zoomY)

        newMatrix = qt.QWMatrix(zoom,0,0,zoom,matrix.dx(),matrix.dy())
        rect = newMatrix.map(rect)
        zoom = min(zoom,20)
        canvas.setZoom(zoom,zoom)
        canvas.setContentsPos(rect.x(),rect.y())
        self.__zoomList.writeStrValue("%d%%" % (zoom * 100))

    def _measure_dialog_new(self,openDialogAction,aQubImage) :
        try :
            self.__measureDialog = QubMeasureListDialog(self,
                                                        canvas=aQubImage.canvas(),
                                                        matrix=aQubImage.matrix(),
                                                        eventMgr=aQubImage,
                                                        drawingObjectLayer = 2 ** 31)
            self.__measureDialog.connect(aQubImage, qt.PYSIGNAL("ForegroundColorChanged"),
                                         self.__measureDialog.setDefaultColor)
            openDialogAction.setDialog(self.__measureDialog)
        except:
            import traceback
            traceback.print_exc()
Example #7
0
    def __init__(self, *args):
        BlissWidget.__init__(self, *args)

        self.camera       = None
        self.update_disabled = False
        self.__cameraName = None

        self.__zoomList = [1.5,2,2.5,3,3.5,4]
        self.__initZoom = 2

        self.__fixWidth  = -1
        self.__fixHeight = -1

        self.__swapRgb = True
                        ####### PRINT #######
        self.__printWidget = QubPrintPreview(self)
        self.__printWidget.resize(400,500)
        printer = qt.QPrinter()
        printer.setOutputToFile(1)
        printer.setOutputFileName('/tmp/print_file.ps')
        self.__printWidget.setPrinter(printer)
        self.__printWidget.update()

        self.__beamAction    = None
        self.__scaleAction   = None
        self.__chosenActions = {}
        self.__wholeActions  = []
        self.__measureDialog = None

        ####### PRINT ACTION #######
        printAction = QubPrintPreviewAction(name="print",group="admin",withVectorMenu=True)
        printAction.previewConnect(self.__printWidget)
        self.__wholeActions.append(printAction)

        ####### SAVE IMAGE #######
        self.__saveAction = QubSaveImageAction(parent=self, label='Save falcon image',
                                               name="save", group="admin")
        self.__saveAction.setConnectCallBack(self._save_dialog_new)
        self.__wholeActions.append(self.__saveAction)
        self.__defaultSavePath = '/tmp'

        ####### UPDATE #######
        update = QubToggleAction(name="update",group="image",initState=True)
        self.connect(update,qt.PYSIGNAL("StateChanged"),self.__cameraUpdate)
        self.__wholeActions.append(update)

        ####### Start Camera ######
        startCamera = QubToggleAction(name="startCamera", group="image", iconName = 'bright-cont', initState=True)
        self.connect(startCamera, qt.PYSIGNAL("StateChanged"), self.__cameraStart)
        self.__wholeActions.append(startCamera)


        ####### BRIGHTNESS/CONTRAST #######
        self.__brightcount = QubOpenDialogAction(name="bright-cont",
                                                 iconName = 'bright-cont', group="image")
        self.__brightcount.setDialog(QubBrightnessContrastDialog(self))
        self.__wholeActions.append(self.__brightcount)

        ###### Grid TOOL ######
        self.__gridToolAction = QubOpenDialogAction(parent=self, name='grid_tool',
                                                    iconName='rectangle', label='Grid tool',
                                                    group="Tools") #place="contextmenu")
        self.__gridDialog = GridDialog(self, "Grid Dialog", flags = qt.Qt.WStyle_StaysOnTop)
        self.__gridToolAction.setConnectCallBack(self._grid_dialog_connect_hdlr)
        self.__wholeActions.append(self.__gridToolAction)

        self.__previous_pos_dict = {}
        self.__beamWidth = 0
        self.__beamHeight = 0

        ####### BEAM ACTION #######
        self.__beamAction = QubBeamAction(name="beam", group="Tools")
        self.__wholeActions.append(self.__beamAction)
        self.connect(self.__beamAction,qt.PYSIGNAL("BeamSelected"),
                     self.beamSelection)

        ####### SCALE #######
        self.__scaleAction = QubScaleAction(name='scale',group='Tools')
        self.__wholeActions.append(self.__scaleAction)
        self.__wholeActions.extend(self.__creatStdActions())

        ####### ACTION INFO #######
        actionInfo = QubInfoAction(name="actionInfo", group="image",place="statusbar")
        self.__wholeActions.append(actionInfo)

        ####### CHANGE FOREGROUND COLOR #######
        self.__fcoloraction = QubForegroundColorAction(name="color", group="image")
        self.__wholeActions.append(self.__fcoloraction)

        ####### MEASURE #######
        self.__measureAction = QubOpenDialogAction(parent=self, name='measure',
                                            iconName='measure', label='Measure',
                                            group="Tools")
        self.__measureAction.setConnectCallBack(self._measure_dialog_new)
        self.__wholeActions.append(self.__measureAction)

        # ###### POSITION TOOL ######
        # self.__posToolAction = QubOpenDialogAction(parent=self, name='pos_tool',
        #                                            iconName='circle', label='Position tool',
        #                                            group="Tools")
        # self.__posToolAction.setConnectCallBack(self._line_dialog_new)
        # self.__wholeActions.append(self.__posToolAction)

        ####### ZOOM LIST #######
        zoomActionList = QubZoomListAction(place = "toolbar",
                                           initZoom = 1,zoomValList = [0.1,0.25,0.5,0.75,1,1.5,2],
                                           show = 1,group = "zoom")
        self.__wholeActions.append(zoomActionList)

        ####### ZOOM Action #######
        self.__zoomFitOrFill = QubZoomAction(place = "toolbar",group = "zoom")
        self.__wholeActions.append(self.__zoomFitOrFill)

        ####### LINK ZOOM ACTION #######
        self.__zoomFitOrFill.setList(zoomActionList)
        zoomActionList.setActionZoomMode(self.__zoomFitOrFill)

        ####### ZOOM WINDOW #######
        self.__zoomAction = QubZoomRectangle(label='Zoom Crop',place="toolbar", show=1, group="zoom")
        self.connect(self.__zoomAction,qt.PYSIGNAL("Actif"),self.__hide_show_zoom)
        self.__wholeActions.append(self.__zoomAction)

        self.__splitter = qt.QSplitter(qt.Qt.Horizontal,self)
        self.__splitter.show()

        self.__mainVideo = QubPixmapDisplayView(self.__splitter)
        self.__mainVideo.show()
        self.__mainVideo.setScrollbarMode('Auto')
        self.__mainPlug = _MainVideoPlug(self.__mainVideo,self.__zoomAction)

        actions = self.__creatStdActions()

        ####### ZOOM LIST #######
        self.__zoomActionList = QubZoomListAction(place = "toolbar",keepROI = True,
                                                  initZoom = self.__initZoom,zoomValList = self.__zoomList,
                                                  show = 1,group = "zoom")
        actions.insert(0,self.__zoomActionList)

        ####### ZOOM Action #######
        zoomFitOrFill = QubZoomAction(place = "toolbar",keepROI = True,group = "zoom")
        zoomFitOrFill.setList(self.__zoomActionList)
        self.__zoomActionList.setActionZoomMode(zoomFitOrFill)
        actions.append(zoomFitOrFill)

        self.__zoomVideo = QubPixmapDisplayView(self.__splitter,None,actions)
        self.__zoomVideo.hide()
        self.__zoomPlug = _ZoomPlug(self.__zoomVideo)
        self.__zoomPlug.zoom().setZoom(2,2)
        self.__cbk = _rectangleZoom(self.__zoomAction,self.__zoomPlug)

        layout = qt.QHBoxLayout(self,0,0,"layout")
        layout.addWidget(self.__splitter)

        self.__image2Pixmap = QubImage2Pixmap()
        self.__image2Pixmap.plug(self.__mainPlug)
        self.__zoomPlug.setPoller(self.__image2Pixmap)

        self.__jpegDecompress = QubStdData2Image()
        self.__jpegDecompress.setSwapRGB(True)
        self.__jpeg2image = None

        ####### PROPERTY #######
        self.addProperty('camera','string','')
        self.addProperty('zoom list','string',','.join([str(x) for x in self.__zoomList]))
        self.addProperty('init zoom','integer',self.__initZoom)
        self.addProperty('swap rgb','boolean',True)

        self.addProperty('fix : width','integer',-1)
        self.addProperty('fix : height','integer',-1)

        self.addProperty('action : print','boolean',True)
        self.addProperty('action : save image','boolean',True)
        self.addProperty('action : update','boolean',True)
        self.addProperty('action : startCamera','boolean',True)
        self.addProperty('action : brightness contrast','boolean',True)
        self.addProperty('action : beam','boolean',True)
        self.addProperty('action : scale','boolean',True)
        self.addProperty('action : change foreground color','boolean',True)
        self.addProperty('action : measure','boolean',True)
        self.addProperty('action : measure (place)', 'combo', ('toolbar','contextmenu'),'toolbar')
        self.addProperty('action : zoom window','boolean',True)
        self.addProperty('action : zoom fit or fill','boolean',True)
        self.addProperty('action : zoom list','boolean',True)
        self.addProperty('action : x,y coordinates','boolean',True)
        self.addProperty('action : default color','combo',('black','red','green'),'black')

        self.addProperty('action : save image (place)',"combo",('toolbar','contextmenu'),'toolbar')
        self.addProperty('action : save image (default path)',"string",'/tmp')
        self.addProperty('action : save image (show always configure)',"boolean",True)

        self.addProperty("diffractometer", "string", "")
        self.diffractometerHwobj = None


        ####### SIGNAL #######
        self.defineSignal("BeamPositionChanged", ())

        ####### SLOT #######
        self.defineSlot("changeBeamPosition", ())
        self.defineSlot("changePixelScale",())
        self.defineSlot('getView',())
        self.defineSlot('getImage',())

        ####### LINK VIEW AND SUB VIEW #######
        mainView = self.__mainVideo.view()
        zoomView = self.__zoomVideo.view()
        mainView.addEventMgrLink(zoomView,
                                 mainView.canvas(),zoomView.canvas(),
                                 mainView.matrix(),zoomView.matrix())

        self.imageReceivedConnected = None
Example #8
0
class CameraBrick(BlissWidget):
    def __init__(self, *args):
        BlissWidget.__init__(self, *args)

        self.camera       = None
        self.update_disabled = False
        self.__cameraName = None

        self.__zoomList = [1.5,2,2.5,3,3.5,4]
        self.__initZoom = 2

        self.__fixWidth  = -1
        self.__fixHeight = -1

        self.__swapRgb = True
                        ####### PRINT #######
        self.__printWidget = QubPrintPreview(self)
        self.__printWidget.resize(400,500)
        printer = qt.QPrinter()
        printer.setOutputToFile(1)
        printer.setOutputFileName('/tmp/print_file.ps')
        self.__printWidget.setPrinter(printer)
        self.__printWidget.update()

        self.__beamAction    = None
        self.__scaleAction   = None
        self.__chosenActions = {}
        self.__wholeActions  = []
        self.__measureDialog = None

        ####### PRINT ACTION #######
        printAction = QubPrintPreviewAction(name="print",group="admin",withVectorMenu=True)
        printAction.previewConnect(self.__printWidget)
        self.__wholeActions.append(printAction)

        ####### SAVE IMAGE #######
        self.__saveAction = QubSaveImageAction(parent=self, label='Save falcon image',
                                               name="save", group="admin")
        self.__saveAction.setConnectCallBack(self._save_dialog_new)
        self.__wholeActions.append(self.__saveAction)
        self.__defaultSavePath = '/tmp'

        ####### UPDATE #######
        update = QubToggleAction(name="update",group="image",initState=True)
        self.connect(update,qt.PYSIGNAL("StateChanged"),self.__cameraUpdate)
        self.__wholeActions.append(update)

        ####### Start Camera ######
        startCamera = QubToggleAction(name="startCamera", group="image", iconName = 'bright-cont', initState=True)
        self.connect(startCamera, qt.PYSIGNAL("StateChanged"), self.__cameraStart)
        self.__wholeActions.append(startCamera)


        ####### BRIGHTNESS/CONTRAST #######
        self.__brightcount = QubOpenDialogAction(name="bright-cont",
                                                 iconName = 'bright-cont', group="image")
        self.__brightcount.setDialog(QubBrightnessContrastDialog(self))
        self.__wholeActions.append(self.__brightcount)

        ###### Grid TOOL ######
        self.__gridToolAction = QubOpenDialogAction(parent=self, name='grid_tool',
                                                    iconName='rectangle', label='Grid tool',
                                                    group="Tools") #place="contextmenu")
        self.__gridDialog = GridDialog(self, "Grid Dialog", flags = qt.Qt.WStyle_StaysOnTop)
        self.__gridToolAction.setConnectCallBack(self._grid_dialog_connect_hdlr)
        self.__wholeActions.append(self.__gridToolAction)

        self.__previous_pos_dict = {}
        self.__beamWidth = 0
        self.__beamHeight = 0

        ####### BEAM ACTION #######
        self.__beamAction = QubBeamAction(name="beam", group="Tools")
        self.__wholeActions.append(self.__beamAction)
        self.connect(self.__beamAction,qt.PYSIGNAL("BeamSelected"),
                     self.beamSelection)

        ####### SCALE #######
        self.__scaleAction = QubScaleAction(name='scale',group='Tools')
        self.__wholeActions.append(self.__scaleAction)
        self.__wholeActions.extend(self.__creatStdActions())

        ####### ACTION INFO #######
        actionInfo = QubInfoAction(name="actionInfo", group="image",place="statusbar")
        self.__wholeActions.append(actionInfo)

        ####### CHANGE FOREGROUND COLOR #######
        self.__fcoloraction = QubForegroundColorAction(name="color", group="image")
        self.__wholeActions.append(self.__fcoloraction)

        ####### MEASURE #######
        self.__measureAction = QubOpenDialogAction(parent=self, name='measure',
                                            iconName='measure', label='Measure',
                                            group="Tools")
        self.__measureAction.setConnectCallBack(self._measure_dialog_new)
        self.__wholeActions.append(self.__measureAction)

        # ###### POSITION TOOL ######
        # self.__posToolAction = QubOpenDialogAction(parent=self, name='pos_tool',
        #                                            iconName='circle', label='Position tool',
        #                                            group="Tools")
        # self.__posToolAction.setConnectCallBack(self._line_dialog_new)
        # self.__wholeActions.append(self.__posToolAction)

        ####### ZOOM LIST #######
        zoomActionList = QubZoomListAction(place = "toolbar",
                                           initZoom = 1,zoomValList = [0.1,0.25,0.5,0.75,1,1.5,2],
                                           show = 1,group = "zoom")
        self.__wholeActions.append(zoomActionList)

        ####### ZOOM Action #######
        self.__zoomFitOrFill = QubZoomAction(place = "toolbar",group = "zoom")
        self.__wholeActions.append(self.__zoomFitOrFill)

        ####### LINK ZOOM ACTION #######
        self.__zoomFitOrFill.setList(zoomActionList)
        zoomActionList.setActionZoomMode(self.__zoomFitOrFill)

        ####### ZOOM WINDOW #######
        self.__zoomAction = QubZoomRectangle(label='Zoom Crop',place="toolbar", show=1, group="zoom")
        self.connect(self.__zoomAction,qt.PYSIGNAL("Actif"),self.__hide_show_zoom)
        self.__wholeActions.append(self.__zoomAction)

        self.__splitter = qt.QSplitter(qt.Qt.Horizontal,self)
        self.__splitter.show()

        self.__mainVideo = QubPixmapDisplayView(self.__splitter)
        self.__mainVideo.show()
        self.__mainVideo.setScrollbarMode('Auto')
        self.__mainPlug = _MainVideoPlug(self.__mainVideo,self.__zoomAction)

        actions = self.__creatStdActions()

        ####### ZOOM LIST #######
        self.__zoomActionList = QubZoomListAction(place = "toolbar",keepROI = True,
                                                  initZoom = self.__initZoom,zoomValList = self.__zoomList,
                                                  show = 1,group = "zoom")
        actions.insert(0,self.__zoomActionList)

        ####### ZOOM Action #######
        zoomFitOrFill = QubZoomAction(place = "toolbar",keepROI = True,group = "zoom")
        zoomFitOrFill.setList(self.__zoomActionList)
        self.__zoomActionList.setActionZoomMode(zoomFitOrFill)
        actions.append(zoomFitOrFill)

        self.__zoomVideo = QubPixmapDisplayView(self.__splitter,None,actions)
        self.__zoomVideo.hide()
        self.__zoomPlug = _ZoomPlug(self.__zoomVideo)
        self.__zoomPlug.zoom().setZoom(2,2)
        self.__cbk = _rectangleZoom(self.__zoomAction,self.__zoomPlug)

        layout = qt.QHBoxLayout(self,0,0,"layout")
        layout.addWidget(self.__splitter)

        self.__image2Pixmap = QubImage2Pixmap()
        self.__image2Pixmap.plug(self.__mainPlug)
        self.__zoomPlug.setPoller(self.__image2Pixmap)

        self.__jpegDecompress = QubStdData2Image()
        self.__jpegDecompress.setSwapRGB(True)
        self.__jpeg2image = None

        ####### PROPERTY #######
        self.addProperty('camera','string','')
        self.addProperty('zoom list','string',','.join([str(x) for x in self.__zoomList]))
        self.addProperty('init zoom','integer',self.__initZoom)
        self.addProperty('swap rgb','boolean',True)

        self.addProperty('fix : width','integer',-1)
        self.addProperty('fix : height','integer',-1)

        self.addProperty('action : print','boolean',True)
        self.addProperty('action : save image','boolean',True)
        self.addProperty('action : update','boolean',True)
        self.addProperty('action : startCamera','boolean',True)
        self.addProperty('action : brightness contrast','boolean',True)
        self.addProperty('action : beam','boolean',True)
        self.addProperty('action : scale','boolean',True)
        self.addProperty('action : change foreground color','boolean',True)
        self.addProperty('action : measure','boolean',True)
        self.addProperty('action : measure (place)', 'combo', ('toolbar','contextmenu'),'toolbar')
        self.addProperty('action : zoom window','boolean',True)
        self.addProperty('action : zoom fit or fill','boolean',True)
        self.addProperty('action : zoom list','boolean',True)
        self.addProperty('action : x,y coordinates','boolean',True)
        self.addProperty('action : default color','combo',('black','red','green'),'black')

        self.addProperty('action : save image (place)',"combo",('toolbar','contextmenu'),'toolbar')
        self.addProperty('action : save image (default path)',"string",'/tmp')
        self.addProperty('action : save image (show always configure)',"boolean",True)

        self.addProperty("diffractometer", "string", "")
        self.diffractometerHwobj = None


        ####### SIGNAL #######
        self.defineSignal("BeamPositionChanged", ())

        ####### SLOT #######
        self.defineSlot("changeBeamPosition", ())
        self.defineSlot("changePixelScale",())
        self.defineSlot('getView',())
        self.defineSlot('getImage',())

        ####### LINK VIEW AND SUB VIEW #######
        mainView = self.__mainVideo.view()
        zoomView = self.__zoomVideo.view()
        mainView.addEventMgrLink(zoomView,
                                 mainView.canvas(),zoomView.canvas(),
                                 mainView.matrix(),zoomView.matrix())

        self.imageReceivedConnected = None

    def safeConnect(self):
        if not self.imageReceivedConnected and self.camera is not None:
            #print "CONNECTING 0"
            self.camera.connect('imageReceived', self.__imageReceived)
            #self.connect(self.camera,qt.PYSIGNAL('imageReceived'),self.__imageReceived)
            self.imageReceivedConnected = False

    def safeDisconnect(self):
        if self.imageReceivedConnected and self.camera is not None:
            #print "DISCONNECTING 3"
            self.camera.disconnect('imageReceived', self.__imageReceived)
            #self.disconnect(self.camera,qt.PYSIGNAL('imageReceived'),self.__imageReceived)
            self.imageReceivedConnected = False

    def disable_update(self):
        #self.__imageReceived(DISABLED_JPEG,DISABLED_WIDTH,DISABLED_HEIGHT)
        self.update_disabled = True

    def enable_update(self):
        self.update_disabled = False

    def __imageReceived(self,image,width,height,force_update=False):
        if self.update_disabled:
            return

        if not force_update:
            if not self.isVisible():
                return
        
        if isinstance(image,qt.QImage):
            if self.__swapRgb:
                image = image.swapRGB()
            self.__jpeg2image.setImage(image,image)
        else:
            self.__jpegDecompress.putData(image,width,height)

    def propertyChanged(self,property,oldValue,newValue):
        if property=='camera':
            #if self.camera is not None and not self.isRunning():
            #    self.safeDisconnect()
            self.safeDisconnect()
            self.camera      = self.getHardwareObject(newValue)
            self.__hwoName   = newValue

            if self.camera is not None:
		try:
                    self.__tangoName = self.camera.tangoname
		except:
		    self.__tangoName = ""

                try:
                    camera_role=self.camera.getDeviceByRole('camera')
                    if camera_role is not None:
                        self.camera=camera_role
                except AttributeError:
                    pass

                self.__brightcount.setCamera(self.camera)

        elif property == 'zoom list' :
            zoomList = [float(x) for x in newValue.split(',')]
            if zoomList != self.__zoomList :
                self.__zoomList = zoomList
                self.__zoomActionList.changeZoomList(zoomList,self.__initZoom)
        elif property == 'init zoom' :
            if newValue != self.__initZoom :
                self.__initZoom = newValue
                self.__zoomActionList.changeZoomList(self.__zoomList,newValue)
        elif property == 'swap rgb' :
            self.__jpegDecompress.setSwapRGB(newValue)
            self.__swapRgb = newValue
        elif property == 'action : print' : self.__chosenActions['print'] = newValue
        elif property == 'action : save image' : self.__chosenActions['save'] = newValue
        elif property == 'action : update' : self.__chosenActions['update'] = newValue
        elif property == 'action : startCamera' : self.__chosenActions['startCamera'] = newValue
        elif property == 'action : brightness contrast' : self.__chosenActions['bright-cont'] = newValue
        elif property == 'action : beam' : self.__chosenActions['beam'] = newValue
        elif property == 'action : scale' : self.__chosenActions['scale'] = newValue
        elif property == 'action : change foreground color' : self.__chosenActions['color'] = newValue
        elif property == 'action : measure' : self.__chosenActions['measure'] = newValue
        elif property == 'action : zoom window' : self.__chosenActions['zoomrect'] = newValue
        elif property == 'action : zoom fit or fill' : self.__chosenActions['Zoom tools'] = newValue
        elif property == 'action : zoom list' : self.__chosenActions['zoomlist'] = newValue
        elif property == 'action : x,y coordinates' : self.__chosenActions['position'] = newValue
        elif property == 'action : default color' : self.__chosenDefaultColor = newValue
        elif property == 'action : save image (place)' :
            self.__saveAction.setPlace(newValue,True)
        elif property == 'action : measure (place)':
            self.__measureAction.setPlace(newValue, True)
        elif property == 'action : save image (default path)' :
            self.__defaultSavePath = newValue
        elif property == 'action : save image (show always configure)' :
            self.__saveAction.setConfigureOnClick(newValue)

        elif property == 'fix : width' : self.__fixWidth = newValue
        elif property == 'fix : height': self.__fixHeight = newValue
        elif property == "diffractometer":
            self.diffractometerHwobj = self.getHardwareObject(newValue)
            if self.diffractometerHwobj is not None:
                self.__previous_pos_dict = self.diffractometerHwobj.getPositions()
                self.diffractometerHwobj.connect("minidiffStateChanged",
                                                 self.diffractometerChanged)
                if self.diffractometerHwobj.zoomMotor is not None:    
                    zoom = self.diffractometerHwobj.zoomMotor.getPosition()
                    xSize,ySize = self.diffractometerHwobj.getCalibrationData(zoom)
                    #xSize,ySize = self.__scaleAction.xPixelSize(), self.__scaleAction.yPixelSize()
                    self.diffractometerHwobj.getBeamInfo(self.__getBeamInfo)
                    beam_pos_x = self.diffractometerHwobj.getBeamPosX()
                    beam_pos_y = self.diffractometerHwobj.getBeamPosY()


                    self.__gridDialog.set_x_pixel_size(xSize)
                    self.__gridDialog.set_y_pixel_size(ySize)
                    self.__gridDialog.set_beam_position(beam_pos_x, beam_pos_y,
                                                 self.__beamWidth, self.__beamHeight)

    def run(self) :
        chosenActions = []

        for action in self.__wholeActions :
            if self.__chosenActions.get(action.name(), True) :
                chosenActions.append(action)

        self.__mainVideo.addAction(chosenActions)

        if not self.__chosenActions.get('update', False) :
            self.__cameraUpdate(True)

        if not self.__chosenActions.get('startCamera', False) :
            self.__cameraStart(True)

        if self.__fixWidth != -1 and self.__fixHeight != -1 :
            self.__mainVideo.view().setFixedSize(self.__fixWidth + 4,self.__fixHeight + 4)

        self.__startIdle = qt.QTimer(self)
        qt.QObject.connect(self.__startIdle,qt.SIGNAL('timeout()'),self.__idleRun)
        self.__startIdle.start(0)

    def __idleRun(self) :
        self.__startIdle.stop()
        self.__fcoloraction.setColor(self.__chosenDefaultColor)
        self.__mainVideo.view().setForegroundColor(qt.QColor(self.__chosenDefaultColor))

    def stop(self) :
        self.safeDisconnect()

    def beamSelection(self,x,y) :
        self.emit(qt.PYSIGNAL("BeamPositionChanged"), (x,y))
        self.changeBeamPosition(x,y)

    def changeBeamPosition(self, x, y, beam_width=None, beam_height=None):
        self.__beamAction.setBeamPosition(x, y)
        try:
            if not beam_width:
                beam_width = self.__beamWidth

            if not beam_height:
                beam_height = self.__beamHeight

            self.__gridDialog.set_beam_position(x, y, beam_width, beam_height)
        except:
            pass

    def changePixelScale(self,sizex,sizey) :
        self.__scaleAction.setXPixelSize(sizex)
        self.__scaleAction.setYPixelSize(sizey)
        if self.__measureDialog :
            self.__measureDialog.setXPixelSize(sizex)
            self.__measureDialog.setYPixelSize(sizey)

        self.__gridDialog.set_x_pixel_size(sizex)
        self.__gridDialog.set_y_pixel_size(sizey)

    def getView(self,key):
        try:
            key['drawing'] = self.__mainVideo.view()
            key['view']    = self.__mainVideo
            key['hwname']  = self.__hwoName
            key['dsname']  = self.__tangoName
        except:
            pass

    def getImage(self,key) :
        if self.__jpeg2image is not None :
            try:
                key['image'] = self.__jpeg2image.getLastImage()
            except:
                pass

    def __creatStdActions(self) :
        actions = []
        ####### MOUSE POSITION #######
        posaction = QubPositionAction(name="position", group="image",place="statusbar")
        actions.append(posaction)

        return actions

    def __cameraUpdate(self,onoff) :
        if onoff :
            self.__jpeg2image = _Jpeg2ImagePlug(self.__image2Pixmap)
            self.__jpegDecompress.plug(self.__jpeg2image)
            if self.camera is not None:
                imageInfo = self.camera.imageType()
            else:
                imageInfo = None
            imType    = self.__jpegDecompress.STANDARD
            if imageInfo :
                if imageInfo.type() == 'bayer': imType = self.__jpegDecompress.BAYER_RG
                elif imageInfo.type() == 'raw': imType = self.__jpegDecompress.RAW
            self.__jpegDecompress.setImageType(imType)
            self.safeConnect()
        else:
            self.safeDisconnect()
            self.__jpeg2image.setEnd()

    def __cameraStart(self, onoff) :
        if onoff :
            print "********************************************************Set the camera ON"
            if self.camera is not None:
                self.camera.setLive(True)
            else:
                print "camera is none"
        else:
            print "****************************************************Set the camera off"
            if self.camera is not None:
                print "camera :"
                print self.camera
                self.camera.setLive(False)
            else:
                print "camera is none"

    def __hide_show_zoom(self,actif) :
        if actif :
            if self.__chosenActions['Zoom tools'] :
                self.__zoomFitOrFill.setState(True)
            else:
                self.__mainVideo.setScrollbarMode('Fit2Screen')
            self.__zoomPlug.start()
            self.__zoomVideo.show()
            splitterWidth = self.__splitter.width()
            self.__splitter.setSizes([splitterWidth/3,splitterWidth - splitterWidth/3])
        else:
            if self.__chosenActions['Zoom tools'] :
                self.__zoomFitOrFill.setState(False)
            else:
                self.__mainVideo.setScrollbarMode('Auto')
            self.__zoomPlug.stop()
            self.__zoomVideo.hide()

    def _measure_dialog_new(self,openDialogAction,aQubImage) :
        try :
            self.__measureDialog = QubMeasureListDialog(self,
                                                        canvas=aQubImage.canvas(),
                                                        matrix=aQubImage.matrix(),
                                                        eventMgr=aQubImage)
            xSize,ySize = self.__scaleAction.xPixelSize(),self.__scaleAction.yPixelSize()
            self.__measureDialog.setXPixelSize(xSize)
            self.__measureDialog.setYPixelSize(ySize)
            self.__measureDialog.connect(aQubImage, qt.PYSIGNAL("ForegroundColorChanged"),
                                         self.__measureDialog.setDefaultColor)
            openDialogAction.setDialog(self.__measureDialog)
        except:
            import traceback
            traceback.print_exc()

    def _grid_dialog_connect_hdlr(self,openDialogAction, aQubImage) :
        try :
            self.__gridDialog.set_qub_event_mgr(aQubImage)
            openDialogAction.setDialog(self.__gridDialog)
        except:
            import traceback
            traceback.print_exc()

    def __getBeamInfo(self, ret):
        self.__beamWidth = float(ret["size_x"])
        self.__beamHeight = float(ret["size_y"])
        #self.__beamShape = ret["shape"]

    def _save_dialog_new(self,openDialogAction,aQubImage) :
        saveDialog = QubSaveImageDialog(self,matrix=aQubImage.matrix(),canvas=aQubImage.canvas())
        saveDialog.setImage2Pixmap(self.__image2Pixmap)
        saveDialog.setSavePath(self.__defaultSavePath)
        openDialogAction.setDialog(saveDialog)

    def instanceMirrorChanged(self,mirror):
        #print "INSTANCEMIRRORCHANGED",mirror,BlissWidget.isInstanceMirrorAllow()
        return
        if BlissWidget.isInstanceModeSlave():
            if BlissWidget.isInstanceMirrorAllow():
                self.safeConnect()
            else:
                self.safeDisconnect()

    def diffractometerChanged(self, *args):
        """
        Handles diffractometer change events, connected to the signal 
        minidiffStateChanged of the diffractometer hardware object.
        """
        
        if self.diffractometerHwobj.isReady():
            pos_dict = self.diffractometerHwobj.getPositions()
            p1 = self.diffractometerHwobj.motor_positions_to_screen(self.__previous_pos_dict)
            p2 = (self.diffractometerHwobj.getBeamPosX(), self.diffractometerHwobj.getBeamPosY())

            dx = p2[0] - p1[0]
            dy = p2[1] - p1[1]

            if dy != 0:
                self.__gridDialog.move_grid_ver(-dy)

            if dx != 0:
                self.__gridDialog.move_grid_hor(-dx)

            #print dx, dy

            self.__previous_pos_dict = pos_dict
class CameraMosaicBrick(BlissWidget):
    def __init__(self, *args):
        BlissWidget.__init__(self, *args)

        actions = []

        self.__zoomList = QubZoomListAction(
            place="toolbar", zoomValList=[0.1, 0.25, 0.5, 1, 1.5, 2, 2.5, 3, 3.5, 4], show=1, group="zoom"
        )
        actions.append(self.__zoomList)

        self.__zoomFitOrFill = QubZoomAction(place="toolbar", keepROI=True, group="zoom")
        self.__zoomFitOrFill.setList(self.__zoomList)
        self.__zoomList.setActionZoomMode(self.__zoomFitOrFill)
        actions.append(self.__zoomFitOrFill)

        zoomAction = QubZoomRectangle(
            label="Zoom Crop",
            place="toolbar",
            show=1,
            group="zoom",
            activate_click_drag=True,
            drawingObjectLayer=2 ** 31,
            unactiveActionWhenDub=True,
        )
        qt.QObject.connect(zoomAction, qt.PYSIGNAL("RectangleSelected"), self.__rectangleZoomChanged)
        actions.append(zoomAction)

        ####### CHANGE FOREGROUND COLOR #######
        fcoloraction = QubForegroundColorAction(name="color", group="image")
        actions.append(fcoloraction)

        ####### MEASURE #######
        measureAction = QubOpenDialogAction(
            parent=self, name="measure", iconName="measure", label="Measure", group="Tools"
        )
        measureAction.setConnectCallBack(self._measure_dialog_new)
        actions.append(measureAction)

        self.__mainView = QubMosaicView(self, actions=actions)

        layout = qt.QHBoxLayout(self)
        layout.addWidget(self.__mainView)

        ####### SLOT #######
        self.defineSlot("getView", ())

    def getView(self, key):
        try:
            key["drawing"] = self.__mainView.view()
            key["view"] = self.__mainView
        except:
            pass

    def __rectangleZoomChanged(self, drawingMgr):
        self.__zoomFitOrFill.setState(False)
        rect = drawingMgr.rect()
        canvas = self.__mainView.view()

        matrix = canvas.matrix()

        vp = canvas.viewport()
        viewWidth, viewHeight = vp.width(), vp.height()
        zoomX = float(viewWidth) / rect.width()
        zoomY = float(viewHeight) / rect.height()
        zoom = max(zoomX, zoomY)

        newMatrix = qt.QWMatrix(zoom, 0, 0, zoom, matrix.dx(), matrix.dy())
        rect = newMatrix.map(rect)
        zoom = min(zoom, 20)
        canvas.setZoom(zoom, zoom)
        canvas.setContentsPos(rect.x(), rect.y())
        self.__zoomList.writeStrValue("%d%%" % (zoom * 100))

    def _measure_dialog_new(self, openDialogAction, aQubImage):
        try:
            self.__measureDialog = QubMeasureListDialog(
                self,
                canvas=aQubImage.canvas(),
                matrix=aQubImage.matrix(),
                eventMgr=aQubImage,
                drawingObjectLayer=2 ** 31,
            )
            self.__measureDialog.connect(
                aQubImage, qt.PYSIGNAL("ForegroundColorChanged"), self.__measureDialog.setDefaultColor
            )
            openDialogAction.setDialog(self.__measureDialog)
        except:
            import traceback

            traceback.print_exc()