From 1af02d36f4e0b030f3afb249a68d6e7fe2088147 Mon Sep 17 00:00:00 2001 From: emoebel <emmanuel.moebel@inria.fr> Date: Wed, 27 Oct 2021 15:45:50 +0200 Subject: [PATCH] GUI annotation: now object lists can also be saves as excel files --- deepfinder/utils/objl.py | 37 +++++++++++++++++++++++++++++++ pyqt/annotation/gui_annotation.py | 14 +++++++----- 2 files changed, 45 insertions(+), 6 deletions(-) diff --git a/deepfinder/utils/objl.py b/deepfinder/utils/objl.py index e94fa01..301e23e 100644 --- a/deepfinder/utils/objl.py +++ b/deepfinder/utils/objl.py @@ -5,6 +5,7 @@ # License: GPL v3.0. See <https://www.gnu.org/licenses/> # ============================================================================================= +import os import numpy as np import warnings @@ -62,6 +63,42 @@ def disp(objlIN): print(strout) + +def read(filename): + """Reads object list. Handles .xml and .xlsx files, according to what extension the file has. + + Args: + filename (str): '/path/to/file.ext' with '.ext' either '.xml' or '.xlsx' + + Returns: + list of dict + """ + data_format = os.path.splitext(filename) + if data_format[1] == '.xml': + objl = read_xml(filename) + elif data_format[1] == '.xlsx': + objl = read_excel(filename) + else: + print('/!\ DeepFinder can only read object lists in .xml and .xlsx formats') + return objl + + +def write(objl, filename): + """Writes object list. Can write .xml and .xlsx files, according to the extension specified in filename. + + Args: + objl (list of dict) + filename (str): '/path/to/file.ext' with '.ext' either '.xml' or '.xlsx' + """ + data_format = os.path.splitext(filename) + if data_format[1] == '.xml': + write_xml(objl, filename) + elif data_format[1] == '.xlsx': + write_excel(objl, filename) + else: + print('/!\ DeepFinder can only write object lists in .xml and .xlsx formats') + + def read_xml(filename): tree = etree.parse(filename) objl_xml = tree.getroot() diff --git a/pyqt/annotation/gui_annotation.py b/pyqt/annotation/gui_annotation.py index 4b29399..bfc658c 100644 --- a/pyqt/annotation/gui_annotation.py +++ b/pyqt/annotation/gui_annotation.py @@ -208,7 +208,7 @@ class AnnotationWindow(QtWidgets.QMainWindow, Ui_MainWindow): self.winDisp.dwidget.goto_coord(coord) # to refresh lmap display # Test: - ol.disp(self.objl) + #ol.disp(self.objl) def on_object_remove_secure(self): @@ -288,9 +288,10 @@ class AnnotationWindow(QtWidgets.QMainWindow, Ui_MainWindow): filename = filename[0] else: filename = self.path_objl - s = os.path.splitext(filename) - filename = s[0]+'.xml' # force extension to be xml - ol.write_xml(self.objl, filename) + #s = os.path.splitext(filename) + #filename = s[0]+'.xml' # force extension to be xml + #ol.write_xml(self.objl, filename) + ol.write(self.objl, filename) message = 'Object list saved! Quit?' reply = QtGui.QMessageBox.question(self, 'Quit?', message, @@ -305,7 +306,7 @@ class AnnotationWindow(QtWidgets.QMainWindow, Ui_MainWindow): else: path_objl = ('', '') if len(self.objl)!=0: - message = 'This will overwrite current object list. Proceed?' + message = 'This will overwrite current object list. Proceed?' # TODO: DOES NOT OVERWRITE OBJL!! reply = QtGui.QMessageBox.question(self, 'Remove class', message, QtGui.QMessageBox.Yes | QtGui.QMessageBox.No) if reply == QtGui.QMessageBox.Yes: @@ -320,7 +321,8 @@ class AnnotationWindow(QtWidgets.QMainWindow, Ui_MainWindow): def load_objl(self, path_objl): - objl = ol.read_xml(path_objl) + #objl = ol.read_xml(path_objl) + objl = ol.read(path_objl) self.label_list = ol.get_labels(objl) for idx in range(len(objl)): -- GitLab