From b84c9915c045f4314c81e94b44aa34516fe381db Mon Sep 17 00:00:00 2001 From: Yorusora Date: Mon, 2 Jun 2025 20:38:32 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BA=86<=E5=91=BC?= =?UTF-8?q?=E5=90=B8=E5=8F=AF=E7=94=A8=E6=80=A7=E5=8F=8A=E9=97=B4=E6=9C=9F?= =?UTF-8?q?=E6=A0=87=E6=B3=A8>=E4=B8=AD=E6=97=A0=E6=B3=95=E7=BB=98?= =?UTF-8?q?=E5=88=B6=E6=9C=80=E5=90=8E=E4=B8=80=E4=B8=AA=E7=89=87=E6=AE=B5?= =?UTF-8?q?=E7=9A=84=E4=BF=A1=E5=8F=B7=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- func/Module_resp_quality_label.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/func/Module_resp_quality_label.py b/func/Module_resp_quality_label.py index 5da029e..e2e0163 100644 --- a/func/Module_resp_quality_label.py +++ b/func/Module_resp_quality_label.py @@ -411,7 +411,7 @@ class MainWindow_resp_quality_label(QMainWindow): artifact_type_seq = append(artifact_type_seq, 4) if self.ui.checkBox_type5.isChecked(): artifact_type_seq = append(artifact_type_seq, 5) - length = Config["InputConfig"]["OrgBCGUseFreq"] * Params.RESP_QUALITY_LABEL_PARTS_TIME_SEC + length = end_OrgBCG - begin_OrgBCG mask = array([arange(length), arange(length), arange(length), arange(length), arange(length), arange(length)]) mask = mask.astype(float64) for i in artifact_type_seq: From 454d068626375848fe9e06a3a87bd324c3f70266 Mon Sep 17 00:00:00 2001 From: Yorusora Date: Tue, 3 Jun 2025 22:31:15 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BA=86=E4=B8=BB?= =?UTF-8?q?=E8=8F=9C=E5=8D=95=E4=B8=AD=E6=A0=B7=E6=9C=ACID=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E9=94=99=E8=AF=AF=E7=9A=84=E9=97=AE=E9=A2=98=20?= =?UTF-8?q?=E7=A6=81=E7=94=A8=E4=BA=86=E6=A0=B9=E7=9B=AE=E5=BD=95=E8=B7=AF?= =?UTF-8?q?=E5=BE=84=E7=9A=84=E6=89=8B=E5=8A=A8=E8=BE=93=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- func/Module_mainwindow.py | 2 ++ ui/MainWindow/MainWindow_menu.py | 1 + ui/MainWindow/MainWindow_menu.ui | 6 +++++- 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/func/Module_mainwindow.py b/func/Module_mainwindow.py index 056972e..05d1b76 100644 --- a/func/Module_mainwindow.py +++ b/func/Module_mainwindow.py @@ -277,9 +277,11 @@ class MainWindow(QMainWindow, Ui_Signal_Label): def seek_sampID(self, path): if not Path(path).exists(): PublicFunc.msgbox_output(self, Constants.MAINWINDOW_ROOT_PATH_NOT_EXIST, Constants.MSGBOX_TYPE_ERROR) + self.ui.comboBox_sampID.clear() return sub_folders = [item.name for item in Path(path).iterdir() if item.is_dir()] + self.ui.comboBox_sampID.clear() self.ui.comboBox_sampID.addItems(sub_folders) def check_root_path(self): diff --git a/ui/MainWindow/MainWindow_menu.py b/ui/MainWindow/MainWindow_menu.py index 5f7f1ff..104c18a 100644 --- a/ui/MainWindow/MainWindow_menu.py +++ b/ui/MainWindow/MainWindow_menu.py @@ -50,6 +50,7 @@ class Ui_Signal_Label(object): self.plainTextEdit_root_path = QPlainTextEdit(self.centralwidget) self.plainTextEdit_root_path.setObjectName(u"plainTextEdit_root_path") + self.plainTextEdit_root_path.setEnabled(False) self.verticalLayout_3.addWidget(self.plainTextEdit_root_path) diff --git a/ui/MainWindow/MainWindow_menu.ui b/ui/MainWindow/MainWindow_menu.ui index 6189829..5445f16 100644 --- a/ui/MainWindow/MainWindow_menu.ui +++ b/ui/MainWindow/MainWindow_menu.ui @@ -40,7 +40,11 @@ - + + + false + + From 71979940195ff437e124ba1ff7b0e758fcba4276 Mon Sep 17 00:00:00 2001 From: Yorusora Date: Tue, 3 Jun 2025 23:23:26 +0800 Subject: [PATCH 3/5] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=A4=9A=E5=A4=84?= =?UTF-8?q?=E7=9A=84Result=E7=BB=93=E6=9E=9C=E6=9C=AAreturn=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- func/Module_approximately_align.py | 2 -- func/Module_artifact_label.py | 6 ++--- func/Module_bcg_quality_label.py | 6 ++--- func/Module_precisely_align.py | 6 ++--- func/Module_preprocess.py | 43 +++++++++++++++++++----------- func/Module_resp_quality_label.py | 15 +++++------ func/utils/Constants.py | 1 + 7 files changed, 44 insertions(+), 35 deletions(-) diff --git a/func/Module_approximately_align.py b/func/Module_approximately_align.py index 8d4b482..0c6f03d 100644 --- a/func/Module_approximately_align.py +++ b/func/Module_approximately_align.py @@ -1230,7 +1230,6 @@ class Data: tho_bias_list.append(tho_seg_pos // temp_freq) abd_bias_list.append(abd_seg_pos // temp_freq) - result = { "tho_bias_list": tho_bias_list, "abd_bias_list": abd_bias_list, @@ -1238,7 +1237,6 @@ class Data: "epoch_max": epoch_max } - except Exception as e: return Result().failure( info=Constants.APPROXIMATELY_EPOCH_GET_FAILURE + Constants.FAILURE_REASON[ diff --git a/func/Module_artifact_label.py b/func/Module_artifact_label.py index 4c946ae..6523f98 100644 --- a/func/Module_artifact_label.py +++ b/func/Module_artifact_label.py @@ -1338,7 +1338,7 @@ class Data: def resample(self): if self.orgBcg is None: - Result().failure(info=Constants.RESAMPLE_FAILURE + Constants.FAILURE_REASON["Data_Not_Exist"]) + return Result().failure(info=Constants.RESAMPLE_FAILURE + Constants.FAILURE_REASON["Data_Not_Exist"]) try: if Config["InputConfig"]["orgBcgFreq"] != Config["InputConfig"]["UseFreq"]: @@ -1348,8 +1348,8 @@ class Data: 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().failure(info=Constants.RESAMPLE_FAILURE + + Constants.FAILURE_REASON["Resample_Exception"] + "\n" + format_exc()) return Result().success(info=Constants.RESAMPLE_FINISHED) diff --git a/func/Module_bcg_quality_label.py b/func/Module_bcg_quality_label.py index d903e9f..8a51c6f 100644 --- a/func/Module_bcg_quality_label.py +++ b/func/Module_bcg_quality_label.py @@ -1072,7 +1072,7 @@ class Data(): def resample(self): if self.BCG is None: - Result().failure(info=Constants.RESAMPLE_FAILURE + Constants.FAILURE_REASON["Data_Not_Exist"]) + return Result().failure(info=Constants.RESAMPLE_FAILURE + Constants.FAILURE_REASON["Data_Not_Exist"]) try: if Config["InputConfig"]["BCGFreq"] != Config["InputConfig"]["UseFreq"]: @@ -1082,8 +1082,8 @@ class Data(): 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().failure(info=Constants.RESAMPLE_FAILURE + + Constants.FAILURE_REASON["Resample_Exception"] + "\n" + format_exc()) return Result().success(info=Constants.RESAMPLE_FINISHED) diff --git a/func/Module_precisely_align.py b/func/Module_precisely_align.py index 98934a6..005a798 100644 --- a/func/Module_precisely_align.py +++ b/func/Module_precisely_align.py @@ -1559,7 +1559,7 @@ class Data: def resample(self): if self.raw_orgBcg is None or self.raw_BCG is None or self.raw_ECG is None: - Result().failure(info=Constants.RESAMPLE_FAILURE + Constants.FAILURE_REASON["Data_Not_Exist"]) + return Result().failure(info=Constants.RESAMPLE_FAILURE + Constants.FAILURE_REASON["Data_Not_Exist"]) try: if Config["InputConfig"]["orgBcgFreq"] != Config["InputConfig"]["UseFreq"]: @@ -1569,8 +1569,8 @@ class Data: 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().failure(info=Constants.RESAMPLE_FAILURE + + Constants.FAILURE_REASON["Resample_Exception"] + "\n" + format_exc()) return Result().success(info=Constants.RESAMPLE_FINISHED) diff --git a/func/Module_preprocess.py b/func/Module_preprocess.py index f016e26..ed869a4 100644 --- a/func/Module_preprocess.py +++ b/func/Module_preprocess.py @@ -432,7 +432,7 @@ class Data: def resample(self): if self.raw_data is None: - Result().failure(info=Constants.RESAMPLE_FAILURE + Constants.FAILURE_REASON["Data_Not_Exist"]) + return Result().failure(info=Constants.RESAMPLE_FAILURE + Constants.FAILURE_REASON["Data_Not_Exist"]) try: if Config["InputConfig"]["Freq"] != Config["OutputConfig"]["Freq"]: @@ -442,34 +442,45 @@ class Data: else: return Result().success(info=Constants.RESAMPLE_NO_NEED) except Exception as e: - Result().failure(info=Constants.RESAMPLE_FAILURE + + return 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.raw_data is None: - Result().failure(info=Constants.PREPROCESS_FAILURE + Constants.FAILURE_REASON["Data_Not_Exist"]) + return Result().failure(info=Constants.PREPROCESS_FAILURE + Constants.FAILURE_REASON["Data_Not_Exist"]) try: - if Config["Mode"] == "BCG": - self.processed_data = Butterworth_for_BCG_PreProcess(self.raw_data, type='bandpass', - low_cut=Config["Filter"]["BCGBandPassLow"], - high_cut=Config["Filter"]["BCGBandPassHigh"], - order=Config["Filter"]["BCGBandPassOrder"], - sample_rate=Config["OutputConfig"]["Freq"]) + if Config["Filter"]["BCGBandPassOrder"] == 0: + self.processed_data = self.raw_data + else: + if Config["Filter"]["BCGBandPassLow"] >= Config["Filter"]["BCGBandPassHigh"]: + return Result().failure( + info=Constants.PREPROCESS_FAILURE + Constants.FAILURE_REASON["Filter_Args_Not_Correct"]) + self.processed_data = Butterworth_for_BCG_PreProcess(self.raw_data, type='bandpass', + low_cut=Config["Filter"]["BCGBandPassLow"], + high_cut=Config["Filter"]["BCGBandPassHigh"], + order=Config["Filter"]["BCGBandPassOrder"], + sample_rate=Config["OutputConfig"]["Freq"]) elif Config["Mode"] == "ECG": - self.processed_data = Butterworth_for_ECG_PreProcess(self.raw_data, type='bandpass', - low_cut=Config["Filter"]["ECGBandPassLow"], - high_cut=Config["Filter"]["ECGBandPassHigh"], - order=Config["Filter"]["ECGBandPassOrder"], - sample_rate=Config["OutputConfig"]["Freq"]) + if Config["Filter"]["ECGBandPassOrder"] == 0: + self.processed_data = self.raw_data + else: + if Config["Filter"]["ECGBandPassLow"] >= Config["Filter"]["ECGBandPassHigh"]: + return Result().failure( + info=Constants.PREPROCESS_FAILURE + Constants.FAILURE_REASON["Filter_Args_Not_Correct"]) + self.processed_data = Butterworth_for_ECG_PreProcess(self.raw_data, type='bandpass', + low_cut=Config["Filter"]["ECGBandPassLow"], + high_cut=Config["Filter"]["ECGBandPassHigh"], + order=Config["Filter"]["ECGBandPassOrder"], + sample_rate=Config["OutputConfig"]["Freq"]) else: raise ValueError("模式不存在") except Exception as e: - Result().failure(info=Constants.PREPROCESS_FAILURE + - Constants.FAILURE_REASON["Preprocess_Exception"] + "\n" + format_exc()) + return Result().failure(info=Constants.PREPROCESS_FAILURE + + Constants.FAILURE_REASON["Preprocess_Exception"] + "\n" + format_exc()) return Result().success(info=Constants.PREPROCESS_FINISHED) diff --git a/func/Module_resp_quality_label.py b/func/Module_resp_quality_label.py index e2e0163..2c7f594 100644 --- a/func/Module_resp_quality_label.py +++ b/func/Module_resp_quality_label.py @@ -806,8 +806,7 @@ class MainWindow_resp_quality_label(QMainWindow): def __slot_btn_refilter_orgBcg__(self): PublicFunc.__disableAllButton__(self, ButtonState) if len(self.data.OrgBCG_Processed) == 0: - Result().failure(info=Constants.RESAMPLE_FAILURE + Constants.FAILURE_REASON["Data_Not_Exist"]) - return + return Result().failure(info=Constants.RESAMPLE_FAILURE + Constants.FAILURE_REASON["Data_Not_Exist"]) if self.ui.radioButton_orgBcg_fillterMode_custom.isChecked(): if self.check_filter_args() is False: @@ -1301,7 +1300,7 @@ class Data(): def resample_tho(self): if self.Tho is None: - Result().failure(info=Constants.RESAMPLE_FAILURE + Constants.FAILURE_REASON["Data_Not_Exist"]) + return Result().failure(info=Constants.RESAMPLE_FAILURE + Constants.FAILURE_REASON["Data_Not_Exist"]) try: if Config["InputConfig"]["ThoFreq"] != Config["InputConfig"]["ThoUseFreq"]: @@ -1311,8 +1310,8 @@ class Data(): 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().failure(info=Constants.RESAMPLE_FAILURE + + Constants.FAILURE_REASON["Resample_Exception"] + "\n" + format_exc()) return Result().success(info=Constants.RESAMPLE_FINISHED) @@ -1477,7 +1476,7 @@ class Data(): def resample_tho_and_OrgBCG(self): if (self.OrgBCG is None) or (self.Tho is None): - Result().failure(info=Constants.RESAMPLE_FAILURE + Constants.FAILURE_REASON["Data_Not_Exist"]) + return Result().failure(info=Constants.RESAMPLE_FAILURE + Constants.FAILURE_REASON["Data_Not_Exist"]) try: if ((Config["InputConfig"]["OrgBCGFreq"] != Config["InputConfig"]["OrgBCGUseFreq"]) @@ -1494,8 +1493,8 @@ class Data(): 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().failure(info=Constants.RESAMPLE_FAILURE + + Constants.FAILURE_REASON["Resample_Exception"] + "\n" + format_exc()) return Result().success(info=Constants.RESAMPLE_FINISHED) diff --git a/func/utils/Constants.py b/func/utils/Constants.py index 7cbdab4..b1c6d08 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": "(信号长度不正确)", + "Filter_Args_Not_Correct": "(滤波器参数输入不正确)", "Open_Data_Exception": "(打开数据异常)", "Process_Exception": "(处理异常)", From ba2de0df39c3cf48201e899dca414c3690971b7a Mon Sep 17 00:00:00 2001 From: Yorusora Date: Tue, 3 Jun 2025 23:56:36 +0800 Subject: [PATCH 4/5] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BA=86=E5=A4=9A?= =?UTF-8?q?=E5=A4=84=E6=BB=A4=E6=B3=A2=E5=99=A8=E7=9A=84=E6=BB=A4=E6=B3=A2?= =?UTF-8?q?=E5=8F=82=E6=95=B0=E4=B8=8D=E5=88=A4=E6=96=AD=E6=98=AF=E5=90=A6?= =?UTF-8?q?=E5=90=88=E6=B3=95=E7=9A=84=E9=97=AE=E9=A2=98=20=E5=BD=93?= =?UTF-8?q?=E6=BB=A4=E6=B3=A2=E5=99=A8=E9=98=B6=E6=95=B0=E4=B8=BA0?= =?UTF-8?q?=E6=97=B6=EF=BC=8C=E5=B0=86=E8=BE=93=E5=87=BA=E5=8E=9F=E5=A7=8B?= =?UTF-8?q?=E4=BF=A1=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- func/Module_detect_Jpeak.py | 7 +++++++ func/Module_detect_Rpeak.py | 4 ++++ func/Module_label_check.py | 34 ++++++++++++++++++++++--------- func/Module_preprocess.py | 6 ++++-- func/Module_resp_quality_label.py | 4 +++- func/utils/Constants.py | 7 ++++--- 6 files changed, 46 insertions(+), 16 deletions(-) diff --git a/func/Module_detect_Jpeak.py b/func/Module_detect_Jpeak.py index 11f36ff..9ccca43 100644 --- a/func/Module_detect_Jpeak.py +++ b/func/Module_detect_Jpeak.py @@ -424,6 +424,10 @@ class Data: Constants.FAILURE_REASON["Data_Not_Exist"]) try: + if ((Config["Filter"]["BandPassLow"] >= Config["Filter"]["BandPassHigh"]) or + (Config["Filter"]["BandPassLow"] <= 0) or (Config["Filter"]["BandPassHigh"] <= 0)): + return Result().failure( + info=Constants.PREPROCESS_FAILURE + Constants.FAILURE_REASON["Filter_Args_Not_Correct"]) self.processed_data = preprocess(self.raw_data, Config["InputConfig"]["Freq"], Config["Filter"]["BandPassLow"], @@ -445,6 +449,9 @@ class Data: Constants.FAILURE_REASON["Data_Not_Exist"]) try: + if Config["IntervalLow"] >= Config["IntervalHigh"]: + return Result().failure( + info=Constants.DETECT_JPEAK_PREDICT_FAILURE + Constants.FAILURE_REASON["Interval_Args_Not_Correct"]) self.peak, self.interval = Jpeak_Detection(model.selected_model, Path(model.model_folder_path) / Path(model.selected_model), self.processed_data, diff --git a/func/Module_detect_Rpeak.py b/func/Module_detect_Rpeak.py index f884eb4..879d68e 100644 --- a/func/Module_detect_Rpeak.py +++ b/func/Module_detect_Rpeak.py @@ -425,6 +425,10 @@ class Data: Constants.FAILURE_REASON["Data_Not_Exist"]) try: + if ((Config["Filter"]["BandPassLow"] >= Config["Filter"]["BandPassHigh"]) or + (Config["Filter"]["BandPassLow"] <= 0) or (Config["Filter"]["BandPassHigh"] <= 0)): + return Result().failure( + info=Constants.PREPROCESS_FAILURE + Constants.FAILURE_REASON["Filter_Args_Not_Correct"]) self.processed_data = preprocess(self.raw_data, Config["InputConfig"]["Freq"], Config["Filter"]["BandPassLow"], diff --git a/func/Module_label_check.py b/func/Module_label_check.py index e28b0b1..80bf7a1 100644 --- a/func/Module_label_check.py +++ b/func/Module_label_check.py @@ -986,17 +986,31 @@ class Data: try: if Config["Mode"] == "BCG": - self.processed_data = data_preprocess_for_label_check(self.raw_data, - Config["Filter"]["BCGBandPassOrder"], - Config["Filter"]["BCGBandPassLow"], - Config["Filter"]["BCGBandPassHigh"], - Config["InputConfig"]["Freq"]) + if Config["Filter"]["BCGBandPassOrder"] == 0: + self.processed_data = self.raw_data + else: + if ((Config["Filter"]["BCGBandPassLow"] >= Config["Filter"]["BCGBandPassHigh"]) or + (Config["Filter"]["BCGBandPassLow"] <= 0) or (Config["Filter"]["BCGBandPassHigh"] <= 0)): + return Result().failure( + info=Constants.PREPROCESS_FAILURE + Constants.FAILURE_REASON["Filter_Args_Not_Correct"]) + self.processed_data = data_preprocess_for_label_check(self.raw_data, + Config["Filter"]["BCGBandPassOrder"], + Config["Filter"]["BCGBandPassLow"], + Config["Filter"]["BCGBandPassHigh"], + Config["InputConfig"]["Freq"]) elif Config["Mode"] == "ECG": - self.processed_data = data_preprocess_for_label_check(self.raw_data, - Config["Filter"]["ECGBandPassOrder"], - Config["Filter"]["ECGBandPassLow"], - Config["Filter"]["ECGBandPassHigh"], - Config["InputConfig"]["Freq"]) + if Config["Filter"]["ECGBandPassOrder"] == 0: + self.processed_data = self.raw_data + else: + if ((Config["Filter"]["ECGBandPassLow"] >= Config["Filter"]["ECGBandPassHigh"]) or + (Config["Filter"]["ECGBandPassLow"] <= 0) or (Config["Filter"]["ECGBandPassHigh"] <= 0)): + return Result().failure( + info=Constants.PREPROCESS_FAILURE + Constants.FAILURE_REASON["Filter_Args_Not_Correct"]) + self.processed_data = data_preprocess_for_label_check(self.raw_data, + Config["Filter"]["ECGBandPassOrder"], + Config["Filter"]["ECGBandPassLow"], + Config["Filter"]["ECGBandPassHigh"], + Config["InputConfig"]["Freq"]) else: raise ValueError("模式不存在") self.original_peak_y = [self.processed_data[x] for x in self.original_peak] diff --git a/func/Module_preprocess.py b/func/Module_preprocess.py index ed869a4..c52ca9d 100644 --- a/func/Module_preprocess.py +++ b/func/Module_preprocess.py @@ -456,7 +456,8 @@ class Data: if Config["Filter"]["BCGBandPassOrder"] == 0: self.processed_data = self.raw_data else: - if Config["Filter"]["BCGBandPassLow"] >= Config["Filter"]["BCGBandPassHigh"]: + if ((Config["Filter"]["BCGBandPassLow"] >= Config["Filter"]["BCGBandPassHigh"]) or + (Config["Filter"]["BCGBandPassLow"] <= 0) or (Config["Filter"]["BCGBandPassHigh"] <= 0)): return Result().failure( info=Constants.PREPROCESS_FAILURE + Constants.FAILURE_REASON["Filter_Args_Not_Correct"]) self.processed_data = Butterworth_for_BCG_PreProcess(self.raw_data, type='bandpass', @@ -468,7 +469,8 @@ class Data: if Config["Filter"]["ECGBandPassOrder"] == 0: self.processed_data = self.raw_data else: - if Config["Filter"]["ECGBandPassLow"] >= Config["Filter"]["ECGBandPassHigh"]: + if ((Config["Filter"]["ECGBandPassLow"] >= Config["Filter"]["ECGBandPassHigh"]) or + (Config["Filter"]["ECGBandPassLow"] <= 0) or (Config["Filter"]["ECGBandPassHigh"] <= 0)): return Result().failure( info=Constants.PREPROCESS_FAILURE + Constants.FAILURE_REASON["Filter_Args_Not_Correct"]) self.processed_data = Butterworth_for_ECG_PreProcess(self.raw_data, type='bandpass', diff --git a/func/Module_resp_quality_label.py b/func/Module_resp_quality_label.py index 2c7f594..b37a74c 100644 --- a/func/Module_resp_quality_label.py +++ b/func/Module_resp_quality_label.py @@ -811,6 +811,7 @@ class MainWindow_resp_quality_label(QMainWindow): if self.ui.radioButton_orgBcg_fillterMode_custom.isChecked(): if self.check_filter_args() is False: PublicFunc.msgbox_output(self, Constants.RESP_QUALITY_LABEL_CUSTOM_FILTER_ARGS_ERROR, Constants.MSGBOX_TYPE_ERROR) + PublicFunc.finish_operation(self, ButtonState) return result = self.__plot__() if not result.status: @@ -1035,7 +1036,8 @@ class MainWindow_resp_quality_label(QMainWindow): self.ax1_spectrum.set_title(Constants.RESP_QUALITY_LABEL_SPECTRUM_THO_TITLE, fontsize=8) def check_filter_args(self): - if (float(Config["Filter"]["BandPassLow"]) >= float(Config["Filter"]["BandPassHigh"])): + if ((float(Config["Filter"]["BandPassLow"]) >= float(Config["Filter"]["BandPassHigh"])) or + (float(Config["Filter"]["BandPassLow"]) <= 0) or (float(Config["Filter"]["BandPassHigh"]) <= 0)): return False return True diff --git a/func/utils/Constants.py b/func/utils/Constants.py index b1c6d08..512e286 100644 --- a/func/utils/Constants.py +++ b/func/utils/Constants.py @@ -106,7 +106,8 @@ class Constants: "Data_Length_not_Correct": "(orgBcg和BCG长度不匹配)", "Artifact_Format_Not_Correct": "(体动长度或格式不正确)", "Data_Length_Not_Correct": "(信号长度不正确)", - "Filter_Args_Not_Correct": "(滤波器参数输入不正确)", + "Filter_Args_Not_Correct": "(滤波器参数输入不正确,上下截止频率都要大于0,且上截止频率应大于下截止频率)", + "Interval_Args_Not_Correct": "(间期参数输入不正确,上间期阈值应大于下间期阈值)", "Open_Data_Exception": "(打开数据异常)", "Process_Exception": "(处理异常)", @@ -448,8 +449,8 @@ class Constants: RESP_QUALITY_LABEL_ADD_POINTS_SUCCESSFULLY: str = "成功新增点,横坐标:" RESP_QUALITY_LABEL_REMOVE_POINTS_SUCCESSFULLY: str = "成功删除点,横坐标:" RESP_QUALITY_LABEL_NO_POINT_IN_THE_INTERVAL: str = "所选区间内无新增或删除点" - RESP_QUALITY_LABEL_CUSTOM_FILTER_ARGS_ERROR: str = "OrgBCG带通滤波频率设置范围应为数字,范围是0~1" - RESP_QUALITY_LABEL_AUTOLABEL_ARGS_ERROR: str = "人工标注阈值设置范围应为数字,范围是0~1" + RESP_QUALITY_LABEL_CUSTOM_FILTER_ARGS_ERROR: str = "OrgBCG带通滤波频率设置范围应为数字,范围是0~1,且上截止频率应大于下截止频率" + RESP_QUALITY_LABEL_AUTOLABEL_ARGS_ERROR: str = "人工标注阈值设置范围应为数字,范围是0~1,且[1]应大于[0]" RESP_QUALITY_LABEL_CHECK_ARGS_QUESTION_CONTENT: str = "你确定要执行此操作吗,请确保参数输入正确" RESP_QUALITY_LABEL_ACTION_LABEL_MULTIPLE_NAME: str = f"批量更改标签({Params.RESP_QUALITY_LABEL_ACTION_LABEL_MULTIPLE_SHORTCUT_KEY})" RESP_QUALITY_LABEL_A_QUALITY: int = 1 From 65f8bef69498c905579fbd26d3e932bbc265c86d Mon Sep 17 00:00:00 2001 From: Yorusora Date: Wed, 4 Jun 2025 00:29:18 +0800 Subject: [PATCH 5/5] =?UTF-8?q?1=E3=80=81=E4=BF=AE=E5=A4=8D=E4=BA=86?= =?UTF-8?q?=E5=8F=AA=E8=AF=BB=E6=9D=83=E9=99=90=E4=B8=8B=E4=BF=9D=E5=AD=98?= =?UTF-8?q?csv=E6=97=B6=EF=BC=8C=E6=97=A0=E6=B3=95=E6=AD=A3=E7=A1=AE?= =?UTF-8?q?=E4=BF=9D=E5=AD=98=E7=9A=84=E9=97=AE=E9=A2=98=EF=BC=8C=E5=BD=93?= =?UTF-8?q?=E6=97=A0=E6=B3=95=E6=AD=A3=E7=A1=AE=E4=BF=9D=E5=AD=98=E6=97=B6?= =?UTF-8?q?=EF=BC=8C=E7=A8=8B=E5=BA=8F=E5=B0=86=E8=BE=93=E5=87=BA=E8=BE=83?= =?UTF-8?q?=E4=B8=BA=E7=9B=B4=E8=A7=82=E7=9A=84=E6=8F=90=E7=A4=BA=E4=BF=A1?= =?UTF-8?q?=E6=81=AF=202=E3=80=81=E5=AF=B9=E5=A4=9A=E5=A4=84=E4=BF=9D?= =?UTF-8?q?=E5=AD=98=E8=B7=AF=E5=BE=84=E8=BF=9B=E8=A1=8C=E4=BA=86=E7=A9=BA?= =?UTF-8?q?=E5=80=BC=E6=A3=80=E6=B5=8B=EF=BC=8C=E4=B8=BA=E7=A9=BA=E5=80=BC?= =?UTF-8?q?=E6=97=B6=E7=A8=8B=E5=BA=8F=E5=B0=86=E8=BE=93=E5=87=BA=E8=BE=83?= =?UTF-8?q?=E4=B8=BA=E7=9B=B4=E8=A7=82=E7=9A=84=E6=8F=90=E7=A4=BA=E4=BF=A1?= =?UTF-8?q?=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- func/Module_SA_label.py | 122 +++++++++++++++++++++------ func/Module_approximately_align.py | 4 + func/Module_artifact_label.py | 4 + func/Module_bcg_quality_label.py | 4 + func/Module_cut_PSG.py | 4 + func/Module_detect_Jpeak.py | 4 + func/Module_detect_Rpeak.py | 4 + func/Module_label_check.py | 4 + func/Module_precisely_align.py | 24 ++++++ func/Module_preprocess.py | 4 + func/Module_resp_quality_label.py | 8 ++ func/utils/Constants.py | 2 + ui/MainWindow/MainWindow_SA_label.py | 18 +++- ui/MainWindow/MainWindow_SA_label.ui | 20 ++++- 14 files changed, 193 insertions(+), 33 deletions(-) diff --git a/func/Module_SA_label.py b/func/Module_SA_label.py index acc017f..365ade7 100644 --- a/func/Module_SA_label.py +++ b/func/Module_SA_label.py @@ -362,6 +362,7 @@ class MainWindow_SA_label(QMainWindow): self.ui.pushButton_prev.clicked.connect(self.__slot_btn_move__) self.ui.pushButton_next.clicked.connect(self.__slot_btn_move__) self.ui.pushButton_confirmLabel.clicked.connect(self.__slot_btn_confirmLabel__) + self.ui.pushButton_save.clicked.connect(self.__slot_btn_save__) self.ui.pushButton_quick_remark_input_waitingForTalk.clicked.connect(self.__slot_btn_quick_remark__) self.ui.pushButton_quick_remark_input_maybeDesaturation.clicked.connect(self.__slot_btn_quick_remark__) self.ui.pushButton_quick_remark_input_maybeWrongLabeled.clicked.connect(self.__slot_btn_quick_remark__) @@ -633,83 +634,105 @@ class MainWindow_SA_label(QMainWindow): self.data = Data() # 导入数据 - PublicFunc.progressbar_update(self, 1, 7, Constants.INPUTTING_DATA, 0) + PublicFunc.progressbar_update(self, 1, 9, Constants.INPUTTING_DATA, 0) result = self.data.open_file() if not result.status: - PublicFunc.text_output(self.ui, "(1/7)" + result.info, Constants.TIPS_TYPE_ERROR) + PublicFunc.text_output(self.ui, "(1/9)" + 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/7)" + result.info, Constants.TIPS_TYPE_INFO) + PublicFunc.text_output(self.ui, "(1/9)" + result.info, Constants.TIPS_TYPE_INFO) # 获取存档 - PublicFunc.progressbar_update(self, 2, 7, Constants.LOADING_ARCHIVE, 20) + PublicFunc.progressbar_update(self, 2, 9, Constants.LOADING_ARCHIVE, 15) result = self.data.get_archive() if not result.status: - PublicFunc.text_output(self.ui, "(2/7)" + result.info, Constants.TIPS_TYPE_ERROR) + PublicFunc.text_output(self.ui, "(2/9)" + 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/7)" + result.info, Constants.TIPS_TYPE_INFO) + PublicFunc.text_output(self.ui, "(2/9)" + result.info, Constants.TIPS_TYPE_INFO) + + # 保存 + PublicFunc.progressbar_update(self, 3, 9, Constants.SAVING_DATA, 20) + result = self.data.save() + if not result.status: + PublicFunc.text_output(self.ui, "(3/9)" + 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/9)" + result.info, Constants.TIPS_TYPE_INFO) + + # 保存 + PublicFunc.progressbar_update(self, 4, 9, Constants.SAVING_DATA, 25) + result = self.data.save_2() + if not result.status: + PublicFunc.text_output(self.ui, "(4/9)" + 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/9)" + result.info, Constants.TIPS_TYPE_INFO) # 数据预处理 - PublicFunc.progressbar_update(self, 3, 7, Constants.PREPROCESSING_DATA, 30) + PublicFunc.progressbar_update(self, 5, 9, Constants.PREPROCESSING_DATA, 30) result = self.data.preprocess() if not result.status: - PublicFunc.text_output(self.ui, "(3/7)" + result.info, Constants.TIPS_TYPE_ERROR) + PublicFunc.text_output(self.ui, "(5/9)" + 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/7)" + result.info, Constants.TIPS_TYPE_INFO) + PublicFunc.text_output(self.ui, "(5/9)" + result.info, Constants.TIPS_TYPE_INFO) # 重采样 - PublicFunc.progressbar_update(self, 4, 7, Constants.RESAMPLING_DATA, 50) + PublicFunc.progressbar_update(self, 6, 9, Constants.RESAMPLING_DATA, 50) result = self.data.resample() for key, value in self.data.channel.items(): PublicFunc.text_output(self.ui, key + "重采样后的长度:" + str(len(value)), Constants.TIPS_TYPE_INFO) if not result.status: - PublicFunc.text_output(self.ui, "(4/7)" + result.info, Constants.TIPS_TYPE_ERROR) + PublicFunc.text_output(self.ui, "(6/9)" + 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/7)" + result.info, Constants.TIPS_TYPE_INFO) + PublicFunc.text_output(self.ui, "(6/9)" + result.info, Constants.TIPS_TYPE_INFO) # 绘图 - PublicFunc.progressbar_update(self, 5, 7, Constants.DRAWING_DATA, 70) + PublicFunc.progressbar_update(self, 7, 9, Constants.DRAWING_DATA, 70) result = self.__plot__() if not result.status: - PublicFunc.text_output(self.ui, "(5/7)" + result.info, Constants.TIPS_TYPE_ERROR) + PublicFunc.text_output(self.ui, "(7/9)" + 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/7)" + result.info, Constants.TIPS_TYPE_INFO) + PublicFunc.text_output(self.ui, "(7/9)" + result.info, Constants.TIPS_TYPE_INFO) # 更新表格 - PublicFunc.progressbar_update(self, 6, 7, Constants.UPDATING_TABLEWIDGET, 90) + PublicFunc.progressbar_update(self, 8, 9, Constants.UPDATING_TABLEWIDGET, 90) result = self.update_tableWidget() if not result.status: - PublicFunc.text_output(self.ui, "(6/7)" + result.info, Constants.TIPS_TYPE_ERROR) + PublicFunc.text_output(self.ui, "(8/9)" + 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, "(6/7)" + result.info, Constants.TIPS_TYPE_INFO) + PublicFunc.text_output(self.ui, "(8/9)" + result.info, Constants.TIPS_TYPE_INFO) # 更新信息 - PublicFunc.progressbar_update(self, 7, 7, Constants.UPDATING_INFO, 95) + PublicFunc.progressbar_update(self, 9, 9, Constants.UPDATING_INFO, 95) result = self.update_UI_Args() if not result.status: - PublicFunc.text_output(self.ui, "(7/7)" + result.info, Constants.TIPS_TYPE_ERROR) + PublicFunc.text_output(self.ui, "(9/9)" + 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, "(7/7)" + result.info, Constants.TIPS_TYPE_INFO) + PublicFunc.text_output(self.ui, "(9/9)" + result.info, Constants.TIPS_TYPE_INFO) if (self.data.df_corrected["isLabeled"] == 1).all(): self.ui.checkBox_examineLabeled.setChecked(False) @@ -779,8 +802,13 @@ class MainWindow_SA_label(QMainWindow): self.data.df_addNew = self.pd_add_new_row(self.data.df_addNew, score, remark, correct_Start, correct_End, correct_EventsType, isLabeled) result = self.data.save_2() - info = f"保存新事件打标结果到csv。score:{str(score)},correct_Start:{str(correct_Start)},correct_End:{str(correct_End)},correct_EventsType:{str(correct_EventsType)}" - PublicFunc.text_output(self.ui, info, Constants.MSGBOX_TYPE_INFO) + if result.status: + info = f"保存新事件打标结果到csv。score:{str(score)},correct_Start:{str(correct_Start)},correct_End:{str(correct_End)},correct_EventsType:{str(correct_EventsType)}" + PublicFunc.text_output(self.ui, info, Constants.TIPS_TYPE_INFO) + else: + info = f"未成功保存新事件打标结果到csv,错误提示:{result.info},结果已暂存到缓存中,请正确操作后重试。score:{str(score)},correct_Start:{str(correct_Start)},correct_End:{str(correct_End)},correct_EventsType:{str(correct_EventsType)}" + PublicFunc.text_output(self.ui, info, Constants.TIPS_TYPE_ERROR) + PublicFunc.msgbox_output(self, info, Constants.MSGBOX_TYPE_ERROR) else: PublicFunc.msgbox_output(self, Constants.SA_LABEL_WRONG_ARGS, Constants.MSGBOX_TYPE_ERROR) else: @@ -810,17 +838,19 @@ class MainWindow_SA_label(QMainWindow): self.data.df_corrected.at[Config["EventLabelIndexList"][ Config["PlotEventIndex"]], "correct_EventsType"] = "Hypopnea" self.data.df_corrected.at[Config["EventLabelIndexList"][Config["PlotEventIndex"]], "isLabeled"] = int(1) - # self.data.df_corrected.to_csv( - # self.BCG_Label_Path / f"export{self.mainWindow.ui_SA_label_left.comboBox_sampID.currentText()}_all.csv", - # mode='w', index=None, encoding="gbk") result = self.data.save() index = str(Config["PlotEventIndex"] + 1) score = str(self.data.df_corrected.at[Config["EventLabelIndexList"][Config["PlotEventIndex"]], "score"]) correct_Start = str(self.data.df_corrected.at[Config["EventLabelIndexList"][Config["PlotEventIndex"]], "correct_Start"]) correct_End = str(self.data.df_corrected.at[Config["EventLabelIndexList"][Config["PlotEventIndex"]], "correct_End"]) correct_EventsType = str(self.data.df_corrected.at[Config["EventLabelIndexList"][Config["PlotEventIndex"]], "correct_EventsType"]) - info = f"保存index{index}标注结果到csv。score:{score},correct_Start:{correct_Start},correct_End:{correct_End},correct_EventsType:{correct_EventsType}" - PublicFunc.text_output(self.ui, info, Constants.MSGBOX_TYPE_INFO) + if result.status: + info = f"保存index{index}标注结果到csv。score:{score},correct_Start:{correct_Start},correct_End:{correct_End},correct_EventsType:{correct_EventsType}" + PublicFunc.text_output(self.ui, info, Constants.TIPS_TYPE_INFO) + else: + info = f"未成功保存index{index}标注结果到csv,错误提示:{result.info},结果已暂存到缓存中,请正确操作后重试。score:{score},correct_Start:{correct_Start},correct_End:{correct_End},correct_EventsType:{correct_EventsType}" + PublicFunc.text_output(self.ui, info, Constants.TIPS_TYPE_ERROR) + PublicFunc.msgbox_output(self, info, Constants.MSGBOX_TYPE_ERROR) if (self.data.df_corrected.loc[Config["EventLabelIndexList"]]["isLabeled"] == 1).all(): self.ui.checkBox_examineLabeled.setChecked(False) PublicFunc.text_output(self.ui, Constants.SA_LABEL_ALL_LABELED, Constants.TIPS_TYPE_INFO) @@ -832,6 +862,34 @@ class MainWindow_SA_label(QMainWindow): info = Constants.SAVE_FAILURE + "\n" + format_exc() PublicFunc.msgbox_output(self, info, Constants.MSGBOX_TYPE_ERROR) + def __slot_btn_save__(self): + PublicFunc.__disableAllButton__(self, ButtonState) + + # 保存 + PublicFunc.progressbar_update(self, 1, 2, Constants.SAVING_DATA, 0) + result = self.data.save() + if not result.status: + PublicFunc.text_output(self.ui, "(1/2)" + 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/2)" + result.info, Constants.TIPS_TYPE_INFO) + + # 保存 + PublicFunc.progressbar_update(self, 2, 2, Constants.SAVING_DATA, 50) + result = self.data.save_2() + if not result.status: + PublicFunc.text_output(self.ui, "(2/2)" + 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/2)" + result.info, Constants.TIPS_TYPE_INFO) + + PublicFunc.msgbox_output(self, result.info, Constants.TIPS_TYPE_INFO) + PublicFunc.finish_operation(self, ButtonState) + def __slot_btn_move__(self): if self.data is None: return @@ -1595,6 +1653,10 @@ class Data: try: self.df_corrected.to_csv(Config["Path"]["Save"], mode='w', index=None, encoding="gbk") + except PermissionError as e: + return Result().failure(info=Constants.SAVE_FAILURE + Constants.FAILURE_REASON["Save_Permission_Denied"]) + except FileNotFoundError as e: + return Result().failure(info=Constants.SAVE_FAILURE + Constants.FAILURE_REASON["Save_File_Not_Found"]) except Exception as e: return Result().failure(info=Constants.SAVE_FAILURE + Constants.FAILURE_REASON["Save_Exception"] + "\n" + format_exc()) @@ -1610,6 +1672,10 @@ class Data: try: self.df_addNew.to_csv(Config["Path"]["Save_2"], mode='w', index=None, encoding="gbk") + except PermissionError as e: + return Result().failure(info=Constants.SAVE_FAILURE + Constants.FAILURE_REASON["Save_Permission_Denied"]) + except FileNotFoundError as e: + return Result().failure(info=Constants.SAVE_FAILURE + Constants.FAILURE_REASON["Save_File_Not_Found"]) except Exception as e: return Result().failure(info=Constants.SAVE_FAILURE + Constants.FAILURE_REASON["Save_Exception"] + "\n" + format_exc()) diff --git a/func/Module_approximately_align.py b/func/Module_approximately_align.py index 0c6f03d..781e6af 100644 --- a/func/Module_approximately_align.py +++ b/func/Module_approximately_align.py @@ -970,6 +970,10 @@ class Data: # 保存到csv中 df = DataFrame({"pos": [pos], "epoch": [epoch], "ApplyFrequency": [ApplyFrequency]}) df.to_csv(Path(Config["Path"]["Save"]), mode="w", header=True, index=False) + except PermissionError as e: + return Result().failure(info=Constants.SAVE_FAILURE + Constants.FAILURE_REASON["Save_Permission_Denied"]) + except FileNotFoundError as e: + return Result().failure(info=Constants.SAVE_FAILURE + Constants.FAILURE_REASON["Save_File_Not_Found"]) except Exception as e: return Result().failure(info=Constants.SAVE_FAILURE + Constants.FAILURE_REASON[ "Save_Exception"] + "\n" + format_exc()) diff --git a/func/Module_artifact_label.py b/func/Module_artifact_label.py index 6523f98..9063d79 100644 --- a/func/Module_artifact_label.py +++ b/func/Module_artifact_label.py @@ -1399,6 +1399,10 @@ class Data: df_Artifact_b.to_csv(Path(Config["Path"]["Save_b"]), header=False, index=False, sep='\n') self.df_Artifact_a.to_csv(Path(Config["Path"]["Save_c"]), index=False, encoding=Params.GBK_ENCODING) + except PermissionError as e: + return Result().failure(info=Constants.SAVE_FAILURE + Constants.FAILURE_REASON["Save_Permission_Denied"]) + except FileNotFoundError as e: + return Result().failure(info=Constants.SAVE_FAILURE + Constants.FAILURE_REASON["Save_File_Not_Found"]) except Exception as e: return Result().failure(info=Constants.SAVE_FAILURE + Constants.FAILURE_REASON[ "Save_Exception"] + "\n" + format_exc()) diff --git a/func/Module_bcg_quality_label.py b/func/Module_bcg_quality_label.py index 8a51c6f..d48fe7d 100644 --- a/func/Module_bcg_quality_label.py +++ b/func/Module_bcg_quality_label.py @@ -1112,6 +1112,10 @@ class Data(): try: self.df_label.to_csv(Config["Path"]["Save"], index=False, encoding=Params.GBK_ENCODING) + except PermissionError as e: + return Result().failure(info=Constants.SAVE_FAILURE + Constants.FAILURE_REASON["Save_Permission_Denied"]) + except FileNotFoundError as e: + return Result().failure(info=Constants.SAVE_FAILURE + Constants.FAILURE_REASON["Save_File_Not_Found"]) except Exception as e: return Result().failure(info=filename + Constants.SAVE_FAILURE + Constants.FAILURE_REASON["Save_Exception"] + "\n" + format_exc()) diff --git a/func/Module_cut_PSG.py b/func/Module_cut_PSG.py index 1d43c64..6b2ff69 100644 --- a/func/Module_cut_PSG.py +++ b/func/Module_cut_PSG.py @@ -335,6 +335,10 @@ class Data: self.SALabel.to_csv(Path(Config["Path"]["SaveFolder"]) / Path((Config["LabelSave"]["SA Label"] + Config["EndWith"]["SA Label"])), index=False, encoding="gbk") + except PermissionError as e: + return Result().failure(info=Constants.SAVE_FAILURE + Constants.FAILURE_REASON["Save_Permission_Denied"]) + except FileNotFoundError as e: + return Result().failure(info=Constants.SAVE_FAILURE + Constants.FAILURE_REASON["Save_File_Not_Found"]) except Exception as e: return Result().failure(info=Constants.SAVE_FAILURE + Constants.FAILURE_REASON["Save_Exception"] + "\n" + format_exc()) diff --git a/func/Module_detect_Jpeak.py b/func/Module_detect_Jpeak.py index 9ccca43..0cf45e7 100644 --- a/func/Module_detect_Jpeak.py +++ b/func/Module_detect_Jpeak.py @@ -472,6 +472,10 @@ class Data: try: chunk.to_csv(Config["Path"]["Save"], mode='a', index=False, header=False) + except PermissionError as e: + return Result().failure(info=Constants.SAVE_FAILURE + Constants.FAILURE_REASON["Save_Permission_Denied"]) + except FileNotFoundError as e: + return Result().failure(info=Constants.SAVE_FAILURE + Constants.FAILURE_REASON["Save_File_Not_Found"]) except Exception as e: return Result().failure(info=Constants.SAVE_FAILURE + Constants.FAILURE_REASON["Save_Exception"] + "\n" + format_exc()) diff --git a/func/Module_detect_Rpeak.py b/func/Module_detect_Rpeak.py index 879d68e..06c56d6 100644 --- a/func/Module_detect_Rpeak.py +++ b/func/Module_detect_Rpeak.py @@ -462,6 +462,10 @@ class Data: try: chunk.to_csv(Config["Path"]["Save"], mode='a', index=False, header=False) + except PermissionError as e: + return Result().failure(info=Constants.SAVE_FAILURE + Constants.FAILURE_REASON["Save_Permission_Denied"]) + except FileNotFoundError as e: + return Result().failure(info=Constants.SAVE_FAILURE + Constants.FAILURE_REASON["Save_File_Not_Found"]) except Exception as e: return Result().failure(info=Constants.SAVE_FAILURE + Constants.FAILURE_REASON["Save_Exception"] + "\n" + format_exc()) diff --git a/func/Module_label_check.py b/func/Module_label_check.py index 80bf7a1..8711f0d 100644 --- a/func/Module_label_check.py +++ b/func/Module_label_check.py @@ -1027,6 +1027,10 @@ class Data: try: DataFrame(self.corrected_peak).to_csv(Config["Path"]["Save"], index=False, header=False) + except PermissionError as e: + return Result().failure(info=Constants.SAVE_FAILURE + Constants.FAILURE_REASON["Save_Permission_Denied"]) + except FileNotFoundError as e: + return Result().failure(info=Constants.SAVE_FAILURE + Constants.FAILURE_REASON["Save_File_Not_Found"]) except Exception as e: return Result().failure(info=Constants.SAVE_FAILURE + Constants.FAILURE_REASON["Save_Exception"] + "\n" + format_exc()) diff --git a/func/Module_precisely_align.py b/func/Module_precisely_align.py index 005a798..65b1126 100644 --- a/func/Module_precisely_align.py +++ b/func/Module_precisely_align.py @@ -1904,6 +1904,10 @@ class Data: } save_data = [str(save_data)] DataFrame(save_data).to_csv(Config["Path"]["Save_AlignInfo"], index=False, header=False) + except PermissionError as e: + return Result().failure(info=Constants.SAVE_FAILURE + Constants.FAILURE_REASON["Save_Permission_Denied"]) + except FileNotFoundError as e: + return Result().failure(info=Constants.SAVE_FAILURE + Constants.FAILURE_REASON["Save_File_Not_Found"]) except Exception as e: return Result().failure(info=Constants.PRECISELY_ALIGN_SAVING_ALIGNINFO_FAILURE + Constants.FAILURE_REASON["Save_Exception"] + "\n" + format_exc()) @@ -1925,6 +1929,10 @@ class Data: try: chunk.to_csv(Config["Path"]["Save_OrgBCG"], mode='a', index=False, header=False) + except PermissionError as e: + return Result().failure(info=Constants.SAVE_FAILURE + Constants.FAILURE_REASON["Save_Permission_Denied"]) + except FileNotFoundError as e: + return Result().failure(info=Constants.SAVE_FAILURE + Constants.FAILURE_REASON["Save_File_Not_Found"]) except Exception as e: return Result().failure(info=Constants.PRECISELY_ALIGN_SAVING_RES_ORGBCG_FAILURE + Constants.FAILURE_REASON["Save_Exception"] + "\n" + format_exc()) @@ -1941,6 +1949,10 @@ class Data: try: chunk.to_csv(Config["Path"]["Save_BCG"], mode='a', index=False, header=False) + except PermissionError as e: + return Result().failure(info=Constants.SAVE_FAILURE + Constants.FAILURE_REASON["Save_Permission_Denied"]) + except FileNotFoundError as e: + return Result().failure(info=Constants.SAVE_FAILURE + Constants.FAILURE_REASON["Save_File_Not_Found"]) except Exception as e: return Result().failure(info=Constants.PRECISELY_ALIGN_SAVING_RES_BCG_FAILURE + Constants.FAILURE_REASON["Save_Exception"] + "\n" + format_exc()) @@ -1957,6 +1969,10 @@ class Data: try: chunk.to_csv(Config["Path"]["Save_ECG"], mode='a', index=False, header=False) + except PermissionError as e: + return Result().failure(info=Constants.SAVE_FAILURE + Constants.FAILURE_REASON["Save_Permission_Denied"]) + except FileNotFoundError as e: + return Result().failure(info=Constants.SAVE_FAILURE + Constants.FAILURE_REASON["Save_File_Not_Found"]) except Exception as e: return Result().failure(info=Constants.PRECISELY_ALIGN_SAVING_CUT_ECG_FAILURE + Constants.FAILURE_REASON["Save_Exception"] + "\n" + format_exc()) @@ -1973,6 +1989,10 @@ class Data: try: chunk.to_csv(Config["Path"]["Save_Jpeak"], mode='a', index=False, header=False) + except PermissionError as e: + return Result().failure(info=Constants.SAVE_FAILURE + Constants.FAILURE_REASON["Save_Permission_Denied"]) + except FileNotFoundError as e: + return Result().failure(info=Constants.SAVE_FAILURE + Constants.FAILURE_REASON["Save_File_Not_Found"]) except Exception as e: return Result().failure(info=Constants.PRECISELY_ALIGN_SAVING_CUT_JPEAK_FAILURE + Constants.FAILURE_REASON["Save_Exception"] + "\n" + format_exc()) @@ -1989,6 +2009,10 @@ class Data: try: chunk.to_csv(Config["Path"]["Save_Rpeak"], mode='a', index=False, header=False) + except PermissionError as e: + return Result().failure(info=Constants.SAVE_FAILURE + Constants.FAILURE_REASON["Save_Permission_Denied"]) + except FileNotFoundError as e: + return Result().failure(info=Constants.SAVE_FAILURE + Constants.FAILURE_REASON["Save_File_Not_Found"]) except Exception as e: return Result().failure(info=Constants.PRECISELY_ALIGN_SAVING_CUT_RPEAK_FAILURE + Constants.FAILURE_REASON["Save_Exception"] + "\n" + format_exc()) diff --git a/func/Module_preprocess.py b/func/Module_preprocess.py index c52ca9d..36e8e80 100644 --- a/func/Module_preprocess.py +++ b/func/Module_preprocess.py @@ -492,6 +492,10 @@ class Data: try: chunk.to_csv(Config["Path"]["Save"], mode='a', index=False, header=False, float_format='%.4f') + except PermissionError as e: + return Result().failure(info=Constants.SAVE_FAILURE + Constants.FAILURE_REASON["Save_Permission_Denied"]) + except FileNotFoundError as e: + return Result().failure(info=Constants.SAVE_FAILURE + Constants.FAILURE_REASON["Save_File_Not_Found"]) except Exception as e: return Result().failure(info=Constants.SAVE_FAILURE + Constants.FAILURE_REASON["Save_Exception"] + "\n" + format_exc()) diff --git a/func/Module_resp_quality_label.py b/func/Module_resp_quality_label.py index b37a74c..cf0981a 100644 --- a/func/Module_resp_quality_label.py +++ b/func/Module_resp_quality_label.py @@ -1354,6 +1354,10 @@ class Data(): try: DataFrame(self.Tho_peak).to_csv(Path(Config["Path"]["Save_Tho_peak"]), mode='w', index=False, header=False) + except PermissionError as e: + return Result().failure(info=Constants.SAVE_FAILURE + Constants.FAILURE_REASON["Save_Permission_Denied"]) + except FileNotFoundError as e: + return Result().failure(info=Constants.SAVE_FAILURE + Constants.FAILURE_REASON["Save_File_Not_Found"]) except Exception as e: return Result().failure(info=Filename.THO_PEAK + Constants.SAVE_FAILURE + Constants.FAILURE_REASON["Save_Exception"] + "\n" + format_exc()) @@ -1539,6 +1543,10 @@ class Data(): try: DataFrame(self.resp_quality_label).to_csv(Path(Config["Path"]["Save_Resp_quality_label"]), mode='w', index=False, header=False) + except PermissionError as e: + return Result().failure(info=Constants.SAVE_FAILURE + Constants.FAILURE_REASON["Save_Permission_Denied"]) + except FileNotFoundError as e: + return Result().failure(info=Constants.SAVE_FAILURE + Constants.FAILURE_REASON["Save_File_Not_Found"]) except Exception as e: return Result().failure(info=Filename.RESP_QUALITY_LABEL + Constants.SAVE_FAILURE + Constants.FAILURE_REASON["Save_Exception"] + "\n" + format_exc()) diff --git a/func/utils/Constants.py b/func/utils/Constants.py index 512e286..7f36958 100644 --- a/func/utils/Constants.py +++ b/func/utils/Constants.py @@ -108,6 +108,8 @@ class Constants: "Data_Length_Not_Correct": "(信号长度不正确)", "Filter_Args_Not_Correct": "(滤波器参数输入不正确,上下截止频率都要大于0,且上截止频率应大于下截止频率)", "Interval_Args_Not_Correct": "(间期参数输入不正确,上间期阈值应大于下间期阈值)", + "Save_Permission_Denied": "(所保存的文件正在被其他进程使用)", + "Save_File_Not_Found": "(保存路径不存在)", "Open_Data_Exception": "(打开数据异常)", "Process_Exception": "(处理异常)", diff --git a/ui/MainWindow/MainWindow_SA_label.py b/ui/MainWindow/MainWindow_SA_label.py index 21c196f..4cf694f 100644 --- a/ui/MainWindow/MainWindow_SA_label.py +++ b/ui/MainWindow/MainWindow_SA_label.py @@ -143,6 +143,17 @@ class Ui_MainWindow_SA_label(object): self.verticalLayout_2.addItem(self.verticalSpacer_3) + self.pushButton_save = QPushButton(self.groupBox_left) + self.pushButton_save.setObjectName(u"pushButton_save") + sizePolicy1 = QSizePolicy(QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Preferred) + sizePolicy1.setHorizontalStretch(0) + sizePolicy1.setVerticalStretch(0) + sizePolicy1.setHeightForWidth(self.pushButton_save.sizePolicy().hasHeightForWidth()) + self.pushButton_save.setSizePolicy(sizePolicy1) + self.pushButton_save.setFont(font1) + + self.verticalLayout_2.addWidget(self.pushButton_save) + self.groupBox_4 = QGroupBox(self.groupBox_left) self.groupBox_4.setObjectName(u"groupBox_4") self.verticalLayout_6 = QVBoxLayout(self.groupBox_4) @@ -159,7 +170,8 @@ class Ui_MainWindow_SA_label(object): self.verticalLayout_2.setStretch(1, 1) self.verticalLayout_2.setStretch(2, 15) self.verticalLayout_2.setStretch(3, 1) - self.verticalLayout_2.setStretch(4, 5) + self.verticalLayout_2.setStretch(4, 2) + self.verticalLayout_2.setStretch(5, 5) self.gridLayout.addWidget(self.groupBox_left, 0, 0, 1, 1) @@ -368,9 +380,6 @@ class Ui_MainWindow_SA_label(object): self.gridLayout_5.setObjectName(u"gridLayout_5") self.pushButton_quick_remark_input_durationNoEnough = QPushButton(self.groupBox_label_operation) self.pushButton_quick_remark_input_durationNoEnough.setObjectName(u"pushButton_quick_remark_input_durationNoEnough") - sizePolicy1 = QSizePolicy(QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Preferred) - sizePolicy1.setHorizontalStretch(0) - sizePolicy1.setVerticalStretch(0) sizePolicy1.setHeightForWidth(self.pushButton_quick_remark_input_durationNoEnough.sizePolicy().hasHeightForWidth()) self.pushButton_quick_remark_input_durationNoEnough.setSizePolicy(sizePolicy1) self.pushButton_quick_remark_input_durationNoEnough.setFont(font1) @@ -557,6 +566,7 @@ class Ui_MainWindow_SA_label(object): self.lineEdit_filter_label_add.setPlaceholderText(QCoreApplication.translate("MainWindow_SA_label", u"\u7b5b\u9009\u5668", None)) self.lineEdit_filter_label.setPlaceholderText(QCoreApplication.translate("MainWindow_SA_label", u"\u7b5b\u9009\u5668", None)) self.label_2.setText(QCoreApplication.translate("MainWindow_SA_label", u"\u65b0\u589e\u7684\u6807\u7b7e", None)) + self.pushButton_save.setText(QCoreApplication.translate("MainWindow_SA_label", u"\u624b\u52a8\u4fdd\u5b58", None)) self.groupBox_4.setTitle(QCoreApplication.translate("MainWindow_SA_label", u"\u65e5\u5fd7", None)) self.groupBox_right.setTitle(QCoreApplication.translate("MainWindow_SA_label", u"\u7761\u7720\u547c\u5438\u6682\u505c\u4e8b\u4ef6\u6807\u6ce8", None)) self.groupBox_examineBySecond.setTitle(QCoreApplication.translate("MainWindow_SA_label", u"\u9010\u5e27\u68c0\u67e5", None)) diff --git a/ui/MainWindow/MainWindow_SA_label.ui b/ui/MainWindow/MainWindow_SA_label.ui index 2e35b97..510f787 100644 --- a/ui/MainWindow/MainWindow_SA_label.ui +++ b/ui/MainWindow/MainWindow_SA_label.ui @@ -42,7 +42,7 @@ 睡眠呼吸暂停事件标注 - + @@ -208,6 +208,24 @@ + + + + + 0 + 0 + + + + + 12 + + + + 手动保存 + + +