Ejemplo n.º 1
0
 def view_server_logs(self):
     from calibre.library.server import log_access_file, log_error_file
     d = QDialog(self)
     d.resize(QSize(800, 600))
     layout = QVBoxLayout()
     d.setLayout(layout)
     layout.addWidget(QLabel(_('Error log:')))
     el = QPlainTextEdit(d)
     layout.addWidget(el)
     try:
         el.setPlainText(
             open(log_error_file, 'rb').read().decode('utf8', 'replace'))
     except IOError:
         el.setPlainText('No error log found')
     layout.addWidget(QLabel(_('Access log:')))
     al = QPlainTextEdit(d)
     layout.addWidget(al)
     try:
         al.setPlainText(
             open(log_access_file, 'rb').read().decode('utf8', 'replace'))
     except IOError:
         al.setPlainText('No access log found')
     bx = QDialogButtonBox(QDialogButtonBox.Ok)
     layout.addWidget(bx)
     bx.accepted.connect(d.accept)
     d.show()
Ejemplo n.º 2
0
def show_config_dialog(ia):
    global config_dialog
    global config_widget

    if not config_dialog:
        config_dialog = QDialog(ia.gui)

        config_widget = ConfigWidget(ia)

        button_box = QDialogButtonBox(QDialogButtonBox.Close)
        button_box.accepted.connect(hide_config_dialog)
        button_box.rejected.connect(hide_config_dialog)

        v = QVBoxLayout(config_dialog)
        v.addWidget(config_widget)
        v.addWidget(button_box)

        geom = prefs.get('config_dialog_geometry')
        if geom:
            config_dialog.restoreGeometry(geom)
        else:
            config_dialog.resize(config_dialog.sizeHint())

        config_dialog.setModal(False)

    config_dialog.show()
    config_dialog.raise_()
    config_dialog.activateWindow()
    config_widget.textBrowser.setHtml(help_text)
    config_widget.scroll_function_names_box(prefs['current_macro'])
Ejemplo n.º 3
0
 def view_server_logs(self):
     from calibre.srv.embedded import log_paths
     log_error_file, log_access_file = log_paths()
     d = QDialog(self)
     d.resize(QSize(800, 600))
     layout = QVBoxLayout()
     d.setLayout(layout)
     layout.addWidget(QLabel(_('Error log:')))
     el = QPlainTextEdit(d)
     layout.addWidget(el)
     try:
         el.setPlainText(
             lopen(log_error_file, 'rb').read().decode('utf8', 'replace'))
     except EnvironmentError:
         el.setPlainText(_('No error log found'))
     layout.addWidget(QLabel(_('Access log:')))
     al = QPlainTextEdit(d)
     layout.addWidget(al)
     try:
         al.setPlainText(
             lopen(log_access_file, 'rb').read().decode('utf8', 'replace'))
     except EnvironmentError:
         al.setPlainText(_('No access log found'))
     loc = QLabel(
         _('The server log files are in: {}').format(
             os.path.dirname(log_error_file)))
     loc.setWordWrap(True)
     layout.addWidget(loc)
     bx = QDialogButtonBox(QDialogButtonBox.Ok)
     layout.addWidget(bx)
     bx.accepted.connect(d.accept)
     d.show()
Ejemplo n.º 4
0
 def view_server_logs(self):
     from calibre.srv.embedded import log_paths
     log_error_file, log_access_file = log_paths()
     d = QDialog(self)
     d.resize(QSize(800, 600))
     layout = QVBoxLayout()
     d.setLayout(layout)
     layout.addWidget(QLabel(_('Error log:')))
     el = QPlainTextEdit(d)
     layout.addWidget(el)
     try:
         el.setPlainText(
             lopen(log_error_file, 'rb').read().decode('utf8', 'replace')
         )
     except EnvironmentError:
         el.setPlainText(_('No error log found'))
     layout.addWidget(QLabel(_('Access log:')))
     al = QPlainTextEdit(d)
     layout.addWidget(al)
     try:
         al.setPlainText(
             lopen(log_access_file, 'rb').read().decode('utf8', 'replace')
         )
     except EnvironmentError:
         al.setPlainText(_('No access log found'))
     loc = QLabel(_('The server log files are in: {}').format(os.path.dirname(log_error_file)))
     loc.setWordWrap(True)
     layout.addWidget(loc)
     bx = QDialogButtonBox(QDialogButtonBox.Ok)
     layout.addWidget(bx)
     bx.accepted.connect(d.accept)
     d.show()
Ejemplo n.º 5
0
    def view_server_logs(self):
        from calibre.library.server import log_access_file, log_error_file

        d = QDialog(self)
        d.resize(QSize(800, 600))
        layout = QVBoxLayout()
        d.setLayout(layout)
        layout.addWidget(QLabel(_("Error log:")))
        el = QPlainTextEdit(d)
        layout.addWidget(el)
        try:
            el.setPlainText(open(log_error_file, "rb").read().decode("utf8", "replace"))
        except IOError:
            el.setPlainText("No error log found")
        layout.addWidget(QLabel(_("Access log:")))
        al = QPlainTextEdit(d)
        layout.addWidget(al)
        try:
            al.setPlainText(open(log_access_file, "rb").read().decode("utf8", "replace"))
        except IOError:
            al.setPlainText("No access log found")
        bx = QDialogButtonBox(QDialogButtonBox.Ok)
        layout.addWidget(bx)
        bx.accepted.connect(d.accept)
        d.show()
