Compare commits

...

5 Commits

7 changed files with 410 additions and 340 deletions

View File

@ -20,16 +20,20 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import os
import time
import sqlite3
import logging
import numpy as np import numpy as np
from PyQt5.QtWidgets import QFileDialog, QApplication, QMessageBox
import sqlite3
import settings as stg
from os import chdir
import time
from PyQt5.QtWidgets import QFileDialog, QApplication, QMessageBox
import settings as stg
from settings import ABS_name from settings import ABS_name
logger = logging.getLogger()
class CreateTableForSaveAs: class CreateTableForSaveAs:
def __init__(self): def __init__(self):
@ -165,23 +169,32 @@ class CreateTableForSaveAs:
def open_file_dialog(self): def open_file_dialog(self):
options = QFileDialog.Options() name, _ = QFileDialog.getSaveFileName(
name = QFileDialog.getSaveFileName( caption="Save As",
caption="Save As", directory="", filter="AcouSed Files (*.acd)", options=QFileDialog.DontUseNativeDialog) directory="",
filter="AcouSed Files (*.acd)",
options=QFileDialog.DontUseNativeDialog
)
if name[0]: if name != "":
filename = os.path.basename(name)
if os.path.splitext(filename)[1] != ".acd":
filename += ".acd"
stg.dirname_save_as = "/".join(name[0].split("/")[:-1]) + "/" logger.debug(f"selected save file: '{filename}'")
stg.filename_save_as = name[0].split("/")[-1]
chdir(stg.dirname_save_as) stg.dirname_save_as = os.path.dirname(name)
stg.filename_save_as = filename
try:
os.chdir(stg.dirname_save_as)
except OSError as e:
logger.warning(f"chdir: {str(e)}")
start = time.time() start = time.time()
self.create_table() self.create_table()
print(f"end : {time.time() - start} sec") print(f"end : {time.time() - start} sec")
else: else:
msgBox = QMessageBox() msgBox = QMessageBox()
msgBox.setWindowTitle("Save Error") msgBox.setWindowTitle("Save Error")
msgBox.setIcon(QMessageBox.Warning) msgBox.setIcon(QMessageBox.Warning)
@ -192,7 +205,7 @@ class CreateTableForSaveAs:
def create_table(self): def create_table(self):
# Create a new database and open a database connection to allow sqlite3 to work with it. # Create a new database and open a database connection to allow sqlite3 to work with it.
cnx = sqlite3.connect(stg.filename_save_as + '.acd') cnx = sqlite3.connect(stg.filename_save_as)
# Create database cursor to execute SQL statements and fetch results from SQL queries. # Create database cursor to execute SQL statements and fetch results from SQL queries.
cur = cnx.cursor() cur = cnx.cursor()
@ -459,6 +472,3 @@ class CreateTableForSaveAs:
# Close database connection # Close database connection
cnx.close() cnx.close()

View File

@ -20,37 +20,50 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import os
import sys import sys
import numpy as np
from PyQt5.QtWidgets import QFileDialog, QApplication, QWidget, QTabWidget
import sqlite3 import sqlite3
from os import path, chdir import logging
import numpy as np
from PyQt5.QtWidgets import QFileDialog, QApplication, QWidget, QTabWidget
import settings as stg import settings as stg
from settings import BS_raw_data, acoustic_data from settings import BS_raw_data, acoustic_data
from View.acoustic_data_tab import AcousticDataTab from View.acoustic_data_tab import AcousticDataTab
logger = logging.getLogger()
class ReadTableForOpen: class ReadTableForOpen:
def __init__(self): def __init__(self):
self.opened = False
pass self.open_file_dialog()
def open_file_dialog(self): def open_file_dialog(self):
name, _ = QFileDialog.getOpenFileName(
caption="Open Acoused file",
directory="",
filter="Acoused file (*.acd)",
options=QFileDialog.DontUseNativeDialog
)
name = QFileDialog.getOpenFileName(caption="Open Acoused file", directory="", filter="Acoused file (*.acd)", if name != "":
options=QFileDialog.DontUseNativeDialog) stg.dirname_open = os.path.dirname(name)
stg.filename_open = os.path.basename(name)
if name: try:
os.chdir(stg.dirname_open)
except OSError as e:
logger.warning(f"chdir: {str(e)}")
stg.dirname_open = path.dirname(name[0])
stg.filename_open = path.basename(name[0])
chdir(stg.dirname_open)
self.sql_file_to_open = open(stg.filename_open) self.sql_file_to_open = open(stg.filename_open)
self.read_table() self.read_table()
self.opened = True
def read_table(self): def read_table(self):
@ -428,4 +441,3 @@ class ReadTableForOpen:
stg.BS_raw_data.append(np.reshape(stg.BS_raw_data_reshape[i], stg.BS_raw_data.append(np.reshape(stg.BS_raw_data_reshape[i],
(len(stg.freq[i]), stg.depth[i].shape[1], stg.time[i].shape[1]))) (len(stg.freq[i]), stg.depth[i].shape[1], stg.time[i].shape[1])))

