This repository has been archived by the owner on Apr 9, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 1
/
qtfits.py
135 lines (105 loc) · 4.16 KB
/
qtfits.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
# TODO: Loading message and I/O in threads
# TODO: Fast initial render when reclipping or zooming in
# TODO: Draw line across image and plot pixels it collides with
# TODO: Select a region and show statistics
import argparse
import numpy as np
from astropy.io import fits
try:
from PyQt5.QtWidgets import QWidget, QGridLayout, QApplication, QFileDialog, QVBoxLayout
from PyQt5.QtCore import Qt
except ImportError:
from PyQt4.QtGui import QWidget, QGridLayout, QApplication, QFileDialog, QVBoxLayout
from PyQt4.QtCore import Qt
from dirlist import DirList
from histogram import ImageHistogram
from imagedisplay import ImageDisplay
from minimap import MiniMap
from headerdisplay import HeaderDisplay
from cursordisplay import CursorDisplay
from menubar import MenuBar
class QtFits(QApplication):
def __init__(self, filename=None):
super().__init__([])
self.header = None
self.setStyle('Fusion')
self.setApplicationName('QtFits')
self.overlord = QWidget()
self.overlord.resize(800, 500)
overlord_layout = QVBoxLayout()
self.overlord.setLayout(overlord_layout)
overlord_layout.setContentsMargins(0, 0, 0, 0)
overlord_layout.setSpacing(0)
self.window = QWidget()
self.window.resizeEvent = self.resizeEvent
self.window.keyPressEvent = self.keyPressEvent
grid = QGridLayout()
grid.setContentsMargins(0, 0, 0, 0)
self.window.setLayout(grid)
self.minimap = MiniMap()
grid.addWidget(self.minimap, 0, 1, 1, 1)
self.main = ImageDisplay()
grid.addWidget(self.main, 0, 0, 3, 1)
self.cursordisplay = CursorDisplay()
grid.addWidget(self.cursordisplay, 1, 1, 1, 1)
self.box = DirList()
grid.addWidget(self.box, 2, 1, 2, 1)
self.histogram = ImageHistogram()
grid.addWidget(self.histogram, 3, 0, 1, 1)
self.menubar = MenuBar(self)
overlord_layout.addWidget(self.menubar)
overlord_layout.addWidget(self.window)
self.box.main = self.main
self.box.list.app = self
self.main.histogram = self.histogram
self.histogram.main = self.main
self.minimap.main = self.main
self.main.minimap = self.minimap
self.main.cursordisplay = self.cursordisplay
self.handlers = {
Qt.Key_Escape: self.overlord.close,
Qt.Key_Equal: self.main.increase_zoom,
Qt.Key_Minus: self.main.decrease_zoom,
Qt.Key_Down: self.box.list.selection_down,
Qt.Key_Up: self.box.list.selection_up,
Qt.Key_Return: self.box.list.select,
Qt.Key_Right: self.box.list.select,
Qt.Key_Backspace: self.box.list.back,
Qt.Key_Left: self.box.list.back,
}
self.window.setFocusPolicy(Qt.ClickFocus)
if filename is not None:
self.open(filename)
self.overlord.show()
self.exec_()
def open(self, path, hdu=None):
with open(path, 'rb') as input_file:
self.hdulist = fits.open(input_file)
if hdu is None:
hdu = 0
while self.hdulist[hdu].data is None:
hdu += 1
self.set_hdu(hdu)
def set_hdu(self, hdu):
image = self.hdulist[hdu].data.astype(np.float32)
self.main.image = image
self.header = repr(self.hdulist[hdu].header)
self.menubar.set_hdulist(self.hdulist)
def open_dialog(self):
filename = QFileDialog.getOpenFileName(self.main, 'Open file', '.')
if filename[0]:
self.open(filename[0])
def show_header(self):
header_window = HeaderDisplay(self.header)
header_window.show()
header_window.exec_()
def keyPressEvent(self, event):
if event.key() in self.handlers:
self.handlers[event.key()]()
def resizeEvent(self, event):
self.main._refresh_queue.append(self.main.reslice)
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='Display a fits file')
parser.add_argument('filename', help='path to or name of file to open')
args = parser.parse_args()
QtFits(args.filename)