From a7efcd0a853bc4c796e53717a99fe90ec74d9060 Mon Sep 17 00:00:00 2001 From: marques <20172333133@m.scnu.edu.cn> Date: Sun, 31 Aug 2025 19:59:29 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0SA=E6=89=93=E6=A0=87=E7=95=8C?= =?UTF-8?q?=E9=9D=A2=E5=BF=AB=E6=8D=B7=E9=94=AE=E8=AE=BE=E7=BD=AE=EF=BC=8C?= =?UTF-8?q?=E8=B0=83=E6=95=B4=E6=8C=89=E9=92=AE=E6=96=87=E6=9C=AC=E5=8F=8A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=96=B0=E6=8C=89=E9=92=AE=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- func/Module_SA_label_v2.py | 78 +++++++++++++++++++++++-- func/utils/ConfigParams.py | 7 ++- ui/MainWindow/MainWindow_SA_label_v2.py | 10 ++-- ui/MainWindow/MainWindow_SA_label_v2.ui | 10 ++-- 4 files changed, 88 insertions(+), 17 deletions(-) diff --git a/func/Module_SA_label_v2.py b/func/Module_SA_label_v2.py index 6c39f32..ff4752d 100644 --- a/func/Module_SA_label_v2.py +++ b/func/Module_SA_label_v2.py @@ -394,9 +394,11 @@ class Data: start = one_data["correct_Start"] if one_data["isLabeled"] == 1 else one_data["Start"] end = one_data["correct_End"] if one_data["isLabeled"] == 1 else one_data["End"] + event_type = one_data["correct_EventsType"] if one_data["isLabeled"] == 1 else one_data[ + "Event type"] self.event_label_revised[start * plot_freq:end * plot_freq] = self.event_type_to_value[ - one_data["Event type"]] + event_type] self.event_index_revised[start:end] = one_data["Index"] except Exception as e: @@ -527,11 +529,36 @@ class DataFrameModel(QAbstractTableModel): if role == Qt.ForegroundRole: if "isLabeled" in self._dataframe.columns: try: - is_labeled_value = pd.to_numeric(self._showdata.iloc[row]["isLabeled"], errors='coerce') + print(self._showdata.iloc[row]["Index"]) + + event_index = self._showdata.iloc[row]["Index"] + is_labeled_value = self._dataframe[self._dataframe["Index"] == event_index]["isLabeled"] + if is_labeled_value.empty: + return None + is_labeled_value = is_labeled_value.values[0] + if is_labeled_value == 1: - return QColor(0, 255, 0) + # remark 返回蓝色 score 1 返回绿色, 2返回橙色 3返回灰色 -1返回红色 + # 获取此行的remark + remark = not self._dataframe[self._dataframe["Index"] == event_index]["remark"].values[0] + score = self._dataframe[self._dataframe["Index"] == event_index]["score"].values[0] + if remark == "待讨论": + return QColor(0, 0, 255) + elif score == 1: + return QColor(0, 255, 0) + elif score == 2: + return QColor(255, 165, 0) + elif score == 3: + return QColor(128, 128, 128) + elif score == -1: + return QColor(255, 0, 0) + else: + # 返回黑色 + return QColor(0, 0, 0) + else: - return QColor(255, 165, 0) + # 返回灰色 + return QColor(0, 0, 0) except Exception as e: return None @@ -628,9 +655,9 @@ class MainWindow_SA_label(QMainWindow): self.display_columns_name_origin = ["事件编号", "事件类型", "起始时间(s)", "终止时间(s)"] self.header_mapping_origin = dict(zip(self.display_columns_origin, self.display_columns_name_origin)) - self.display_columns_revised = ["Index", "isLabeled", "correct_EventsType", "score", "correct_Start", + self.display_columns_revised = ["Index", "correct_EventsType", "score", "correct_Start", "correct_End"] - self.display_columns_name_revised = ["事件编号", "已标注", "修正事件类型", "标签类型", "起始时间(s)", + self.display_columns_name_revised = ["事件编号", "修正事件类型", "标签类型", "起始时间(s)", "终止时间(s)"] self.header_mapping_revised = dict(zip(self.display_columns_revised, self.display_columns_name_revised)) @@ -681,6 +708,8 @@ class MainWindow_SA_label(QMainWindow): self.figToolbar.cid_mouse_press = self.canvas.mpl_connect('button_press_event', self.on_press) self.figToolbar.cid_mouse_release = self.canvas.mpl_connect('button_release_event', self.on_release) self.figToolbar.cid_mouse_move = self.canvas.mpl_connect('motion_notify_event', self.on_motion) + self.figToolbar.cid_wheel = self.canvas.mpl_connect('scroll_event', self.__slot_wheel_move__) + self.ui.verticalLayout_canvas.addWidget(self.canvas) self.ui.verticalLayout_canvas.addWidget(self.figToolbar) @@ -819,6 +848,20 @@ class MainWindow_SA_label(QMainWindow): QCoreApplication.translate("MainWindow", Params.SA_LABEL_BTN_NEXT_HALF_SHORTCUT_KEY)) self.ui.pushButton_best_fit.setShortcut( QCoreApplication.translate("MainWindow", Params.SA_LABEL_BTN_BEST_FIT_SHORTCUT_KEY)) + self.ui.pushButton_quick_remark_input_littleChange.setShortcut( + QCoreApplication.translate("MainWindow", Params. SA_LABEL_BTN_LITTLE_CHANGED_SHORTCUT_KEY) + ) + self.ui.pushButton_quick_remark_input_changeOnMiddle.setShortcut( + QCoreApplication.translate("MainWindow", Params. SA_LABEL_BTN_CHANGED_ON_MIDDLE_SHORTCUT_KEY) + ) + self.ui.pushButton_quick_remark_input_noNormalRespBetweenArtifact( + ).setShortcut( + QCoreApplication.translate("MainWindow", Params. SA_LABEL_BTN_BETWEEN_ARTIFACT_SHORTCUT_KEY) + ) + self.ui.pushButton_quick_remark_input_lowSignalNoiseRatio.setShortcut( + QCoreApplication.translate("MainWindow", Params. SA_LABEL_BTN_LOW_SNR_SHORTCUT_KEY) + ) + def load_data_to_table(self): try: @@ -830,12 +873,23 @@ class MainWindow_SA_label(QMainWindow): self.header_mapping_revised) self.ui.tableView_label_revised.setModel(self.data_model_revised) + # 按比例设置列宽 + self.set_tableview_column_width_by_ratio(self.ui.tableView_label, [1, 3, 3, 3]) + self.set_tableview_column_width_by_ratio(self.ui.tableView_label_revised, [1, 3, 1, 2, 2]) + except Exception as e: return Result().failure(info=Constants.UPDATE_FAILURE + Constants.FAILURE_REASON["Update_tableWidget_Exception"] + "\n" + format_exc()) return Result().success(info=Constants.UPDATE_FINISHED) + def set_tableview_column_width_by_ratio(self, tableview, ratios): + """按比例设置tableView每列宽度""" + total_width = tableview.viewport().width() + sum_ratio = sum(ratios) + for i, ratio in enumerate(ratios): + tableview.setColumnWidth(i, int(total_width * ratio / sum_ratio)) + def best_fit(self): plot_freq = self.config["Config"]["InputConfig"]["PlotFreq"] start_point = self.config["WindowStartSecond"] * plot_freq @@ -1711,6 +1765,13 @@ class MainWindow_SA_label(QMainWindow): PublicFunc.text_output(self.ui, f"跳转到 {jump_time} 秒", Constants.TIPS_TYPE_INFO) self.__jump_to__by_time__(jump_time) + def __slot_wheel_move__(self, event): + # 向上滚动,时间向前跳30秒,向下滚动,时间向后跳30秒 + offset = 30 if event.step < 0 else -30 + PublicFunc.text_output(self.ui, f"滚轮移动 {offset} 秒", Constants.TIPS_TYPE_INFO) + self.__jump_to__by_time__(self.config["WindowStartSecond"], offset) + + def __slot_btn_quick_remark__(self): sender = self.sender() @@ -1811,6 +1872,8 @@ class MainWindow_SA_label(QMainWindow): if start + value < 0: return 0, self.config["WindowSignalSecond"] elif start + value + self.config["WindowSignalSecond"] > self.config["SignalSecond"]: + PublicFunc.msgbox_output(self, "已到达信号末尾,无法继续前进!", Constants.MSGBOX_TYPE_WARNING) + PublicFunc.text_output(self.ui, "已到达信号末尾,无法继续前进!", Constants.TIPS_TYPE_ERROR) return start - self.config["WindowSignalSecond"], self.config["SignalSecond"] else: return start + value, start + value + self.config["WindowSignalSecond"] @@ -1889,6 +1952,9 @@ class CustomNavigationToolbar(NavigationToolbar2QT): # Connect Pan action to toggle off Edit self._actions['pan'].triggered.connect(self.toggle_pan) + self._actions['pan'].setShortcut( + QCoreApplication.translate("MainWindow", Params.SA_LABEL_BTN_PAN_MODE_SHORTCUT_KEY)) + def drag_pan(self, event): """Callback for dragging in pan/zoom mode.""" diff --git a/func/utils/ConfigParams.py b/func/utils/ConfigParams.py index 36a3887..50520ba 100644 --- a/func/utils/ConfigParams.py +++ b/func/utils/ConfigParams.py @@ -377,8 +377,9 @@ class Params: SA_LABEL_BTN_NEXT_30s_SHORTCUT_KEY: str = "D" SA_LABEL_BTN_PREV_HALF_SHORTCUT_KEY: str = "F" SA_LABEL_BTN_NEXT_HALF_SHORTCUT_KEY: str = "G" - SA_LABEL_BTN_BEST_FIT_SHORTCUT_KEY: str = "X" + SA_LABEL_BTN_BEST_FIT_SHORTCUT_KEY: str = "B" SA_LABEL_BTN_EDIT_MODE_SHORTCUT_KEY: str = "Z" + SA_LABEL_BTN_PAN_MODE_SHORTCUT_KEY: str = "X" SA_LABEL_BTN_CONFIRMLABEL_SHORTCUT_KEY: str = "S" SA_LABEL_BTN_QUICK_REMARK_WAITINGFORTALK_SHORTCUT_KEY: str = "J" SA_LABEL_RADIOBUTTON_OSA_SHORTCUT_KEY: str = "7" @@ -388,6 +389,10 @@ class Params: SA_LABEL_RADIOBUTTON_1_CLASS_SHORTCUT_KEY: str = "1" SA_LABEL_RADIOBUTTON_2_CLASS_SHORTCUT_KEY: str = "2" SA_LABEL_RADIOBUTTON_3_CLASS_SHORTCUT_KEY: str = "3" + SA_LABEL_BTN_LITTLE_CHANGED_SHORTCUT_KEY: str = "U" + SA_LABEL_BTN_CHANGED_ON_MIDDLE_SHORTCUT_KEY: str = "I" + SA_LABEL_BTN_BETWEEN_ARTIFACT_SHORTCUT_KEY: str = "O" + SA_LABEL_BTN_LOW_SNR_SHORTCUT_KEY: str = "P" # 禁止实例化 diff --git a/ui/MainWindow/MainWindow_SA_label_v2.py b/ui/MainWindow/MainWindow_SA_label_v2.py index 823e4e2..3c50787 100644 --- a/ui/MainWindow/MainWindow_SA_label_v2.py +++ b/ui/MainWindow/MainWindow_SA_label_v2.py @@ -653,7 +653,7 @@ class Ui_MainWindow_SA_label(object): self.pushButton_input_setting.setText(QCoreApplication.translate("MainWindow_SA_label", u"\u5bfc\u5165\u8bbe\u7f6e", None)) self.pushButton_input.setText(QCoreApplication.translate("MainWindow_SA_label", u"\u5f00\u59cb\u5bfc\u5165", None)) self.checkBox_auto_save.setText(QCoreApplication.translate("MainWindow_SA_label", u"\u4fee\u6539\u540e\u81ea\u52a8\u4fdd\u5b58", None)) - self.pushButton_best_fit.setText(QCoreApplication.translate("MainWindow_SA_label", u"\u81ea\u9002\u5e94\u5e45\u503c\uff08X\uff09", None)) + self.pushButton_best_fit.setText(QCoreApplication.translate("MainWindow_SA_label", u"\u81ea\u9002\u5e94\u5e45\u503c\uff08B\uff09", None)) self.label_4.setText(QCoreApplication.translate("MainWindow_SA_label", u"\u663e\u793a\u7a97\u53e3\u957f\u5ea6/\u79d2\uff1a", None)) self.comboBox_window_signal_length.setItemText(0, QCoreApplication.translate("MainWindow_SA_label", u"30", None)) self.comboBox_window_signal_length.setItemText(1, QCoreApplication.translate("MainWindow_SA_label", u"60", None)) @@ -696,12 +696,12 @@ class Ui_MainWindow_SA_label(object): self.label_7.setText(QCoreApplication.translate("MainWindow_SA_label", u"\u5feb\u901f\u5907\u6ce8\u8f93\u5165", None)) self.pushButton_quick_remark_input_durationNoEnough.setText(QCoreApplication.translate("MainWindow_SA_label", u"\u4e8c\u7c7b-\u65f6\u957f\u4e0d\u8db3", None)) self.pushButton_quick_remark_input_maybeWrongLabeled.setText(QCoreApplication.translate("MainWindow_SA_label", u"\u4e8c\u7c7b-\u7591\u4f3c\u533b\u751f\u8bef\u6807", None)) - self.pushButton_quick_remark_input_noNormalRespBetweenArtifact.setText(QCoreApplication.translate("MainWindow_SA_label", u"\u4e8c\u7c7b-\u4f53\u52a8\u95f4\u65e0\u6b63\u5e38\u547c\u5438", None)) + self.pushButton_quick_remark_input_noNormalRespBetweenArtifact.setText(QCoreApplication.translate("MainWindow_SA_label", u"\u4e8c\u7c7b-\u4f53\u52a8\u95f4\u65e0\u6b63\u5e38\u547c\u5438(O)", None)) self.pushButton_quick_remark_input_maybeDesaturation.setText(QCoreApplication.translate("MainWindow_SA_label", u"\u4e00\u7c7b-\u5f62\u4f3c\u6f6e\u5f0f\u547c\u5438", None)) - self.pushButton_quick_remark_input_littleChange.setText(QCoreApplication.translate("MainWindow_SA_label", u"\u4e8c\u7c7b-\u8d77\u4f0f\u53d8\u5316\u4e0d\u5927", None)) + self.pushButton_quick_remark_input_littleChange.setText(QCoreApplication.translate("MainWindow_SA_label", u"\u4e8c\u7c7b-\u8d77\u4f0f\u53d8\u5316\u4e0d\u5927(U)", None)) self.pushButton_quick_remark_input_waitingForTalk.setText(QCoreApplication.translate("MainWindow_SA_label", u"\u5f85\u8ba8\u8bba(N)", None)) - self.pushButton_quick_remark_input_lowSignalNoiseRatio.setText(QCoreApplication.translate("MainWindow_SA_label", u"\u4e8c\u7c7b-\u4fe1\u566a\u6bd4\u4f4e", None)) - self.pushButton_quick_remark_input_changeOnMiddle.setText(QCoreApplication.translate("MainWindow_SA_label", u"\u4e8c\u7c7b-\u4e2d\u95f4\u8d77\u4f0f", None)) + self.pushButton_quick_remark_input_lowSignalNoiseRatio.setText(QCoreApplication.translate("MainWindow_SA_label", u"\u4e8c\u7c7b-\u4fe1\u566a\u6bd4\u4f4e(P)", None)) + self.pushButton_quick_remark_input_changeOnMiddle.setText(QCoreApplication.translate("MainWindow_SA_label", u"\u4e8c\u7c7b-\u4e2d\u95f4\u8d77\u4f0f(I)", None)) self.label_8.setText(QCoreApplication.translate("MainWindow_SA_label", u"\u4fee\u6b63\u540e\u8d77\u59cb\u65f6\u95f4(s)", None)) self.label_9.setText(QCoreApplication.translate("MainWindow_SA_label", u"\u4fee\u6b63\u540e\u7ec8\u6b62\u65f6\u95f4(s)", None)) self.pushButton_confirmLabel.setText(QCoreApplication.translate("MainWindow_SA_label", u"\u786e\u5b9a\u6253\u6807\u53c2\u6570(S)", None)) diff --git a/ui/MainWindow/MainWindow_SA_label_v2.ui b/ui/MainWindow/MainWindow_SA_label_v2.ui index 55f0e51..d2713bd 100644 --- a/ui/MainWindow/MainWindow_SA_label_v2.ui +++ b/ui/MainWindow/MainWindow_SA_label_v2.ui @@ -134,7 +134,7 @@ - 自适应幅值(X) + 自适应幅值(B) false @@ -867,7 +867,7 @@ - 二类-体动间无正常呼吸 + 二类-体动间无正常呼吸(O) @@ -903,7 +903,7 @@ - 二类-起伏变化不大 + 二类-起伏变化不大(U) @@ -939,7 +939,7 @@ - 二类-信噪比低 + 二类-信噪比低(P) @@ -957,7 +957,7 @@ - 二类-中间起伏 + 二类-中间起伏(I)