View File

@ -51,7 +51,7 @@ class UpdateTableForSave:
def update_table(self): def update_table(self):
# Create a new database and open a database connection to allow sqlite3 to work with it. # Create a new database and open a database connection to allow sqlite3 to work with it.
cnx = sqlite3.connect(stg.filename_save_as + '.acd') cnx = sqlite3.connect(stg.filename_save_as)
# Create database cursor to execute SQL statements and fetch results from SQL queries. # Create database cursor to execute SQL statements and fetch results from SQL queries.
cur = cnx.cursor() cur = cnx.cursor()
@ -104,7 +104,10 @@ class UpdateTableForSave:
# Drop Table if exists # Drop Table if exists
cur.execute("DROP TABLE if exists Measure") cur.execute("DROP TABLE if exists Measure")
cur.execute("""CREATE TABLE Measure(ID INTEGER PRIMARY KEY AUTOINCREMENT, cur.execute(
"""
CREATE TABLE Measure(
ID INTEGER PRIMARY KEY AUTOINCREMENT,
acoustic_data INTEGER, acoustic_data INTEGER,
Date STRING, Date STRING,
Hour STRING, Hour STRING,
@ -121,25 +124,52 @@ class UpdateTableForSave:
NbPingsAveragedPerProfile FLOAT, NbPingsAveragedPerProfile FLOAT,
GainRx FLOAT, GainRx FLOAT,
GainTx FLOAT GainTx FLOAT
)"""
) )
""")
# Fill the table Measure # Fill the table Measure
for i in stg.acoustic_data: for i in stg.acoustic_data:
for j in range(stg.freq[i].shape[0]): for j in range(stg.freq[i].shape[0]):
cur.execute(''' INSERT into Measure(acoustic_data, Date, Hour, frequency, sound_attenuation, kt_read, kt_corrected, NbProfiles, cur.execute(
NbProfilesPerSeconds, NbCells, CellSize, PulseLength, '''
NbPingsPerSeconds, NbPingsAveragedPerProfile, GainRx, GainTx, INSERT into Measure(
acoustic_data,
Date, Hour,
frequency,
sound_attenuation,
kt_read, kt_corrected,
NbProfiles, NbProfilesPerSeconds,
NbCells, CellSize,
PulseLength,
NbPingsPerSeconds,
NbPingsAveragedPerProfile,
GainRx, GainTx
) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)''',
(
stg.acoustic_data[i],
(
str(stg.date[i].year) + str('-') +
str(stg.date[i].month) + str('-') +
str(stg.date[i].day)
),
(
str(stg.hour[i].hour) + str(':') +
str(stg.hour[i].minute)
),
stg.freq[i][j],
stg.water_attenuation[i][j],
stg.kt_read[j],
stg.kt_corrected[j],
stg.nb_profiles[i][j],
stg.nb_profiles_per_sec[i][j],
stg.nb_cells[i][j],
stg.cell_size[i][j],
stg.pulse_length[i][j],
stg.nb_pings_per_sec[i][j],
stg.nb_pings_averaged_per_profile[i][j],
stg.gain_rx[i][j], stg.gain_tx[i][j]
)
) )
VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)''',
(stg.acoustic_data[i], stg.freq[i][j], stg.water_attenuation[i][j], stg.kt_read[j], stg.kt_corrected[j],
stg.nb_profiles[i][j], stg.nb_profiles_per_sec[i][j], stg.nb_cells[i][j],
stg.cell_size[i][j], stg.pulse_length[i][j], stg.nb_pings_per_sec[i][j],
stg.nb_pings_averaged_per_profile[i][j], stg.gain_rx[i][j], stg.gain_tx[i][j],
str(stg.date[i].year) + str('-') + str(stg.date[i].month) + str('-') + str(stg.date[i].day),
str(stg.hour[i].hour) + str(':') + str(stg.hour[i].minute)
))
# Commit the transaction after executing INSERT. # Commit the transaction after executing INSERT.
cnx.commit() cnx.commit()
@ -417,6 +447,3 @@ class UpdateTableForSave:
# Close database connection # Close database connection
cnx.close() cnx.close()

