Compare commits

...

5 Commits

Author SHA1 Message Date
fada84e115 优化<数据预处理>的代码 2025-05-20 16:30:17 +08:00
5332a2e7db 修改了部分命名规则 2025-05-20 15:55:23 +08:00
81c360bf9f Merge remote-tracking branch 'origin/master' 2025-05-20 15:45:45 +08:00
9af911a856 Merge remote-tracking branch 'origin/master'
# Conflicts:
#	func/Module_approximately_align.py
2025-05-20 15:26:43 +08:00
cb7e79a86d 修改了部分命名规则 2025-05-20 15:20:54 +08:00
10 changed files with 183 additions and 79 deletions

View File

@ -7,7 +7,7 @@ from PySide6.QtWidgets import QMessageBox, QMainWindow, QApplication
from matplotlib.backends.backend_qt import NavigationToolbar2QT from matplotlib.backends.backend_qt import NavigationToolbar2QT
from matplotlib.backends.backend_qtagg import FigureCanvasQTAgg as FigureCanvas from matplotlib.backends.backend_qtagg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure from matplotlib.figure import Figure
from numpy import repeat, convolve, ones, mean, std, int64, argmax, linspace, diff from numpy import convolve, ones, mean, std, int64, argmax, linspace, diff
from overrides import overrides from overrides import overrides
from pandas import read_csv, DataFrame from pandas import read_csv, DataFrame
from scipy.signal import find_peaks, resample, butter, sosfiltfilt, correlate from scipy.signal import find_peaks, resample, butter, sosfiltfilt, correlate

View File

@ -64,7 +64,7 @@ class MainWindow_cut_PSG(QMainWindow):
"Path": { "Path": {
"InputFolder": str(Path(self.root_path) / ConfigParams.PUBLIC_PATH_PSG_TEXT / Path(str(self.sampID))), "InputFolder": str(Path(self.root_path) / ConfigParams.PUBLIC_PATH_PSG_TEXT / Path(str(self.sampID))),
"SaveFolder": str(Path(self.root_path) / ConfigParams.PUBLIC_PATH_PSG_ALIGNED / Path(str(self.sampID))), "SaveFolder": str(Path(self.root_path) / ConfigParams.PUBLIC_PATH_PSG_ALIGNED / Path(str(self.sampID))),
"InputAlignInfo": str(Path(self.root_path) / ConfigParams.PUBLIC_PATH_PSG_ALIGNED / Path(str(self.sampID)) / (ConfigParams.CUT_PSG_SAVE_ECG_ALIGNINFO_FILENAME + ConfigParams.ENDSWITH_TXT)) "InputAlignInfo": str(Path(self.root_path) / ConfigParams.PUBLIC_PATH_LABEL / Path(str(self.sampID)) / (ConfigParams.CUT_PSG_SAVE_ECG_ALIGNINFO_FILENAME + ConfigParams.ENDSWITH_TXT))
} }
}) })

View File