Ejemplo n.º 6
0
        def run(self, *args, **kwargs):
            """Create & show dialog

            Args:
                onClose(accepted): Function to run on close. Defaults to None.
            """
            dlg = QDialog()
            dlg.setWindowFlags(dlg.windowFlags()
                               & ~Qt.WindowContextHelpButtonHint)
            dlg.setWindowTitle(title)

            layout = QVBoxLayout()
            layout.setContentsMargins(10, 10, 10, 10)
            self.layout = layout
            dlg.setLayout(layout)

            pushQDlgStack(self)
            self.constructor(dlg, *args, **kwargs)
            popQDlgStack(self)

            dlg.setWindowModality(Qt.WindowModal)
            if size:
                dlg.resize(size[0], size[1])
            dlg.show()
            return dlg.exec_() == QDialog.Accepted
Ejemplo n.º 7
0
 def show(self):
     QDialog.show(self)
     if self.geom_pref is None:
         if self.parent() is None:
             geom = QDesktopWidget.screenGeometry(self)
         else:
             geom = self.parent().geometry()
         x = max(50, geom.x() + geom.width() // 2 - self.width() // 2)
         y = max(50, geom.y() + geom.height() // 2 - self.height() // 2)
         self.move(x, y)
Ejemplo n.º 8
0
 def show(self):
     QDialog.show(self)
     if self.geom_pref is None:
         if self.parent() is None:
             geom = QDesktopWidget.screenGeometry(self)
         else:
             geom = self.parent().geometry()
         x = max(50, geom.x() + geom.width() // 2 - self.width() // 2)
         y = max(50, geom.y() + geom.height() // 2 - self.height() // 2)
         self.move(x, y)
Ejemplo n.º 9
0
    def view_server_logs(self):
        from calibre.srv.embedded import log_paths
        log_error_file, log_access_file = log_paths()
        d = QDialog(self)
        d.resize(QSize(800, 600))
        layout = QVBoxLayout()
        d.setLayout(layout)
        layout.addWidget(QLabel(_('Error log:')))
        el = QPlainTextEdit(d)
        layout.addWidget(el)
        try:
            el.setPlainText(
                lopen(log_error_file, 'rb').read().decode('utf8', 'replace'))
        except EnvironmentError:
            el.setPlainText(_('No error log found'))
        layout.addWidget(QLabel(_('Access log:')))
        al = QPlainTextEdit(d)
        layout.addWidget(al)
        try:
            al.setPlainText(
                lopen(log_access_file, 'rb').read().decode('utf8', 'replace'))
        except EnvironmentError:
            al.setPlainText(_('No access log found'))
        loc = QLabel(
            _('The server log files are in: {}').format(
                os.path.dirname(log_error_file)))
        loc.setWordWrap(True)
        layout.addWidget(loc)
        bx = QDialogButtonBox(QDialogButtonBox.Ok)
        layout.addWidget(bx)
        bx.accepted.connect(d.accept)
        b = bx.addButton(_('&Clear logs'), bx.ActionRole)

        def clear_logs():
            if getattr(self.server, 'is_running', False):
                return error_dialog(
                    d,
                    _('Server running'),
                    _('Cannot clear logs while the server is running. First stop the server.'
                      ),
                    show=True)
            if self.server:
                self.server.access_log.clear()
                self.server.log.clear()
            else:
                for x in (log_error_file, log_access_file):
                    try:
                        os.remove(x)
                    except EnvironmentError as err:
                        if err.errno != errno.ENOENT:
                            raise
            el.setPlainText(''), al.setPlainText('')

        b.clicked.connect(clear_logs)
        d.show()
Ejemplo n.º 10
0
    def view_server_logs(self):
        from calibre.srv.embedded import log_paths
        log_error_file, log_access_file = log_paths()
        d = QDialog(self)
        d.resize(QSize(800, 600))
        layout = QVBoxLayout()
        d.setLayout(layout)
        layout.addWidget(QLabel(_('Error log:')))
        el = QPlainTextEdit(d)
        layout.addWidget(el)
        try:
            el.setPlainText(
                lopen(log_error_file, 'rb').read().decode('utf8', 'replace')
            )
        except EnvironmentError:
            el.setPlainText(_('No error log found'))
        layout.addWidget(QLabel(_('Access log:')))
        al = QPlainTextEdit(d)
        layout.addWidget(al)
        try:
            al.setPlainText(
                lopen(log_access_file, 'rb').read().decode('utf8', 'replace')
            )
        except EnvironmentError:
            al.setPlainText(_('No access log found'))
        loc = QLabel(_('The server log files are in: {}').format(os.path.dirname(log_error_file)))
        loc.setWordWrap(True)
        layout.addWidget(loc)
        bx = QDialogButtonBox(QDialogButtonBox.Ok)
        layout.addWidget(bx)
        bx.accepted.connect(d.accept)
        b = bx.addButton(_('&Clear logs'), bx.ActionRole)

        def clear_logs():
            if getattr(self.server, 'is_running', False):
                return error_dialog(d, _('Server running'), _(
                    'Cannot clear logs while the server is running. First stop the server.'), show=True)
            if self.server:
                self.server.access_log.clear()
                self.server.log.clear()
            else:
                for x in (log_error_file, log_access_file):
                    try:
                        os.remove(x)
                    except EnvironmentError as err:
                        if err.errno != errno.ENOENT:
                            raise
            el.setPlainText(''), al.setPlainText('')

        b.clicked.connect(clear_logs)
        d.show()
Ejemplo n.º 11
0
 def show(self):
     dprint(4, "show entrypoint")
     if self._geometry:
         dprint(4, "setting geometry")
         self.setGeometry(self._geometry)
     if self._hist is None:
         busy = BusyIndicator()
         dprint(4, "updating histogram")
         self._updateHistogram()
         dprint(4, "updating stats")
         self._updateStats(self._subset, self._subset_range)
         busy.reset_cursor()
     dprint(4, "calling QDialog.show")
     QDialog.show(self)
Ejemplo n.º 12
0
 def show(self):
     """Shows dialog, resetting the model if it was invisible."""
     if not self.isVisible():
         self.resetModel()
     QDialog.show(self)
Ejemplo n.º 13
0
 def show(self):
     QDialog.show(self)
     if self.is_pane:
         self.gui.quickview_splitter.show_quickview_widget()
Ejemplo n.º 14
0
class Window:
    def __init__(self):
        # ---------------------------------------------------------------------------------------------------------- #
        # START OF APPLICATION
        # ------------------------
        # ------------------------
        # Set flags
        # ------------------------
        # *** SET AS SWITCH UP/DOWN *** #
        self.UP = True
        self.DOWN = False
        # *** IMAGES *** #
        self.ALL_IMG_FORMAT = "All Supported (*.jpg *.jpeg *.jpe *.png *.bmp *.tif *.tiff " \
                              "*.dib *.pbm *.pgm *.ppm *.sr *.ras)"
        self.JPG_FORMAT = "JPG (*.jpg *.jpeg *.jpe)"
        self.PNG_FORMAT = "PNG (*.png)"
        self.BMP_FORMAT = "BMP (*.bmp)"
        self.TIF_FORMAT = "TIFF (*.tif *.tiff)"
        self.DIB_FORMAT = "DIB (*.dib)"
        self.PBM_FORMAT = "PBM (*.pbm)"
        self.PGM_FORMAT = "PGM (*.pgm)"
        self.PPM_FORMAT = "PPM (*.ppm)"
        self.SR__FORMAT = "SR (*.sr)"
        self.RAS_FORMAT = "RAS (*.ras)"
        self.DD = ";;"
        self.IMG_FILTER = self.ALL_IMG_FORMAT + self.DD + self.JPG_FORMAT + self.DD + self.PNG_FORMAT + self.DD + \
                          self.BMP_FORMAT + self.DD + self.TIF_FORMAT + self.DD + self.DIB_FORMAT + self.DD + \
                          self.PBM_FORMAT + self.DD + self.PGM_FORMAT + self.DD + self.PPM_FORMAT + self.DD + \
                          self.SR__FORMAT + self.DD + self.RAS_FORMAT
        # *** VIDEOS *** #
        self.ALL_VID_FORMAT = "All Supported (*.mov *.MOV *.mp4 *.avi)"
        self.MOV_FORMAT = "MOV (*.mov *.MOV)"
        self.MP4_FORMAT = "MP4 (*.mp4)"
        self.AVI_FORMAT = "AVI (*.avi)"
        self.VID_FILTER = self.ALL_VID_FORMAT + self.DD + self.MOV_FORMAT + self.DD + self.MP4_FORMAT + self.DD\
                          + self.AVI_FORMAT
        # *** Qt FLAGS *** #
        self.DIALOG_FLAG = QFileDialog.DontUseNativeDialog
        self.Q_ASPECT_RATIO = Qt.KeepAspectRatio
        # *** FEATURE OPTION FLAG *** #
        self.F_SIFT = IMG_SIFT
        self.F_SURF = IMG_SURF
        self.F_ORB = IMG_ORB
        self.F_AKAZE = IMG_AKAZE
        # ------------------------
        # Flags Section ends here
        # ---------------------------------------------------------------------------------------------------------- #
        #
        # ------------------------
        # Set class items
        # ------------------------
        self.video_list = []
        self.image_list = []
        self.image_block = ImageBlock()

        self.img_view_index = 0
        self.draw_kp = self.DOWN
        # ------------------------
        # Class items ends here
        # ---------------------------------------------------------------------------------------------------------- #
        # ------------------------
        # Set up the ui
        # ------------------------
        # *** MAIN_UI *** #
        self.app = QtWidgets.QApplication(sys.argv)
        self.ui_main_win = Ui_MainWindow()
        self.MainWindow = QtWidgets.QMainWindow()
        self.ui_main_win.setupUi(self.MainWindow)

        # *** VIDEO TO IMAGES UI *** #
        self.ui_video2images = Ui_Video2Images()
        self.Video2Images = QDialog()
        self.ui_video2images.setupUi(self.Video2Images)

        # *** SIMPLE IMAGE VIEWER *** #
        self.ui_simple_img_viewer = Ui_SimpleImageViewer()
        self.SimpleImageViewer = QDialog()
        self.ui_simple_img_viewer.setupUi(self.SimpleImageViewer)

        # *** CRABS SFM UI *** #
        self.ui_crabSFM = Ui_CrabsSFM()
        self.WinCrabSFM = QDialog()
        self.ui_crabSFM.setupUi(self.WinCrabSFM)

        # ------------------------
        # Setting up ends here
        # ---------------------------------------------------------------------------------------------------------- #
        # ------------------------
        # Actions list starts here
        # ------------------------
        # *** UI_MAIN_WIN *** #
        # ** FILE ** #
        self.ui_main_win.actionExit.triggered.connect(self.exit_window)  # actionExit
        # *** IMAGE *** #
        self.ui_main_win.actionImageImport.triggered.connect(self.image_import)  # actionImageImport
        self.ui_main_win.button_add_image.clicked.connect(self.image_import)  # button_add_image
        self.ui_main_win.button_del_image.clicked.connect(self.image_delete)  # button_del_image
        self.ui_main_win.actionImage_Viewer.triggered.connect(self.simgv_open)  # actionImage_Viewer

        self.ui_main_win.actionApproximate_Interior_Orientation.triggered.connect(self.image_approximate_camera)
        self.ui_main_win.actionSIFT.triggered.connect(lambda: self.image_find_feature_points(self.F_SIFT))
        self.ui_main_win.actionSURF.triggered.connect(lambda: self.image_find_feature_points(self.F_SURF))
        self.ui_main_win.actionORB.triggered.connect(lambda: self.image_find_feature_points(self.F_ORB))
        self.ui_main_win.actionAKAZE.triggered.connect(lambda: self.image_find_feature_points(self.F_AKAZE))
        self.ui_main_win.actionCreate_Block.triggered.connect(self.image_create_block)
        self.ui_main_win.actionAll_Images_Matching.triggered.connect(lambda: self.image_matching(fast=False))
        self.ui_main_win.actionFast_Matching.triggered.connect(lambda: self.image_matching(fast=True))
        self.ui_main_win.actionCreate_Model.triggered.connect(self.image_create_model)
        self.ui_main_win.actionCrabSFM.triggered.connect(self.crabSFM_open)
        # *** SIMPLE IMAGE VIEWER *** #
        self.ui_simple_img_viewer.button_previous.clicked.connect(self.simgv_button_previous)
        self.ui_simple_img_viewer.button_next.clicked.connect(self.simgv_button_next)
        self.ui_simple_img_viewer.check_box_draw_keypoints.stateChanged.connect(self.simgv_kp_view_check)

        # *** CrabSFM UI *** #
        self.ui_crabSFM.button_cancel.clicked.connect(self.crabSFM_cancel)
        self.ui_crabSFM.button_compute.clicked.connect(self.crabSFM_compute_threading)

        # *** VIDEO *** #
        self.ui_main_win.actionVideoImport.triggered.connect(self.video_import)  # actionVideoImport
        self.ui_main_win.actionVideo_to_Images.triggered.connect(self.video2images)  # actionVideo_to_Images
        self.ui_main_win.button_add_video.clicked.connect(self.video_import)  # button_add_video
        self.ui_main_win.button_del_video.clicked.connect(self.video_delete)  # button_del_video

        # *** UI_VIDEO_2_IMAGES *** #
        self.ui_video2images.button_cancel.clicked.connect(self.video2images_cancel)
        self.ui_video2images.button_compute.clicked.connect(self.video2images_compute)
        self.ui_video2images.combo_box_select_video.currentTextChanged.connect(self.video2images_set_fps_for_video)
        self.ui_video2images.button_export_images_at.clicked.connect(self.video2images_set_export_folder)

        # ------------------------
        # Actions list ends here
        # ---------------------------------------------------------------------------------------------------------- #
        # ------------------------
        # Main loop and exit app
        # ------------------------
        self.MainWindow.show()  # Main Loop
        sys.exit(self.app.exec_())  # Close application
        # ------------------------
        # END OF APPLICATION
        # ---------------------------------------------------------------------------------------------------------- #

    # -------------------
    # ACTION FUNCTIONS
    # -------------------

    # *** FILE *** #

    def exit_window(self):
        """
        Signal exit application
        :return: Nothing
        """
        self.MainWindow.close()  # Close The window

    # *** IMAGES *** #

    def image_import(self):
        """
        Take the path(s) of one or more images and import them to the application.
        :return: Nothing
        """
        file_dialog = QFileDialog()  # Create QFileDialog
        # Open the file dialog as Open File Names dialog (for image choice)
        f_path = file_dialog.getOpenFileNames(parent=None,
                                              caption="Open Image(s)",
                                              directory=QDir.homePath(),
                                              filter=self.IMG_FILTER,
                                              options=self.DIALOG_FLAG)[0]
        if f_path:  # If user chose at least one image
            img_id_counter = 0  # Set a counter for id
            for file in f_path:  # For all paths in f_paths
                image_tmp = Image()  # Create an Image object
                success = image_tmp.img_open(file)  # Set image parameters
                if success:  # If image exists
                    image_tmp.img_set_image_id(img_id_counter)  # Set image counter
                    img_id_counter += 1  # increase the counter by 1
                    # image_tmp.img_print_info()  # print image info for debugging
                    self.image_list.append(image_tmp)  # Append image to list
                    item_name = "../" + image_tmp.info.dir_name + "/" + image_tmp.info.name  # Set name for view
                    item_widget = QListWidgetItem(item_name)  # Append item to window image list
                    item_widget.setFlags(item_widget.flags() | QtCore.Qt.ItemIsUserCheckable)  # Set it checkable
                    item_widget.setCheckState(QtCore.Qt.Checked)  # Set it checked
                    self.ui_main_win.listImage.addItem(item_widget)  # Add item to list
                    self.ui_main_win.menuCamera_Settings.setEnabled(self.UP)  # Enable Camera menu
                    self.ui_main_win.actionCrabSFM.setEnabled(self.UP)  # Enable SFM action

    def image_delete(self):
        """
        Delete an image from the list
        :return: Nothing
        """
        item_list = self.ui_main_win.listImage.selectedItems()  # Take all selected indexes
        if not item_list:  # If nothing is selected
            return  # return
        for item in item_list:  # else for each selected item
            self.image_list.pop(self.ui_main_win.listImage.row(item))  # delete the item from python image_list
            self.ui_main_win.listImage.takeItem(self.ui_main_win.listImage.row(item))  # delete it from Qt image list
        image_list_counter = 0  # set image id counter to 0
        for image in self.image_list:  # for each image in image list
            image.img_set_image_id(image_list_counter)  # set new id
            image_list_counter += 1  # increase the counter by 1
        # self.image_list_info()  # show new image info list for debugging

    def image_list_info(self):
        """
        Print to console the information of images in the list.
        :return: Nothing
        """
        for image in self.image_list:  # for each image in image list
            image.img_print_info()  # print image info to the console

    def image_default_approximate_camera_checked(self):
        """
        Reset action Approximate Interior Orientation
        :return: Nothing
        """
        self.ui_main_win.actionApproximate_Interior_Orientation.setChecked(self.DOWN)

    def image_approximate_camera(self, show_message=True):
        """
        Approximate the camera interior orientation for each image in image list.
        :param show_message: True/False
        :return: Nothing
        """
        success = False  # set success boolean to false
        for image in self.image_list:  # for each image in image list
            success = True  # set success to True (this means there are images in the list)
            image.img_approximate_camera_parameters()  # approximate camera parameters
            # image.img_print_camera_matrix()  # print camera matrix for debugging
        # self.image_list[0].img_print_camera_matrix()  # print the camera matrix only for the first image (debugging)
        if success:  # if success = True
            self.ui_main_win.menuFind_Feature_Points.setEnabled(self.UP)  # enable menu find feature points
            # check action approximate interior orientation
            self.ui_main_win.actionApproximate_Interior_Orientation.setChecked(self.UP)
            if show_message:
                message_box_widget = QWidget()  # create QWidget
                QMessageBox.information(message_box_widget, "Approximate Interior Orientation",
                                        "Process finished successfully!")  # information message

    def image_default_find_feature_points_checked(self):
        """
        Reset the actions SIFT, SURF, ORB and AKAZE.
        :return: Nothing
        """
        self.ui_main_win.actionSIFT.setChecked(self.DOWN)
        self.ui_main_win.actionSURF.setChecked(self.DOWN)
        self.ui_main_win.actionORB.setChecked(self.DOWN)
        self.ui_main_win.actionAKAZE.setChecked(self.DOWN)

    def image_find_feature_points(self, flag=IMG_AKAZE, show_message=True):
        """
        Use the appropriate flag and find the feature points for each image in the list.
        It takes a while to calculate for big images.
        :param show_message: True/False
        :param flag: IMG_SIFT, IMG_SURF, IMG_ORB, IMG_AKAZE
        :return: Nothing
        """
        success = False  # Set success to False
        for image in self.image_list:  # For each image in image list
            success = True  # Set success to True (this means there are images in list)
            image.img_find_feature_points(flag=flag)  # find feature points using the specified flag
        if success:  # if success = True
            self.image_default_find_feature_points_checked()  # reset the find feature checked
            # reset the default create block (do this because this function doesnt recreate the block). The block needs
            # to be recreated after find feature points action for updated results.
            self.image_default_create_block_checked()
            if flag == self.F_AKAZE:  # if flag AKAZE
                self.ui_main_win.actionAKAZE.setChecked(self.UP)  # find feature points using akaze method
            elif flag == self.F_ORB:  # if flag ORB
                self.ui_main_win.actionORB.setChecked(self.UP)  # find feature points using orb method
            self.ui_simple_img_viewer.check_box_draw_keypoints.setEnabled(self.UP)  # enable draw keypoints to simgv
            self.ui_simple_img_viewer.check_box_draw_keypoints.setChecked(self.DOWN)  # uncheck it
            self.draw_kp = self.DOWN  # set the draw kp boolean to uncheck (use this for code readability)
            self.ui_main_win.actionCreate_Block.setEnabled(self.UP)  # enable action Create Block
            if show_message:
                message_box_widget = QWidget()  # Create QWidget
                QMessageBox.information(message_box_widget, flag,
                                        "Process finished successfully!")  # message information

    def image_default_create_block_checked(self):
        """
        Reset the action Create Block.
        :return: Nothing
        """
        self.ui_main_win.actionCreate_Block.setChecked(self.DOWN)

    def image_create_block(self, show_message=True):
        """
        Create a block of images for all checked images in image list.
        :return: Nothing
        """
        image_list_tmp = []  # create a temporary image list
        image_list_size = len(self.image_list)  # take the size of the actual list

        # for image in self.image_list:
        #    print(image.info.name)

        success = False  # set success boolean to False
        counter = 0  # set image in image_list_tmp counter to 0
        for index_id in range(0, image_list_size):  # for index id in range(0, list_size)
            if self.ui_main_win.listImage.item(index_id).checkState():  # check the image item state (if true)
                counter += 1  # increase the counter
                if counter > 1:  # a block needs at least 2 images (if counter > 1)
                    success = True  # set success to True
                image_list_tmp.append(self.image_list[index_id])  # append the image from image list to tmp image list
        # print(image_list_tmp)  # print image list for debugging
        if success:  # if success = True
            self.ui_main_win.actionCreate_Block.setChecked(self.UP)  # check Create Block
            self.image_block.b_img_create_image_list(image_list_tmp)  # set the image block
            self.ui_main_win.menuImage_Matching.setEnabled(self.UP)  # enable menu Image Matching
            if show_message:
                message_box_widget = QWidget()  # create QWidget
                QMessageBox.information(message_box_widget, "Create Block",
                                        "Process finished successfully!")  # message information

    def image_default_matching(self):
        """
        Reset actions All Images Matching and Fast Matching
        :return: Nothing
        """
        self.ui_main_win.actionAll_Images_Matching.setChecked(self.DOWN)
        self.ui_main_win.actionFast_Matching.setChecked(self.DOWN)

    def image_matching(self, fast=False, show_message=True):
        """
        If fast=True run fast matching method. Else run block matching method (match all images).
        :param show_message:  True/False
        :param fast: True/False
        :return: Nothing
        """
        if fast:
            self.image_default_matching()
            self.image_block.b_img_fast_matching()
            message_box_widget = QWidget()  # create QWidget
            self.ui_main_win.actionFast_Matching.setChecked(self.UP)
            if show_message:
                QMessageBox.information(message_box_widget, "Fast Matching",
                                        "Process finished successfully!")  # message information
                self.ui_main_win.actionCreate_Model.setEnabled(self.UP)
        else:
            self.image_default_matching()
            self.image_block.b_img_match_all_images()
            self.ui_main_win.actionAll_Images_Matching.setChecked(self.UP)
            if show_message:
                message_box_widget = QWidget()  # create QWidget
                QMessageBox.information(message_box_widget, "Matching All Images",
                                        "Process finished successfully!")  # message information
            self.ui_main_win.actionCreate_Model.setEnabled(self.UP)

    def image_create_model(self, show_message=True):
        self.image_block.b_img_create_pair_models()
        self.image_block.b_img_create_block_model()
        message_box_widget = QWidget()  # create QWidget
        if show_message:
            QMessageBox.information(message_box_widget, "Create Model",
                                    "Process finished successfully!")  # message information

    # *** CRABS SFM UI*** #
    def crabSFM_open(self):
        self.crabSFM_default_runtime_checkboxes()
        self.crabSFM_default_options()
        self.WinCrabSFM.show()

    def crabSFM_default_runtime_checkboxes(self):
        self.ui_crabSFM.checkBox_Camera.setChecked(self.DOWN)
        self.ui_crabSFM.checkBox_Block_Creation.setChecked(self.DOWN)
        self.ui_crabSFM.checkBox_Find_Feature_Points.setChecked(self.DOWN)
        self.ui_crabSFM.checkBox_Image_Matching.setChecked(self.DOWN)
        self.ui_crabSFM.checkBox_Create_Model.setChecked(self.DOWN)

    def crabSFM_default_options(self):
        self.ui_crabSFM.radio_approximate_interion_orientation.setChecked(self.UP)
        self.ui_crabSFM.radio_AKAZE.setChecked(self.UP)
        self.ui_crabSFM.radio_Match_All_Images.setChecked(self.UP)

    def crabSFM_cancel(self):
        self.WinCrabSFM.close()

    def crabSFM_window_update(self):
        self.WinCrabSFM.update()
        self.WinCrabSFM.repaint()

    def crabSFM_compute(self):
        self.crabSFM_default_runtime_checkboxes()
        # Camera Settings
        if self.ui_crabSFM.radio_approximate_interion_orientation.isChecked():
            self.image_approximate_camera(show_message=False)
        self.ui_crabSFM.checkBox_Camera.setChecked(self.UP)
        self.crabSFM_window_update()

        # Feature Points
        if self.ui_crabSFM.radio_SIFT.isChecked():
            self.image_find_feature_points(flag=IMG_SIFT, show_message=False)
        elif self.ui_crabSFM.radio_SURF.isChecked():
            self.image_find_feature_points(flag=IMG_SURF, show_message=False)
        elif self.ui_crabSFM.radio_ORB.isChecked():
            self.image_find_feature_points(flag=IMG_ORB, show_message=False)
        elif self.ui_crabSFM.radio_AKAZE.isChecked():
            self.image_find_feature_points(flag=IMG_AKAZE, show_message=False)
        self.ui_crabSFM.checkBox_Block_Creation.setCheckable(self.UP)
        self.ui_crabSFM.checkBox_Block_Creation.setChecked(self.UP)
        self.crabSFM_window_update()

        # Create Block
        self.image_create_block(show_message=False)
        self.ui_crabSFM.checkBox_Find_Feature_Points.setChecked(self.UP)
        self.crabSFM_window_update()

        # Image Matching
        if self.ui_crabSFM.radio_Match_All_Images.isChecked():
            self.image_matching(fast=False, show_message=False)
        elif self.ui_crabSFM.radio_Fast_Matching.isChecked():
            self.image_matching(fast=True, show_message=False)
        self.ui_crabSFM.checkBox_Image_Matching.setChecked(self.UP)
        self.crabSFM_window_update()

        # Create Model
        self.image_create_model(show_message=False)
        self.ui_crabSFM.checkBox_Create_Model.setChecked(self.UP)
        self.crabSFM_window_update()

    def crabSFM_compute_threading(self):
        t = threading.Thread(self.crabSFM_compute())
        t.start()

    # *** SIMPLE IMAGE VIEWER (SIMGV) *** #
    def simgv_open(self):
        """
        Open image and then Simple Image Viewer window.
        :return: Nothing
        """
        self.simgv_open_image()
        self.SimpleImageViewer.show()

    def simgv_open_image(self):
        """
        Open the first selected image. If none of the images is selected, then open the first image.
        If the list has no image, then open the default image viewer.
        :return: Nothing
        """
        items_selected = self.ui_main_win.listImage.selectedItems()  # take all selected items
        if len(items_selected) > 0:  # if there is at least one item selected
            self.img_view_index = self.ui_main_win.listImage.row(items_selected[0])  # take the first selected item
            self.simgv_load_image_to_viewer(self.img_view_index)  # load it to viewer
        elif len(self.image_list) > 0:  # else if there are no selected items, but there are images imported
            self.img_view_index = 0  # set the view index to the first image in the least
            self.simgv_load_image_to_viewer(self.img_view_index)  # load the first image to the viewer

    def simgv_load_image_to_viewer(self, index):
        """
        Load an image to viewer. If the show feature points is checked, then load feature points as well.
        This option can be done only if the user has run a feature point method first.
        :param index: index of image to load.
        :return: Nothing
        """
        if self.draw_kp:
            img_rgb = self.image_list[index].img_get_img_rgb_with_feature_points()
            feature_point_number = len(self.image_list[index].feature_points.keypoints)
            self.ui_simple_img_viewer.label_feature_points_number.setText(str(feature_point_number))
        else:
            img_rgb = self.image_list[index].img_get_img_rgb()
            self.ui_simple_img_viewer.label_feature_points_number.clear()
        bytes_per_line = 3 * self.image_list[index].info.width
        q_img = QImage(img_rgb, self.image_list[index].info.width, self.image_list[index].info.height,
                                bytes_per_line, QImage.Format_RGB888)
        width = self.ui_simple_img_viewer.image_view.width()
        height = self.ui_simple_img_viewer.image_view.height()
        if q_img.width() < width or q_img.height() < height:
            width = q_img.width()
            height = q_img.height()
        size = QSize(width, height)
        pixmap = QPixmap()
        pixmap = pixmap.fromImage(q_img)
        pixmap = pixmap.scaled(size, self.Q_ASPECT_RATIO)
        self.ui_simple_img_viewer.image_view.setPixmap(pixmap)
        self.ui_simple_img_viewer.image_view.show()

        self.ui_simple_img_viewer.button_previous.setEnabled(self.UP)
        self.ui_simple_img_viewer.button_next.setEnabled(self.UP)
        if index == 0:
            self.ui_simple_img_viewer.button_previous.setEnabled(self.DOWN)
        if index == len(self.image_list) - 1:
            self.ui_simple_img_viewer.button_next.setEnabled(self.DOWN)

    def simgv_button_previous(self):
        """
        Set the image index to -1 (if index is greater than 0) and load that image to viewer.
        :return: Nothing
        """
        self.img_view_index -= 1  # decrease the image view index by 1
        self.simgv_load_image_to_viewer(self.img_view_index)  # load that image to viewer

    def simgv_button_next(self):
        """
        Set the image index to +1 (if index is greater than 0) and load that image to viewer.
        :return: Nothing
        """
        self.img_view_index += 1  # increase the image view index by 1
        self.simgv_load_image_to_viewer(self.img_view_index)  # load that image to viewer

    def simgv_kp_view_check(self):
        """
        Check if feature points checkbox is checked and load the correct image
        :return: Nothing
        """
        self.draw_kp = self.ui_simple_img_viewer.check_box_draw_keypoints.isChecked()  # take the checked boolean value
        self.simgv_load_image_to_viewer(self.img_view_index)  # load the image to viewer

    # *** VIDEOS *** #

    def video_import(self):
        """
        Take the path(s) of one or more videos and import them to the application.
        :return:
        """
        file_dialog = QFileDialog()
        f_path = file_dialog.getOpenFileNames(parent=None,
                                              caption="Open Video(s)",
                                              directory=QDir.homePath(),
                                              filter=self.VID_FILTER,
                                              options=self.DIALOG_FLAG)[0]
        if f_path:
            for file in f_path:
                video_tmp = Video()
                success = video_tmp.vid_open(file)
                if success:
                    self.video_list.append(video_tmp)
                    item_name = "../" + video_tmp.info.dir_name + "/" + video_tmp.info.name
                    item_widget = QListWidgetItem(item_name)
                    item_widget.setFlags(item_widget.flags() | QtCore.Qt.ItemIsUserCheckable)
                    item_widget.setCheckState(QtCore.Qt.Checked)
                    self.ui_main_win.listVideo.addItem(item_widget)
            self.video_list_info()

    def video_delete(self):
        """
        Delete a video from the list
        :return: Nothing
        """
        item_list = self.ui_main_win.listVideo.selectedItems()
        if not item_list:
            return
        for item in item_list:
            self.video_list.pop(self.ui_main_win.listVideo.row(item))
            self.ui_main_win.listVideo.takeItem(self.ui_main_win.listVideo.row(item))
        self.video_list_info()

    def video_list_info(self):
        """
        Print the video list info in a console window (for debugging)
        :return: Nothing
        """
        for video in self.video_list:
            video.vid_print_info()

    # *** VIDEO 2 IMAGES *** #

    def video2images(self):
        """
        Open the video2images dialog.
        :return: Nothing
        """
        self.video2images_set_default()
        self.Video2Images.show()

    def video2images_set_default(self):
        """
        Set the default parameters for video2images dialog
        :return: Nothing
        """
        item_list_size = self.ui_main_win.listVideo.count()
        for item_id in range(0, item_list_size):
            if self.ui_main_win.listVideo.item(item_id).checkState():
                item_name = self.ui_main_win.listVideo.item(item_id).text()
                self.ui_video2images.combo_box_select_video.addItem(item_name)
                self.ui_video2images.line_edit_export_images_at.setEnabled(self.UP)
                self.ui_video2images.button_export_images_at.setEnabled(self.UP)

        self.ui_video2images.combo_box_select_video.setCurrentIndex(0)
        self.video2images_set_fps_for_video()

    def video2images_set_fps_for_video(self):
        """
        Set the fps from video 2 images spin box.
        :return: Nothing
        """
        video_name = self.ui_video2images.combo_box_select_video.currentText()
        item_list_size = self.ui_main_win.listVideo.count()
        for item_id in range(0, item_list_size):
            item_name = self.ui_main_win.listVideo.item(item_id).text()
            if video_name == item_name:
                fps = self.video_list[item_id].FPS()
                self.ui_video2images.spin_box_fps.setValue(fps)

    def video2images_set_export_folder(self):
        """
        Set export folder for the video frames.
        :return: Nothing
        """
        file_dialog = QFileDialog()
        f_path = file_dialog.getExistingDirectory(parent=None,
                                                  caption="Open Directory",
                                                  directory=QDir.homePath(),
                                                  options=self.DIALOG_FLAG | QFileDialog.ShowDirsOnly)
        # print(f_path)
        if f_path:
            self.ui_video2images.line_edit_export_images_at.setText(f_path)
            self.ui_video2images.button_compute.setEnabled(self.UP)

    def video2images_clear(self):
        """
        Clear video 2 images window (reset the window)
        :return: Nothing
        """
        self.ui_video2images.combo_box_select_video.clear()
        self.ui_video2images.spin_box_fps.setValue(1)
        self.ui_video2images.line_edit_export_images_at.setEnabled(self.DOWN)
        self.ui_video2images.button_export_images_at.setEnabled(self.DOWN)
        self.ui_video2images.button_compute.setEnabled(self.DOWN)

    def video2images_cancel(self):
        """
        Clear the video 2 images window and close the window.
        :return: Nothing
        """
        self.video2images_clear()
        self.Video2Images.close()

    def video2images_compute(self):
        """
        Executed when the user press compute and export the video frames to the given folder.
        :return: Nothing
        """
        video_name = self.ui_video2images.combo_box_select_video.currentText()
        export_folder_name = self.ui_video2images.line_edit_export_images_at.text()
        fps = self.ui_video2images.spin_box_fps.value()
        export_folder_name += "/"
        self.video2images_compute_yes(video_name, export_folder_name, fps)
        message_box_widget = QWidget()
        QMessageBox.information(message_box_widget, "img2video", "Process finished successfully!")

    def video2images_compute_yes(self, video_name, export_folder_name, fps):
        """
        Export the frames to the given folder.
        :param video_name: the name of the video
        :param export_folder_name: the path to the exported folder
        :param fps: the number of fps (use it to find the frames to export)
        :return: Nothing
        """
        item_list_size = self.ui_main_win.listVideo.count()
        for item_id in range(0, item_list_size):
            item_name = self.ui_main_win.listVideo.item(item_id).text()
            if video_name == item_name:
                self.video_list[item_id].video2img(export_folder_name, fps)
                break
Ejemplo n.º 15
0
 def show(self, *args):
     self.restore_state()
     return QDialog.show(self, *args)
Ejemplo n.º 16
0
 def show(self):
     QDialog.show(self)
     if self.is_pane:
         self.gui.quickview_splitter.show_quickview_widget()
Ejemplo n.º 17
0
Archivo: jobs.py Proyecto: kba/calibre
 def show(self, *args):
     self.restore_state()
     return QDialog.show(self, *args)