diff --git a/func/Module_bcg_quality_label.py b/func/Module_bcg_quality_label.py index ee26e8a..3c6ab0e 100644 --- a/func/Module_bcg_quality_label.py +++ b/func/Module_bcg_quality_label.py @@ -3,12 +3,15 @@ from pathlib import Path from traceback import format_exc import matplotlib.pyplot as plt -from PySide6.QtWidgets import QMessageBox, QMainWindow, QApplication +from PySide6.QtGui import QColor +from PySide6.QtWidgets import QMessageBox, QMainWindow, QApplication, QTableWidget, QTableWidgetItem from matplotlib import gridspec from matplotlib.backends.backend_qt import NavigationToolbar2QT from matplotlib.backends.backend_qtagg import FigureCanvasQTAgg +from numpy import array, int64, append, zeros, full, where, nan, arange, float64, isnan, place, count_nonzero, all as np_all from overrides import overrides from pandas import read_csv, DataFrame +from scipy.signal import resample, iirfilter, lfilter from yaml import dump, load, FullLoader from func.utils.PublicFunc import PublicFunc @@ -68,6 +71,80 @@ class SettingWindow(QMainWindow): self.sampID = sampID self.config = None + self.__read_config__() + + self.ui.spinBox_input_freq_signal_BCG.valueChanged.connect(self.__update_ui__) + self.ui.radioButton_30s_mode.clicked.connect(self.__update_mode__) + self.ui.radioButton_10s_mode.clicked.connect(self.__update_mode__) + self.ui.pushButton_confirm.clicked.connect(self.__write_config__) + self.ui.pushButton_cancel.clicked.connect(self.__rollback_config__) + self.ui.pushButton_cancel.clicked.connect(self.close) + + def __read_config__(self): + if not Path(ConfigParams.BCG_QUALITY_LABEL_CONFIG_FILE_PATH).exists(): + with open(ConfigParams.BCG_QUALITY_LABEL_CONFIG_FILE_PATH, "w") as f: + dump(ConfigParams.BCG_QUALITY_LABEL_CONFIG_NEW_CONTENT, f) + + with open(ConfigParams.BCG_QUALITY_LABEL_CONFIG_FILE_PATH, "r") as f: + file_config = load(f.read(), Loader=FullLoader) + Config.update(file_config) + self.config = file_config + + Config.update({ + "Path": { + "Input_BCG": str((Path(self.root_path) / ConfigParams.PUBLIC_PATH_ORGBCG_ALIGNED / + Path(str(self.sampID)))), + "Input_Artifact": str((Path(self.root_path) / ConfigParams.PUBLIC_PATH_LABEL / + Path(str(self.sampID)))), + "Save": str((Path(self.root_path) / ConfigParams.PUBLIC_PATH_LABEL / + Path(str(self.sampID)))), + }, + "Mode": "Undefined", + "DataPartNum": 0, + "CurrentDataIdx": 0, + "CurrentPartNum": 1, + "LongestContinuousTime": 0, + "ArtifactTimePercentage": 0 + }) + + # 数据回显 + self.ui.spinBox_input_freq_signal_BCG.setValue(Config["InputConfig"]["BCGFreq"]) + self.ui.plainTextEdit_file_path_input_signal_BCG.setPlainText(Config["Path"]["Input_BCG"]) + self.ui.plainTextEdit_file_path_input_artifact.setPlainText(Config["Path"]["Input_Artifact"]) + self.ui.plainTextEdit_file_path_save.setPlainText(Config["Path"]["Save"]) + + def __write_config__(self): + # 从界面写入配置 + Config["InputConfig"]["BCGFreq"] = self.ui.spinBox_input_freq_signal_BCG.value() + Config["Path"]["Input_BCG"] = self.ui.plainTextEdit_file_path_input_signal_BCG.toPlainText() + Config["Path"]["Input_Artifact"] = self.ui.plainTextEdit_file_path_input_artifact.toPlainText() + Config["Path"]["Save"] = self.ui.plainTextEdit_file_path_save.toPlainText() + + # 保存配置到文件 + self.config["InputConfig"]["BCGFreq"] = self.ui.spinBox_input_freq_signal_BCG.value() + + with open(ConfigParams.BCG_QUALITY_LABEL_CONFIG_FILE_PATH, "w") as f: + dump(self.config, f) + + self.close() + + def __rollback_config__(self): + self.__read_config__() + + def __update_ui__(self): + self.ui.plainTextEdit_file_path_input_signal_BCG.setPlainText( + str((Path(self.root_path) / + ConfigParams.PUBLIC_PATH_ORGBCG_ALIGNED / + Path(str(self.sampID)) / + Path(ConfigParams.BCG_SYNC + + str(self.ui.spinBox_input_freq_signal_BCG.value()) + + ConfigParams.ENDSWITH_TXT)))) + + def __update_mode__(self): + if self.ui.radioButton_30s_mode.isChecked(): + Config["Mode"] = "30s" + elif self.ui.radioButton_10s_mode.isChecked(): + Config["Mode"] = "10s" class MainWindow_bcg_quality_label(QMainWindow): @@ -86,4 +163,589 @@ class MainWindow_bcg_quality_label(QMainWindow): # 初始化进度条 self.progressbar = None - PublicFunc.add_progressbar(self) \ No newline at end of file + PublicFunc.add_progressbar(self) + + #初始化画框 + self.fig = None + self.canvas = None + self.figToolbar = None + self.gs = None + self.ax0 = None + + self.line_data = None + + self.msgBox = QMessageBox() + self.msgBox.setWindowTitle(Constants.MAINWINDOW_MSGBOX_TITLE) + + @overrides + def show(self, root_path, sampID): + super().show() + self.root_path = root_path + self.sampID = sampID + + self.setting = SettingWindow(root_path, sampID) + + # 初始化画框 + self.fig = plt.figure(figsize=(12, 9), dpi=100) + self.canvas = FigureCanvasQTAgg(self.fig) + self.figToolbar = NavigationToolbar2QT(self.canvas) + for action in self.figToolbar._actions.values(): + action.setEnabled(False) + for action in self.figToolbar.actions(): + if action.text() == "Subplots" or action.text() == "Customize": + self.figToolbar.removeAction(action) + self.ui.verticalLayout_canvas.addWidget(self.canvas) + self.ui.verticalLayout_canvas.addWidget(self.figToolbar) + self.gs = gridspec.GridSpec(1, 1, height_ratios=[1]) + self.fig.subplots_adjust(top=0.98, bottom=0.05, right=0.98, left=0.1, hspace=0, wspace=0) + self.ax0 = self.fig.add_subplot(self.gs[0]) + self.ax0.grid(True) + self.ax0.xaxis.set_major_formatter(ConfigParams.FORMATTER) + + PublicFunc.__resetAllButton__(self, ButtonState) + + self.ui.tableWidget_a1.setEditTriggers(QTableWidget.NoEditTriggers) + self.ui.tableWidget_a2.setEditTriggers(QTableWidget.NoEditTriggers) + self.ui.tableWidget_b1.setEditTriggers(QTableWidget.NoEditTriggers) + self.ui.tableWidget_b2.setEditTriggers(QTableWidget.NoEditTriggers) + self.ui.tableWidget_c.setEditTriggers(QTableWidget.NoEditTriggers) + self.ui.tableWidget_f.setEditTriggers(QTableWidget.NoEditTriggers) + self.ui.tableWidget_a1.horizontalHeader().setStretchLastSection(True) + self.ui.tableWidget_a2.horizontalHeader().setStretchLastSection(True) + self.ui.tableWidget_b1.horizontalHeader().setStretchLastSection(True) + self.ui.tableWidget_b2.horizontalHeader().setStretchLastSection(True) + self.ui.tableWidget_c.horizontalHeader().setStretchLastSection(True) + self.ui.tableWidget_f.horizontalHeader().setStretchLastSection(True) + self.ui.tableWidget_a1.setHorizontalHeaderLabels(['a1']) + self.ui.tableWidget_a2.setHorizontalHeaderLabels(['a2']) + self.ui.tableWidget_b1.setHorizontalHeaderLabels(['b1']) + self.ui.tableWidget_b2.setHorizontalHeaderLabels(['b2']) + self.ui.tableWidget_c.setHorizontalHeaderLabels(['c']) + self.ui.tableWidget_f.setHorizontalHeaderLabels(['None']) + + self.ui.pushButton_input_setting.clicked.connect(self.setting.show) + self.ui.pushButton_input.clicked.connect(self.__slot_btn_input__) + + @overrides + def closeEvent(self, event): + reply = QMessageBox.question(self, '确认', '确认退出吗?', QMessageBox.Yes | QMessageBox.No, QMessageBox.No) + if reply == QMessageBox.Yes: + + PublicFunc.__disableAllButton__(self, ButtonState) + + PublicFunc.statusbar_show_msg(self, PublicFunc.format_status_msg(Constants.SHUTTING_DOWN)) + QApplication.processEvents() + + # 清空画框 + if self.ax0 is not None: + self.ax0.clear() + + # 释放资源 + del self.data + self.fig.clf() + plt.close(self.fig) + self.deleteLater() + collect() + self.canvas = None + event.accept() + else: + event.ignore() + + def __reset__(self): + ButtonState["Current"].update(ButtonState["Default"].copy()) + + def __plot__(self): + # 清空画框 + self.reset_axes() + + sender = self.sender() + + if sender == self.ui.pushButton_input: + try: + artifact_type_seq = array([]) + artifact_type_seq = artifact_type_seq.astype(int64) + if self.ui.checkBox_type1.isChecked(): + artifact_type_seq = append(artifact_type_seq, 1) + if self.ui.checkBox_type2.isChecked(): + artifact_type_seq = append(artifact_type_seq, 2) + if self.ui.checkBox_type3.isChecked(): + artifact_type_seq = append(artifact_type_seq, 3) + if self.ui.checkBox_type4.isChecked(): + artifact_type_seq = append(artifact_type_seq, 4) + if self.ui.checkBox_type5.isChecked(): + artifact_type_seq = append(artifact_type_seq, 5) + + # 是否显示去除工频噪声 + if self.ui.checkBox_display_afterfilter.isChecked(): + display_data = self.data.BCG_without_industrialFrequencyNoise + else: + display_data = self.data.BCG + + if Config["Mode"] == "30s": + length = Config["InputConfig"]["UseFreq"] * 30 + elif Config["Mode"] == "10s": + length = Config["InputConfig"]["UseFreq"] * 10 + else: + raise ValueError("模式不存在") + + # 绘制数据和体动 + mask = array([arange(length), arange(length), arange(length), arange(length), arange(length), arange(length)]) + mask = mask.astype(float64) + self.ax0.plot( + arange(Config["CurrentDataIdx"], Config["CurrentDataIdx"] + length), + display_data[Config["CurrentDataIdx"]: Config["CurrentDataIdx"] + length], + label=Constants.BCG_QUALITY_LABEL_PLOT_LABEL_SIGNAL, color=Constants.PLOT_COLOR_BLUE) + for i in artifact_type_seq: + mask[i] = self.data.artifact_mask[Config["CurrentDataIdx"]: Config["CurrentDataIdx"] + length] == i + mask[i] = (display_data[Config["CurrentDataIdx"]: Config["CurrentDataIdx"] + length] * + mask[i]).astype(float64) + place(mask[i], mask[i] == 0, nan) + self.ax0.plot(arange(Config["CurrentDataIdx"], Config["CurrentDataIdx"] + length), mask[i], + label=f"{Constants.BCG_QUALITY_LABEL_PLOT_LABEL_ARTIFACT}{i}", color=Constants.PLOT_COLOR_RED, + linestyle="-") + + isArtifact = mask[~np_all(mask == range(0, length), axis=1)] + isArtifact = ~isnan(isArtifact).all(axis=0) + + # 计算最长连续时间并更新信息 + longest_continuous_max_length = 0 + longest_continuous_current_length = 0 + longest_continuous_end = 0 + for index, value in enumerate(isArtifact): + if value == False: + longest_continuous_current_length += 1 + if longest_continuous_current_length > longest_continuous_max_length: + longest_continuous_end = index + longest_continuous_max_length = max(longest_continuous_max_length, + longest_continuous_current_length) + else: + longest_continuous_current_length = 0 + longest_continuous_start = longest_continuous_end - longest_continuous_max_length + 1 + if self.ui.checkBox_highlight_longest_continuous.isChecked(): + self.ax0.plot( + arange(Config["CurrentDataIdx"] + longest_continuous_start, + Config["CurrentDataIdx"] + longest_continuous_end), + display_data[ + Config["CurrentDataIdx"] + longest_continuous_start: Config["CurrentDataIdx"] + longest_continuous_end], + label=Constants.BCG_QUALITY_LABEL_PLOT_LABEL_LONGEST_CONTINUOUS, + color=Constants.PLOT_COLOR_PURPLE, linestyle="-", zorder=3) + self.ui.lineEdit_longest_continuous_time.setText( + str(round(longest_continuous_max_length / int(Config["InputConfig"]["UseFreq"]), 2)) + "秒") + + # 计算体动时间占比并更新信息 + self.ui.lineEdit_artifact_time_percentage.setText( + str(round(100 * count_nonzero(isArtifact) / len(isArtifact), 2)) + "%") + + self.ax0.legend(loc=Constants.PLOT_UPPER_RIGHT) + self.canvas.draw() + except Exception as e: + return Result().failure(info=Constants.DRAW_FAILURE + "\n" + format_exc()) + return Result().success(info=Constants.DRAW_FINISHED) + else: + self.canvas.draw() + self.ax0.autoscale(False) + return Result().failure(info=Constants.DRAW_FAILURE) + + def __slot_btn_input__(self): + PublicFunc.__disableAllButton__(self, ButtonState) + + self.reset_axes() + self.canvas.draw() + + self.data = Data() + + # 导入数据 + PublicFunc.progressbar_update(self, 1, 5, Constants.INPUTTING_DATA, 0) + result = self.data.open_file() + if not result.status: + PublicFunc.text_output(self.ui, "(1/5)" + result.info, Constants.TIPS_TYPE_ERROR) + PublicFunc.msgbox_output(self, result.info, Constants.MSGBOX_TYPE_ERROR) + PublicFunc.finish_operation(self, ButtonState) + return + else: + PublicFunc.text_output(self.ui, "(1/5)" + result.info, Constants.TIPS_TYPE_INFO) + + # 获取存档 + PublicFunc.progressbar_update(self, 2, 5, Constants.LOADING_ARCHIVE, 30) + result = self.data.get_archive() + if not result.status: + PublicFunc.text_output(self.ui, "(2/5)" + result.info, Constants.TIPS_TYPE_ERROR) + PublicFunc.msgbox_output(self, result.info, Constants.MSGBOX_TYPE_ERROR) + PublicFunc.finish_operation(self, ButtonState) + return + else: + PublicFunc.text_output(self.ui, "(2/5)" + result.info, Constants.TIPS_TYPE_INFO) + + # 重采样 + PublicFunc.progressbar_update(self, 3, 5, Constants.RESAMPLING_DATA, 40) + result = self.data.resample() + if not result.status: + PublicFunc.text_output(self.ui, "(3/5)" + result.info, Constants.TIPS_TYPE_ERROR) + PublicFunc.msgbox_output(self, result.info, Constants.MSGBOX_TYPE_ERROR) + PublicFunc.finish_operation(self, ButtonState) + return + else: + PublicFunc.text_output(self.ui, "(3/5)" + result.info, Constants.TIPS_TYPE_INFO) + + # 数据预处理 + PublicFunc.progressbar_update(self, 4, 5, Constants.PREPROCESSING_DATA, 70) + result = self.data.preprocess() + if not result.status: + PublicFunc.text_output(self.ui, "(4/5)" + result.info, Constants.TIPS_TYPE_ERROR) + PublicFunc.msgbox_output(self, result.info, Constants.MSGBOX_TYPE_ERROR) + PublicFunc.finish_operation(self, ButtonState) + return + else: + PublicFunc.text_output(self.ui, "(4/5)" + result.info, Constants.TIPS_TYPE_INFO) + + # 绘图 + PublicFunc.progressbar_update(self, 5, 5, Constants.DRAWING_DATA, 90) + result = self.__plot__() + if not result.status: + PublicFunc.text_output(self.ui, "(5/5)" + result.info, Constants.TIPS_TYPE_ERROR) + PublicFunc.msgbox_output(self, result.info, Constants.MSGBOX_TYPE_ERROR) + PublicFunc.finish_operation(self, ButtonState) + return + else: + PublicFunc.text_output(self.ui, "(5/5)" + result.info, Constants.TIPS_TYPE_INFO) + + self.__reset__() + self.change_tablewidget_mode() + self.update_tableWidget() + self.update_status() + ButtonState["Current"]["pushButton_input_setting"] = True + ButtonState["Current"]["pushButton_input"] = True + ButtonState["Current"]["pushButton_invalid_signal_label"] = True + ButtonState["Current"]["pushButton_Ctype_signal_label"] = True + ButtonState["Current"]["pushButton_prev"] = True + ButtonState["Current"]["pushButton_next"] = True + ButtonState["Current"]["pushButton_save"] = True + ButtonState["Current"]["pushButton_a1"] = True + ButtonState["Current"]["pushButton_a2"] = True + ButtonState["Current"]["pushButton_b1"] = True + ButtonState["Current"]["pushButton_b2"] = True + ButtonState["Current"]["pushButton_c"] = True + ButtonState["Current"]["pushButton_f"] = True + for action in self.figToolbar._actions.values(): + action.setEnabled(True) + + PublicFunc.finish_operation(self, ButtonState) + + def update_status(self): + if Config["Mode"] == "30s": + hour = int(((Config["CurrentDataIdx"] + (Config["InputConfig"]["UseFreq"] * 30)) / int(Config["InputConfig"]["UseFreq"])) // 3600) + min = int((((Config["CurrentDataIdx"] + (Config["InputConfig"]["UseFreq"] * 30)) / int(Config["InputConfig"]["UseFreq"])) % 3600) // 60) + sec = int((((Config["CurrentDataIdx"] + (Config["InputConfig"]["UseFreq"] * 30)) / int(Config["InputConfig"]["UseFreq"])) % 3600) % 60) + elif Config["Mode"] == "10s": + hour = int(((Config["CurrentDataIdx"] + (Config["InputConfig"]["UseFreq"] * 10)) / int(Config["InputConfig"]["UseFreq"])) // 3600) + min = int((((Config["CurrentDataIdx"] + (Config["InputConfig"]["UseFreq"] * 10)) / int(Config["InputConfig"]["UseFreq"])) % 3600) // 60) + sec = int((((Config["CurrentDataIdx"] + (Config["InputConfig"]["UseFreq"] * 10)) / int(Config["InputConfig"]["UseFreq"])) % 3600) % 60) + else: + raise ValueError("模式不存在") + self.ui.lineEdit_current_part_time.setText(str(hour) + "时" + str(min) + "分" + str(sec) + "秒") + self.ui.lineEdit_data_part_num.setText(str(Config["CurrentPartNum"]) + "/" + str(Config["DataPartNum"])) + + def update_tableWidget(self): + if Config["Mode"] == "30s": + label_list = { + "label_a1": where(self.data.label == Constants.BCG_QUALITY_LABEL_30S_A1)[0] + 1, + "label_a2": where(self.data.label == Constants.BCG_QUALITY_LABEL_30S_A2)[0] + 1, + "label_b1": where(self.data.label == Constants.BCG_QUALITY_LABEL_30S_B1)[0] + 1, + "label_b2": where(self.data.label == Constants.BCG_QUALITY_LABEL_30S_B2)[0] + 1, + "label_c": where(self.data.label == Constants.BCG_QUALITY_LABEL_30S_C)[0] + 1, + "label_tobeLabeled": where(self.data.label == Constants.BCG_QUALITY_LABEL_TOBELABELED)[0] + 1 + } + self.ui.tableWidget_a1.setRowCount(label_list["label_a1"].__len__()) + self.ui.tableWidget_a2.setRowCount(label_list["label_a2"].__len__()) + self.ui.tableWidget_b1.setRowCount(label_list["label_b1"].__len__()) + self.ui.tableWidget_b2.setRowCount(label_list["label_b2"].__len__()) + self.ui.tableWidget_c.setRowCount(label_list["label_c"].__len__()) + self.ui.tableWidget_f.setRowCount(label_list["label_tobeLabeled"].__len__()) + for label_name, label in label_list.items(): + if label_name == "label_a1": + tableWidget = self.ui.tableWidget_a1 + elif label_name == "label_a2": + tableWidget = self.ui.tableWidget_a2 + elif label_name == "label_b1": + tableWidget = self.ui.tableWidget_b1 + elif label_name == "label_b2": + tableWidget = self.ui.tableWidget_b2 + elif label_name == "label_c": + tableWidget = self.ui.tableWidget_c + elif label_name == "label_tobeLabeled": + tableWidget = self.ui.tableWidget_f + else: + raise ValueError("标签名不存在") + for row, value in enumerate(label): + item = QTableWidgetItem(str(value).strip()) + tableWidget.setItem(row, 0, item) + if (self.data.df_label[Constants.BCG_QUALITY_LABEL_COLUMN_REMARK][ + value - 1] != Constants.STRING_IS_EMPTY and + self.data.df_label[Constants.BCG_QUALITY_LABEL_COLUMN_REMARK][value - 1] is not nan): + item = tableWidget.item(row, 0) + item.setBackground(QColor(255, 200, 200)) + else: + item = tableWidget.item(row, 0) + item.setBackground(QColor(255, 255, 255)) + self.ui.tableWidget_a1.verticalScrollBar().setValue(self.ui.tableWidget_a1.verticalScrollBar().maximum()) + self.ui.tableWidget_a2.verticalScrollBar().setValue(self.ui.tableWidget_a2.verticalScrollBar().maximum()) + self.ui.tableWidget_b1.verticalScrollBar().setValue(self.ui.tableWidget_b2.verticalScrollBar().maximum()) + self.ui.tableWidget_c.verticalScrollBar().setValue(self.ui.tableWidget_c.verticalScrollBar().maximum()) + self.ui.tableWidget_f.verticalScrollBar().setValue(self.ui.tableWidget_f.verticalScrollBar().maximum()) + elif Config["Mode"] == "10s": + label_list = { + "label_a": where(self.data.label == Constants.BCG_QUALITY_LABEL_10S_A)[0] + 1, + "label_b": where(self.data.label == Constants.BCG_QUALITY_LABEL_10S_B)[0] + 1, + "label_c": where(self.data.label == Constants.BCG_QUALITY_LABEL_10S_C)[0] + 1, + "label_tobeLabeled": where(self.data.label == Constants.BCG_QUALITY_LABEL_TOBELABELED)[0] + 1 + } + self.ui.tableWidget_a1.setRowCount(label_list["label_a"].__len__()) + self.ui.tableWidget_b1.setRowCount(label_list["label_b"].__len__()) + self.ui.tableWidget_c.setRowCount(label_list["label_c"].__len__()) + self.ui.tableWidget_f.setRowCount(label_list["label_tobeLabeled"].__len__()) + for label_name, label in label_list.items(): + if label_name == "label_a": + tableWidget = self.ui.tableWidget_a1 + elif label_name == "label_b": + tableWidget = self.ui.tableWidget_b1 + elif label_name == "label_c": + tableWidget = self.ui.tableWidget_c + elif label_name == "label_tobeLabeled": + tableWidget = self.ui.tableWidget_f + else: + raise ValueError("标签名不存在") + for row, value in enumerate(label): + item = QTableWidgetItem(str(value).strip()) + tableWidget.setItem(row, 0, item) + if (self.data.df_label[Constants.BCG_QUALITY_LABEL_COLUMN_REMARK][ + value - 1] != Constants.STRING_IS_EMPTY and + self.data.df_label[Constants.BCG_QUALITY_LABEL_COLUMN_REMARK][value - 1] is not nan): + item = tableWidget.item(row, 0) + item.setBackground(QColor(255, 200, 200)) + else: + item = tableWidget.item(row, 0) + item.setBackground(QColor(255, 255, 255)) + self.ui.tableWidget_a1.verticalScrollBar().setValue(self.ui.tableWidget_a1.verticalScrollBar().maximum()) + self.ui.tableWidget_b1.verticalScrollBar().setValue(self.ui.tableWidget_b1.verticalScrollBar().maximum()) + self.ui.tableWidget_c.verticalScrollBar().setValue(self.ui.tableWidget_c.verticalScrollBar().maximum()) + else: + raise ValueError("模式不存在") + + def reset_axes(self): + if self.ax0 is not None: + self.ax0.clear() + self.ax0.grid(True) + self.ax0.xaxis.set_major_formatter(ConfigParams.FORMATTER) + + def change_tablewidget_mode(self): + if Config["Mode"] == "10s": + self.ui.pushButton_a1.show() + self.ui.pushButton_a2.hide() + self.ui.pushButton_b1.show() + self.ui.pushButton_b2.hide() + self.ui.pushButton_c.show() + self.ui.pushButton_f.show() + self.ui.pushButton_a1.setText("a") + self.ui.pushButton_a2.setText("a2") + self.ui.pushButton_b1.setText("b") + self.ui.pushButton_b2.setText("b2") + self.ui.pushButton_c.setText("c") + self.ui.pushButton_f.setText("删除") + self.ui.tableWidget_a1.show() + self.ui.tableWidget_a2.hide() + self.ui.tableWidget_b1.show() + self.ui.tableWidget_b2.hide() + self.ui.tableWidget_c.show() + self.ui.tableWidget_f.show() + self.ui.tableWidget_a1.setHorizontalHeaderLabels(['a']) + self.ui.tableWidget_a2.setHorizontalHeaderLabels(['a2']) + self.ui.tableWidget_b1.setHorizontalHeaderLabels(['b']) + self.ui.tableWidget_b2.setHorizontalHeaderLabels(['b2']) + self.ui.tableWidget_c.setHorizontalHeaderLabels(['c']) + self.ui.tableWidget_f.setHorizontalHeaderLabels(['None']) + elif Config["Mode"] == "30s": + self.ui.pushButton_a1.show() + self.ui.pushButton_a2.show() + self.ui.pushButton_b1.show() + self.ui.pushButton_b2.show() + self.ui.pushButton_c.show() + self.ui.pushButton_f.show() + self.ui.pushButton_a1.setText("a1") + self.ui.pushButton_a2.setText("a2") + self.ui.pushButton_b1.setText("b1") + self.ui.pushButton_b2.setText("b2") + self.ui.pushButton_c.setText("c") + self.ui.pushButton_f.setText("删除") + self.ui.tableWidget_a1.show() + self.ui.tableWidget_a2.show() + self.ui.tableWidget_b1.show() + self.ui.tableWidget_b2.show() + self.ui.tableWidget_c.show() + self.ui.tableWidget_f.show() + self.ui.tableWidget_a1.setHorizontalHeaderLabels(['a1']) + self.ui.tableWidget_a2.setHorizontalHeaderLabels(['a2']) + self.ui.tableWidget_b1.setHorizontalHeaderLabels(['b1']) + self.ui.tableWidget_b2.setHorizontalHeaderLabels(['b2']) + self.ui.tableWidget_c.setHorizontalHeaderLabels(['c']) + self.ui.tableWidget_f.setHorizontalHeaderLabels(['None']) + elif Config["Mode"] == "Undefined": + return False + else: + raise ValueError("模式不存在") + return True + + +class Data(): + + def __init__(self): + self.BCG = None + self.BCG_without_industrialFrequencyNoise = None + self.Artifact_a = None + self.df_label = None + self.label = None + + self.artifact_number = array([]).astype(int64) + self.artifact_type = array([]).astype(int64) + self.artifact_mask = array([]).astype(int64) + + def open_file(self): + if Path(Config["Path"]["Input_BCG"]).is_file(): + Config["Path"]["Input_BCG"] = str(Path(Config["Path"]["Input_BCG"]).parent) + if Path(Config["Path"]["Input_Artifact"]).is_file(): + Config["Path"]["Input_Artifact"] = str(Path(Config["Path"]["Input_Artifact"]).parent) + if Path(Config["Path"]["Save"]).is_file(): + Config["Path"]["Save"] = str(Path(Config["Path"]["Save"]).parent) + + result = PublicFunc.examine_file(Config["Path"]["Input_BCG"], ConfigParams.BCG_SYNC, ConfigParams.ENDSWITH_TXT) + if result.status: + Config["Path"]["Input_BCG"] = result.data["path"] + Config["InputConfig"]["ThoFreq"] = result.data["freq"] + else: + return result + + result = PublicFunc.examine_file(Config["Path"]["Input_Artifact"], ConfigParams.ARTIFACT_A, ConfigParams.ENDSWITH_TXT) + if result.status: + Config["Path"]["Input_Artifact"] = result.data["path"] + else: + return result + + if Config["Mode"] == "30s": + Config["Path"]["Save"] = str( + Path(Config["Path"]["Save"]) / Path(ConfigParams.SQ_LABEL_30S + ConfigParams.ENDSWITH_CSV)) + elif Config["Mode"] == "10s": + Config["Path"]["Save"] = str( + Path(Config["Path"]["Save"]) / Path(ConfigParams.SQ_LABEL_10S + ConfigParams.ENDSWITH_CSV)) + elif Config["Mode"] == "Undefined": + return Result().failure(info=Constants.INPUT_FAILURE + Constants.FAILURE_REASON["Mode_Undefined"]) + else: + raise ValueError("模式不存在") + + try: + self.BCG = read_csv(Config["Path"]["Input_BCG"], + encoding=ConfigParams.UTF8_ENCODING, + header=None).to_numpy().reshape(-1) + self.Artifact_a = read_csv(Config["Path"]["Input_Artifact"], + encoding=ConfigParams.UTF8_ENCODING, + header=None).to_numpy().reshape(-1) + except Exception as e: + return Result().failure(info=Constants.INPUT_FAILURE + Constants.FAILURE_REASON["Open_Data_Exception"] + "\n" + format_exc()) + + try: + if Config["Mode"] == "30s": + Config["DataPartNum"] = len(self.BCG) // (Config["InputConfig"]["UseFreq"] * 30) + elif Config["Mode"] == "10s": + Config["DataPartNum"] = len(self.BCG) // (Config["InputConfig"]["UseFreq"] * 10) + else: + raise ValueError("模式不存在") + if Config["DataPartNum"] == 0: + return Result().failure(info=Constants.INPUT_FAILURE + Constants.FAILURE_REASON["Data_Length_Not_Correct"]) + except Exception as e: + return Result().failure(info=Constants.INPUT_FAILURE + Constants.FAILURE_REASON["Open_Data_Exception"] + "\n" + format_exc()) + + try: + # 检查体动标签正确性,长度 + PublicFunc.examine_artifact(self.Artifact_a) + # 定义绘制体动所需要的数组 + artifact_start = array([]) + artifact_start = artifact_start.astype(int64) + artifact_end = array([]) + artifact_end = artifact_end.astype(int64) + for i in range(0, len(self.Artifact_a), 4): + self.artifact_number = append(self.artifact_number, self.Artifact_a[i]) + for i in range(1, len(self.Artifact_a), 4): + self.artifact_type = append(self.artifact_type, self.Artifact_a[i]) + for i in range(2, len(self.Artifact_a), 4): + artifact_start = append(artifact_start, self.Artifact_a[i]) + for i in range(3, len(self.Artifact_a), 4): + artifact_end = append(artifact_end, self.Artifact_a[i]) + self.artifact_mask = zeros(len(self.BCG)) + for i in range(0, len(self.artifact_number)): + self.artifact_mask[artifact_start[i]: artifact_end[i] + 1] = 1 + except Exception as e: + return Result().failure(info=Constants.INPUT_FAILURE + + Constants.FAILURE_REASON["Get_Artifact_Format_Exception"] + "\n" + format_exc()) + + return Result().success(info=Constants.INPUT_FINISHED) + + def get_archive(self): + if Config["Mode"] == "30s": + filename = ConfigParams.SQ_LABEL_30S + elif Config["Mode"] == "10s": + filename = ConfigParams.SQ_LABEL_10S + else: + raise ValueError("模式不存在") + + if not Path(Config["Path"]["Save"]).exists(): + self.label = full(Config["DataPartNum"], Constants.BCG_QUALITY_LABEL_TOBELABELED) + self.df_label = DataFrame(columns=[Constants.BCG_QUALITY_LABEL_COLUMN_LABEL, Constants.BCG_QUALITY_LABEL_COLUMN_REMARK]) + self.df_label[Constants.BCG_QUALITY_LABEL_COLUMN_LABEL] = self.label + self.df_label[Constants.BCG_QUALITY_LABEL_COLUMN_REMARK] = Constants.STRING_IS_EMPTY + self.df_label[Constants.BCG_QUALITY_LABEL_COLUMN_LABEL] = self.df_label[ + Constants.BCG_QUALITY_LABEL_COLUMN_LABEL].astype(str) + self.df_label[Constants.BCG_QUALITY_LABEL_COLUMN_REMARK] = self.df_label[ + Constants.BCG_QUALITY_LABEL_COLUMN_REMARK].astype(str) + return Result().success(info=filename + ":" + Constants.ARCHIVE_NOT_EXIST) + else: + self.df_label = read_csv(Config["Path"]["Save"], + encoding=ConfigParams.GBK_ENCODING) + self.label = self.df_label[Constants.BCG_QUALITY_LABEL_COLUMN_LABEL].astype(str) + return Result().success(info=filename + ":" + Constants.ARCHIVE_EXIST) + + def resample(self): + if self.BCG is None: + Result().failure(info=Constants.RESAMPLE_FAILURE + Constants.FAILURE_REASON["Data_Not_Exist"]) + + try: + if Config["InputConfig"]["BCGFreq"] != Config["InputConfig"]["UseFreq"]: + self.BCG = resample(self.BCG, + int(len(self.BCG) * + (Config["InputConfig"]["UseFreq"] / Config["InputConfig"]["BCGFreq"]))) + else: + return Result().success(info=Constants.RESAMPLE_NO_NEED) + except Exception as e: + Result().failure(info=Constants.RESAMPLE_FAILURE + + Constants.FAILURE_REASON["Resample_Exception"] + "\n" + format_exc()) + + return Result().success(info=Constants.RESAMPLE_FINISHED) + + def preprocess(self): + if self.BCG is None: + return Result().failure(info=Constants.PREPROCESS_FAILURE + Constants.FAILURE_REASON["Data_Not_Exist"]) + + try: + self.BCG_without_industrialFrequencyNoise = Data.wipe_industrialFrequencyNoise(self.BCG, int(Config["InputConfig"]["UseFreq"])) + except Exception as e: + return Result().failure(info=Constants.PREPROCESS_FAILURE + + Constants.FAILURE_REASON["Preprocess_Exception"] + "\n" + format_exc()) + + return Result().success(info=Constants.PREPROCESS_FINISHED) + + + @staticmethod + def wipe_industrialFrequencyNoise(data, fs): + # 设计带阻滤波器(Notch Filter)来滤除49-51Hz的噪声 + nyq = 0.5 * fs # 奈奎斯特频率 + low = 49 / nyq + high = 51 / nyq + b, a = iirfilter(4, [low, high], btype='bandstop', ftype='butter') # 4阶巴特沃斯带阻滤波器 + return lfilter(b, a, data) \ No newline at end of file diff --git a/func/Module_resp_quality_label.py b/func/Module_resp_quality_label.py index 9c2e1ff..2f1049d 100644 --- a/func/Module_resp_quality_label.py +++ b/func/Module_resp_quality_label.py @@ -286,7 +286,6 @@ class MainWindow_resp_quality_label(QMainWindow): self.ui.pushButton_invalid.clicked.connect(self.__slot_btn_label__) self.ui.pushButton_reset.clicked.connect(self.__slot_btn_label__) self.ui.pushButton_save.clicked.connect(self.__slot_btn_save__) - self.ui.lineEdit_filter_labeled.textChanged.connect(self.__slot_lineEdit_filter__) self.ui.lineEdit_filter_tobelabeled.textChanged.connect(self.__slot_lineEdit_filter__) self.ui.doubleSpinBox_quality_threshold1.valueChanged.connect(self.update_config) diff --git a/func/utils/ConfigParams.py b/func/utils/ConfigParams.py index 899488d..ee06548 100644 --- a/func/utils/ConfigParams.py +++ b/func/utils/ConfigParams.py @@ -70,6 +70,8 @@ class ConfigParams: SA_LABEL_ADD: str = "SA Label_add" RESP_QUALITY_LABEL: str = "Resp_quality_label" THO_PEAK: str = "Tho_peak_" + SQ_LABEL_10S: str = "SQ_label_10s" + SQ_LABEL_30S: str = "SQ_label_30s" # 数据粗同步 APPROXIMATELY_ALIGN_CONFIG_FILE_PATH: str = "./config/Config_approximately_align.yaml" @@ -252,7 +254,14 @@ class ConfigParams: ARTIFACT_LABEL_LABEL_TRANSPARENCY: float = 0.3 ARTIFACT_LABEL_ACTION_LABEL_ARTIFACT_SHORTCUT_KEY: str = "Z" - # BCG质量标注 + # BCG的质量标注 + BCG_QUALITY_LABEL_CONFIG_FILE_PATH: str = "./config/Config_bcg_quality_label.yaml" + BCG_QUALITY_LABEL_CONFIG_NEW_CONTENT: dict = { + "InputConfig": { + "BCGFreq": 1000, + "UseFreq": 1000 + } + } # 呼吸可用性及间期标注 RESP_QUALITY_LABEL_CONFIG_FILE_PATH: str = "./config/Config_resp_quality_label.yaml" @@ -311,19 +320,6 @@ class ConfigParams: SA_LABEL_RADIOBUTTON_2_CLASS_SHORTCUT_KEY: str = "I" SA_LABEL_RADIOBUTTON_3_CLASS_SHORTCUT_KEY: str = "O" - # 质量打标 - BCG_QUALITY_LABEL_INPUT_BCG_FILENAME: str = "BCG_sync_" - BCG_QUALITY_LABEL_INPUT_ARTIFACT_FILENAME: str = "Artifact_a" - BCG_QUALITY_LABEL_SAVE_FILENAME: str = "SQ_label_" - - BCG_QUALITY_LABEL_INPUT_DEFAULT_FS: int = 1000 - - BCG_QUALITY_LABEL_SAVE_MODE_10S: str = "10s" - BCG_QUALITY_LABEL_SAVE_MODE_30S: str = "30s" - - BCG_QUALITY_LABEL_MODE_10S_LENGTH = 10 * BCG_QUALITY_LABEL_INPUT_DEFAULT_FS - BCG_QUALITY_LABEL_MODE_30S_LENGTH = 30 * BCG_QUALITY_LABEL_INPUT_DEFAULT_FS - # 禁止实例化 def __new__(cls): raise TypeError("Constants class cannot be instantiated") diff --git a/func/utils/Constants.py b/func/utils/Constants.py index 1696396..7300484 100644 --- a/func/utils/Constants.py +++ b/func/utils/Constants.py @@ -106,6 +106,7 @@ class Constants: "Data_Length_not_Correct": "(orgBcg和BCG长度不匹配)", "Artifact_Format_Not_Correct": "(体动长度或格式不正确)", "Data_Length_Not_Correct": "(信号长度不正确)", + "Mode_Undefined": "(模式未选择)", "Open_Data_Exception": "(打开数据异常)", "Process_Exception": "(处理异常)", @@ -381,7 +382,21 @@ class Constants: background-color: #00ff00; /* 鼠标悬停时的背景颜色 */ }""" - # BCG质量标注 + # BCG的质量标注 + BCG_QUALITY_LABEL_COLUMN_LABEL: str = "label" + BCG_QUALITY_LABEL_COLUMN_REMARK: str = "remark" + BCG_QUALITY_LABEL_PLOT_LABEL_SIGNAL: str = "BCG" + BCG_QUALITY_LABEL_PLOT_LABEL_ARTIFACT: str = "Artifact" + BCG_QUALITY_LABEL_PLOT_LABEL_LONGEST_CONTINUOUS: str = "Longest_Continuous" + BCG_QUALITY_LABEL_10S_A: str = "a" + BCG_QUALITY_LABEL_10S_B: str = "b" + BCG_QUALITY_LABEL_10S_C: str = "c" + BCG_QUALITY_LABEL_30S_A1: str = "a" + BCG_QUALITY_LABEL_30S_A2: str = "b" + BCG_QUALITY_LABEL_30S_B1: str = "c" + BCG_QUALITY_LABEL_30S_B2: str = "d" + BCG_QUALITY_LABEL_30S_C: str = "e" + BCG_QUALITY_LABEL_TOBELABELED: str = "f" # 呼吸可用性及间期标注 @@ -464,19 +479,6 @@ class Constants: # 质量打标 - BCG_QUALITY_LABEL_FILES_NOT_FOUND: str = f"无法找到{ConfigParams.BCG_QUALITY_LABEL_INPUT_BCG_FILENAME}{ConfigParams.ENDSWITH_TXT}或{ConfigParams.BCG_QUALITY_LABEL_INPUT_ARTIFACT_FILENAME}{ConfigParams.ENDSWITH_TXT},无法执行" - BCG_QUALITY_LABEL_FILES_FOUND: str = f"找到{ConfigParams.BCG_QUALITY_LABEL_INPUT_BCG_FILENAME}{ConfigParams.ENDSWITH_TXT}和{ConfigParams.BCG_QUALITY_LABEL_INPUT_ARTIFACT_FILENAME}{ConfigParams.ENDSWITH_TXT}" - BCG_QUALITY_LABEL_HISTORICAL_SAVE_FOUND: str = f"找到历史存档文件{ConfigParams.BCG_QUALITY_LABEL_SAVE_FILENAME}{ConfigParams.BCG_QUALITY_LABEL_SAVE_MODE_10S}{ConfigParams.ENDSWITH_CSV}或{ConfigParams.BCG_QUALITY_LABEL_SAVE_FILENAME}{ConfigParams.BCG_QUALITY_LABEL_SAVE_MODE_30S}{ConfigParams.ENDSWITH_CSV},已成功读取" - BCG_QUALITY_LABEL_MODE_UNSELECTED: str = "显示模式未选择" - BCG_QUALITY_LABEL_INPUT_SIGNAL_FAILURE: str = "导入信号失败,请检查信号长度" - BCG_QUALITY_LABEL_INPUT_ARTIFACT_FAILURE_FORMAT: str = "导入体动失败,请检查体动标签格式" - BCG_QUALITY_LABEL_INPUT_ARTIFACT_FAILURE_LENGTH: str = "导入体动失败,请检查体动长度是否为4的倍数" - - BCG_QUALITY_LABEL_RUNNING: str = "开始执行任务" - BCG_QUALITY_LABEL_10S_MODE: str = f"{ConfigParams.BCG_QUALITY_LABEL_SAVE_MODE_10S}_MODE" - BCG_QUALITY_LABEL_30S_MODE: str = f"{ConfigParams.BCG_QUALITY_LABEL_SAVE_MODE_30S}_MODE" - BCG_QUALITY_LABEL_COLUMN_LABEL: str = "label" - BCG_QUALITY_LABEL_COLUMN_REMARK: str = "remark" BCG_QUALITY_LABEL_VIEWING_THE_FIRST_PART: str = "你正在查看第1段信号" BCG_QUALITY_LABEL_VIEWING_THE_LAST_PART: str = "你正在查看最后1段信号" BCG_QUALITY_LABEL_VIEWING_THE_FIRST_PART_UNLABELED: str = "前面的片段都被打标,将跳转至第1段信号" @@ -491,27 +493,6 @@ class Constants: BCG_QUALITY_LABEL_LABEL_ALL_TO_TYPE_C: str = "已将所有片段标记为类型C" BCG_QUALITY_LABEL_LABEL_ARTIFACT_TO_TYPE_C_QUESTION_CONTENT: str = "你确定要将所有带有体动的片段标记为类型C" BCG_QUALITY_LABEL_LABEL_ARTIFACT_TO_TYPE_C: str = "已将所有带有体动的片段标记为类型C" - BCG_QUALITY_LABEL_PLOT_LABEL_SIGNAL: str = "BCG" - BCG_QUALITY_LABEL_PLOT_LABEL_ARTIFACT: str = "Artifact" - BCG_QUALITY_LABEL_PLOT_LABEL_LONGEST_CONTINUOUS: str = "Longest_Continuous" - BCG_QUALITY_LABEL_10S_A: str = "a" - BCG_QUALITY_LABEL_10S_B: str = "b" - BCG_QUALITY_LABEL_10S_C: str = "c" - BCG_QUALITY_LABEL_10S_A_LIST: str = "label_a" - BCG_QUALITY_LABEL_10S_B_LIST: str = "label_b" - BCG_QUALITY_LABEL_10S_C_LIST: str = "label_c" - BCG_QUALITY_LABEL_30S_A1: str = "a" - BCG_QUALITY_LABEL_30S_A2: str = "b" - BCG_QUALITY_LABEL_30S_B1: str = "c" - BCG_QUALITY_LABEL_30S_B2: str = "d" - BCG_QUALITY_LABEL_30S_C: str = "e" - BCG_QUALITY_LABEL_30S_A1_LIST: str = "label_a1" - BCG_QUALITY_LABEL_30S_A2_LIST: str = "label_a2" - BCG_QUALITY_LABEL_30S_B1_LIST: str = "label_b1" - BCG_QUALITY_LABEL_30S_B2_LIST: str = "label_b2" - BCG_QUALITY_LABEL_30S_C_LIST: str = "label_c" - BCG_QUALITY_LABEL_tobeLabeled: str = "f" - BCG_QUALITY_LABEL_tobeLabeled_LIST: str = "label_tobeLabeled" BCG_QUALITY_LABEL_LABELBTN_STYLE: str = """ QPushButton { background-color: orange; /* 设置背景颜色 */ diff --git a/ui/MainWindow/MainWindow_bcg_quality_label.py b/ui/MainWindow/MainWindow_bcg_quality_label.py new file mode 100644 index 0000000..df857d5 --- /dev/null +++ b/ui/MainWindow/MainWindow_bcg_quality_label.py @@ -0,0 +1,552 @@ +# -*- coding: utf-8 -*- + +################################################################################ +## Form generated from reading UI file 'MainWindow_bcg_quality_label.ui' +## +## Created by: Qt User Interface Compiler version 6.8.2 +## +## WARNING! All changes made in this file will be lost when recompiling UI file! +################################################################################ + +from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale, + QMetaObject, QObject, QPoint, QRect, + QSize, QTime, QUrl, Qt) +from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor, + QFont, QFontDatabase, QGradient, QIcon, + QImage, QKeySequence, QLinearGradient, QPainter, + QPalette, QPixmap, QRadialGradient, QTransform) +from PySide6.QtWidgets import (QApplication, QCheckBox, QGridLayout, QGroupBox, + QHBoxLayout, QHeaderView, QLabel, QLineEdit, + QMainWindow, QPushButton, QSizePolicy, QSpacerItem, + QStatusBar, QTableWidget, QTableWidgetItem, QTextBrowser, + QVBoxLayout, QWidget) + +class Ui_MainWindow_bcg_quality_label(object): + def setupUi(self, MainWindow_bcg_quality_label): + if not MainWindow_bcg_quality_label.objectName(): + MainWindow_bcg_quality_label.setObjectName(u"MainWindow_bcg_quality_label") + MainWindow_bcg_quality_label.resize(1920, 1080) + self.centralwidget = QWidget(MainWindow_bcg_quality_label) + self.centralwidget.setObjectName(u"centralwidget") + self.gridLayout = QGridLayout(self.centralwidget) + self.gridLayout.setObjectName(u"gridLayout") + self.groupBox_canvas = QGroupBox(self.centralwidget) + self.groupBox_canvas.setObjectName(u"groupBox_canvas") + font = QFont() + font.setPointSize(10) + self.groupBox_canvas.setFont(font) + self.verticalLayout = QVBoxLayout(self.groupBox_canvas) + self.verticalLayout.setObjectName(u"verticalLayout") + self.verticalLayout_canvas = QVBoxLayout() + self.verticalLayout_canvas.setObjectName(u"verticalLayout_canvas") + + self.verticalLayout.addLayout(self.verticalLayout_canvas) + + + self.gridLayout.addWidget(self.groupBox_canvas, 0, 1, 1, 1) + + self.groupBox_left = QGroupBox(self.centralwidget) + self.groupBox_left.setObjectName(u"groupBox_left") + self.groupBox_left.setFont(font) + self.verticalLayout_2 = QVBoxLayout(self.groupBox_left) + self.verticalLayout_2.setObjectName(u"verticalLayout_2") + self.horizontalLayout = QHBoxLayout() + self.horizontalLayout.setObjectName(u"horizontalLayout") + self.pushButton_input_setting = QPushButton(self.groupBox_left) + self.pushButton_input_setting.setObjectName(u"pushButton_input_setting") + sizePolicy = QSizePolicy(QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Minimum) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.pushButton_input_setting.sizePolicy().hasHeightForWidth()) + self.pushButton_input_setting.setSizePolicy(sizePolicy) + font1 = QFont() + font1.setPointSize(12) + self.pushButton_input_setting.setFont(font1) + + self.horizontalLayout.addWidget(self.pushButton_input_setting) + + self.pushButton_input = QPushButton(self.groupBox_left) + self.pushButton_input.setObjectName(u"pushButton_input") + sizePolicy.setHeightForWidth(self.pushButton_input.sizePolicy().hasHeightForWidth()) + self.pushButton_input.setSizePolicy(sizePolicy) + self.pushButton_input.setFont(font1) + + self.horizontalLayout.addWidget(self.pushButton_input) + + + self.verticalLayout_2.addLayout(self.horizontalLayout) + + self.verticalSpacer = QSpacerItem(20, 40, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding) + + self.verticalLayout_2.addItem(self.verticalSpacer) + + self.groupBox_status = QGroupBox(self.groupBox_left) + self.groupBox_status.setObjectName(u"groupBox_status") + self.gridLayout_3 = QGridLayout(self.groupBox_status) + self.gridLayout_3.setObjectName(u"gridLayout_3") + self.label_5 = QLabel(self.groupBox_status) + self.label_5.setObjectName(u"label_5") + sizePolicy1 = QSizePolicy(QSizePolicy.Policy.Preferred, QSizePolicy.Policy.Fixed) + sizePolicy1.setHorizontalStretch(0) + sizePolicy1.setVerticalStretch(0) + sizePolicy1.setHeightForWidth(self.label_5.sizePolicy().hasHeightForWidth()) + self.label_5.setSizePolicy(sizePolicy1) + self.label_5.setFont(font1) + + self.gridLayout_3.addWidget(self.label_5, 0, 0, 1, 1) + + self.label_6 = QLabel(self.groupBox_status) + self.label_6.setObjectName(u"label_6") + sizePolicy1.setHeightForWidth(self.label_6.sizePolicy().hasHeightForWidth()) + self.label_6.setSizePolicy(sizePolicy1) + self.label_6.setFont(font1) + + self.gridLayout_3.addWidget(self.label_6, 1, 0, 1, 1) + + self.label_12 = QLabel(self.groupBox_status) + self.label_12.setObjectName(u"label_12") + sizePolicy1.setHeightForWidth(self.label_12.sizePolicy().hasHeightForWidth()) + self.label_12.setSizePolicy(sizePolicy1) + self.label_12.setFont(font1) + + self.gridLayout_3.addWidget(self.label_12, 2, 0, 1, 1) + + self.label_13 = QLabel(self.groupBox_status) + self.label_13.setObjectName(u"label_13") + sizePolicy1.setHeightForWidth(self.label_13.sizePolicy().hasHeightForWidth()) + self.label_13.setSizePolicy(sizePolicy1) + self.label_13.setFont(font1) + + self.gridLayout_3.addWidget(self.label_13, 3, 0, 1, 1) + + self.lineEdit_artifact_time_percentage = QLineEdit(self.groupBox_status) + self.lineEdit_artifact_time_percentage.setObjectName(u"lineEdit_artifact_time_percentage") + self.lineEdit_artifact_time_percentage.setEnabled(False) + self.lineEdit_artifact_time_percentage.setFont(font1) + + self.gridLayout_3.addWidget(self.lineEdit_artifact_time_percentage, 3, 1, 1, 1) + + self.lineEdit_longest_continuous_time = QLineEdit(self.groupBox_status) + self.lineEdit_longest_continuous_time.setObjectName(u"lineEdit_longest_continuous_time") + self.lineEdit_longest_continuous_time.setEnabled(False) + self.lineEdit_longest_continuous_time.setFont(font1) + + self.gridLayout_3.addWidget(self.lineEdit_longest_continuous_time, 2, 1, 1, 1) + + self.lineEdit_data_part_num = QLineEdit(self.groupBox_status) + self.lineEdit_data_part_num.setObjectName(u"lineEdit_data_part_num") + self.lineEdit_data_part_num.setEnabled(False) + self.lineEdit_data_part_num.setFont(font1) + + self.gridLayout_3.addWidget(self.lineEdit_data_part_num, 1, 1, 1, 1) + + self.lineEdit_current_part_time = QLineEdit(self.groupBox_status) + self.lineEdit_current_part_time.setObjectName(u"lineEdit_current_part_time") + self.lineEdit_current_part_time.setEnabled(False) + self.lineEdit_current_part_time.setFont(font1) + + self.gridLayout_3.addWidget(self.lineEdit_current_part_time, 0, 1, 1, 1) + + + self.verticalLayout_2.addWidget(self.groupBox_status) + + self.verticalSpacer_5 = QSpacerItem(20, 40, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding) + + self.verticalLayout_2.addItem(self.verticalSpacer_5) + + self.horizontalLayout_2 = QHBoxLayout() + self.horizontalLayout_2.setObjectName(u"horizontalLayout_2") + self.groupBox_artifact_type = QGroupBox(self.groupBox_left) + self.groupBox_artifact_type.setObjectName(u"groupBox_artifact_type") + self.gridLayout_6 = QGridLayout(self.groupBox_artifact_type) + self.gridLayout_6.setObjectName(u"gridLayout_6") + self.checkBox_allin = QCheckBox(self.groupBox_artifact_type) + self.checkBox_allin.setObjectName(u"checkBox_allin") + font2 = QFont() + font2.setPointSize(20) + self.checkBox_allin.setFont(font2) + self.checkBox_allin.setChecked(True) + + self.gridLayout_6.addWidget(self.checkBox_allin, 0, 1, 1, 1) + + self.checkBox_type1 = QCheckBox(self.groupBox_artifact_type) + self.checkBox_type1.setObjectName(u"checkBox_type1") + self.checkBox_type1.setFont(font1) + self.checkBox_type1.setChecked(True) + + self.gridLayout_6.addWidget(self.checkBox_type1, 0, 2, 1, 1) + + self.checkBox_type2 = QCheckBox(self.groupBox_artifact_type) + self.checkBox_type2.setObjectName(u"checkBox_type2") + self.checkBox_type2.setFont(font1) + self.checkBox_type2.setChecked(True) + + self.gridLayout_6.addWidget(self.checkBox_type2, 1, 1, 1, 1) + + self.checkBox_type3 = QCheckBox(self.groupBox_artifact_type) + self.checkBox_type3.setObjectName(u"checkBox_type3") + self.checkBox_type3.setFont(font1) + self.checkBox_type3.setChecked(True) + + self.gridLayout_6.addWidget(self.checkBox_type3, 1, 2, 1, 1) + + self.checkBox_type4 = QCheckBox(self.groupBox_artifact_type) + self.checkBox_type4.setObjectName(u"checkBox_type4") + self.checkBox_type4.setFont(font1) + self.checkBox_type4.setChecked(True) + + self.gridLayout_6.addWidget(self.checkBox_type4, 2, 1, 1, 1) + + self.checkBox_type5 = QCheckBox(self.groupBox_artifact_type) + self.checkBox_type5.setObjectName(u"checkBox_type5") + self.checkBox_type5.setFont(font1) + self.checkBox_type5.setChecked(True) + + self.gridLayout_6.addWidget(self.checkBox_type5, 2, 2, 1, 1) + + + self.horizontalLayout_2.addWidget(self.groupBox_artifact_type) + + self.groupBox_function = QGroupBox(self.groupBox_left) + self.groupBox_function.setObjectName(u"groupBox_function") + self.gridLayout_13 = QGridLayout(self.groupBox_function) + self.gridLayout_13.setObjectName(u"gridLayout_13") + self.pushButton_invalid_signal_label = QPushButton(self.groupBox_function) + self.pushButton_invalid_signal_label.setObjectName(u"pushButton_invalid_signal_label") + sizePolicy2 = QSizePolicy(QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Preferred) + sizePolicy2.setHorizontalStretch(0) + sizePolicy2.setVerticalStretch(0) + sizePolicy2.setHeightForWidth(self.pushButton_invalid_signal_label.sizePolicy().hasHeightForWidth()) + self.pushButton_invalid_signal_label.setSizePolicy(sizePolicy2) + self.pushButton_invalid_signal_label.setFont(font1) + + self.gridLayout_13.addWidget(self.pushButton_invalid_signal_label, 0, 0, 1, 1) + + self.pushButton_Ctype_signal_label = QPushButton(self.groupBox_function) + self.pushButton_Ctype_signal_label.setObjectName(u"pushButton_Ctype_signal_label") + sizePolicy2.setHeightForWidth(self.pushButton_Ctype_signal_label.sizePolicy().hasHeightForWidth()) + self.pushButton_Ctype_signal_label.setSizePolicy(sizePolicy2) + self.pushButton_Ctype_signal_label.setFont(font1) + + self.gridLayout_13.addWidget(self.pushButton_Ctype_signal_label, 1, 0, 1, 1) + + + self.horizontalLayout_2.addWidget(self.groupBox_function) + + self.horizontalLayout_2.setStretch(0, 2) + self.horizontalLayout_2.setStretch(1, 1) + + self.verticalLayout_2.addLayout(self.horizontalLayout_2) + + self.verticalSpacer_4 = QSpacerItem(20, 40, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding) + + self.verticalLayout_2.addItem(self.verticalSpacer_4) + + self.groupBox_operation = QGroupBox(self.groupBox_left) + self.groupBox_operation.setObjectName(u"groupBox_operation") + self.gridLayout_7 = QGridLayout(self.groupBox_operation) + self.gridLayout_7.setObjectName(u"gridLayout_7") + self.pushButton_prev = QPushButton(self.groupBox_operation) + self.pushButton_prev.setObjectName(u"pushButton_prev") + sizePolicy2.setHeightForWidth(self.pushButton_prev.sizePolicy().hasHeightForWidth()) + self.pushButton_prev.setSizePolicy(sizePolicy2) + self.pushButton_prev.setFont(font1) + + self.gridLayout_7.addWidget(self.pushButton_prev, 4, 0, 1, 1) + + self.checkBox_examine_tobeLabeled = QCheckBox(self.groupBox_operation) + self.checkBox_examine_tobeLabeled.setObjectName(u"checkBox_examine_tobeLabeled") + self.checkBox_examine_tobeLabeled.setFont(font1) + + self.gridLayout_7.addWidget(self.checkBox_examine_tobeLabeled, 1, 0, 1, 1) + + self.checkBox_highlight_longest_continuous = QCheckBox(self.groupBox_operation) + self.checkBox_highlight_longest_continuous.setObjectName(u"checkBox_highlight_longest_continuous") + self.checkBox_highlight_longest_continuous.setFont(font1) + + self.gridLayout_7.addWidget(self.checkBox_highlight_longest_continuous, 0, 0, 1, 1) + + self.pushButton_next = QPushButton(self.groupBox_operation) + self.pushButton_next.setObjectName(u"pushButton_next") + sizePolicy2.setHeightForWidth(self.pushButton_next.sizePolicy().hasHeightForWidth()) + self.pushButton_next.setSizePolicy(sizePolicy2) + self.pushButton_next.setFont(font1) + + self.gridLayout_7.addWidget(self.pushButton_next, 4, 1, 1, 1) + + self.label = QLabel(self.groupBox_operation) + self.label.setObjectName(u"label") + self.label.setFont(font1) + self.label.setAlignment(Qt.AlignmentFlag.AlignCenter) + + self.gridLayout_7.addWidget(self.label, 2, 0, 1, 1) + + self.checkBox_display_afterfilter = QCheckBox(self.groupBox_operation) + self.checkBox_display_afterfilter.setObjectName(u"checkBox_display_afterfilter") + self.checkBox_display_afterfilter.setFont(font1) + + self.gridLayout_7.addWidget(self.checkBox_display_afterfilter, 0, 1, 1, 1) + + self.lineEdit_remark = QLineEdit(self.groupBox_operation) + self.lineEdit_remark.setObjectName(u"lineEdit_remark") + self.lineEdit_remark.setEnabled(True) + self.lineEdit_remark.setFont(font1) + + self.gridLayout_7.addWidget(self.lineEdit_remark, 2, 1, 1, 1) + + self.verticalSpacer_2 = QSpacerItem(20, 40, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding) + + self.gridLayout_7.addItem(self.verticalSpacer_2, 3, 0, 1, 2) + + self.gridLayout_7.setRowStretch(0, 1) + self.gridLayout_7.setRowStretch(1, 1) + self.gridLayout_7.setRowStretch(2, 1) + self.gridLayout_7.setRowStretch(3, 1) + self.gridLayout_7.setRowStretch(4, 3) + self.gridLayout_7.setColumnStretch(0, 1) + self.gridLayout_7.setColumnStretch(1, 1) + + self.verticalLayout_2.addWidget(self.groupBox_operation) + + self.verticalSpacer_3 = QSpacerItem(20, 40, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding) + + self.verticalLayout_2.addItem(self.verticalSpacer_3) + + self.horizontalLayout_3 = QHBoxLayout() + self.horizontalLayout_3.setObjectName(u"horizontalLayout_3") + self.pushButton_save = QPushButton(self.groupBox_left) + self.pushButton_save.setObjectName(u"pushButton_save") + sizePolicy.setHeightForWidth(self.pushButton_save.sizePolicy().hasHeightForWidth()) + self.pushButton_save.setSizePolicy(sizePolicy) + self.pushButton_save.setFont(font1) + + self.horizontalLayout_3.addWidget(self.pushButton_save) + + + self.verticalLayout_2.addLayout(self.horizontalLayout_3) + + self.groupBox_4 = QGroupBox(self.groupBox_left) + self.groupBox_4.setObjectName(u"groupBox_4") + self.verticalLayout_6 = QVBoxLayout(self.groupBox_4) + self.verticalLayout_6.setObjectName(u"verticalLayout_6") + self.textBrowser_info = QTextBrowser(self.groupBox_4) + self.textBrowser_info.setObjectName(u"textBrowser_info") + + self.verticalLayout_6.addWidget(self.textBrowser_info) + + + self.verticalLayout_2.addWidget(self.groupBox_4) + + self.verticalLayout_2.setStretch(0, 2) + self.verticalLayout_2.setStretch(1, 1) + self.verticalLayout_2.setStretch(2, 4) + self.verticalLayout_2.setStretch(3, 1) + self.verticalLayout_2.setStretch(4, 6) + self.verticalLayout_2.setStretch(5, 1) + self.verticalLayout_2.setStretch(6, 6) + self.verticalLayout_2.setStretch(7, 1) + self.verticalLayout_2.setStretch(8, 2) + self.verticalLayout_2.setStretch(9, 5) + + self.gridLayout.addWidget(self.groupBox_left, 0, 0, 1, 1) + + self.groupBox_right = QGroupBox(self.centralwidget) + self.groupBox_right.setObjectName(u"groupBox_right") + self.groupBox_right.setFont(font) + self.gridLayout_4 = QGridLayout(self.groupBox_right) + self.gridLayout_4.setObjectName(u"gridLayout_4") + self.verticalSpacer_9 = QSpacerItem(20, 40, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding) + + self.gridLayout_4.addItem(self.verticalSpacer_9, 7, 0, 1, 2) + + self.verticalSpacer_7 = QSpacerItem(20, 40, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding) + + self.gridLayout_4.addItem(self.verticalSpacer_7, 3, 0, 1, 2) + + self.pushButton_b1 = QPushButton(self.groupBox_right) + self.pushButton_b1.setObjectName(u"pushButton_b1") + sizePolicy2.setHeightForWidth(self.pushButton_b1.sizePolicy().hasHeightForWidth()) + self.pushButton_b1.setSizePolicy(sizePolicy2) + font3 = QFont() + font3.setPointSize(24) + self.pushButton_b1.setFont(font3) + + self.gridLayout_4.addWidget(self.pushButton_b1, 4, 0, 1, 1) + + self.tableWidget_c = QTableWidget(self.groupBox_right) + if (self.tableWidget_c.columnCount() < 1): + self.tableWidget_c.setColumnCount(1) + self.tableWidget_c.setObjectName(u"tableWidget_c") + self.tableWidget_c.setFont(font1) + self.tableWidget_c.setColumnCount(1) + + self.gridLayout_4.addWidget(self.tableWidget_c, 8, 1, 1, 1) + + self.tableWidget_a1 = QTableWidget(self.groupBox_right) + if (self.tableWidget_a1.columnCount() < 1): + self.tableWidget_a1.setColumnCount(1) + self.tableWidget_a1.setObjectName(u"tableWidget_a1") + self.tableWidget_a1.setFont(font1) + self.tableWidget_a1.setColumnCount(1) + self.tableWidget_a1.horizontalHeader().setMinimumSectionSize(33) + self.tableWidget_a1.horizontalHeader().setDefaultSectionSize(75) + self.tableWidget_a1.verticalHeader().setMinimumSectionSize(32) + + self.gridLayout_4.addWidget(self.tableWidget_a1, 0, 1, 1, 1) + + self.pushButton_b2 = QPushButton(self.groupBox_right) + self.pushButton_b2.setObjectName(u"pushButton_b2") + sizePolicy2.setHeightForWidth(self.pushButton_b2.sizePolicy().hasHeightForWidth()) + self.pushButton_b2.setSizePolicy(sizePolicy2) + self.pushButton_b2.setFont(font3) + + self.gridLayout_4.addWidget(self.pushButton_b2, 6, 0, 1, 1) + + self.pushButton_f = QPushButton(self.groupBox_right) + self.pushButton_f.setObjectName(u"pushButton_f") + sizePolicy2.setHeightForWidth(self.pushButton_f.sizePolicy().hasHeightForWidth()) + self.pushButton_f.setSizePolicy(sizePolicy2) + self.pushButton_f.setFont(font3) + + self.gridLayout_4.addWidget(self.pushButton_f, 10, 0, 1, 1) + + self.tableWidget_f = QTableWidget(self.groupBox_right) + if (self.tableWidget_f.columnCount() < 1): + self.tableWidget_f.setColumnCount(1) + self.tableWidget_f.setObjectName(u"tableWidget_f") + self.tableWidget_f.setFont(font1) + self.tableWidget_f.setColumnCount(1) + + self.gridLayout_4.addWidget(self.tableWidget_f, 10, 1, 1, 1) + + self.pushButton_a2 = QPushButton(self.groupBox_right) + self.pushButton_a2.setObjectName(u"pushButton_a2") + sizePolicy2.setHeightForWidth(self.pushButton_a2.sizePolicy().hasHeightForWidth()) + self.pushButton_a2.setSizePolicy(sizePolicy2) + self.pushButton_a2.setFont(font3) + + self.gridLayout_4.addWidget(self.pushButton_a2, 2, 0, 1, 1) + + self.verticalSpacer_6 = QSpacerItem(20, 40, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding) + + self.gridLayout_4.addItem(self.verticalSpacer_6, 1, 0, 1, 2) + + self.tableWidget_b1 = QTableWidget(self.groupBox_right) + if (self.tableWidget_b1.columnCount() < 1): + self.tableWidget_b1.setColumnCount(1) + self.tableWidget_b1.setObjectName(u"tableWidget_b1") + self.tableWidget_b1.setFont(font1) + self.tableWidget_b1.setColumnCount(1) + + self.gridLayout_4.addWidget(self.tableWidget_b1, 4, 1, 1, 1) + + self.pushButton_a1 = QPushButton(self.groupBox_right) + self.pushButton_a1.setObjectName(u"pushButton_a1") + sizePolicy2.setHeightForWidth(self.pushButton_a1.sizePolicy().hasHeightForWidth()) + self.pushButton_a1.setSizePolicy(sizePolicy2) + self.pushButton_a1.setFont(font3) + + self.gridLayout_4.addWidget(self.pushButton_a1, 0, 0, 1, 1) + + self.tableWidget_b2 = QTableWidget(self.groupBox_right) + if (self.tableWidget_b2.columnCount() < 1): + self.tableWidget_b2.setColumnCount(1) + self.tableWidget_b2.setObjectName(u"tableWidget_b2") + self.tableWidget_b2.setFont(font1) + self.tableWidget_b2.setColumnCount(1) + + self.gridLayout_4.addWidget(self.tableWidget_b2, 6, 1, 1, 1) + + self.tableWidget_a2 = QTableWidget(self.groupBox_right) + if (self.tableWidget_a2.columnCount() < 1): + self.tableWidget_a2.setColumnCount(1) + self.tableWidget_a2.setObjectName(u"tableWidget_a2") + self.tableWidget_a2.setFont(font1) + self.tableWidget_a2.setColumnCount(1) + + self.gridLayout_4.addWidget(self.tableWidget_a2, 2, 1, 1, 1) + + self.verticalSpacer_8 = QSpacerItem(20, 40, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding) + + self.gridLayout_4.addItem(self.verticalSpacer_8, 5, 0, 1, 2) + + self.pushButton_c = QPushButton(self.groupBox_right) + self.pushButton_c.setObjectName(u"pushButton_c") + sizePolicy2.setHeightForWidth(self.pushButton_c.sizePolicy().hasHeightForWidth()) + self.pushButton_c.setSizePolicy(sizePolicy2) + self.pushButton_c.setFont(font3) + + self.gridLayout_4.addWidget(self.pushButton_c, 8, 0, 1, 1) + + self.verticalSpacer_10 = QSpacerItem(20, 40, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding) + + self.gridLayout_4.addItem(self.verticalSpacer_10, 9, 0, 1, 2) + + self.gridLayout_4.setRowStretch(0, 5) + self.gridLayout_4.setRowStretch(1, 1) + self.gridLayout_4.setRowStretch(2, 5) + self.gridLayout_4.setRowStretch(3, 1) + self.gridLayout_4.setRowStretch(4, 5) + self.gridLayout_4.setRowStretch(5, 1) + self.gridLayout_4.setRowStretch(6, 5) + self.gridLayout_4.setRowStretch(7, 1) + self.gridLayout_4.setRowStretch(8, 5) + self.gridLayout_4.setRowStretch(9, 1) + self.gridLayout_4.setRowStretch(10, 5) + self.gridLayout_4.setColumnStretch(0, 1) + self.gridLayout_4.setColumnStretch(1, 2) + + self.gridLayout.addWidget(self.groupBox_right, 0, 2, 1, 1) + + self.gridLayout.setColumnStretch(0, 4) + self.gridLayout.setColumnStretch(1, 15) + self.gridLayout.setColumnStretch(2, 4) + MainWindow_bcg_quality_label.setCentralWidget(self.centralwidget) + self.statusbar = QStatusBar(MainWindow_bcg_quality_label) + self.statusbar.setObjectName(u"statusbar") + MainWindow_bcg_quality_label.setStatusBar(self.statusbar) + + self.retranslateUi(MainWindow_bcg_quality_label) + + QMetaObject.connectSlotsByName(MainWindow_bcg_quality_label) + # setupUi + + def retranslateUi(self, MainWindow_bcg_quality_label): + MainWindow_bcg_quality_label.setWindowTitle(QCoreApplication.translate("MainWindow_bcg_quality_label", u"BCG\u7684\u8d28\u91cf\u6807\u6ce8", None)) + self.groupBox_canvas.setTitle(QCoreApplication.translate("MainWindow_bcg_quality_label", u"\u7ed8\u56fe\u533a", None)) + self.groupBox_left.setTitle(QCoreApplication.translate("MainWindow_bcg_quality_label", u"BCG\u7684\u8d28\u91cf\u6807\u6ce8", None)) + self.pushButton_input_setting.setText(QCoreApplication.translate("MainWindow_bcg_quality_label", u"\u5bfc\u5165\u8bbe\u7f6e", None)) + self.pushButton_input.setText(QCoreApplication.translate("MainWindow_bcg_quality_label", u"\u5f00\u59cb\u5bfc\u5165", None)) + self.groupBox_status.setTitle(QCoreApplication.translate("MainWindow_bcg_quality_label", u"\u8fd0\u884c\u72b6\u6001", None)) + self.label_5.setText(QCoreApplication.translate("MainWindow_bcg_quality_label", u"\u5f53\u524d\u7247\u6bb5\u65f6\u95f4", None)) + self.label_6.setText(QCoreApplication.translate("MainWindow_bcg_quality_label", u"\u5f53\u524d\u7247\u6bb5/\u7247\u6bb5\u603b\u6570", None)) + self.label_12.setText(QCoreApplication.translate("MainWindow_bcg_quality_label", u"\u6700\u957f\u8fde\u7eed\u65f6\u95f4", None)) + self.label_13.setText(QCoreApplication.translate("MainWindow_bcg_quality_label", u"\u4f53\u52a8\u65f6\u95f4\u5360\u6bd4", None)) + self.groupBox_artifact_type.setTitle(QCoreApplication.translate("MainWindow_bcg_quality_label", u"\u4f53\u52a8\u7c7b\u578b", None)) + self.checkBox_allin.setText(QCoreApplication.translate("MainWindow_bcg_quality_label", u"\u5168\u9009", None)) + self.checkBox_type1.setText(QCoreApplication.translate("MainWindow_bcg_quality_label", u"\u7c7b\u578b1", None)) + self.checkBox_type2.setText(QCoreApplication.translate("MainWindow_bcg_quality_label", u"\u7c7b\u578b2", None)) + self.checkBox_type3.setText(QCoreApplication.translate("MainWindow_bcg_quality_label", u"\u7c7b\u578b3", None)) + self.checkBox_type4.setText(QCoreApplication.translate("MainWindow_bcg_quality_label", u"\u7c7b\u578b4", None)) + self.checkBox_type5.setText(QCoreApplication.translate("MainWindow_bcg_quality_label", u"\u7c7b\u578b5", None)) + self.groupBox_function.setTitle(QCoreApplication.translate("MainWindow_bcg_quality_label", u"\u529f\u80fd", None)) + self.pushButton_invalid_signal_label.setText(QCoreApplication.translate("MainWindow_bcg_quality_label", u"\u65e0\u6548\u4fe1\u53f7\u6253\u6807", None)) + self.pushButton_Ctype_signal_label.setText(QCoreApplication.translate("MainWindow_bcg_quality_label", u"C\u7c7b\u4fe1\u53f7\u6253\u6807", None)) + self.groupBox_operation.setTitle(QCoreApplication.translate("MainWindow_bcg_quality_label", u"\u64cd\u4f5c", None)) + self.pushButton_prev.setText(QCoreApplication.translate("MainWindow_bcg_quality_label", u"<(A)", None)) + self.checkBox_examine_tobeLabeled.setText(QCoreApplication.translate("MainWindow_bcg_quality_label", u"\u4ec5\u67e5\u672a\u6807\u7247\u6bb5", None)) + self.checkBox_highlight_longest_continuous.setText(QCoreApplication.translate("MainWindow_bcg_quality_label", u"\u9ad8\u4eae\u6700\u957f\u8fde\u7eed", None)) + self.pushButton_next.setText(QCoreApplication.translate("MainWindow_bcg_quality_label", u">(D)", None)) + self.label.setText(QCoreApplication.translate("MainWindow_bcg_quality_label", u"\u8f93\u5165\u5907\u6ce8", None)) + self.checkBox_display_afterfilter.setText(QCoreApplication.translate("MainWindow_bcg_quality_label", u"\u53bb\u9664\u5de5\u9891\u566a\u58f0", None)) + self.pushButton_save.setText(QCoreApplication.translate("MainWindow_bcg_quality_label", u"\u5bfc\u51fa\u6807\u7b7e", None)) + self.groupBox_4.setTitle(QCoreApplication.translate("MainWindow_bcg_quality_label", u"\u65e5\u5fd7", None)) + self.groupBox_right.setTitle(QCoreApplication.translate("MainWindow_bcg_quality_label", u"\u6807\u7b7e\u8bb0\u5f55", None)) + self.pushButton_b1.setText(QCoreApplication.translate("MainWindow_bcg_quality_label", u"b1", None)) + self.pushButton_b2.setText(QCoreApplication.translate("MainWindow_bcg_quality_label", u"b2", None)) + self.pushButton_f.setText(QCoreApplication.translate("MainWindow_bcg_quality_label", u"\u5220\u9664", None)) + self.pushButton_a2.setText(QCoreApplication.translate("MainWindow_bcg_quality_label", u"a2", None)) + self.pushButton_a1.setText(QCoreApplication.translate("MainWindow_bcg_quality_label", u"a1", None)) + self.pushButton_c.setText(QCoreApplication.translate("MainWindow_bcg_quality_label", u"c", None)) + # retranslateUi + diff --git a/ui/MainWindow/MainWindow_bcg_quality_label.ui b/ui/MainWindow/MainWindow_bcg_quality_label.ui new file mode 100644 index 0000000..e196086 --- /dev/null +++ b/ui/MainWindow/MainWindow_bcg_quality_label.ui @@ -0,0 +1,853 @@ + + + MainWindow_bcg_quality_label + + + + 0 + 0 + 1920 + 1080 + + + + BCG的质量标注 + + + + + + + + 10 + + + + 绘图区 + + + + + + + + + + + + + 10 + + + + BCG的质量标注 + + + + + + + + + 0 + 0 + + + + + 12 + + + + 导入设置 + + + + + + + + 0 + 0 + + + + + 12 + + + + 开始导入 + + + + + + + + + Qt::Orientation::Vertical + + + + 20 + 40 + + + + + + + + 运行状态 + + + + + + + 0 + 0 + + + + + 12 + + + + 当前片段时间 + + + + + + + + 0 + 0 + + + + + 12 + + + + 当前片段/片段总数 + + + + + + + + 0 + 0 + + + + + 12 + + + + 最长连续时间 + + + + + + + + 0 + 0 + + + + + 12 + + + + 体动时间占比 + + + + + + + false + + + + 12 + + + + + + + + false + + + + 12 + + + + + + + + false + + + + 12 + + + + + + + + false + + + + 12 + + + + + + + + + + + Qt::Orientation::Vertical + + + + 20 + 40 + + + + + + + + + + 体动类型 + + + + + + + 20 + + + + 全选 + + + true + + + + + + + + 12 + + + + 类型1 + + + true + + + + + + + + 12 + + + + 类型2 + + + true + + + + + + + + 12 + + + + 类型3 + + + true + + + + + + + + 12 + + + + 类型4 + + + true + + + + + + + + 12 + + + + 类型5 + + + true + + + + + + + + + + 功能 + + + + + + + 0 + 0 + + + + + 12 + + + + 无效信号打标 + + + + + + + + 0 + 0 + + + + + 12 + + + + C类信号打标 + + + + + + + + + + + + Qt::Orientation::Vertical + + + + 20 + 40 + + + + + + + + 操作 + + + + + + + 0 + 0 + + + + + 12 + + + + <(A) + + + + + + + + 12 + + + + 仅查未标片段 + + + + + + + + 12 + + + + 高亮最长连续 + + + + + + + + 0 + 0 + + + + + 12 + + + + >(D) + + + + + + + + 12 + + + + 输入备注 + + + Qt::AlignmentFlag::AlignCenter + + + + + + + + 12 + + + + 去除工频噪声 + + + + + + + true + + + + 12 + + + + + + + + Qt::Orientation::Vertical + + + + 20 + 40 + + + + + + + + + + + Qt::Orientation::Vertical + + + + 20 + 40 + + + + + + + + + + + 0 + 0 + + + + + 12 + + + + 导出标签 + + + + + + + + + 日志 + + + + + + + + + + + + + + + + 10 + + + + 标签记录 + + + + + + Qt::Orientation::Vertical + + + + 20 + 40 + + + + + + + + Qt::Orientation::Vertical + + + + 20 + 40 + + + + + + + + + 0 + 0 + + + + + 24 + + + + b1 + + + + + + + + 12 + + + + 1 + + + + + + + + + 12 + + + + 1 + + + 33 + + + 75 + + + 32 + + + + + + + + + 0 + 0 + + + + + 24 + + + + b2 + + + + + + + + 0 + 0 + + + + + 24 + + + + 删除 + + + + + + + + 12 + + + + 1 + + + + + + + + + 0 + 0 + + + + + 24 + + + + a2 + + + + + + + Qt::Orientation::Vertical + + + + 20 + 40 + + + + + + + + + 12 + + + + 1 + + + + + + + + + 0 + 0 + + + + + 24 + + + + a1 + + + + + + + + 12 + + + + 1 + + + + + + + + + 12 + + + + 1 + + + + + + + + Qt::Orientation::Vertical + + + + 20 + 40 + + + + + + + + + 0 + 0 + + + + + 24 + + + + c + + + + + + + Qt::Orientation::Vertical + + + + 20 + 40 + + + + + + + + + + + + + + diff --git a/ui/setting/bcg_quality_label_input_setting.py b/ui/setting/bcg_quality_label_input_setting.py new file mode 100644 index 0000000..735b15c --- /dev/null +++ b/ui/setting/bcg_quality_label_input_setting.py @@ -0,0 +1,177 @@ +# -*- coding: utf-8 -*- + +################################################################################ +## Form generated from reading UI file 'bcg_quality_label_input_setting.ui' +## +## Created by: Qt User Interface Compiler version 6.8.2 +## +## WARNING! All changes made in this file will be lost when recompiling UI file! +################################################################################ + +from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale, + QMetaObject, QObject, QPoint, QRect, + QSize, QTime, QUrl, Qt) +from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor, + QFont, QFontDatabase, QGradient, QIcon, + QImage, QKeySequence, QLinearGradient, QPainter, + QPalette, QPixmap, QRadialGradient, QTransform) +from PySide6.QtWidgets import (QApplication, QGridLayout, QGroupBox, QHBoxLayout, + QLabel, QMainWindow, QPlainTextEdit, QPushButton, + QRadioButton, QSizePolicy, QSpacerItem, QSpinBox, + QStatusBar, QVBoxLayout, QWidget) + +class Ui_MainWindow_bcg_quality_label_input_setting(object): + def setupUi(self, MainWindow_bcg_quality_label_input_setting): + if not MainWindow_bcg_quality_label_input_setting.objectName(): + MainWindow_bcg_quality_label_input_setting.setObjectName(u"MainWindow_bcg_quality_label_input_setting") + MainWindow_bcg_quality_label_input_setting.resize(540, 540) + self.centralwidget = QWidget(MainWindow_bcg_quality_label_input_setting) + self.centralwidget.setObjectName(u"centralwidget") + self.gridLayout = QGridLayout(self.centralwidget) + self.gridLayout.setObjectName(u"gridLayout") + self.pushButton_cancel = QPushButton(self.centralwidget) + self.pushButton_cancel.setObjectName(u"pushButton_cancel") + font = QFont() + font.setPointSize(12) + self.pushButton_cancel.setFont(font) + + self.gridLayout.addWidget(self.pushButton_cancel, 1, 3, 1, 1) + + self.groupBox = QGroupBox(self.centralwidget) + self.groupBox.setObjectName(u"groupBox") + font1 = QFont() + font1.setPointSize(10) + self.groupBox.setFont(font1) + self.verticalLayout_2 = QVBoxLayout(self.groupBox) + self.verticalLayout_2.setObjectName(u"verticalLayout_2") + self.groupBox_file_path_input_signal_BCG = QGroupBox(self.groupBox) + self.groupBox_file_path_input_signal_BCG.setObjectName(u"groupBox_file_path_input_signal_BCG") + self.verticalLayout_5 = QVBoxLayout(self.groupBox_file_path_input_signal_BCG) + self.verticalLayout_5.setObjectName(u"verticalLayout_5") + self.horizontalLayout_2 = QHBoxLayout() + self.horizontalLayout_2.setObjectName(u"horizontalLayout_2") + self.label_2 = QLabel(self.groupBox_file_path_input_signal_BCG) + self.label_2.setObjectName(u"label_2") + self.label_2.setFont(font) + + self.horizontalLayout_2.addWidget(self.label_2) + + self.spinBox_input_freq_signal_BCG = QSpinBox(self.groupBox_file_path_input_signal_BCG) + self.spinBox_input_freq_signal_BCG.setObjectName(u"spinBox_input_freq_signal_BCG") + self.spinBox_input_freq_signal_BCG.setFont(font) + self.spinBox_input_freq_signal_BCG.setMinimum(1) + self.spinBox_input_freq_signal_BCG.setMaximum(1000000) + + self.horizontalLayout_2.addWidget(self.spinBox_input_freq_signal_BCG) + + + self.verticalLayout_5.addLayout(self.horizontalLayout_2) + + self.plainTextEdit_file_path_input_signal_BCG = QPlainTextEdit(self.groupBox_file_path_input_signal_BCG) + self.plainTextEdit_file_path_input_signal_BCG.setObjectName(u"plainTextEdit_file_path_input_signal_BCG") + + self.verticalLayout_5.addWidget(self.plainTextEdit_file_path_input_signal_BCG) + + self.verticalLayout_5.setStretch(0, 1) + self.verticalLayout_5.setStretch(1, 2) + + self.verticalLayout_2.addWidget(self.groupBox_file_path_input_signal_BCG) + + self.groupBox_file_path_input_artifact = QGroupBox(self.groupBox) + self.groupBox_file_path_input_artifact.setObjectName(u"groupBox_file_path_input_artifact") + self.verticalLayout_6 = QVBoxLayout(self.groupBox_file_path_input_artifact) + self.verticalLayout_6.setObjectName(u"verticalLayout_6") + self.plainTextEdit_file_path_input_artifact = QPlainTextEdit(self.groupBox_file_path_input_artifact) + self.plainTextEdit_file_path_input_artifact.setObjectName(u"plainTextEdit_file_path_input_artifact") + + self.verticalLayout_6.addWidget(self.plainTextEdit_file_path_input_artifact) + + self.verticalLayout_6.setStretch(0, 2) + + self.verticalLayout_2.addWidget(self.groupBox_file_path_input_artifact) + + self.groupBox_file_path_save = QGroupBox(self.groupBox) + self.groupBox_file_path_save.setObjectName(u"groupBox_file_path_save") + self.verticalLayout_4 = QVBoxLayout(self.groupBox_file_path_save) + self.verticalLayout_4.setObjectName(u"verticalLayout_4") + self.plainTextEdit_file_path_save = QPlainTextEdit(self.groupBox_file_path_save) + self.plainTextEdit_file_path_save.setObjectName(u"plainTextEdit_file_path_save") + + self.verticalLayout_4.addWidget(self.plainTextEdit_file_path_save) + + + self.verticalLayout_2.addWidget(self.groupBox_file_path_save) + + self.groupBox_display_mode = QGroupBox(self.groupBox) + self.groupBox_display_mode.setObjectName(u"groupBox_display_mode") + self.horizontalLayout = QHBoxLayout(self.groupBox_display_mode) + self.horizontalLayout.setObjectName(u"horizontalLayout") + self.horizontalSpacer = QSpacerItem(40, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum) + + self.horizontalLayout.addItem(self.horizontalSpacer) + + self.radioButton_30s_mode = QRadioButton(self.groupBox_display_mode) + self.radioButton_30s_mode.setObjectName(u"radioButton_30s_mode") + self.radioButton_30s_mode.setFont(font) + + self.horizontalLayout.addWidget(self.radioButton_30s_mode) + + self.horizontalSpacer_3 = QSpacerItem(40, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum) + + self.horizontalLayout.addItem(self.horizontalSpacer_3) + + self.radioButton_10s_mode = QRadioButton(self.groupBox_display_mode) + self.radioButton_10s_mode.setObjectName(u"radioButton_10s_mode") + self.radioButton_10s_mode.setFont(font) + + self.horizontalLayout.addWidget(self.radioButton_10s_mode) + + self.horizontalSpacer_2 = QSpacerItem(40, 20, QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum) + + self.horizontalLayout.addItem(self.horizontalSpacer_2) + + + self.verticalLayout_2.addWidget(self.groupBox_display_mode) + + self.verticalLayout_2.setStretch(0, 3) + self.verticalLayout_2.setStretch(1, 2) + self.verticalLayout_2.setStretch(2, 2) + self.verticalLayout_2.setStretch(3, 2) + + self.gridLayout.addWidget(self.groupBox, 0, 0, 1, 4) + + self.pushButton_confirm = QPushButton(self.centralwidget) + self.pushButton_confirm.setObjectName(u"pushButton_confirm") + self.pushButton_confirm.setFont(font) + + self.gridLayout.addWidget(self.pushButton_confirm, 1, 2, 1, 1) + + MainWindow_bcg_quality_label_input_setting.setCentralWidget(self.centralwidget) + self.statusbar = QStatusBar(MainWindow_bcg_quality_label_input_setting) + self.statusbar.setObjectName(u"statusbar") + MainWindow_bcg_quality_label_input_setting.setStatusBar(self.statusbar) + + self.retranslateUi(MainWindow_bcg_quality_label_input_setting) + + QMetaObject.connectSlotsByName(MainWindow_bcg_quality_label_input_setting) + # setupUi + + def retranslateUi(self, MainWindow_bcg_quality_label_input_setting): + MainWindow_bcg_quality_label_input_setting.setWindowTitle(QCoreApplication.translate("MainWindow_bcg_quality_label_input_setting", u"\u5bfc\u5165\u8bbe\u7f6e", None)) + self.pushButton_cancel.setText(QCoreApplication.translate("MainWindow_bcg_quality_label_input_setting", u"\u53d6\u6d88", None)) + self.groupBox.setTitle(QCoreApplication.translate("MainWindow_bcg_quality_label_input_setting", u"\u6587\u4ef6\u8def\u5f84", None)) + self.groupBox_file_path_input_signal_BCG.setTitle(QCoreApplication.translate("MainWindow_bcg_quality_label_input_setting", u"\u540c\u6b65\u540e\u7684BCG\u8def\u5f84", None)) + self.label_2.setText(QCoreApplication.translate("MainWindow_bcg_quality_label_input_setting", u"\u91c7\u6837\u7387(Hz)\uff1a", None)) + self.plainTextEdit_file_path_input_signal_BCG.setPlainText("") + self.plainTextEdit_file_path_input_signal_BCG.setPlaceholderText(QCoreApplication.translate("MainWindow_bcg_quality_label_input_setting", u"\u6587\u4ef6\u8def\u5f84", None)) + self.groupBox_file_path_input_artifact.setTitle(QCoreApplication.translate("MainWindow_bcg_quality_label_input_setting", u"\u4f53\u52a8Artifact_a\u8def\u5f84", None)) + self.plainTextEdit_file_path_input_artifact.setPlainText("") + self.plainTextEdit_file_path_input_artifact.setPlaceholderText(QCoreApplication.translate("MainWindow_bcg_quality_label_input_setting", u"\u6587\u4ef6\u8def\u5f84", None)) + self.groupBox_file_path_save.setTitle(QCoreApplication.translate("MainWindow_bcg_quality_label_input_setting", u"BCG\u8d28\u91cf\u6807\u7b7e\u4fdd\u5b58\u8def\u5f84", None)) + self.plainTextEdit_file_path_save.setPlaceholderText(QCoreApplication.translate("MainWindow_bcg_quality_label_input_setting", u"\u4fdd\u5b58\u8def\u5f84", None)) + self.groupBox_display_mode.setTitle(QCoreApplication.translate("MainWindow_bcg_quality_label_input_setting", u"\u663e\u793a\u6a21\u5f0f", None)) + self.radioButton_30s_mode.setText(QCoreApplication.translate("MainWindow_bcg_quality_label_input_setting", u"30s\u6a21\u5f0f", None)) + self.radioButton_10s_mode.setText(QCoreApplication.translate("MainWindow_bcg_quality_label_input_setting", u"10s\u6a21\u5f0f", None)) + self.pushButton_confirm.setText(QCoreApplication.translate("MainWindow_bcg_quality_label_input_setting", u"\u786e\u5b9a", None)) + # retranslateUi + diff --git a/ui/setting/bcg_quality_label_input_setting.ui b/ui/setting/bcg_quality_label_input_setting.ui new file mode 100644 index 0000000..c3bf273 --- /dev/null +++ b/ui/setting/bcg_quality_label_input_setting.ui @@ -0,0 +1,219 @@ + + + MainWindow_bcg_quality_label_input_setting + + + + 0 + 0 + 540 + 540 + + + + 导入设置 + + + + + + + + 12 + + + + 取消 + + + + + + + + 10 + + + + 文件路径 + + + + + + 同步后的BCG路径 + + + + + + + + + 12 + + + + 采样率(Hz): + + + + + + + + 12 + + + + 1 + + + 1000000 + + + + + + + + + + + + 文件路径 + + + + + + + + + + 体动Artifact_a路径 + + + + + + + + + 文件路径 + + + + + + + + + + BCG质量标签保存路径 + + + + + + 保存路径 + + + + + + + + + + 显示模式 + + + + + + Qt::Orientation::Horizontal + + + + 40 + 20 + + + + + + + + + 12 + + + + 30s模式 + + + + + + + Qt::Orientation::Horizontal + + + + 40 + 20 + + + + + + + + + 12 + + + + 10s模式 + + + + + + + Qt::Orientation::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + + + 12 + + + + 确定 + + + + + + + + + +