View File

@ -21,11 +21,18 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from PyQt5.QtWidgets import (QWidget, QVBoxLayout, QHBoxLayout, QGroupBox, QPushButton, QComboBox, QLineEdit, QLabel, from PyQt5.QtWidgets import (
QGridLayout, QTableView, QSpacerItem, QSizePolicy, QFileDialog, QMessageBox, QScrollArea, QWidget, QVBoxLayout, QHBoxLayout, QGroupBox,
QSlider, QMenu, QCheckBox) QPushButton, QComboBox, QLineEdit, QLabel,
QGridLayout, QTableView, QSpacerItem, QSizePolicy,
QFileDialog, QMessageBox, QScrollArea,
QSlider, QMenu, QCheckBox
)
from PyQt5.QtGui import QPixmap, QIcon from PyQt5.QtGui import QPixmap, QIcon
from PyQt5.QtCore import Qt, QCoreApplication, pyqtSignal, QEvent, QSize, QPropertyAnimation from PyQt5.QtCore import (
Qt, QCoreApplication, pyqtSignal, QEvent, QSize,
QPropertyAnimation
)
import numpy as np import numpy as np
import pandas as pd import pandas as pd
@ -35,7 +42,7 @@ from matplotlib.colors import LogNorm, CSS4_COLORS, BoundaryNorm
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolBar from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolBar
from os import path import os
from copy import deepcopy from copy import deepcopy
import locale import locale
@ -1232,71 +1239,76 @@ class AcousticDataTab(QWidget):
self.combobox_frequency_information.currentIndex()])) self.combobox_frequency_information.currentIndex()]))
def open_dialog_box(self): def open_dialog_box(self):
abs_params = [
(None, None),
("AQUAscat file", "Aquascat file (*.aqa)"),
("UBSediFlow file", "UBSediFlow file (*.udt)"),
]
# --- Open dialog box + choice directory and select file ---
if self.combobox_ABS_system_choice.currentIndex() == 0: system = self.combobox_ABS_system_choice.currentIndex()
if system == 0:
msgBox = QMessageBox() msgBox = QMessageBox()
msgBox.setWindowTitle("Download Error") msgBox.setWindowTitle("Download Error")
msgBox.setIcon(QMessageBox.Warning) msgBox.setIcon(QMessageBox.Warning)
msgBox.setText("Choose ABS system before download acoustic files") msgBox.setText("Choose ABS system before download acoustic files")
msgBox.setStandardButtons(QMessageBox.Ok) msgBox.setStandardButtons(QMessageBox.Ok)
msgBox.exec() msgBox.exec()
elif self.combobox_ABS_system_choice.currentIndex() == 1: else:
abs_name, abs_file_type = abs_params[system]
filename = QFileDialog.getOpenFileNames(self, "AQUAscat file", filenames, _ = QFileDialog.getOpenFileNames(
[stg.path_BS_raw_data[-1] if self.fileListWidget.count() > 0 else ""][0], self, abs_name,
"Aquascat file (*.aqa)", [
options=QFileDialog.DontUseNativeDialog) stg.path_BS_raw_data[-1]
if self.fileListWidget.count() > 0
else ""
][0],
abs_file_type,
options=QFileDialog.DontUseNativeDialog
)
for n in filename[0]: if len(filenames) == 0:
return
stg.path_BS_raw_data.append(path.dirname(n)) for n in filenames:
stg.filename_BS_raw_data.append(path.basename(n)) stg.path_BS_raw_data.append(os.path.dirname(n))
stg.data_preprocessed.append(path.basename(n)) stg.filename_BS_raw_data.append(os.path.basename(n))
stg.data_preprocessed.append(os.path.basename(n))
elif self.combobox_ABS_system_choice.currentIndex() == 2: self.open_acoustic_data()
filename = QFileDialog.getOpenFileNames(self, "UBSediFlow file",
[stg.path_BS_raw_data[-1] if self.fileListWidget.count() > 0 else ""][0],
"UBSediFlow file (*.udt)",
options=QFileDialog.DontUseNativeDialog)
for n in filename[0]:
stg.path_BS_raw_data.append(path.dirname(n))
stg.filename_BS_raw_data.append(path.basename(n))
stg.data_preprocessed.append(path.basename(n))
def open_acoustic_data(self):
# --- Fill lineEdit with path and file names + load acoustic data --- # --- Fill lineEdit with path and file names + load acoustic data ---
# --- fill date, hour and measurements information + fill frequency combobox for bottom detection --- # --- fill date, hour and measurements information + fill frequency combobox for bottom detection ---
if self.combobox_ABS_system_choice.currentIndex() != 0: system = self.combobox_ABS_system_choice.currentIndex()
if system != 0:
try: try:
self.load_BS_acoustic_raw_data() self.load_BS_acoustic_raw_data()
except ValueError as e: except ValueError as e:
msgBox = QMessageBox() msgBox = QMessageBox()
msgBox.setWindowTitle("Download Error") msgBox.setWindowTitle("Download Error")
msgBox.setIcon(QMessageBox.Warning) msgBox.setIcon(QMessageBox.Warning)
msgBox.setText("Please select a file") msgBox.setText("Please select a file")
msgBox.setStandardButtons(QMessageBox.Ok) msgBox.setStandardButtons(QMessageBox.Ok)
msgBox.exec() msgBox.exec()
else: else:
if self.fileListWidget.count() == 0: if self.fileListWidget.count() == 0:
for p, f in zip(stg.path_BS_raw_data,
for p, f in zip(stg.path_BS_raw_data, stg.filename_BS_raw_data): stg.filename_BS_raw_data):
self.fileListWidget.addFilenames([f]) self.fileListWidget.addFilenames([f])
self.fileListWidget.setToolTip(p) self.fileListWidget.setToolTip(p)
else: else:
for k in range(self.fileListWidget.count(),
for k in range(self.fileListWidget.count(), len(stg.filename_BS_raw_data), 1): len(stg.filename_BS_raw_data),
self.fileListWidget.addFilenames([stg.filename_BS_raw_data[k]]) 1):
self.fileListWidget.setToolTip(stg.path_BS_raw_data[k]) self.fileListWidget.addFilenames(
[stg.filename_BS_raw_data[k]]
)
self.fileListWidget.setToolTip(
stg.path_BS_raw_data[k]
)
self.fill_measurements_information_groupbox() self.fill_measurements_information_groupbox()
self.fill_table() self.fill_table()
@ -1304,7 +1316,11 @@ class AcousticDataTab(QWidget):
self.update_frequency_combobox() self.update_frequency_combobox()
self.water_attenuation() self.water_attenuation()
stg.acoustic_data = list(range(self.fileListWidget.count())) stg.acoustic_data = list(
range(
self.fileListWidget.count()
)
)
def rename_file_in_ListWidget(self, event): def rename_file_in_ListWidget(self, event):
@ -2719,4 +2735,3 @@ class AcousticDataTab(QWidget):
self.update_plot_profile() self.update_plot_profile()
self.fig_BS.canvas.draw_idle() self.fig_BS.canvas.draw_idle()