@ -90,7 +90,7 @@ class SettingWindow(QMainWindow):
"Input_Peak": str((Path(self.root_path) / ConfigParams.PUBLIC_PATH_ORGBCG_TEXT / "Input_Peak": str((Path(self.root_path) / ConfigParams.PUBLIC_PATH_ORGBCG_TEXT /
Path(str(self.sampID)) / Path(ConfigParams.LABEL_CHECK_INPUT_JPEAK_FILENAME + Path(str(self.sampID)) / Path(ConfigParams.LABEL_CHECK_INPUT_JPEAK_FILENAME +
ConfigParams.ENDSWITH_TXT))), ConfigParams.ENDSWITH_TXT))),
"Input_Approximately_Align": str((Path(self.root_path) / ConfigParams.PUBLIC_PATH_PSG_TEXT / "Input_Approximately_Align": str((Path(self.root_path) / ConfigParams.PUBLIC_PATH_LABEL /
Path(str(self.sampID)) / Path(ConfigParams.LABEL_CHECK_APPROXIMATELY_ALIGNINFO_FILENAME + Path(str(self.sampID)) / Path(ConfigParams.LABEL_CHECK_APPROXIMATELY_ALIGNINFO_FILENAME +
ConfigParams.ENDSWITH_CSV))), ConfigParams.ENDSWITH_CSV))),
"Save": str((Path(self.root_path) / ConfigParams.PUBLIC_PATH_ORGBCG_TEXT / "Save": str((Path(self.root_path) / ConfigParams.PUBLIC_PATH_ORGBCG_TEXT /
@ -109,7 +109,7 @@ class SettingWindow(QMainWindow):
"Input_Peak": str((Path(self.root_path) / ConfigParams.PUBLIC_PATH_PSG_TEXT / "Input_Peak": str((Path(self.root_path) / ConfigParams.PUBLIC_PATH_PSG_TEXT /
Path(str(self.sampID)) / Path(ConfigParams.LABEL_CHECK_INPUT_RPEAK_FILENAME + Path(str(self.sampID)) / Path(ConfigParams.LABEL_CHECK_INPUT_RPEAK_FILENAME +
ConfigParams.ENDSWITH_TXT))), ConfigParams.ENDSWITH_TXT))),
"Input_Approximately_Align": str((Path(self.root_path) / ConfigParams.PUBLIC_PATH_PSG_TEXT / "Input_Approximately_Align": str((Path(self.root_path) / ConfigParams.PUBLIC_PATH_LABEL /
Path(str(self.sampID)) / Path(ConfigParams.LABEL_CHECK_APPROXIMATELY_ALIGNINFO_FILENAME + Path(str(self.sampID)) / Path(ConfigParams.LABEL_CHECK_APPROXIMATELY_ALIGNINFO_FILENAME +
ConfigParams.ENDSWITH_CSV))), ConfigParams.ENDSWITH_CSV))),
"Save": str((Path(self.root_path) / ConfigParams.PUBLIC_PATH_PSG_TEXT / "Save": str((Path(self.root_path) / ConfigParams.PUBLIC_PATH_PSG_TEXT /

View File

@ -226,7 +226,15 @@ class MainWindow(QMainWindow, Ui_Signal_Label):
def __slot_btn_SA_label__(self): def __slot_btn_SA_label__(self):
self.SA_label = MainWindow_SA_label() self.SA_label = MainWindow_SA_label()
self.SA_label.show() root_path = self.ui.plainTextEdit_root_path.toPlainText()
sampID = self.ui.comboBox_sampID.currentText()
if not self.check_root_path():
return
if not self.check_sampID():
return
self.SA_label.show(root_path, int(sampID))
# 默认最大化显示而非固定分辨率
self.SA_label.showMaximized()
def seek_sampID(self, path): def seek_sampID(self, path):
if not Path(path).exists(): if not Path(path).exists():

View File

@ -111,7 +111,7 @@ class SettingWindow(QMainWindow):
Config.update({ Config.update({
"Path": { "Path": {
"Input_orgBcg": str((Path(self.root_path) / ConfigParams.PUBLIC_PATH_ORGBCG_TEXT / "Input_OrgBCG": str((Path(self.root_path) / ConfigParams.PUBLIC_PATH_ORGBCG_TEXT /
Path(str(self.sampID)) / Path(ConfigParams.PRECISELY_ALIGN_INPUT_ORGBCG_FILENAME + Path(str(self.sampID)) / Path(ConfigParams.PRECISELY_ALIGN_INPUT_ORGBCG_FILENAME +
str(Config["InputConfig"]["ECGFreq"]) + str(Config["InputConfig"]["ECGFreq"]) +
ConfigParams.ENDSWITH_TXT))), ConfigParams.ENDSWITH_TXT))),
@ -132,13 +132,10 @@ class SettingWindow(QMainWindow):
"Input_Approximately_Align": str((Path(self.root_path) / ConfigParams.PUBLIC_PATH_PSG_TEXT / "Input_Approximately_Align": str((Path(self.root_path) / ConfigParams.PUBLIC_PATH_PSG_TEXT /
Path(str(self.sampID)) / Path(ConfigParams.PRECISELY_ALIGN_APPROXIMATELY_ALIGNINFO_FILENAME + Path(str(self.sampID)) / Path(ConfigParams.PRECISELY_ALIGN_APPROXIMATELY_ALIGNINFO_FILENAME +
ConfigParams.ENDSWITH_CSV))), ConfigParams.ENDSWITH_CSV))),
"Save_BCG_AlignInfo": str((Path(self.root_path) / ConfigParams.PUBLIC_PATH_ORGBCG_ALIGNED / "Save_AlignInfo": str((Path(self.root_path) / ConfigParams.PUBLIC_PATH_LABEL /
Path(str(self.sampID)) / Path(ConfigParams.PRECISELY_ALIGN_SAVE_BCG_ALIGNINFO_FILENAME + Path(str(self.sampID)) / Path(ConfigParams.PRECISELY_ALIGN_SAVE_ALIGNINFO_FILENAME +
ConfigParams.ENDSWITH_TXT))), ConfigParams.ENDSWITH_TXT))),
"Save_ECG_AlignInfo": str((Path(self.root_path) / ConfigParams.PUBLIC_PATH_PSG_ALIGNED / "Save_OrgBCG": str((Path(self.root_path) / ConfigParams.PUBLIC_PATH_ORGBCG_ALIGNED /
Path(str(self.sampID)) / Path(ConfigParams.PRECISELY_ALIGN_SAVE_ECG_ALIGNINFO_FILENAME +
ConfigParams.ENDSWITH_TXT))),
"Save_orgBcg": str((Path(self.root_path) / ConfigParams.PUBLIC_PATH_ORGBCG_ALIGNED /
Path(str(self.sampID)) / Path(ConfigParams.PRECISELY_ALIGN_SAVE_ORGBCG_FILENAME + Path(str(self.sampID)) / Path(ConfigParams.PRECISELY_ALIGN_SAVE_ORGBCG_FILENAME +
str(Config["InputConfig"]["ECGFreq"]) + str(Config["InputConfig"]["ECGFreq"]) +
ConfigParams.ENDSWITH_TXT))), ConfigParams.ENDSWITH_TXT))),
@ -202,15 +199,14 @@ class SettingWindow(QMainWindow):
# 数据回显 # 数据回显
self.ui.spinBox_input_freq_ECG.setValue(Config["InputConfig"]["ECGFreq"]) self.ui.spinBox_input_freq_ECG.setValue(Config["InputConfig"]["ECGFreq"])
self.ui.plainTextEdit_file_path_input_orgBcg.setPlainText(Config["Path"]["Input_orgBcg"]) self.ui.plainTextEdit_file_path_input_orgBcg.setPlainText(Config["Path"]["Input_OrgBCG"])
self.ui.plainTextEdit_file_path_input_BCG.setPlainText(Config["Path"]["Input_BCG"]) self.ui.plainTextEdit_file_path_input_BCG.setPlainText(Config["Path"]["Input_BCG"])
self.ui.plainTextEdit_file_path_input_Jpeak.setPlainText(Config["Path"]["Input_Jpeak"]) self.ui.plainTextEdit_file_path_input_Jpeak.setPlainText(Config["Path"]["Input_Jpeak"])
self.ui.plainTextEdit_file_path_input_ECG.setPlainText(Config["Path"]["Input_ECG"]) self.ui.plainTextEdit_file_path_input_ECG.setPlainText(Config["Path"]["Input_ECG"])
self.ui.plainTextEdit_file_path_input_Rpeak.setPlainText(Config["Path"]["Input_Rpeak"]) self.ui.plainTextEdit_file_path_input_Rpeak.setPlainText(Config["Path"]["Input_Rpeak"])
self.ui.plainTextEdit_file_path_input_approximately_align.setPlainText(Config["Path"]["Input_Approximately_Align"]) self.ui.plainTextEdit_file_path_input_approximately_align.setPlainText(Config["Path"]["Input_Approximately_Align"])
self.ui.plainTextEdit_file_path_save_BCG_AlignInfo.setPlainText(Config["Path"]["Save_BCG_AlignInfo"]) self.ui.plainTextEdit_file_path_save_AlignInfo.setPlainText(Config["Path"]["Save_AlignInfo"])
self.ui.plainTextEdit_file_path_save_ECG_AlignInfo.setPlainText(Config["Path"]["Save_ECG_AlignInfo"]) self.ui.plainTextEdit_file_path_save_orgBcg.setPlainText(Config["Path"]["Save_OrgBCG"])
self.ui.plainTextEdit_file_path_save_orgBcg.setPlainText(Config["Path"]["Save_orgBcg"])
self.ui.plainTextEdit_file_path_save_BCG.setPlainText(Config["Path"]["Save_BCG"]) self.ui.plainTextEdit_file_path_save_BCG.setPlainText(Config["Path"]["Save_BCG"])
self.ui.plainTextEdit_file_path_save_ECG.setPlainText(Config["Path"]["Save_ECG"]) self.ui.plainTextEdit_file_path_save_ECG.setPlainText(Config["Path"]["Save_ECG"])
self.ui.plainTextEdit_file_path_save_Jpeak.setPlainText(Config["Path"]["Save_Jpeak"]) self.ui.plainTextEdit_file_path_save_Jpeak.setPlainText(Config["Path"]["Save_Jpeak"])
@ -219,15 +215,14 @@ class SettingWindow(QMainWindow):
def __write_config__(self): def __write_config__(self):
# 从界面写入配置 # 从界面写入配置
Config["InputConfig"]["ECGFreq"] = self.ui.spinBox_input_freq_ECG.value() Config["InputConfig"]["ECGFreq"] = self.ui.spinBox_input_freq_ECG.value()
Config["Path"]["Input_orgBcg"] = self.ui.plainTextEdit_file_path_input_orgBcg.toPlainText() Config["Path"]["Input_OrgBCG"] = self.ui.plainTextEdit_file_path_input_orgBcg.toPlainText()
Config["Path"]["Input_BCG"] = self.ui.plainTextEdit_file_path_input_BCG.toPlainText() Config["Path"]["Input_BCG"] = self.ui.plainTextEdit_file_path_input_BCG.toPlainText()
Config["Path"]["Input_Jpeak"] = self.ui.plainTextEdit_file_path_input_Jpeak.toPlainText() Config["Path"]["Input_Jpeak"] = self.ui.plainTextEdit_file_path_input_Jpeak.toPlainText()
Config["Path"]["Input_ECG"] = self.ui.plainTextEdit_file_path_input_ECG.toPlainText() Config["Path"]["Input_ECG"] = self.ui.plainTextEdit_file_path_input_ECG.toPlainText()
Config["Path"]["Input_Rpeak"] = self.ui.plainTextEdit_file_path_input_Rpeak.toPlainText() Config["Path"]["Input_Rpeak"] = self.ui.plainTextEdit_file_path_input_Rpeak.toPlainText()
Config["Path"]["Input_Approximately_Align"] = self.ui.plainTextEdit_file_path_input_approximately_align.toPlainText() Config["Path"]["Input_Approximately_Align"] = self.ui.plainTextEdit_file_path_input_approximately_align.toPlainText()
Config["Path"]["Save_BCG_AlignInfo"] = self.ui.plainTextEdit_file_path_save_BCG_AlignInfo.toPlainText() Config["Path"]["Save_AlignInfo"] = self.ui.plainTextEdit_file_path_save_AlignInfo.toPlainText()
Config["Path"]["Save_ECG_AlignInfo"] = self.ui.plainTextEdit_file_path_save_ECG_AlignInfo.toPlainText() Config["Path"]["Save_OrgBCG"] = self.ui.plainTextEdit_file_path_save_orgBcg.toPlainText()
Config["Path"]["Save_orgBcg"] = self.ui.plainTextEdit_file_path_save_orgBcg.toPlainText()
Config["Path"]["Save_BCG"] = self.ui.plainTextEdit_file_path_save_BCG.toPlainText() Config["Path"]["Save_BCG"] = self.ui.plainTextEdit_file_path_save_BCG.toPlainText()
Config["Path"]["Save_ECG"] = self.ui.plainTextEdit_file_path_save_ECG.toPlainText() Config["Path"]["Save_ECG"] = self.ui.plainTextEdit_file_path_save_ECG.toPlainText()
Config["Path"]["Save_Jpeak"] = self.ui.plainTextEdit_file_path_save_Jpeak.toPlainText() Config["Path"]["Save_Jpeak"] = self.ui.plainTextEdit_file_path_save_Jpeak.toPlainText()
@ -839,7 +834,7 @@ class MainWindow_precisely_align(QMainWindow):
total_rows = len(DataFrame(self.data.res_orgBcg.reshape(-1))) total_rows = len(DataFrame(self.data.res_orgBcg.reshape(-1)))
chunk_size = ConfigParams.PRECISELY_ALIGN_SAVE_CHUNK_SIZE chunk_size = ConfigParams.PRECISELY_ALIGN_SAVE_CHUNK_SIZE
with open(Config["Path"]["Save_orgBcg"], 'w') as f: with open(Config["Path"]["Save_OrgBCG"], 'w') as f:
for start in range(0, total_rows, chunk_size): for start in range(0, total_rows, chunk_size):
end = min(start + chunk_size, total_rows) end = min(start + chunk_size, total_rows)
chunk = DataFrame(self.data.res_orgBcg.reshape(-1)).iloc[start:end] chunk = DataFrame(self.data.res_orgBcg.reshape(-1)).iloc[start:end]
@ -861,7 +856,7 @@ class MainWindow_precisely_align(QMainWindow):
total_rows = len(DataFrame(self.data.res_BCG.reshape(-1))) total_rows = len(DataFrame(self.data.res_BCG.reshape(-1)))
chunk_size = ConfigParams.PRECISELY_ALIGN_SAVE_CHUNK_SIZE chunk_size = ConfigParams.PRECISELY_ALIGN_SAVE_CHUNK_SIZE
with open(Config["Path"]["Save_orgBcg"], 'w') as f: with open(Config["Path"]["Save_BCG"], 'w') as f:
for start in range(0, total_rows, chunk_size): for start in range(0, total_rows, chunk_size):
end = min(start + chunk_size, total_rows) end = min(start + chunk_size, total_rows)
chunk = DataFrame(self.data.res_BCG.reshape(-1)).iloc[start:end] chunk = DataFrame(self.data.res_BCG.reshape(-1)).iloc[start:end]
@ -944,7 +939,7 @@ class MainWindow_precisely_align(QMainWindow):
else: else:
PublicFunc.text_output(self.ui, "(6/6)" + result.info, Constants.TIPS_TYPE_INFO) PublicFunc.text_output(self.ui, "(6/6)" + result.info, Constants.TIPS_TYPE_INFO)
PublicFunc.msgbox_output(self, result.info, Constants.TIPS_TYPE_INFO) PublicFunc.msgbox_output(self, Constants.SAVING_FINISHED, Constants.TIPS_TYPE_INFO)
PublicFunc.finish_operation(self, ButtonState) PublicFunc.finish_operation(self, ButtonState)
def __update_coordinate__(self): def __update_coordinate__(self):
@ -1447,7 +1442,7 @@ class Data:
return Result().failure(info=Constants.INPUT_FAILURE + Constants.PRECISELY_ALIGN_FAILURE_REASON["Data_Path_Not_Exist"]) return Result().failure(info=Constants.INPUT_FAILURE + Constants.PRECISELY_ALIGN_FAILURE_REASON["Data_Path_Not_Exist"])
try: try:
self.raw_orgBcg = read_csv(Config["Path"]["Input_orgBcg"], self.raw_orgBcg = read_csv(Config["Path"]["Input_OrgBCG"],
encoding=ConfigParams.UTF8_ENCODING, encoding=ConfigParams.UTF8_ENCODING,
header=None).to_numpy().reshape(-1) header=None).to_numpy().reshape(-1)
self.raw_BCG = read_csv(Config["Path"]["Input_BCG"], self.raw_BCG = read_csv(Config["Path"]["Input_BCG"],
@ -1803,8 +1798,7 @@ class Data:
} }
} }
save_data = [str(save_data)] save_data = [str(save_data)]
DataFrame(save_data).to_csv(Config["Path"]["Save_BCG_AlignInfo"], index=False, header=False) DataFrame(save_data).to_csv(Config["Path"]["Save_AlignInfo"], index=False, header=False)
DataFrame(save_data).to_csv(Config["Path"]["Save_ECG_AlignInfo"], index=False, header=False)
except Exception as e: except Exception as e:
return Result().failure(info=Constants.PRECISELY_ALIGN_SAVING_ALIGNINFO_FAILURE + Constants.PRECISELY_ALIGN_FAILURE_REASON["Save_Exception"] + "\n" + format_exc()) return Result().failure(info=Constants.PRECISELY_ALIGN_SAVING_ALIGNINFO_FAILURE + Constants.PRECISELY_ALIGN_FAILURE_REASON["Save_Exception"] + "\n" + format_exc())
@ -1815,7 +1809,7 @@ class Data:
return Result().failure(info=Constants.PRECISELY_ALIGN_SAVING_RES_ORGBCG_FAILURE + Constants.PRECISELY_ALIGN_FAILURE_REASON["res_orgBcg_Not_Exist"]) return Result().failure(info=Constants.PRECISELY_ALIGN_SAVING_RES_ORGBCG_FAILURE + Constants.PRECISELY_ALIGN_FAILURE_REASON["res_orgBcg_Not_Exist"])
try: try:
chunk.to_csv(Config["Path"]["Save_orgBcg"], mode='a', index=False, header=False) chunk.to_csv(Config["Path"]["Save_OrgBCG"], mode='a', index=False, header=False)
except Exception as e: except Exception as e:
return Result().failure(info=Constants.PRECISELY_ALIGN_SAVING_RES_ORGBCG_FAILURE + Constants.PRECISELY_ALIGN_FAILURE_REASON["Save_Exception"] + "\n" + format_exc()) return Result().failure(info=Constants.PRECISELY_ALIGN_SAVING_RES_ORGBCG_FAILURE + Constants.PRECISELY_ALIGN_FAILURE_REASON["Save_Exception"] + "\n" + format_exc())

View File

@ -75,13 +75,9 @@ class SettingWindow(QMainWindow):
Config.update({ Config.update({
"Path": { "Path": {
"Input": str((Path(self.root_path) / ConfigParams.PUBLIC_PATH_ORGBCG_TEXT / "Input": str((Path(self.root_path) / ConfigParams.PUBLIC_PATH_ORGBCG_TEXT /
Path(str(self.sampID)) / Path(ConfigParams.PREPROCESS_INPUT_BCG_FILENAME + Path(str(self.sampID)))),
str(Config["InputConfig"]["Freq"]) +
ConfigParams.ENDSWITH_TXT))),
"Save": str((Path(self.root_path) / ConfigParams.PUBLIC_PATH_ORGBCG_TEXT / "Save": str((Path(self.root_path) / ConfigParams.PUBLIC_PATH_ORGBCG_TEXT /
Path(str(self.sampID)) / Path(ConfigParams.PREPROCESS_SAVE_BCG_FILENAME + Path(str(self.sampID))))
str(Config["OutputConfig"]["Freq"]) +
ConfigParams.ENDSWITH_TXT)))
}, },
"Mode": self.mode "Mode": self.mode
}) })
@ -89,13 +85,9 @@ class SettingWindow(QMainWindow):
Config.update({ Config.update({
"Path": { "Path": {
"Input": str((Path(self.root_path) / ConfigParams.PUBLIC_PATH_PSG_TEXT / "Input": str((Path(self.root_path) / ConfigParams.PUBLIC_PATH_PSG_TEXT /
Path(str(self.sampID)) / Path(ConfigParams.PREPROCESS_INPUT_ECG_FILENAME + Path(str(self.sampID)))),
str(Config["InputConfig"]["Freq"]) +
ConfigParams.ENDSWITH_TXT))),
"Save": str((Path(self.root_path) / ConfigParams.PUBLIC_PATH_PSG_TEXT / "Save": str((Path(self.root_path) / ConfigParams.PUBLIC_PATH_PSG_TEXT /
Path(str(self.sampID)) / Path(ConfigParams.PREPROCESS_SAVE_ECG_FILENAME + Path(str(self.sampID))))
str(Config["OutputConfig"]["Freq"]) +
ConfigParams.ENDSWITH_TXT)))
}, },
"Mode": self.mode "Mode": self.mode
}) })
@ -133,14 +125,14 @@ class SettingWindow(QMainWindow):
str((Path(self.root_path) / str((Path(self.root_path) /
ConfigParams.PUBLIC_PATH_ORGBCG_TEXT / ConfigParams.PUBLIC_PATH_ORGBCG_TEXT /
Path(str(self.sampID)) / Path(str(self.sampID)) /
Path(ConfigParams.PREPROCESS_INPUT_BCG_FILENAME + Path(ConfigParams.ORGBCG_RAW +
str(self.ui.spinBox_input_freq.value()) + str(self.ui.spinBox_input_freq.value()) +
ConfigParams.ENDSWITH_TXT)))) ConfigParams.ENDSWITH_TXT))))
self.ui.plainTextEdit_file_path_save.setPlainText( self.ui.plainTextEdit_file_path_save.setPlainText(
str((Path(self.root_path) / str((Path(self.root_path) /
ConfigParams.PUBLIC_PATH_ORGBCG_TEXT / ConfigParams.PUBLIC_PATH_ORGBCG_TEXT /
Path(str(self.sampID)) / Path(str(self.sampID)) /
Path(ConfigParams.PREPROCESS_SAVE_BCG_FILENAME + Path(ConfigParams.BCG_FILTER +
str(self.ui.spinBox_output_freq.value()) + str(self.ui.spinBox_output_freq.value()) +
ConfigParams.ENDSWITH_TXT)))) ConfigParams.ENDSWITH_TXT))))
elif self.mode == "ECG": elif self.mode == "ECG":
@ -148,14 +140,14 @@ class SettingWindow(QMainWindow):
str((Path(self.root_path) / str((Path(self.root_path) /
ConfigParams.PUBLIC_PATH_PSG_TEXT / ConfigParams.PUBLIC_PATH_PSG_TEXT /
Path(str(self.sampID)) / Path(str(self.sampID)) /
Path(ConfigParams.PREPROCESS_INPUT_ECG_FILENAME + Path(ConfigParams.ECG_RAW +
str(self.ui.spinBox_input_freq.value()) + str(self.ui.spinBox_input_freq.value()) +
ConfigParams.ENDSWITH_TXT)))) ConfigParams.ENDSWITH_TXT))))
self.ui.plainTextEdit_file_path_save.setPlainText( self.ui.plainTextEdit_file_path_save.setPlainText(
str((Path(self.root_path) / str((Path(self.root_path) /
ConfigParams.PUBLIC_PATH_PSG_TEXT / ConfigParams.PUBLIC_PATH_PSG_TEXT /
Path(str(self.sampID)) / Path(str(self.sampID)) /
Path(ConfigParams.PREPROCESS_SAVE_ECG_FILENAME + Path(ConfigParams.ECG_FILTER +
str(self.ui.spinBox_output_freq.value()) + str(self.ui.spinBox_output_freq.value()) +
ConfigParams.ENDSWITH_TXT)))) ConfigParams.ENDSWITH_TXT))))
else: else:
@ -394,21 +386,57 @@ class Data:
self.processed_data = None self.processed_data = None
def open_file(self): def open_file(self):
if Config["Mode"] == "BCG":
signal = ConfigParams.ORGBCG_RAW
elif Config["Mode"] == "ECG":
signal = ConfigParams.ECG_RAW
else:
raise ValueError("模式不存在")
if Path(Config["Path"]["Input"]).is_file():
Config["Path"]["Input"] = str(Path(Config["Path"]["Input"]).parent)
if not Path(Config["Path"]["Input"]).exists(): if not Path(Config["Path"]["Input"]).exists():
return Result().failure(info=Constants.INPUT_FAILURE + Constants.PREPROCESS_FAILURE_REASON["Data_Path_Not_Exist"]) return Result().failure(info=Constants.INPUT_FAILURE + Constants.FAILURE_REASON["Path_Not_Exist"])
temp_path = list(
Path(Config["Path"]["Input"]).glob(f"{signal}*"))
if len(temp_path) == 0:
return Result().failure(
info=Constants.INPUT_FAILURE + "\n" +
signal + "" +
Config["Path"]["Input"] +
Constants.FAILURE_REASON["File_Not_Exist"])
elif len(temp_path) > 1:
return Result().failure(
info=Constants.INPUT_FAILURE + "\n" +
signal + "" +
Config["Path"]["Input"] +
Constants.FAILURE_REASON["Data_File_More_Than_One"])
else:
path = temp_path[0]
Config["Path"]["Input"] = str(path)
freq = path.stem.split("_")[-1]
# 验证是否为整数或是否存在
if not freq.isdigit():
return Result().failure(
info=Constants.INPUT_FAILURE + "\n" +
signal + "" +
Constants.FAILURE_REASON["Data_Frequency_Not_In_Filename"])
Config["InputConfig"]["Freq"] = int(freq)
try: try:
self.raw_data = read_csv(Config["Path"]["Input"], self.raw_data = read_csv(Config["Path"]["Input"],
encoding=ConfigParams.UTF8_ENCODING, encoding=ConfigParams.UTF8_ENCODING,
header=None).to_numpy().reshape(-1) header=None).to_numpy().reshape(-1)
except Exception as e: except Exception as e:
return Result().failure(info=Constants.INPUT_FAILURE + Constants.PREPROCESS_FAILURE_REASON["Read_Data_Exception"] + "\n" + format_exc()) return Result().failure(info=Constants.INPUT_FAILURE +
Constants.FAILURE_REASON["Open_Data_Exception"] + "\n" + format_exc())
return Result().success(info=Constants.INPUT_FINISHED) return Result().success(info=Constants.INPUT_FINISHED)
def preprocess(self): def preprocess(self):
if self.raw_data is None: if self.raw_data is None:
Result().failure(info=Constants.PREPROCESS_PROCESS_FAILURE + Constants.PREPROCESS_FAILURE_REASON["Raw_Data_Not_Exist"]) Result().failure(info=Constants.PREPROCESS_FAILURE + Constants.FAILURE_REASON["Data_Not_Exist"])
try: try:
if Config["InputConfig"]["Freq"] != Config["OutputConfig"]["Freq"]: if Config["InputConfig"]["Freq"] != Config["OutputConfig"]["Freq"]:
@ -430,18 +458,19 @@ class Data:
else: else:
raise ValueError("模式不存在") raise ValueError("模式不存在")
except Exception as e: except Exception as e:
Result().failure(info=Constants.PREPROCESS_PROCESS_FAILURE + Constants.PREPROCESS_FAILURE_REASON["Filter_Exception"] + "\n" + format_exc()) Result().failure(info=Constants.PREPROCESS_FAILURE +
Constants.FAILURE_REASON["Preprocess_Exception"] + "\n" + format_exc())
return Result().success(info=Constants.PREPROCESS_PROCESS_FINISHED)
return Result().success(info=Constants.PREPROCESS_FINISHED)
def save(self, chunk): def save(self, chunk):
if self.processed_data is None: if self.processed_data is None:
return Result().failure(info=Constants.SAVING_FAILURE + Constants.PREPROCESS_FAILURE_REASON["Processed_Data_Not_Exist"]) return Result().failure(info=Constants.SAVING_FAILURE + Constants.FAILURE_REASON["Data_Not_Exist"])
try: try:
chunk.to_csv(Config["Path"]["Save"], mode='a', index=False, header=False, float_format='%.4f') chunk.to_csv(Config["Path"]["Save"], mode='a', index=False, header=False, float_format='%.4f')
except Exception as e: except Exception as e:
return Result().failure(info=Constants.SAVING_FAILURE + Constants.PREPROCESS_FAILURE_REASON["Save_Exception"] + "\n" + format_exc()) return Result().failure(info=Constants.SAVING_FAILURE +
Constants.FAILURE_REASON["Save_Exception"] + "\n" + format_exc())
return Result().success(Constants.SAVING_FINISHED) return Result().success(Constants.SAVING_FINISHED)

View File

@ -29,6 +29,16 @@ class ConfigParams:
ACTION_ZOOM_SHORTCUT_KEY: str = "C" ACTION_ZOOM_SHORTCUT_KEY: str = "C"
FONT: str = "Microsoft YaHei UI" FONT: str = "Microsoft YaHei UI"
ORGBCG_RAW: str = "OrgBCG_Raw_"
ECG_RAW: str = "ECG II_Raw_"
THO_RAW: str = "Effort Tho_Raw_"
ABD_RAW: str = "Effort Abd_Raw_"
BCG_FILTER: str = "BCG_Filter_"
ECG_FILTER: str = "ECG_Filter_"
# 数据粗同步 # 数据粗同步
APPROXIMATELY_ALIGN_CONFIG_FILE_PATH: str = "./config/Config_approximately_align.yaml" APPROXIMATELY_ALIGN_CONFIG_FILE_PATH: str = "./config/Config_approximately_align.yaml"
APPROXIMATELY_ALIGN_CONFIG_NEW_CONTENT: dict = { APPROXIMATELY_ALIGN_CONFIG_NEW_CONTENT: dict = {
@ -163,10 +173,9 @@ class ConfigParams:
PRECISELY_ALIGN_INPUT_ORGBCG_FILENAME: str = "OrgBCG_Raw_" PRECISELY_ALIGN_INPUT_ORGBCG_FILENAME: str = "OrgBCG_Raw_"
PRECISELY_ALIGN_INPUT_BCG_FILENAME: str = "BCG_Filter_" PRECISELY_ALIGN_INPUT_BCG_FILENAME: str = "BCG_Filter_"
PRECISELY_ALIGN_INPUT_JPEAK_FILENAME: str = "JPeak_revise_corrected" PRECISELY_ALIGN_INPUT_JPEAK_FILENAME: str = "JPeak_revise_corrected"
PRECISELY_ALIGN_SAVE_BCG_ALIGNINFO_FILENAME: str = "Align_info" PRECISELY_ALIGN_SAVE_ALIGNINFO_FILENAME: str = "Align_info"
PRECISELY_ALIGN_INPUT_ECG_FILENAME: str = "ECG_Filter_" PRECISELY_ALIGN_INPUT_ECG_FILENAME: str = "ECG_Filter_"
PRECISELY_ALIGN_INPUT_RPEAK_FILENAME: str = "Rpeak_final_corrected" PRECISELY_ALIGN_INPUT_RPEAK_FILENAME: str = "Rpeak_final_corrected"
PRECISELY_ALIGN_SAVE_ECG_ALIGNINFO_FILENAME: str = "Align_info"
PRECISELY_ALIGN_SAVE_ORGBCG_FILENAME: str = "OrgBCG_Sync_" PRECISELY_ALIGN_SAVE_ORGBCG_FILENAME: str = "OrgBCG_Sync_"
PRECISELY_ALIGN_SAVE_BCG_FILENAME: str = "BCG_Sync_" PRECISELY_ALIGN_SAVE_BCG_FILENAME: str = "BCG_Sync_"
PRECISELY_ALIGN_SAVE_ECG_FILENAME: str = "ECG_Sync_" PRECISELY_ALIGN_SAVE_ECG_FILENAME: str = "ECG_Sync_"
@ -185,7 +194,8 @@ class ConfigParams:
"ChannelInput": { "ChannelInput": {
"Effort Tho": "Effort Tho_Raw_", "Effort Tho": "Effort Tho_Raw_",
"Effort Abd": "Effort Abd_Raw_", "Effort Abd": "Effort Abd_Raw_",
"Flow Patient": "Flow Patient_Raw_", "Flow T": "Flow T_Raw_",
"Flow P": "Flow P_Raw_",
"Snore": "Snore_Raw_", "Snore": "Snore_Raw_",
"SpO2": "SpO2_Raw_", "SpO2": "SpO2_Raw_",
"5_class": "5_class_Raw_" "5_class": "5_class_Raw_"
@ -197,7 +207,8 @@ class ConfigParams:
"ChannelSave": { "ChannelSave": {
"Effort Tho": "Effort Tho_Sync_", "Effort Tho": "Effort Tho_Sync_",
"Effort Abd": "Effort Abd_Sync_", "Effort Abd": "Effort Abd_Sync_",
"Flow Patient": "Flow Patient_Sync_", "Flow T": "Flow T_Sync_",
"Flow P": "Flow P_Sync_",
"Snore": "Snore_Sync_", "Snore": "Snore_Sync_",
"SpO2": "SpO2_Sync_", "SpO2": "SpO2_Sync_",
"5_class": "5_class_Sync_" "5_class": "5_class_Sync_"
@ -208,6 +219,8 @@ class ConfigParams:
"EndWith": { "EndWith": {
"Effort Tho": ENDSWITH_TXT, "Effort Tho": ENDSWITH_TXT,
"Effort Abd": ENDSWITH_TXT, "Effort Abd": ENDSWITH_TXT,
"Flow T": ENDSWITH_TXT,
"Flow P": ENDSWITH_TXT,
"Flow Patient": ENDSWITH_TXT, "Flow Patient": ENDSWITH_TXT,
"Snore": ENDSWITH_TXT, "Snore": ENDSWITH_TXT,
"SpO2": ENDSWITH_TXT, "SpO2": ENDSWITH_TXT,
@ -241,7 +254,33 @@ class ConfigParams:
ARTIFACT_LABEL_LABEL_TRANSPARENCY: float = 0.3 ARTIFACT_LABEL_LABEL_TRANSPARENCY: float = 0.3
ARTIFACT_LABEL_ACTION_LABEL_ARTIFACT_SHORTCUT_KEY: str = "Z" ARTIFACT_LABEL_ACTION_LABEL_ARTIFACT_SHORTCUT_KEY: str = "Z"
# 睡眠呼吸暂停事件标注
SA_LABEL_CONFIG_FILE_PATH: str = "./config/Config_SA_label.yaml"
SA_LABEL_CONFIG_NEW_CONTENT: dict = {
"InputConfig": {
"orgBcgFreq": 1000,
"ThoFreq": 100,
"AbdFreq": 100,
"FlowTFreq": 100,
"FlowPFreq": 100,
"SpO2Freq": 1,
"PlotFreq": 100
},
"AddSecond": {
"Front": 60,
"Back": 60
}
}
SA_LABEL_INPUT_ORGBCG_FILENAME: str = "OrgBCG_Sync_"
SA_LABEL_INPUT_THO_FILENAME: str = "Effort Tho_Sync_"
SA_LABEL_INPUT_ABD_FILENAME: str = "Effort Abd_Sync_"
SA_LABEL_INPUT_FLOWT_FILENAME: str = "Flow T_Sync_"
SA_LABEL_INPUT_FLOWP_FILENAME: str = "Flow P_Sync_"
SA_LABEL_INPUT_SPO2_FILENAME: str = "SpO2_Sync_"
SA_LABEL_INPUT_ARTIFACT_FILENAME: str = "Artifact_a"
SA_LABEL_INPUT_LABEL_FILENAME: str = "SA Label_Sync"
SA_LABEL_SAVE_FILENAME: str = "SA Label_corrected"
SA_LABEL_SAVE2_FILENAME: str = "SA Label_add"

View File

@ -19,6 +19,14 @@ class Constants:
INPUT_FINISHED: str = "导入完成" INPUT_FINISHED: str = "导入完成"
INPUT_FAILURE: str = "导入失败" INPUT_FAILURE: str = "导入失败"
PREPROCESSING_DATA: str = "正在预处理数据"
PREPROCESS_FINISHED: str = "预处理完成"
PREPROCESS_FAILURE: str = "预处理失败"
RESAMPLING_DATA: str = "正在数据重采样"
RESAMPLE_FINISHED: str = "重采样完成"
RESAMPLE_FAILURE: str = "重采样失败"
DRAWING_DATA: str = "正在绘制图形" DRAWING_DATA: str = "正在绘制图形"
DRAWING_FINISHED: str = "绘制完成" DRAWING_FINISHED: str = "绘制完成"
DRAWING_FAILURE: str = "绘制失败" DRAWING_FAILURE: str = "绘制失败"
@ -75,6 +83,18 @@ class Constants:
} }
""" """
FAILURE_REASON: dict = {
"Path_Not_Exist": "(路径不存在)",
"File_Not_Exist": "(数据文件不存在)",
"File_More_Than_One": "(数据文件超过一个)",
"Frequency_Not_In_Filename": "(数据频率不在文件名中)",
"Data_Not_Exist": "(数据不存在)",
"Open_Data_Exception": "(打开数据异常)",
"Preprocess_Exception": "(预处理异常)",
"Save_Exception": "(保存异常)"
}
# 数据粗同步 # 数据粗同步
APPROXIMATELY_ONLY_ALIGN_RESAMPLING: str = "正在仅重采样" APPROXIMATELY_ONLY_ALIGN_RESAMPLING: str = "正在仅重采样"
APPROXIMATELY_ONLY_ALIGN_RESAMPLE_FINISHED: str = "仅重采样完成" APPROXIMATELY_ONLY_ALIGN_RESAMPLE_FINISHED: str = "仅重采样完成"
@ -160,9 +180,7 @@ class Constants:
DETECT_JPEAK_LOAD_FINISHED: str = "读取完成" DETECT_JPEAK_LOAD_FINISHED: str = "读取完成"
DETECT_JPEAK_LOAD_FAILURE: str = "读取失败" DETECT_JPEAK_LOAD_FAILURE: str = "读取失败"
DETECT_JPEAK_PROCESSING_DATA: str = "正在处理数据"
DETECT_JPEAK_PROCESS_FINISHED: str = "处理完成"
DETECT_JPEAK_PROCESS_FAILURE: str = "处理失败"
DETECT_JPEAK_PREDICTING_PEAK: str = "正在预测峰值" DETECT_JPEAK_PREDICTING_PEAK: str = "正在预测峰值"
DETECT_JPEAK_PREDICT_FINISHED: str = "预测完成" DETECT_JPEAK_PREDICT_FINISHED: str = "预测完成"
@ -450,6 +468,35 @@ class Constants:
background-color: #00ff00; /* 鼠标悬停时的背景颜色 */ background-color: #00ff00; /* 鼠标悬停时的背景颜色 */
}""" }"""
# 睡眠呼吸暂停事件标注
SA_LABEL_LOADING_ARCHIVE: str = "正在获取历史存档"
SA_LABEL_ARCHIVE_EXIST: str = "找到历史存档,成功读取"
SA_LABEL_ARCHIVE_NOT_EXIST: str = "未找到历史存档,创建新存档"
SA_LABEL_UPDATING_TABLE: str = "正在更新表格"
SA_LABEL_UPDATING_INFO: str = "正在更新信息"
SA_LABEL_UPDATE_FINISHED: str = "更新完成"
SA_LABEL_UPDATE_FAILURE: str = "更新失败"
SA_LABEL_PROCESSING_DATA: str = "正在处理数据"
SA_LABEL_PROCESS_FINISHED: str = "处理完成"
SA_LABEL_PROCESS_FAILURE: str = "处理失败"
SA_LABEL_FAILURE_REASON = {
"Data_Path_Not_Exist": "(数据路径不存在)",
"Read_Data_Exception": "(读取数据异常)",
"Raw_Data_Not_Exist": "(原始数据不存在)",
"Filter_Exception": "(滤波器异常)",
"Resample_Exception": "(重采样异常)",
"Artifact_Format_Not_Correct": "(体动长度或格式不正确)",
"Get_Artifact_Format_Exception": "(获取体动长度或格式异常)",
"Label_Format_Exception": "(获取标签格式异常)",
"Update_tableWidget_Exception": "(更新表格异常)",
"Update_Info_Exception": "(更新信息异常)",
"Process_Data_Exception": "(处理数据异常)",
"Save_Exception": "(保存异常)"
}
SA_LABEL_JUMP: str = "跳转到事件"

View File

@ -70,15 +70,10 @@ class Ui_MainWindow_precisely_align_input_setting(object):
self.groupBox_file_path_save.setObjectName(u"groupBox_file_path_save") self.groupBox_file_path_save.setObjectName(u"groupBox_file_path_save")
self.verticalLayout_4 = QVBoxLayout(self.groupBox_file_path_save) self.verticalLayout_4 = QVBoxLayout(self.groupBox_file_path_save)
self.verticalLayout_4.setObjectName(u"verticalLayout_4") self.verticalLayout_4.setObjectName(u"verticalLayout_4")
self.plainTextEdit_file_path_save_BCG_AlignInfo = QPlainTextEdit(self.groupBox_file_path_save) self.plainTextEdit_file_path_save_AlignInfo = QPlainTextEdit(self.groupBox_file_path_save)
self.plainTextEdit_file_path_save_BCG_AlignInfo.setObjectName(u"plainTextEdit_file_path_save_BCG_AlignInfo") self.plainTextEdit_file_path_save_AlignInfo.setObjectName(u"plainTextEdit_file_path_save_AlignInfo")
self.verticalLayout_4.addWidget(self.plainTextEdit_file_path_save_BCG_AlignInfo) self.verticalLayout_4.addWidget(self.plainTextEdit_file_path_save_AlignInfo)
self.plainTextEdit_file_path_save_ECG_AlignInfo = QPlainTextEdit(self.groupBox_file_path_save)
self.plainTextEdit_file_path_save_ECG_AlignInfo.setObjectName(u"plainTextEdit_file_path_save_ECG_AlignInfo")
self.verticalLayout_4.addWidget(self.plainTextEdit_file_path_save_ECG_AlignInfo)
self.gridLayout_2.addWidget(self.groupBox_file_path_save, 5, 0, 1, 2) self.gridLayout_2.addWidget(self.groupBox_file_path_save, 5, 0, 1, 2)
@ -201,7 +196,7 @@ class Ui_MainWindow_precisely_align_input_setting(object):
self.gridLayout_2.setRowStretch(1, 3) self.gridLayout_2.setRowStretch(1, 3)
self.gridLayout_2.setRowStretch(3, 3) self.gridLayout_2.setRowStretch(3, 3)
self.gridLayout_2.setRowStretch(4, 2) self.gridLayout_2.setRowStretch(4, 2)
self.gridLayout_2.setRowStretch(5, 4) self.gridLayout_2.setRowStretch(5, 2)
self.gridLayout_2.setRowStretch(6, 4) self.gridLayout_2.setRowStretch(6, 4)
self.gridLayout.addWidget(self.groupBox, 0, 0, 1, 4) self.gridLayout.addWidget(self.groupBox, 0, 0, 1, 4)
@ -231,8 +226,7 @@ class Ui_MainWindow_precisely_align_input_setting(object):
self.plainTextEdit_file_path_save_BCG.setPlaceholderText(QCoreApplication.translate("MainWindow_precisely_align_input_setting", u"\u4fdd\u5b58\u8def\u5f84", None)) self.plainTextEdit_file_path_save_BCG.setPlaceholderText(QCoreApplication.translate("MainWindow_precisely_align_input_setting", u"\u4fdd\u5b58\u8def\u5f84", None))
self.plainTextEdit_file_path_save_ECG.setPlaceholderText(QCoreApplication.translate("MainWindow_precisely_align_input_setting", u"\u4fdd\u5b58\u8def\u5f84", None)) self.plainTextEdit_file_path_save_ECG.setPlaceholderText(QCoreApplication.translate("MainWindow_precisely_align_input_setting", u"\u4fdd\u5b58\u8def\u5f84", None))
self.groupBox_file_path_save.setTitle(QCoreApplication.translate("MainWindow_precisely_align_input_setting", u"\u5bf9\u9f50\u4fe1\u606f\u4fdd\u5b58\u8def\u5f84", None)) self.groupBox_file_path_save.setTitle(QCoreApplication.translate("MainWindow_precisely_align_input_setting", u"\u5bf9\u9f50\u4fe1\u606f\u4fdd\u5b58\u8def\u5f84", None))
self.plainTextEdit_file_path_save_BCG_AlignInfo.setPlaceholderText(QCoreApplication.translate("MainWindow_precisely_align_input_setting", u"\u4fdd\u5b58\u8def\u5f84", None)) self.plainTextEdit_file_path_save_AlignInfo.setPlaceholderText(QCoreApplication.translate("MainWindow_precisely_align_input_setting", u"\u4fdd\u5b58\u8def\u5f84", None))
self.plainTextEdit_file_path_save_ECG_AlignInfo.setPlaceholderText(QCoreApplication.translate("MainWindow_precisely_align_input_setting", u"\u4fdd\u5b58\u8def\u5f84", None))
self.groupBox_file_path_input_orgBcg.setTitle(QCoreApplication.translate("MainWindow_precisely_align_input_setting", u"\u539f\u59cborgBcg\u8def\u5f84", None)) self.groupBox_file_path_input_orgBcg.setTitle(QCoreApplication.translate("MainWindow_precisely_align_input_setting", u"\u539f\u59cborgBcg\u8def\u5f84", None))
self.plainTextEdit_file_path_input_orgBcg.setPlainText("") self.plainTextEdit_file_path_input_orgBcg.setPlainText("")
self.plainTextEdit_file_path_input_orgBcg.setPlaceholderText(QCoreApplication.translate("MainWindow_precisely_align_input_setting", u"\u6587\u4ef6\u8def\u5f84", None)) self.plainTextEdit_file_path_input_orgBcg.setPlaceholderText(QCoreApplication.translate("MainWindow_precisely_align_input_setting", u"\u6587\u4ef6\u8def\u5f84", None))

View File

@ -37,7 +37,7 @@
<property name="title"> <property name="title">
<string>文件路径</string> <string>文件路径</string>
</property> </property>
<layout class="QGridLayout" name="gridLayout_2" rowstretch="3,3,0,3,2,4,4"> <layout class="QGridLayout" name="gridLayout_2" rowstretch="3,3,0,3,2,2,4">
<item row="6" column="0"> <item row="6" column="0">
<widget class="QGroupBox" name="groupBox_file_path_save_2"> <widget class="QGroupBox" name="groupBox_file_path_save_2">
<property name="title"> <property name="title">
@ -75,14 +75,7 @@
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout_4"> <layout class="QVBoxLayout" name="verticalLayout_4">
<item> <item>
<widget class="QPlainTextEdit" name="plainTextEdit_file_path_save_BCG_AlignInfo"> <widget class="QPlainTextEdit" name="plainTextEdit_file_path_save_AlignInfo">
<property name="placeholderText">
<string>保存路径</string>
</property>
</widget>
</item>
<item>
<widget class="QPlainTextEdit" name="plainTextEdit_file_path_save_ECG_AlignInfo">
<property name="placeholderText"> <property name="placeholderText">
<string>保存路径</string> <string>保存路径</string>
</property> </property>