From c8a3f7a1a273dcfdacc750d462ffa8e917caa2c7 Mon Sep 17 00:00:00 2001 From: alessandro90 Date: Sun, 28 Oct 2018 11:08:50 +0100 Subject: [PATCH] Automatic lower limit for upper frequency filter --- filters.py | 13 --- main.py | 129 +++++++++++++++++------- main_window.ui | 269 +++++++++++++++++++++++++++++++------------------ 3 files changed, 262 insertions(+), 149 deletions(-) delete mode 100644 filters.py diff --git a/filters.py b/filters.py deleted file mode 100644 index 6e3f994..0000000 --- a/filters.py +++ /dev/null @@ -1,13 +0,0 @@ -from collections import namedtuple - -class Filters(object): - def __init__(self, *all_filters): - self.filter_widgets = all_filters - - def activate(self): - for f in self.filter_widgets: - f.setEnabled(True) - - def deactivate(self): - for f in self.filter_widgets: - f.setEnabled(False) diff --git a/main.py b/main.py index 310dd57..c6de0c3 100644 --- a/main.py +++ b/main.py @@ -65,9 +65,6 @@ class MyApp(QMainWindow, Ui_MainWindow): self.shf_filter_btn, self.ehf_filter_btn, ) - self.lower_freq_confidence.valueChanged.connect( - lambda value: self.upper_freq_confidence.setValue(value) - ) self.lower_freq_spinbox.valueChanged.connect( partial(self.set_min_value_upper_limit, @@ -76,6 +73,17 @@ class MyApp(QMainWindow, Ui_MainWindow): self.upper_freq_filter_unit, self.upper_freq_spinbox) ) + self.lower_freq_spinbox.valueChanged.connect(self.set_band_filter_label) + + self.upper_freq_spinbox.valueChanged.connect( + partial(self.set_min_value_upper_limit, + self.lower_freq_filter_unit, + self.lower_freq_spinbox, + self.upper_freq_filter_unit, + self.upper_freq_spinbox) + ) + self.upper_freq_spinbox.valueChanged.connect(self.set_band_filter_label) + self.lower_freq_filter_unit.currentTextChanged.connect( partial(self.set_min_value_upper_limit, self.lower_freq_filter_unit, @@ -83,6 +91,8 @@ class MyApp(QMainWindow, Ui_MainWindow): self.upper_freq_filter_unit, self.upper_freq_spinbox) ) + self.lower_freq_filter_unit.currentTextChanged.connect(self.set_band_filter_label) + self.upper_freq_filter_unit.currentTextChanged.connect( partial(self.set_min_value_upper_limit, self.lower_freq_filter_unit, @@ -90,6 +100,7 @@ class MyApp(QMainWindow, Ui_MainWindow): self.upper_freq_filter_unit, self.upper_freq_spinbox) ) + self.upper_freq_filter_unit.currentTextChanged.connect(self.set_band_filter_label) self.activate_low_freq_filter_btn.toggled.connect( partial(self.activate_if_toggled, @@ -98,6 +109,7 @@ class MyApp(QMainWindow, Ui_MainWindow): self.lower_freq_filter_unit, self.lower_freq_confidence) ) + self.activate_low_freq_filter_btn.clicked.connect(self.set_band_filter_label) self.activate_up_freq_filter_btn.toggled.connect( partial(self.activate_if_toggled, @@ -106,12 +118,18 @@ class MyApp(QMainWindow, Ui_MainWindow): self.upper_freq_filter_unit, self.upper_freq_confidence) ) + self.activate_up_freq_filter_btn.clicked.connect(self.set_band_filter_label) + + self.lower_freq_confidence.valueChanged.connect(self.set_band_filter_label) + self.upper_freq_confidence.valueChanged.connect(self.set_band_filter_label) self.apply_remove_freq_filter_btn.set_texts("Apply", "Remove") self.apply_remove_freq_filter_btn.set_slave_filters( [ *self.frequency_filters_btns, self.include_undef_freqs, + self.activate_low_freq_filter_btn, + self.activate_up_freq_filter_btn, ], self.activate_low_freq_filter_btn, [ @@ -129,6 +147,8 @@ class MyApp(QMainWindow, Ui_MainWindow): self.apply_remove_freq_filter_btn.clicked.connect(self.display_signals) self.reset_frequency_filters_btn.clicked.connect(self.reset_frequency_filters) + self.reset_filters_btn.clicked.connect(self.reset_all_filters) + UrlColors = namedtuple("UrlColors", ["inactive", "active", "clicked"]) self.url_button.colors = UrlColors("#9f9f9f", "#4c75ff", "#942ccc") self.category_labels = [self.cat_mil, @@ -245,8 +265,7 @@ class MyApp(QMainWindow, Ui_MainWindow): 'inf_band': str, 'sup_band': str, 'category_code': str,}, - names = names, - ) + names = names,) except FileNotFoundError: self.search_bar.setDisabled(True) box = QMessageBox(self) @@ -271,40 +290,77 @@ class MyApp(QMainWindow, Ui_MainWindow): box.show() self.statusbar.showMessage("Database version: undefined.") else: - self.statusbar.showMessage(f"Database version: {self.db_version}") + self.update_status_tip(self.total_signals) @pyqtSlot() def set_min_value_upper_limit(self, lower_combo_box, lower_spin_box, upper_combo_box, upper_spin_box): + unit_conversion = {'Hz' : ['kHz', 'MHz', 'GHz'], + 'kHz': ['MHz', 'GHz'], + 'MHz': ['GHz'] + } lower_units = lower_combo_box.currentText() upper_units = upper_combo_box.currentText() lower_value = lower_spin_box.value() + upper_value = upper_spin_box.value() inf_limit = (lower_value * self.conversion_factors[lower_units]) \ // self.conversion_factors[upper_units] counter = 0 while inf_limit > upper_spin_box.maximum(): counter += 1 inf_limit //= 1000 + if upper_spin_box.minimum() != inf_limit: + upper_spin_box.setMinimum(inf_limit) if counter > 0: - if counter == 1 and upper_units == 'kHz': - new_unit = 'MHz' - else: - new_unit = 'GHz' + new_unit = unit_conversion[upper_units][counter - 1] upper_combo_box.disconnect() upper_combo_box.setCurrentText(new_unit) upper_combo_box.currentTextChanged.connect( partial(self.set_min_value_upper_limit, - self.lower_combo_box, - self.lower_spin_box, - self.upper_combo_box, - self.upper_spin_box - ) + lower_combo_box, + lower_spin_box, + upper_combo_box, + upper_spin_box) ) - upper_spin_box.setValue(upper_spin_box.value() // (1000**counter)) - if upper_spin_box.minimum() != inf_limit: - upper_spin_box.setMinimum(inf_limit) + + @pyqtSlot() + def set_band_filter_label(self): + activate_low = False + activate_high = False + color = self.inactive_color + title = '' + to_display = '' + if self.activate_low_freq_filter_btn.isChecked(): + to_display += str(self.lower_freq_spinbox.value()) + ' ' + self.lower_freq_filter_unit.currentText() + activate_low = True + color = self.active_color + if self.lower_freq_confidence.value() != 0: + to_display += ' - ' + str(self.lower_freq_confidence.value()) + ' %' + else: + to_display += 'DC' + to_display += ' รท ' + if self.activate_up_freq_filter_btn.isChecked(): + to_display += str(self.upper_freq_spinbox.value()) + ' ' + self.upper_freq_filter_unit.currentText() + activate_high = True + color = self.active_color + if self.upper_freq_confidence.value() != 0: + to_display += ' + ' + str(self.upper_freq_confidence.value()) + ' %' + else: + to_display += 'INF' + if activate_low and activate_high: + title = 'Band-pass\n\n' + elif activate_low and not activate_high: + title = 'Low-pass\n\n' + elif not activate_low and activate_high: + title = 'High-pass\n\n' + else: + title = "Frequency range:\n\n" + to_display = "Inactive" + to_display = title + to_display + self.freq_range_lbl.setText(to_display) + self.freq_range_lbl.setStyleSheet(f'color: {color};') @pyqtSlot() def activate_if_toggled(self, radio_btn, *widgets): @@ -321,10 +377,10 @@ class MyApp(QMainWindow, Ui_MainWindow): if text.lower() in signal.lower() and self.frequency_filters_ok(signal): self.result_list.addItem(signal) available_signals += 1 - self.upadte_status_tip(available_signals) + self.update_status_tip(available_signals) - def upadte_status_tip(self, available_signals): - self.statusbar.showMessage(f"Database version: {self.db_version}. {available_signals} out of {self.total_signals} signals displayed.") + def update_status_tip(self, available_signals): + self.statusbar.showMessage(f"{available_signals} out of {self.total_signals} signals displayed.") @pyqtSlot() def reset_frequency_filters(self): @@ -369,22 +425,22 @@ class MyApp(QMainWindow, Ui_MainWindow): any_checked = True if signal_freqs[0] < band_limits.upper and signal_freqs[1] >= band_limits.lower: band_filter_ok = True - lower_freq_filter = self.lower_freq_spinbox.value() - upper_freq_filter = self.upper_freq_spinbox.value() lower_limit_ok = True upper_limit_ok = True if self.activate_low_freq_filter_btn.isChecked(): - lower_tol = self.lower_freq_confidence.value() - lower_limit = lower_freq_filter - lower_tol / 100 * lower_freq_filter + lower_freq_filter = self.lower_freq_spinbox.value() lower_units = self.lower_freq_filter_unit.currentText() - lower_limit *= self.conversion_factors[lower_units] + lower_freq_filter *= self.conversion_factors[lower_units] + lower_tol = self.lower_freq_confidence.value() + lower_limit = lower_freq_filter - (lower_tol * lower_freq_filter) // 100 if not signal_freqs[1] >= lower_limit: lower_limit_ok = False if self.activate_up_freq_filter_btn.isChecked(): - upper_tol = self.upper_freq_confidence.value() - upper_limit = upper_freq_filter + upper_tol / 100 * lower_freq_filter + upper_freq_filter = self.upper_freq_spinbox.value() upper_units = self.upper_freq_filter_unit.currentText() - upper_limit *= self.conversion_factors[upper_units] + upper_freq_filter *= self.conversion_factors[upper_units] + upper_tol = self.upper_freq_confidence.value() + upper_limit = upper_freq_filter + (upper_tol * upper_freq_filter) // 100 if not signal_freqs[0] < upper_limit: upper_limit_ok = False if any_checked: @@ -397,13 +453,6 @@ class MyApp(QMainWindow, Ui_MainWindow): self.display_spectrogram() if item: self.current_signal_name = item.text() - words = self.current_signal_name.split(' ') - if len(words) > 3: - words_per_row = len(words) // 2 - words = ' '.join(words[:words_per_row]) \ - + "\n" + ' '.join(words[words_per_row:]) - else: - words = self.current_signal_name self.name_lab.setText(self.current_signal_name) self.name_lab.setAlignment(Qt.AlignHCenter) current_signal = self.db.loc[self.current_signal_name] @@ -479,6 +528,10 @@ class MyApp(QMainWindow, Ui_MainWindow): pre_upper = upper lower = int(lower) / lower_factor upper = int(upper) / upper_factor + if lower.is_integer(): + lower = int(lower) + if upper.is_integer(): + upper = int(upper) if pre_lower != pre_upper: return f"{lower:,} {units[lower_factor]} - {upper:,} {units[upper_factor]}" else: @@ -535,6 +588,10 @@ class MyApp(QMainWindow, Ui_MainWindow): for band_label in self.band_labels: self.activate_band_category(band_label, False) + @pyqtSlot() + def reset_all_filters(self): + self.reset_frequency_filters_btn.clicked.emit() + @pyqtSlot() def go_to_web_page_signal(self): if self.current_signal_name: diff --git a/main_window.ui b/main_window.ui index 16ed255..ea52169 100644 --- a/main_window.ui +++ b/main_window.ui @@ -70,7 +70,7 @@ QScrollBar::handle:vertical, QScrollBar::handle:horizontal{ border-radius: 5px; border-color: none; border-width: 1px; - background-color: #959595; + background-color: #999999; } QScrollBar::add-line:vertical, QScrollBar::add-line:horizontal{ @@ -1958,7 +1958,8 @@ QPushButton:!enabled { QPushButton:checked { color: #39eaff; -} +} + 0 @@ -2228,7 +2229,7 @@ QPushButton:checked { - 10 + 12 75 true @@ -2254,15 +2255,85 @@ QPushButton:checked { - + 0 0 + + QWidget#freq_filter_container { + border: 1px solid gray; + background-color: rgb(52,52,52); + border-radius: 12px; +} + +QRadioButton, QLabel { + background-color: rgb(52,52,52); +} + - + + + + + 12 + 75 + true + + + + Lower frequency + + + false + + + + + + + false + + + + 0 + 0 + + + + + 100 + 0 + + + + + 100 + 16777215 + + + + + 12 + + + + background-color: #464646; + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + 1 + + + 100000000 + + + + false @@ -2292,6 +2363,9 @@ QPushButton:checked { true + + background-color: #464646; + MHz @@ -2326,7 +2400,30 @@ QPushButton:checked { - + + + + + 0 + 0 + + + + + 12 + 75 + true + + + + Confidence % + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + false @@ -2354,6 +2451,9 @@ QPushButton:checked { 12 + + background-color: #464646; + false @@ -2374,43 +2474,24 @@ QPushButton:checked { - - - - false - - - - 0 - 0 - - - - - 100 - 0 - - - - - 100 - 16777215 - - + + 12 + 75 + true - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + Upper frequency - - 1000000000 + + false - + false @@ -2438,18 +2519,24 @@ QPushButton:checked { 12 + + background-color: #464646; + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + 1 + - 1000000000 + 100000000 - 0 + 1 - + false @@ -2479,6 +2566,9 @@ QPushButton:checked { true + + background-color: #464646; + MHz @@ -2504,7 +2594,30 @@ QPushButton:checked { - + + + + + 0 + 0 + + + + + 12 + 75 + true + + + + Confidence % + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + false @@ -2532,6 +2645,9 @@ QPushButton:checked { 12 + + background-color: #464646; + false @@ -2552,10 +2668,13 @@ QPushButton:checked { - - + + + + false + - + 0 0 @@ -2564,71 +2683,21 @@ QPushButton:checked { 12 75 + false true + false + + color: #9f9f9f; + - Confidence % + Frequency range: + +Inactive - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - - 0 - 0 - - - - - 12 - 75 - true - - - - Confidence % - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - - 12 - 75 - true - - - - Lower frequency - - - false - - - - - - - - 12 - 75 - true - - - - Upper frequency - - - false + Qt::AlignCenter