View File

@ -262,20 +262,33 @@ class Ui_MainWindow(object):
def save_as(self): def save_as(self):
CreateTableForSaveAs() CreateTableForSaveAs()
self.mainwindow.setWindowTitle("AcouSed - " + stg.filename_save_as + ".acd") self.mainwindow.setWindowTitle(
"AcouSed - " +
stg.filename_save_as
)
def save(self): def save(self):
UpdateTableForSave() UpdateTableForSave()
def open(self): def open(self):
ReadTableForOpen() reader = ReadTableForOpen()
if reader.opened:
self.mainwindow.open_study_update_tabs()
def load_calibration_constant_values(self): def load_calibration_constant_values(self):
cc_kt = CalibrationConstantKt() cc_kt = CalibrationConstantKt()
cc_kt.exec() cc_kt.exec()
def db_browser_for_sqlite(self): def db_browser_for_sqlite(self):
Popen(f"sqlitebrowser", shell=True) try:
Popen("sqlitebrowser")
except OSError as e:
msg_box = QtWidgets.QMessageBox()
msg_box.setWindowTitle("DB Browser for SQLite Error")
msg_box.setIcon(QtWidgets.QMessageBox.Critical)
msg_box.setText(f"DB Browser for SQLite Error:\n {str(e)}")
msg_box.setStandardButtons(QtWidgets.QMessageBox.Ok)
msg_box.exec()
def about_window(self): def about_window(self):
print("about") print("about")

