-
Notifications
You must be signed in to change notification settings - Fork 0
/
dialog_converter.py
113 lines (97 loc) · 4.48 KB
/
dialog_converter.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
#!/usr/bin/python
# -*- coding: utf-8 -*-
# ====================================================================
# @author: Joe Del Rocco
# @since: 03/20/2018
# @summary: Dialog for converting (importing/exporting) sky data.
# ====================================================================
import os
import csv
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import *
from PyQt5.QtCore import Qt
class DialogConverter(QDialog):
def __init__(self):
super().__init__(None, Qt.WindowSystemMenuHint | Qt.WindowTitleHint | Qt.WindowCloseButtonHint)
self.datasetIn = ""
self.datasetOut = ""
# init
self.initWidgets()
self.setWindowTitle("Sample Dataset Converter")
self.setWindowIcon(QIcon('res/icon.png'))
def initWidgets(self):
# layout
layout = QVBoxLayout()
layout.setSpacing(5)
layout.setContentsMargins(10, 10, 10, 10)
# message
msg = "Run 'Setup Export File' first.\nExport dialog options will be used for this conversion.\n\n" \
"'Date' 'Time' and 'SamplePatternIndex' features are required for conversion.\n" \
"'Exposure' feature will be used if found, current exposure otherwise.\n"
lblMessage = QLabel()
lblMessage.setText(msg)
layout.addWidget(lblMessage, 0, Qt.AlignTop)
# file in
lblFile = QLabel("Re-export samples from:")
self.txtFileIn = QLineEdit()
self.txtFileIn.setMinimumWidth(400)
self.txtFileIn.setReadOnly(True)
btnFile = QPushButton("...")
btnFile.setMaximumWidth(btnFile.fontMetrics().boundingRect(" ... ").width())
btnFile.clicked.connect(self.browseForFile)
boxFile = QGridLayout()
boxFile.setContentsMargins(0, 0, 0, 0)
boxFile.addWidget(lblFile, 0, 0, 1, 2)
boxFile.addWidget(self.txtFileIn, 1, 0, 1, 1)
boxFile.addWidget(btnFile, 1, 1, 1, 1)
pnlFile = QWidget()
pnlFile.setLayout(boxFile)
layout.addWidget(pnlFile, 0, Qt.AlignTop)
# file out
lblFile = QLabel("Re-export samples to:")
self.txtFileOut = QLineEdit()
boxFile = QGridLayout()
boxFile.setContentsMargins(0, 0, 0, 0)
boxFile.addWidget(lblFile, 0, 0, 1, 2)
boxFile.addWidget(self.txtFileOut, 1, 0, 1, 1)
pnlFile = QWidget()
pnlFile.setLayout(boxFile)
layout.addWidget(pnlFile, 0, Qt.AlignTop)
# accept/decline buttons
boxButtons = QDialogButtonBox()
btn = boxButtons.addButton("Cancel", QDialogButtonBox.RejectRole)
btn.clicked.connect(self.reject)
btn = boxButtons.addButton("Convert!", QDialogButtonBox.AcceptRole)
btn.clicked.connect(self.convertPressed)
layout.addWidget(boxButtons, 0, Qt.AlignBottom | Qt.AlignRight)
self.setLayout(layout)
def browseForFile(self):
filename, filetype = QFileDialog.getOpenFileName(self, 'Select Dataset', '')
if filename is None or len(filename) <= 0:
QMessageBox.critical(self, "Error", "Invalid sample dataset filename.", QMessageBox.Ok)
return
self.txtFileIn.setText(filename)
name, ext = os.path.splitext(filename)
self.txtFileOut.setText(name + "_new" + ext)
def convertPressed(self):
# validate files before proceeding
if self.txtFileIn.text() is None or len(self.txtFileIn.text()) <= 0:
QMessageBox.critical(self, "Error", "Invalid sample dataset filename.", QMessageBox.Ok)
return
if not os.path.exists(self.txtFileIn.text()):
QMessageBox.critical(self, "Error", "Sample dataset file not found.", QMessageBox.Ok)
return
if self.txtFileIn.text() == self.txtFileOut.text():
QMessageBox.critical(self, "Error", "Dataset In and Out filenames cannot be the same.", QMessageBox.Ok)
return
# validate dataset before proceeding (required features)
with open(self.txtFileIn.text(), 'r') as filein:
reader = csv.reader(filein, delimiter=",")
header = next(reader, None)
if 'Date' not in header or 'Time' not in header or 'SamplePatternIndex' not in header:
QMessageBox.critical(self, "Error", "Dataset missing required features:\n'Date', 'Time', or 'SamplePatternIndex'.", QMessageBox.Ok)
return
# save filenames
self.datasetIn = self.txtFileIn.text()
self.datasetOut = self.txtFileOut.text()
self.accept()