390 lines
19 KiB
Python
390 lines
19 KiB
Python
# ============================================================================== #
|
|
# mainwindow.py - AcouSed #
|
|
# Copyright (C) 2024 INRAE #
|
|
# #
|
|
# This program is free software: you can redistribute it and/or modify #
|
|
# it under the terms of the GNU General Public License as published by #
|
|
# the Free Software Foundation, either version 3 of the License, or #
|
|
# (at your option) any later version. #
|
|
# #
|
|
# This program is distributed in the hope that it will be useful, #
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of #
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
|
|
# GNU General Public License for more details. #
|
|
# #
|
|
# You should have received a copy of the GNU General Public License #
|
|
# along with this program. If not, see <https://www.gnu.org/licenses/>. #
|
|
|
|
# by Brahim MOUDJED #
|
|
# ============================================================================== #
|
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
import os
|
|
|
|
# Form implementation generated from reading ui file 'mainwindow.ui'
|
|
#
|
|
# Created by: PyQt5 UI code generator 5.15.9
|
|
#
|
|
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
|
|
# run again. Do not edit this file unless you know what you are doing.
|
|
|
|
|
|
from PyQt5 import QtCore, QtGui, QtWidgets
|
|
from Model.create_table_for_save_as import CreateTableForSaveAs
|
|
from Model.update_table_for_save import UpdateTableForSave
|
|
from Model.read_table_for_open import ReadTableForOpen
|
|
from Model.calibration_constant_kt import CalibrationConstantKt
|
|
from View.about_window import AboutWindow
|
|
import settings as stg
|
|
|
|
import numpy as np
|
|
from subprocess import check_call, run
|
|
|
|
import time
|
|
|
|
from View.acoustic_data_tab import AcousticDataTab
|
|
|
|
|
|
class Ui_MainWindow(object):
|
|
def setupUi(self, MainWindow):
|
|
self.mainwindow = MainWindow
|
|
self.mainwindow.setObjectName("MainWindow")
|
|
self.mainwindow.resize(898, 498)
|
|
self.mainwindow.setLocale(QtCore.QLocale(QtCore.QLocale.French, QtCore.QLocale.France))
|
|
self.mainwindow.setDocumentMode(False)
|
|
self.mainwindow.setDockNestingEnabled(False)
|
|
self.mainwindow.setUnifiedTitleAndToolBarOnMac(False)
|
|
self.centralwidget = QtWidgets.QWidget(self.mainwindow)
|
|
self.centralwidget.setObjectName("centralwidget")
|
|
self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget)
|
|
self.verticalLayout.setObjectName("verticalLayout")
|
|
self.tabWidget = QtWidgets.QTabWidget(self.centralwidget)
|
|
self.tabWidget.setAutoFillBackground(False)
|
|
self.tabWidget.setLocale(QtCore.QLocale(QtCore.QLocale.French, QtCore.QLocale.France))
|
|
self.tabWidget.setDocumentMode(True)
|
|
self.tabWidget.setTabsClosable(False)
|
|
self.tabWidget.setTabBarAutoHide(False)
|
|
self.tabWidget.setObjectName("tabWidget")
|
|
self.tab1 = QtWidgets.QWidget()
|
|
self.tab1.setContextMenuPolicy(QtCore.Qt.ActionsContextMenu)
|
|
self.tab1.setObjectName("tab1")
|
|
self.tabWidget.addTab(self.tab1, "")
|
|
self.tab2 = QtWidgets.QWidget()
|
|
self.tab2.setObjectName("tab2")
|
|
self.tabWidget.addTab(self.tab2, "")
|
|
self.tab3 = QtWidgets.QWidget()
|
|
self.tab3.setObjectName("tab3")
|
|
self.tabWidget.addTab(self.tab3, "")
|
|
self.tab4 = QtWidgets.QWidget()
|
|
self.tab4.setObjectName("tab4")
|
|
self.tabWidget.addTab(self.tab4, "")
|
|
self.tab5 = QtWidgets.QWidget()
|
|
self.tab5.setObjectName("tab5")
|
|
self.tabWidget.addTab(self.tab5, "")
|
|
self.tab6 = QtWidgets.QWidget()
|
|
self.tab6.setObjectName("tab6")
|
|
self.tabWidget.addTab(self.tab6, "")
|
|
# self.tab7 = QtWidgets.QWidget()
|
|
# self.tab7.setObjectName("tab7")
|
|
# self.tabWidget.addTab(self.tab7, "")
|
|
self.verticalLayout.addWidget(self.tabWidget)
|
|
self.mainwindow.setCentralWidget(self.centralwidget)
|
|
self.menubar = QtWidgets.QMenuBar(self.mainwindow)
|
|
self.menubar.setGeometry(QtCore.QRect(0, 0, 898, 22))
|
|
self.menubar.setObjectName("menubar")
|
|
self.menuFile = QtWidgets.QMenu(self.menubar)
|
|
self.menuFile.setLocale(QtCore.QLocale(QtCore.QLocale.French, QtCore.QLocale.France))
|
|
self.menuFile.setObjectName("menuFile")
|
|
self.menuSettings = QtWidgets.QMenu(self.menuFile)
|
|
self.menuSettings.setObjectName("menuSettings")
|
|
self.menuLanguage = QtWidgets.QMenu(self.menuSettings)
|
|
self.menuLanguage.setObjectName("menuLanguage")
|
|
self.menuExport = QtWidgets.QMenu(self.menuFile)
|
|
self.menuExport.setObjectName("menuExport")
|
|
self.menuTools = QtWidgets.QMenu(self.menubar)
|
|
self.menuTools.setLocale(QtCore.QLocale(QtCore.QLocale.French, QtCore.QLocale.France))
|
|
self.menuTools.setObjectName("menuTools")
|
|
self.menuHelp = QtWidgets.QMenu(self.menubar)
|
|
self.menuHelp.setObjectName("menuHelp")
|
|
self.mainwindow.setMenuBar(self.menubar)
|
|
self.statusbar = QtWidgets.QStatusBar(self.mainwindow)
|
|
self.statusbar.setObjectName("statusbar")
|
|
self.mainwindow.setStatusBar(self.statusbar)
|
|
self.toolBar = QtWidgets.QToolBar(self.mainwindow)
|
|
self.toolBar.setObjectName("toolBar")
|
|
self.mainwindow.addToolBar(QtCore.Qt.TopToolBarArea, self.toolBar)
|
|
# self.actionNew = QtWidgets.QAction(self.mainwindow)
|
|
# icon = QtGui.QIcon()
|
|
# icon.addPixmap(QtGui.QPixmap("icons/new.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
|
|
# self.actionNew.setIcon(icon)
|
|
# self.actionNew.setObjectName("actionNew")
|
|
self.actionOpen = QtWidgets.QAction(self.mainwindow)
|
|
icon1 = QtGui.QIcon()
|
|
icon1.addPixmap(QtGui.QPixmap("icons/icon_folder.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
|
|
self.actionOpen.setIcon(icon1)
|
|
self.actionOpen.setObjectName("actionOpen")
|
|
self.actionSave = QtWidgets.QAction(self.mainwindow)
|
|
icon2 = QtGui.QIcon()
|
|
icon2.addPixmap(QtGui.QPixmap("icons/save.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
|
|
self.actionSave.setIcon(icon2)
|
|
self.actionSave.setObjectName("actionSave")
|
|
# self.actionCopy = QtWidgets.QAction(self.mainwindow)
|
|
# icon3 = QtGui.QIcon()
|
|
# icon3.addPixmap(QtGui.QPixmap("icons/copy.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
|
|
# self.actionCopy.setIcon(icon3)
|
|
# self.actionCopy.setObjectName("actionCopy")
|
|
# self.actionCut = QtWidgets.QAction(self.mainwindow)
|
|
# icon4 = QtGui.QIcon()
|
|
# icon4.addPixmap(QtGui.QPixmap("icons/cut.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
|
|
# self.actionCut.setIcon(icon4)
|
|
# self.actionCut.setObjectName("actionCut")
|
|
# self.actionPaste = QtWidgets.QAction(self.mainwindow)
|
|
# icon5 = QtGui.QIcon()
|
|
# icon5.addPixmap(QtGui.QPixmap("icons/paste.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
|
|
# self.actionPaste.setIcon(icon5)
|
|
# self.actionPaste.setObjectName("actionPaste")
|
|
self.actionEnglish = QtWidgets.QAction(self.mainwindow)
|
|
icon6 = QtGui.QIcon()
|
|
icon6.addPixmap(QtGui.QPixmap("icons/en.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
|
|
self.actionEnglish.setIcon(icon6)
|
|
self.actionEnglish.setObjectName("actionEnglish")
|
|
self.actionFrench = QtWidgets.QAction(self.mainwindow)
|
|
icon7 = QtGui.QIcon()
|
|
icon7.addPixmap(QtGui.QPixmap("icons/fr.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
|
|
self.actionFrench.setIcon(icon7)
|
|
self.actionFrench.setObjectName("actionFrench")
|
|
self.action_ABSCalibrationConstant = QtWidgets.QAction(self.mainwindow)
|
|
self.action_ABSCalibrationConstant.setText("ABS constant calibration kt")
|
|
self.actionTable_of_Backscatter_values = QtWidgets.QAction(self.mainwindow)
|
|
self.actionTable_of_Backscatter_values.setObjectName("actionTable_of_Backscatter_values")
|
|
self.actionSave_As = QtWidgets.QAction(self.mainwindow)
|
|
self.actionSave_As.setObjectName("actionSave_As")
|
|
self.actionAbout = QtWidgets.QAction(self.mainwindow)
|
|
self.actionAbout.setObjectName("actionAbout")
|
|
self.actionUserManual = QtWidgets.QAction(self.mainwindow)
|
|
self.actionUserManual.setText("User Manual")
|
|
self.action_AcousticInversionTheory = QtWidgets.QAction(self.mainwindow)
|
|
self.action_AcousticInversionTheory.setText("Acoustic inversion theory")
|
|
self.action_AQUAscatUserManual = QtWidgets.QAction(self.mainwindow)
|
|
self.action_AQUAscatUserManual.setText("Tutorial AQUAscat software")
|
|
self.actionDB_Browser_for_SQLite = QtWidgets.QAction(self.mainwindow)
|
|
self.actionDB_Browser_for_SQLite.setObjectName("actionDB_Browser_for_SQLite")
|
|
self.menuLanguage.addAction(self.actionEnglish)
|
|
self.menuLanguage.addAction(self.actionFrench)
|
|
self.menuSettings.addAction(self.menuLanguage.menuAction())
|
|
self.menuSettings.addAction(self.action_ABSCalibrationConstant)
|
|
self.menuExport.addAction(self.actionTable_of_Backscatter_values)
|
|
self.menuFile.addAction(self.actionOpen)
|
|
self.menuFile.addAction(self.actionSave)
|
|
self.menuFile.addAction(self.actionSave_As)
|
|
self.menuFile.addSeparator()
|
|
self.menuFile.addAction(self.menuSettings.menuAction())
|
|
self.menuFile.addSeparator()
|
|
self.menuFile.addAction(self.menuExport.menuAction())
|
|
self.menuTools.addAction(self.actionDB_Browser_for_SQLite)
|
|
self.menuHelp.addAction(self.actionAbout)
|
|
self.menuHelp.addAction(self.actionUserManual)
|
|
self.menuHelp.addAction(self.action_AcousticInversionTheory)
|
|
self.menuHelp.addAction(self.action_AQUAscatUserManual)
|
|
self.menubar.addAction(self.menuFile.menuAction())
|
|
self.menubar.addAction(self.menuTools.menuAction())
|
|
self.menubar.addAction(self.menuHelp.menuAction())
|
|
# self.toolBar.addAction(self.actionNew)
|
|
self.toolBar.addAction(self.actionOpen)
|
|
self.toolBar.addAction(self.actionSave)
|
|
self.toolBar.addSeparator()
|
|
# self.toolBar.addAction(self.actionCopy)
|
|
# self.toolBar.addAction(self.actionCut)
|
|
# self.toolBar.addAction(self.actionPaste)
|
|
self.toolBar.addSeparator()
|
|
self.toolBar.addAction(self.actionEnglish)
|
|
self.toolBar.addAction(self.actionFrench)
|
|
|
|
self.retranslateUi()
|
|
self.tabWidget.setCurrentIndex(0)
|
|
QtCore.QMetaObject.connectSlotsByName(self.mainwindow)
|
|
|
|
# --- Create Context Menu ---
|
|
self.createContextMenu()
|
|
|
|
# --- Connect Action Save As ---
|
|
self.actionSave_As.triggered.connect(self.save_as)
|
|
|
|
# --- Connect Action save ---
|
|
self.actionSave.triggered.connect(self.save)
|
|
|
|
# --- Connect Action Open ---
|
|
self.actionOpen.triggered.connect(self.open)
|
|
# self.actionOpen.triggered.connect(lambda: print('tott'))
|
|
|
|
# --- Connect Action ABS calibration constant kt ---
|
|
self.action_ABSCalibrationConstant.triggered.connect(self.load_calibration_constant_values)
|
|
|
|
# --- Connect Action export acoustic backscatter values ---
|
|
self.actionTable_of_Backscatter_values.triggered.connect(
|
|
self.export_table_of_acoustic_BS_values_to_excel_or_libreOfficeCalc_file)
|
|
|
|
# --- Connect Action DB_Browser_for_SQLite ---
|
|
self.actionDB_Browser_for_SQLite.triggered.connect(self.db_browser_for_sqlite)
|
|
|
|
# --- Connect Action About ---
|
|
self.actionAbout.triggered.connect(self.about_window)
|
|
|
|
# --- Connect Action User Manual ---
|
|
self.actionUserManual.triggered.connect(self.user_manual)
|
|
self.action_AcousticInversionTheory.triggered.connect(self.inversion_acoustic_theory)
|
|
self.action_AQUAscatUserManual.triggered.connect(self.tutorial_AQUAscat_software)
|
|
|
|
|
|
def createContextMenu(self):
|
|
# Setting contextMenuPolicy
|
|
self.centralwidget.setContextMenuPolicy(QtCore.Qt.ActionsContextMenu)
|
|
# Populating the widget with actions
|
|
self.centralwidget.addAction(self.actionSave_As)
|
|
self.centralwidget.addAction(self.actionSave)
|
|
self.centralwidget.addAction(self.actionOpen)
|
|
self.centralwidget.addAction(self.actionTable_of_Backscatter_values)
|
|
self.centralwidget.addAction(self.actionEnglish)
|
|
self.centralwidget.addAction(self.actionFrench)
|
|
self.centralwidget.addAction(self.actionDB_Browser_for_SQLite)
|
|
|
|
def save_as(self):
|
|
CreateTableForSaveAs()
|
|
self.mainwindow.setWindowTitle("AcouSed - " + stg.filename_save_as + ".acd")
|
|
|
|
def save(self):
|
|
UpdateTableForSave()
|
|
|
|
def open(self):
|
|
pass
|
|
# ReadTableForOpen()
|
|
|
|
# acoustic_data_tab = AcousticDataTab()
|
|
#
|
|
# acoustic_data_tab.fileListWidget.addItems(stg.acoustic_data)
|
|
|
|
def load_calibration_constant_values(self):
|
|
cc_kt = CalibrationConstantKt()
|
|
cc_kt.exec()
|
|
|
|
def db_browser_for_sqlite(self):
|
|
check_call("/usr/bin/sqlitebrowser")
|
|
|
|
def about_window(self):
|
|
print("about")
|
|
aw = AboutWindow()
|
|
aw.exec()
|
|
|
|
def user_manual(self):
|
|
open('AcouSed_UserManual.pdf')
|
|
run(["open", 'AcouSed_UserManual.pdf'])
|
|
|
|
def inversion_acoustic_theory(self):
|
|
open('Acoustic_Inversion_theory.pdf')
|
|
run(["open", 'Acoustic_Inversion_theory.pdf'])
|
|
|
|
def tutorial_AQUAscat_software(self):
|
|
open('Tutorial_AQUAscat_software.pdf')
|
|
run(["open", 'Tutorial_AQUAscat_software.pdf'])
|
|
|
|
def export_table_of_acoustic_BS_values_to_excel_or_libreOfficeCalc_file(self):
|
|
|
|
if len(stg.BS_raw_data_reshape) != 0:
|
|
|
|
# --- Open file dialog to select the directory ---
|
|
|
|
name = QtWidgets.QFileDialog.getExistingDirectory(caption="Select Directory - Acoustic BS raw data Table")
|
|
print("name table to save ", name)
|
|
|
|
# --- Save the raw acoustic backscatter data from a Dataframe to csv file ---
|
|
|
|
t0 = time.time()
|
|
print("len(stg.BS_raw_data_reshape) ", len(stg.BS_raw_data_reshape))
|
|
|
|
if name:
|
|
|
|
for i in range(len(stg.BS_raw_data_reshape)):
|
|
|
|
header_list = []
|
|
header_list.clear()
|
|
table_data = np.array([[]])
|
|
for freq_ind, freq_value in enumerate(stg.freq_text[0]):
|
|
header_list.append("Time - " + freq_value)
|
|
header_list.append("Depth - " + freq_value)
|
|
header_list.append("BS - " + freq_value)
|
|
|
|
if freq_ind == 0:
|
|
table_data = np.vstack((np.vstack((stg.time_reshape[i][:, freq_ind],
|
|
stg.depth_reshape[i][:, freq_ind])),
|
|
stg.BS_raw_data_reshape[i][:, freq_ind]))
|
|
|
|
else:
|
|
table_data = np.vstack((table_data,
|
|
np.vstack((np.vstack(
|
|
(stg.time_reshape[i][:, freq_ind],
|
|
stg.depth_reshape[i][:, freq_ind])),
|
|
stg.BS_raw_data_reshape[i][:, freq_ind]))
|
|
))
|
|
|
|
exec("DataFrame_acoustic_" + str(i) + "= pd.DataFrame(None)")
|
|
exec("DataFrame_acoustic_" + str(i) + "= pd.DataFrame(data=table_data.transpose(), columns=header_list)")
|
|
|
|
# exec("DataFrame_acoustic_" + str(i) + ".to_csv(" +
|
|
# "excel_writer=" +
|
|
# '/home/bmoudjed/Documents/3 SSC acoustic meas project/Graphical interface project/BS_raw_data_table.xlsx' + "," +
|
|
# "sheet_name=stg.filename_BS_raw_data[i]," +
|
|
# "header=DataFrame_acoustic.columns," +
|
|
# "engine=" + "xlsxwriter" + ")")
|
|
|
|
exec("DataFrame_acoustic_" + str(i) + ".to_csv(" +
|
|
"path_or_buf=" +
|
|
"'" + name + "/" + "Table_" +
|
|
str(stg.filename_BS_raw_data[i][:-4]) + ".csv'" + ", " +
|
|
"sep=" + "',' " + ", " +
|
|
"header=DataFrame_acoustic_" + str(i) + ".columns" + ")")
|
|
|
|
t1 = time.time() - t0
|
|
print("time duration export BS ", t1)
|
|
print("table of BS value Export finished")
|
|
|
|
def retranslateUi(self):
|
|
_translate = QtCore.QCoreApplication.translate
|
|
self.mainwindow.setWindowTitle(_translate("MainWindow", "AcouSed - unsaved file"))
|
|
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab1), _translate("MainWindow", "Acoustic data"))
|
|
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab2), _translate("MainWindow", "Signal preprocessing"))
|
|
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab3), _translate("MainWindow", "Sample data"))
|
|
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab4), _translate("MainWindow", "Sediment Calibration"))
|
|
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab5), _translate("MainWindow", "Acoustic inversion"))
|
|
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab6), _translate("MainWindow", "Note"))
|
|
# self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab7), _translate("MainWindow", "User manual"))
|
|
self.menuFile.setTitle(_translate("MainWindow", "File"))
|
|
self.menuSettings.setTitle(_translate("MainWindow", "Settings"))
|
|
self.menuLanguage.setTitle(_translate("MainWindow", "Language"))
|
|
self.menuExport.setTitle(_translate("MainWindow", "Export"))
|
|
self.menuTools.setTitle(_translate("MainWindow", "Tools"))
|
|
self.menuHelp.setTitle(_translate("MainWindow", "Help"))
|
|
self.toolBar.setWindowTitle(_translate("MainWindow", "toolBar"))
|
|
# self.actionNew.setText(_translate("MainWindow", "New"))
|
|
self.actionOpen.setText(_translate("MainWindow", "Open ..."))
|
|
self.actionSave.setText(_translate("MainWindow", "Save"))
|
|
# self.actionCopy.setText(_translate("MainWindow", "Copy"))
|
|
# self.actionCut.setText(_translate("MainWindow", "Cut"))
|
|
# self.actionPaste.setText(_translate("MainWindow", "Paste"))
|
|
self.actionEnglish.setText(_translate("MainWindow", "English"))
|
|
self.actionFrench.setText(_translate("MainWindow", "French"))
|
|
self.actionTable_of_Backscatter_values.setText(_translate("MainWindow", "Table of Backscatter values"))
|
|
self.actionSave_As.setText(_translate("MainWindow", "Save As ..."))
|
|
self.actionAbout.setText(_translate("MainWindow", "About"))
|
|
self.actionDB_Browser_for_SQLite.setText(_translate("MainWindow", "DB Browser for SQLite"))
|
|
|
|
|
|
if __name__ == "__main__":
|
|
import sys
|
|
app = QtWidgets.QApplication(sys.argv)
|
|
MainWindow = QtWidgets.QMainWindow()
|
|
ui = Ui_MainWindow()
|
|
ui.setupUi(MainWindow)
|
|
MainWindow.show()
|
|
sys.exit(app.exec_())
|