View File

@ -1,7 +1,8 @@
import sys from PyQt5.QtWidgets import (
QApplication, QWidget, QVBoxLayout, QHBoxLayout,
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QHBoxLayout, QTextEdit, QPushButton, QSpacerItem, \ QTextEdit, QPushButton, QSpacerItem, QSpinBox,
QSpinBox, QSizePolicy, QFontComboBox, QColorDialog QSizePolicy, QFontComboBox, QColorDialog
)
from PyQt5.QtGui import QPixmap, QIcon, QFont from PyQt5.QtGui import QPixmap, QIcon, QFont
from PyQt5.QtCore import Qt from PyQt5.QtCore import Qt
@ -189,27 +190,21 @@ class NoteTab(QWidget):
self.textEdit.setAlignment(Qt.AlignJustify) self.textEdit.setAlignment(Qt.AlignJustify)
def print_settings(self): def print_settings(self):
self.textEdit.setText(
self.textEdit.setText("Acoustic data: \n\n" "Acoustic data: \n\n"
f" ABS raw data file: {stg.path_BS_raw_data}/{stg.filename_BS_raw_data} \n" f" ABS raw data file: {stg.path_BS_raw_data}/{stg.filename_BS_raw_data} \n"
f" ABS noise data file: {stg.path_BS_noise_data}/{stg.filename_BS_noise_data} \n" f" ABS noise data file: {stg.path_BS_noise_data}/{stg.filename_BS_noise_data} \n"
"\n\n" "\n\n"
"------------------------------------------------------------------------- \n\n\n" "------------------------------------------------------------------------- \n\n\n"
"Particle size data: \n" "Particle size data: \n"
f" Fine sediments data file: {stg.fine_sediment_path}/{stg.fine_sediment_filename} \n" f" Fine sediments data file: {stg.path_fine}/{stg.filename_fine} \n"
f" Sand sediments data file: {stg.sand_sediment_path}/{stg.sand_sediment_filename} \n" f" Sand sediments data file: {stg.path_sand}/{stg.filename_sand} \n"
"\n\n" "\n\n"
"------------------------------------------------------------------------- \n\n\n") "------------------------------------------------------------------------- \n\n\n"
)
# "Acoustic Inversion parameters: \n" # "Acoustic Inversion parameters: \n"
# f" frequencies to compute VBI: {stg.freq_text[int(stg.frequencies_to_compute_VBI[0, 0])]}, " # f" frequencies to compute VBI: {stg.freq_text[int(stg.frequencies_to_compute_VBI[0, 0])]}, "
# f"{stg.freq_text[int(stg.frequencies_to_compute_VBI[1, 0])]} \n" # f"{stg.freq_text[int(stg.frequencies_to_compute_VBI[1, 0])]} \n"
# f" frequency to compute SSC: {stg.freq_text[int(stg.frequency_to_compute_SSC[0])]}") # f" frequency to compute SSC: {stg.freq_text[int(stg.frequency_to_compute_SSC[0])]}")
# if __name__ == "__main__":
# app = QApplication(sys.argv)
# window = NoteTab()
# window.show()
# sys.exit(app.exec_())

