From 00ad4b750ac3a8e293547114d67559f4621e3d5e Mon Sep 17 00:00:00 2001 From: Bhavin Nayak Date: Thu, 7 May 2015 17:18:11 -0700 Subject: [PATCH 1/2] Added label support to the pds viewer. This is an initial commit. More features will be added to the label viewer. refs#2 --- .gitignore | 2 ++ pdsview/PDSImage.py | 3 ++- pdsview/label.py | 23 +++++++++++++++++++++++ pdsview/pdsview.py | 39 ++++++++++++++++++++++++--------------- 4 files changed, 51 insertions(+), 16 deletions(-) create mode 100644 pdsview/label.py diff --git a/.gitignore b/.gitignore index 2a88a24..2e903e8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,11 +1,13 @@ *.py[cod] +._* # C extensions *.so # Packages *.egg *.egg-info +.nfs* dist build eggs diff --git a/pdsview/PDSImage.py b/pdsview/PDSImage.py index a549cc7..115c05b 100644 --- a/pdsview/PDSImage.py +++ b/pdsview/PDSImage.py @@ -15,4 +15,5 @@ def __init__(self, data_np=None, metadata=None, logger=None): def load_file(self, filepath): self.logger.debug("Loading file '%s' ..." % (filepath)) pds_image = gdal_pds.PDSImage(filepath) - self.set_data(pds_image.image) \ No newline at end of file + self.pds_image = pds_image + self.set_data(pds_image.image) diff --git a/pdsview/label.py b/pdsview/label.py new file mode 100644 index 0000000..67db761 --- /dev/null +++ b/pdsview/label.py @@ -0,0 +1,23 @@ +import json +from ginga.qtw.QtHelp import QtGui + + +def label_show(image_label): + print("Label Show") + labelwindow = QtGui.QWidget() + labelwindow.setWindowTitle("Label") + labelwindow.resize(524, 540) + labelPT = QtGui.QTextEdit() + labelPT.setReadOnly(True) + if image_label == None: + labelPT.setText("Please Open an Image First !") + else: + labelPT.setText(json.dumps(image_label, indent=4)) + vbox1 = QtGui.QVBoxLayout() + vbox1.addWidget(labelPT) + labelwindow.setLayout(vbox1) + labelwindow.setMinimumWidth(50) + labelwindow.show() + labelwindow.raise_() + labelwindow.activateWindow() + return labelwindow diff --git a/pdsview/pdsview.py b/pdsview/pdsview.py index 2c536f6..425b9d2 100644 --- a/pdsview/pdsview.py +++ b/pdsview/pdsview.py @@ -8,9 +8,10 @@ # This is open-source software licensed under a BSD license. # Please see the file LICENSE.txt for details. # -import sys, os +import sys import logging import PDSImage +import label from ginga.qtw.QtHelp import QtGui, QtCore from ginga.qtw.ImageViewCanvasQt import ImageViewCanvas @@ -34,13 +35,10 @@ def __init__(self, logger): self.fitsimage = fi bd = fi.get_bindings() - bd.enable_pan(True) - bd.enable_zoom(True) - bd.enable_cuts(True) - bd.enable_flip(True) + bd.enable_all(True) w = fi.get_widget() - w.resize(512, 512) + w.resize(768, 768) vbox = QtGui.QVBoxLayout() vbox.setContentsMargins(QtCore.QMargins(2, 2, 2, 2)) @@ -48,36 +46,50 @@ def __init__(self, logger): vbox.addWidget(w, stretch=1) hbox = QtGui.QHBoxLayout() + self.hboxlayout = QtGui.QHBoxLayout() hbox.setContentsMargins(QtCore.QMargins(4, 2, 4, 2)) wopen = QtGui.QPushButton("Open File") wopen.clicked.connect(self.open_file) + wlabel = QtGui.QPushButton("Label") + wlabel.clicked.connect(self.label) wquit = QtGui.QPushButton("Quit") wquit.clicked.connect(self.quit) hbox.addStretch(1) - for w in (wopen, wquit): + for w in (wopen, wlabel, wquit): hbox.addWidget(w, stretch=0) hw = QtGui.QWidget() hw.setLayout(hbox) vbox.addWidget(hw, stretch=0) + self.vbox = vbox + self.hbox = hbox + self.w = w vw = QtGui.QWidget() self.setCentralWidget(vw) vw.setLayout(vbox) def load_file(self, filepath): - # image = AstroImage.AstroImage(logger=self.logger) - # filepath = '1f345867992effb0j3p1212l0m1.img' - # print(filepath) + global image image = PDSImage.PDSImage(logger=self.logger) image.load_file(filepath) self.fitsimage.set_image(image) print('File_Loaded') - # print(image) self.setWindowTitle(filepath) + def label(self): + try: + label_data = image.pds_image.label + except NameError: + label_data = None + mw = label.label_show(label_data) + self.hboxlayout.addWidget(mw, stretch=0) + + def find(self): + print("Search") + def open_file(self): res = QtGui.QFileDialog.getOpenFileName(self, "Open IMG file", ".", "IMG files (*.IMG)") @@ -85,7 +97,6 @@ def open_file(self): fileName = res[0] else: fileName = str(res) - # fileName = '1f345867992effb0j3p1212l0m1.img' self.load_file(fileName) def drop_file(self, fitsimage, paths): @@ -109,7 +120,7 @@ def main(): logger.addHandler(stderrHdlr) w = FitsViewer(logger) - w.resize(524, 540) + w.resize(780, 770) w.show() app.setActiveWindow(w) w.raise_() @@ -118,5 +129,3 @@ def main(): if __name__ == '__main__': main() - -# END From 51dff74468608d64b5b4ff1cf6ef6a0751b115e0 Mon Sep 17 00:00:00 2001 From: Bhavin Nayak Date: Wed, 13 May 2015 13:50:09 -0700 Subject: [PATCH 2/2] Added GUI required for the label and label_search. The algorithm to search the text from label is still to be implemented. refs#2 --- pdsview/PDSImage.py | 8 ++++ pdsview/label.py | 89 +++++++++++++++++++++++++++++----------- pdsview/pdsview.py | 4 +- pdsview/text_finderUI.py | 50 ++++++++++++++++++++++ 4 files changed, 126 insertions(+), 25 deletions(-) create mode 100644 pdsview/text_finderUI.py diff --git a/pdsview/PDSImage.py b/pdsview/PDSImage.py index 115c05b..8895d78 100644 --- a/pdsview/PDSImage.py +++ b/pdsview/PDSImage.py @@ -17,3 +17,11 @@ def load_file(self, filepath): pds_image = gdal_pds.PDSImage(filepath) self.pds_image = pds_image self.set_data(pds_image.image) + with open(filepath) as f: + labelview = [] + for lineno, line in enumerate(f): + line = line.rstrip() + if line.strip() == 'END': + break + labelview.append(line) + pds_image.labelview = labelview diff --git a/pdsview/label.py b/pdsview/label.py index 67db761..03b360c 100644 --- a/pdsview/label.py +++ b/pdsview/label.py @@ -1,23 +1,66 @@ -import json -from ginga.qtw.QtHelp import QtGui - - -def label_show(image_label): - print("Label Show") - labelwindow = QtGui.QWidget() - labelwindow.setWindowTitle("Label") - labelwindow.resize(524, 540) - labelPT = QtGui.QTextEdit() - labelPT.setReadOnly(True) - if image_label == None: - labelPT.setText("Please Open an Image First !") - else: - labelPT.setText(json.dumps(image_label, indent=4)) - vbox1 = QtGui.QVBoxLayout() - vbox1.addWidget(labelPT) - labelwindow.setLayout(vbox1) - labelwindow.setMinimumWidth(50) - labelwindow.show() - labelwindow.raise_() - labelwindow.activateWindow() - return labelwindow +from ginga.qtw.QtHelp import QtGui, QtCore +import text_finderUI + + +class LabelView(QtGui.QWidget): + def __init__(self, image_label): + QtGui.QWidget.__init__(self, None) + print("Label Show") + self.textwindow = QtGui.QVBoxLayout() + self.textwindow.setContentsMargins(QtCore.QMargins(2, 2, 2, 2)) + self.buttonwindow = QtGui.QHBoxLayout() + self.labelwindowlayout = QtGui.QHBoxLayout() + self.buttonwindow.setContentsMargins(QtCore.QMargins(4, 2, 4, 2)) + + self.textwidget = QtGui.QWidget() + self.textwidget.setWindowTitle("Label") + self.textwidget.resize(640, 620) + self.labelPT = QtGui.QTextEdit() + self.labelPT.setReadOnly(True) + self.font = QtGui.QFont("Monaco") + self.font.setPointSize(12) + + self.image_label = image_label + self.labelPT.setFont(self.font) + self.textwindow.addWidget(self.labelPT, stretch=0) + + findButton = QtGui.QPushButton("Find") + findButton.clicked.connect(self.find) + cancelbutton = QtGui.QPushButton("Cancel") + cancelbutton.clicked.connect(self.cancel) + + for button in (findButton, cancelbutton): + self.buttonwindow.addWidget(button, stretch=0) + + self.buttonwidget = QtGui.QWidget() + self.buttonwidget.setLayout(self.buttonwindow) + self.textwindow.addWidget(self.buttonwidget, stretch=0) + self.textwidget.setLayout(self.textwindow) + + self.label_show() + + def label_show(self): + if self.image_label == None: + self.labelPT.setText("Please Open an Image First !") + else: + self.labelPT.setText('\n'.join(self.image_label)) + # labelPT.setText(json.dumps(image_label, indent=4)) + self.textwidget.setLayout(self.textwindow) + self.textwidget.setMinimumWidth(50) + self.textwidget.show() + self.textwidget.raise_() + self.textwidget.activateWindow() + labelview_window = self.textwidget + return labelview_window + + def find(self): + self.lastMatch = None + self.finderUI() + + def finderUI(self): + mw = text_finderUI.LabelSearch() + self.labelwindowlayout.addWidget(mw, stretch=0) + print mw.search() + + def cancel(self): + self.deleteLater() diff --git a/pdsview/pdsview.py b/pdsview/pdsview.py index 425b9d2..849ee11 100644 --- a/pdsview/pdsview.py +++ b/pdsview/pdsview.py @@ -81,10 +81,10 @@ def load_file(self, filepath): def label(self): try: - label_data = image.pds_image.label + label_data = image.pds_image.labelview except NameError: label_data = None - mw = label.label_show(label_data) + mw = label.LabelView(label_data) self.hboxlayout.addWidget(mw, stretch=0) def find(self): diff --git a/pdsview/text_finderUI.py b/pdsview/text_finderUI.py new file mode 100644 index 0000000..c36e1de --- /dev/null +++ b/pdsview/text_finderUI.py @@ -0,0 +1,50 @@ +from ginga.qtw.QtHelp import QtGui, QtCore + + +class LabelSearch(QtGui.QWidget): + def __init__(self): + QtGui.QWidget.__init__(self, None) + print("Text Search") + self.textwindow = QtGui.QVBoxLayout() + self.textwindow.setContentsMargins(QtCore.QMargins(2, 2, 2, 2)) + self.buttonwindow = QtGui.QHBoxLayout() + self.labelwindowlayout = QtGui.QHBoxLayout() + self.buttonwindow.setContentsMargins(QtCore.QMargins(4, 2, 4, 2)) + + self.textwidget = QtGui.QWidget() + self.textwidget.setWindowTitle("Search Window") + self.textwidget.resize(250, 70) + self.findField = QtGui.QTextEdit(self) + self.findField.resize(200, 50) + self.font = QtGui.QFont("Monaco") + self.font.setPointSize(12) + self.searchButton = QtGui.QPushButton("Search") + self.searchButton.clicked.connect(self.search) + self.cancelButton = QtGui.QPushButton("Cancel") + self.cancelButton.clicked.connect(self.cancel) + + self.findField.setFont(self.font) + self.textwindow.addWidget(self.findField, stretch=0) + self.buttonwindow.addWidget(self.searchButton, stretch=0) + self.buttonwindow.addWidget(self.cancelButton, stretch=0) + + self.buttonwidget = QtGui.QWidget() + self.buttonwidget.setLayout(self.buttonwindow) + self.textwindow.addWidget(self.buttonwidget, stretch=0) + self.textwidget.setLayout(self.textwindow) + self.textwidget.setMinimumWidth(50) + self.textwidget.show() + self.textwidget.raise_() + self.textwidget.activateWindow() + + def search(self): + # Here, we get the value printed in the findField of the "Search Window" + # TODO: + # Set Callback method or Find a way to reflect this value back to the "label.py" + # Once we populate "label.py" with the updated search-string, one can take a reference from: + # https://www.binpress.com/tutorial/building-a-text-editor-with-pyqt-part-3/147 + print self.findField.toPlainText() + return self.findField.toPlainText() + + def cancel(self): + self.deleteLater()