18
main.py
View File

@ -33,7 +33,7 @@ logging.basicConfig(
) )
logger = logging.getLogger() logger = logging.getLogger()
logger.setLevel(logging.INFO) logger.setLevel(logging.DEBUG)
class MainApplication(QMainWindow): class MainApplication(QMainWindow):
@ -49,15 +49,18 @@ class MainApplication(QMainWindow):
height = size.height() height = size.height()
self.resize(int(PERCENT_SCREEN_SIZE*width), int(PERCENT_SCREEN_SIZE*height)) self.resize(int(PERCENT_SCREEN_SIZE*width), int(PERCENT_SCREEN_SIZE*height))
try: try:
self.read_table_open = ReadTableForOpen()
# ************************************************** # **************************************************
# -------------- Acoustic data tab --------------- # -------------- Acoustic data tab ---------------
self.acoustic_data_tab = AcousticDataTab(self.ui_mainwindow.tab1) self.acoustic_data_tab = AcousticDataTab(self.ui_mainwindow.tab1)
print("0 AcousticDataTab ", id(AcousticDataTab)) print("0 AcousticDataTab ", id(AcousticDataTab))
self.acoustic_data_tab.combobox_ABS_system_choice.editTextChanged.connect( self.acoustic_data_tab\
self.acoustic_data_tab.ABS_system_choice) .combobox_ABS_system_choice\
.editTextChanged\
.connect(
self.acoustic_data_tab.ABS_system_choice
)
# ************************************************** # **************************************************
# --------- Signal pre-processing data tab ---------- # --------- Signal pre-processing data tab ----------
@ -92,8 +95,6 @@ class MainApplication(QMainWindow):
# self.user_manual_tab = UserManualTab(self.ui_mainwindow.tab7) # self.user_manual_tab = UserManualTab(self.ui_mainwindow.tab7)
self.ui_mainwindow.actionOpen.triggered.connect(self.trig_open)
# ************************************************** # **************************************************
# ---------------- Text File Error ----------------- # ---------------- Text File Error -----------------
@ -106,9 +107,7 @@ class MainApplication(QMainWindow):
sortie.write(traceback.format_exc()) sortie.write(traceback.format_exc())
# traceback.TracebackException.from_exception(e).print(file=sortie) # traceback.TracebackException.from_exception(e).print(file=sortie)
def trig_open(self): def open_study_update_tabs(self):
self.read_table_open.open_file_dialog()
self.acoustic_data_tab.combobox_ABS_system_choice.setCurrentText(stg.ABS_name[0]) self.acoustic_data_tab.combobox_ABS_system_choice.setCurrentText(stg.ABS_name[0])
self.acoustic_data_tab.fileListWidget.addFilenames(stg.filename_BS_raw_data) self.acoustic_data_tab.fileListWidget.addFilenames(stg.filename_BS_raw_data)
@ -119,7 +118,6 @@ class MainApplication(QMainWindow):
self.sample_data_tab.lineEdit_fine_sediment.setToolTip(stg.path_fine) self.sample_data_tab.lineEdit_fine_sediment.setToolTip(stg.path_fine)
# self.sample_data_tab.fill_table_fine() # self.sample_data_tab.fill_table_fine()
if __name__ == '__main__': if __name__ == '__main__':
# print("sys.argv:", [arg for arg in sys.argv]) # print("sys.argv:", [arg for arg in sys.argv])
# app = MainApplication(sys.argv) # app = MainApplication(sys.argv)