From bbe6abc57f2e6c9d963ea3278bf1fc6b1bef1745 Mon Sep 17 00:00:00 2001
From: Yorusora <yorusorank@outlook.com>
Date: Wed, 19 Feb 2025 20:22:12 +0800
Subject: [PATCH] =?UTF-8?q?=E5=B0=9D=E8=AF=95=E5=B0=86=E6=95=B0=E6=8D=AE?=
 =?UTF-8?q?=E7=BB=93=E6=9E=84=E5=8C=96=E6=B5=81=E7=A8=8B=E4=B8=AD=E7=9A=84?=
 =?UTF-8?q?append.py=E6=AD=A5=E9=AA=A4=E6=95=B4=E5=90=88=E5=85=A5=E6=AD=A4?=
 =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E4=B8=AD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 MainWindow.py      |  71 ++++++++++++++++------------
 MainWindow.ui      | 113 ++++++++++++++++++++++++++-------------------
 ecg_label_check.py |  21 +++++++++
 3 files changed, 129 insertions(+), 76 deletions(-)

diff --git a/MainWindow.py b/MainWindow.py
index 60d4e98..6b3a0ea 100644
--- a/MainWindow.py
+++ b/MainWindow.py
@@ -21,8 +21,32 @@ class Ui_MainWindow(object):
         self.gridLayout.setObjectName("gridLayout")
         self.horizontalLayout = QtWidgets.QHBoxLayout()
         self.horizontalLayout.setObjectName("horizontalLayout")
-        self.verticalLayout_left = QtWidgets.QVBoxLayout()
-        self.verticalLayout_left.setObjectName("verticalLayout_left")
+        self.gridLayout_left = QtWidgets.QGridLayout()
+        self.gridLayout_left.setObjectName("gridLayout_left")
+        self.pushButton_outputLabel = QtWidgets.QPushButton(self.centralwidget)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.pushButton_outputLabel.sizePolicy().hasHeightForWidth())
+        self.pushButton_outputLabel.setSizePolicy(sizePolicy)
+        font = QtGui.QFont()
+        font.setFamily("黑体")
+        font.setPointSize(14)
+        self.pushButton_outputLabel.setFont(font)
+        self.pushButton_outputLabel.setObjectName("pushButton_outputLabel")
+        self.gridLayout_left.addWidget(self.pushButton_outputLabel, 6, 1, 1, 1)
+        self.pushButton_append = QtWidgets.QPushButton(self.centralwidget)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.pushButton_append.sizePolicy().hasHeightForWidth())
+        self.pushButton_append.setSizePolicy(sizePolicy)
+        font = QtGui.QFont()
+        font.setFamily("黑体")
+        font.setPointSize(14)
+        self.pushButton_append.setFont(font)
+        self.pushButton_append.setObjectName("pushButton_append")
+        self.gridLayout_left.addWidget(self.pushButton_append, 6, 0, 1, 1)
         self.groupBox_inputSetting = QtWidgets.QGroupBox(self.centralwidget)
         sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
         sizePolicy.setHorizontalStretch(0)
@@ -493,9 +517,7 @@ class Ui_MainWindow(object):
         self.pushButton_savepath_open.setObjectName("pushButton_savepath_open")
         self.gridLayout_19.addWidget(self.pushButton_savepath_open, 0, 2, 1, 1)
         self.gridLayout_4.addWidget(self.groupBox_save, 5, 0, 1, 5)
-        self.verticalLayout_left.addWidget(self.groupBox_inputSetting)
-        spacerItem9 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
-        self.verticalLayout_left.addItem(spacerItem9)
+        self.gridLayout_left.addWidget(self.groupBox_inputSetting, 0, 0, 1, 2)
         self.groupBox_autoplay = QtWidgets.QGroupBox(self.centralwidget)
         sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
         sizePolicy.setHorizontalStretch(0)
@@ -843,9 +865,7 @@ class Ui_MainWindow(object):
         self.horizontalLayout_move_operate.addWidget(self.pushButton_right_move)
         self.gridLayout_49.addLayout(self.horizontalLayout_move_operate, 0, 0, 1, 2)
         self.gridLayout_6.addWidget(self.groupBox_move, 0, 0, 1, 1)
-        self.verticalLayout_left.addWidget(self.groupBox_autoplay)
-        spacerItem10 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
-        self.verticalLayout_left.addItem(spacerItem10)
+        self.gridLayout_left.addWidget(self.groupBox_autoplay, 2, 0, 1, 2)
         self.groupBox_findpeaks_options = QtWidgets.QGroupBox(self.centralwidget)
         sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
         sizePolicy.setHorizontalStretch(0)
@@ -909,27 +929,19 @@ class Ui_MainWindow(object):
         self.lineEdit_findpeaks_min_height.setPlaceholderText("")
         self.lineEdit_findpeaks_min_height.setObjectName("lineEdit_findpeaks_min_height")
         self.gridLayout_21.addWidget(self.lineEdit_findpeaks_min_height, 0, 3, 1, 1)
-        self.verticalLayout_left.addWidget(self.groupBox_findpeaks_options)
+        self.gridLayout_left.addWidget(self.groupBox_findpeaks_options, 4, 0, 1, 2)
+        spacerItem9 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
+        self.gridLayout_left.addItem(spacerItem9, 1, 0, 1, 2)
+        spacerItem10 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
+        self.gridLayout_left.addItem(spacerItem10, 5, 0, 1, 2)
         spacerItem11 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
-        self.verticalLayout_left.addItem(spacerItem11)
-        self.pushButton_outputLabel = QtWidgets.QPushButton(self.centralwidget)
-        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred)
-        sizePolicy.setHorizontalStretch(0)
-        sizePolicy.setVerticalStretch(0)
-        sizePolicy.setHeightForWidth(self.pushButton_outputLabel.sizePolicy().hasHeightForWidth())
-        self.pushButton_outputLabel.setSizePolicy(sizePolicy)
-        font = QtGui.QFont()
-        font.setFamily("黑体")
-        font.setPointSize(14)
-        self.pushButton_outputLabel.setFont(font)
-        self.pushButton_outputLabel.setObjectName("pushButton_outputLabel")
-        self.verticalLayout_left.addWidget(self.pushButton_outputLabel)
-        self.verticalLayout_left.setStretch(0, 10)
-        self.verticalLayout_left.setStretch(1, 2)
-        self.verticalLayout_left.setStretch(2, 6)
-        self.verticalLayout_left.setStretch(3, 2)
-        self.verticalLayout_left.setStretch(6, 2)
-        self.horizontalLayout.addLayout(self.verticalLayout_left)
+        self.gridLayout_left.addItem(spacerItem11, 3, 0, 1, 2)
+        self.gridLayout_left.setRowStretch(0, 10)
+        self.gridLayout_left.setRowStretch(1, 2)
+        self.gridLayout_left.setRowStretch(2, 6)
+        self.gridLayout_left.setRowStretch(3, 2)
+        self.gridLayout_left.setRowStretch(6, 2)
+        self.horizontalLayout.addLayout(self.gridLayout_left)
         self.verticalLayout_canvas = QtWidgets.QVBoxLayout()
         self.verticalLayout_canvas.setObjectName("verticalLayout_canvas")
         self.horizontalLayout.addLayout(self.verticalLayout_canvas)
@@ -1136,6 +1148,8 @@ class Ui_MainWindow(object):
     def retranslateUi(self, MainWindow):
         _translate = QtCore.QCoreApplication.translate
         MainWindow.setWindowTitle(_translate("MainWindow", "ECG_Label_Check"))
+        self.pushButton_outputLabel.setText(_translate("MainWindow", "导出标签"))
+        self.pushButton_append.setText(_translate("MainWindow", "片段合并"))
         self.groupBox_inputSetting.setTitle(_translate("MainWindow", "导入操作"))
         self.lineEdit_rootpath.setPlaceholderText(_translate("MainWindow", "数据根目录路径"))
         self.label_choose.setText(_translate("MainWindow", "数据和标签的序号选择:"))
@@ -1211,7 +1225,6 @@ class Ui_MainWindow(object):
         self.label_5.setText(_translate("MainWindow", "最小间隔:"))
         self.lineEdit_findpeaks_min_interval.setText(_translate("MainWindow", "1000"))
         self.lineEdit_findpeaks_min_height.setText(_translate("MainWindow", "0.5"))
-        self.pushButton_outputLabel.setText(_translate("MainWindow", "导出标签"))
         self.groupBox_labelDisplay.setTitle(_translate("MainWindow", "标签"))
         self.groupBox_info.setTitle(_translate("MainWindow", "信息"))
         self.label_label2_length.setText(_translate("MainWindow", "0"))
diff --git a/MainWindow.ui b/MainWindow.ui
index 768bbf7..a1ee24c 100644
--- a/MainWindow.ui
+++ b/MainWindow.ui
@@ -18,8 +18,46 @@
     <item row="0" column="0" rowspan="3" colspan="2">
      <layout class="QHBoxLayout" name="horizontalLayout" stretch="5,20,3">
       <item>
-       <layout class="QVBoxLayout" name="verticalLayout_left" stretch="10,2,6,2,0,0,2">
-        <item>
+       <layout class="QGridLayout" name="gridLayout_left" rowstretch="10,2,6,2,0,0,2">
+        <item row="6" column="1">
+         <widget class="QPushButton" name="pushButton_outputLabel">
+          <property name="sizePolicy">
+           <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+            <horstretch>0</horstretch>
+            <verstretch>0</verstretch>
+           </sizepolicy>
+          </property>
+          <property name="font">
+           <font>
+            <family>黑体</family>
+            <pointsize>14</pointsize>
+           </font>
+          </property>
+          <property name="text">
+           <string>导出标签</string>
+          </property>
+         </widget>
+        </item>
+        <item row="6" column="0">
+         <widget class="QPushButton" name="pushButton_append">
+          <property name="sizePolicy">
+           <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+            <horstretch>0</horstretch>
+            <verstretch>0</verstretch>
+           </sizepolicy>
+          </property>
+          <property name="font">
+           <font>
+            <family>黑体</family>
+            <pointsize>14</pointsize>
+           </font>
+          </property>
+          <property name="text">
+           <string>片段合并</string>
+          </property>
+         </widget>
+        </item>
+        <item row="0" column="0" colspan="2">
          <widget class="QGroupBox" name="groupBox_inputSetting">
           <property name="sizePolicy">
            <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
@@ -849,20 +887,7 @@
           </layout>
          </widget>
         </item>
-        <item>
-         <spacer name="verticalSpacer_4">
-          <property name="orientation">
-           <enum>Qt::Vertical</enum>
-          </property>
-          <property name="sizeHint" stdset="0">
-           <size>
-            <width>20</width>
-            <height>40</height>
-           </size>
-          </property>
-         </spacer>
-        </item>
-        <item>
+        <item row="2" column="0" colspan="2">
          <widget class="QGroupBox" name="groupBox_autoplay">
           <property name="sizePolicy">
            <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
@@ -1444,20 +1469,7 @@
           </layout>
          </widget>
         </item>
-        <item>
-         <spacer name="verticalSpacer_6">
-          <property name="orientation">
-           <enum>Qt::Vertical</enum>
-          </property>
-          <property name="sizeHint" stdset="0">
-           <size>
-            <width>20</width>
-            <height>40</height>
-           </size>
-          </property>
-         </spacer>
-        </item>
-        <item>
+        <item row="4" column="0" colspan="2">
          <widget class="QGroupBox" name="groupBox_findpeaks_options">
           <property name="sizePolicy">
            <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
@@ -1560,7 +1572,20 @@
           </layout>
          </widget>
         </item>
-        <item>
+        <item row="1" column="0" colspan="2">
+         <spacer name="verticalSpacer_4">
+          <property name="orientation">
+           <enum>Qt::Vertical</enum>
+          </property>
+          <property name="sizeHint" stdset="0">
+           <size>
+            <width>20</width>
+            <height>40</height>
+           </size>
+          </property>
+         </spacer>
+        </item>
+        <item row="5" column="0" colspan="2">
          <spacer name="verticalSpacer_5">
           <property name="orientation">
            <enum>Qt::Vertical</enum>
@@ -1573,24 +1598,18 @@
           </property>
          </spacer>
         </item>
-        <item>
-         <widget class="QPushButton" name="pushButton_outputLabel">
-          <property name="sizePolicy">
-           <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
-            <horstretch>0</horstretch>
-            <verstretch>0</verstretch>
-           </sizepolicy>
+        <item row="3" column="0" colspan="2">
+         <spacer name="verticalSpacer_6">
+          <property name="orientation">
+           <enum>Qt::Vertical</enum>
           </property>
-          <property name="font">
-           <font>
-            <family>黑体</family>
-            <pointsize>14</pointsize>
-           </font>
+          <property name="sizeHint" stdset="0">
+           <size>
+            <width>20</width>
+            <height>40</height>
+           </size>
           </property>
-          <property name="text">
-           <string>导出标签</string>
-          </property>
-         </widget>
+         </spacer>
         </item>
        </layout>
       </item>
diff --git a/ecg_label_check.py b/ecg_label_check.py
index 21944ec..8d0927d 100644
--- a/ecg_label_check.py
+++ b/ecg_label_check.py
@@ -113,6 +113,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
         self.pushButton_label1path_open.clicked.connect(self.slot_btn_selectPath)
         self.pushButton_label2path_open.clicked.connect(self.slot_btn_selectPath)
         self.pushButton_dataInput.clicked.connect(self.slot_btn_dataInput)
+        self.pushButton_append.clicked.connect(self.slot_btn_append)
         self.pushButton_outputLabel.clicked.connect(self.slot_btn_outputLabel)
         self.comboBox_choose.currentTextChanged.connect(self.slot_comboBox_textChanged)
         self.radioButton_inputMode_auto.clicked.connect(self.slot_radioBtn_inputMode_auto)
@@ -152,6 +153,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
         self.radioButton_data1_fillterMode.setChecked(True)
         self.radioButton_data2_fillterMode.setChecked(True)
         self.radioButton_move_preset_1.setChecked(True)
+        self.pushButton_append.setEnabled(False)
         self.pushButton_outputLabel.setEnabled(False)
         self.figToolbar.action_Label_Single.setEnabled(False)
         self.figToolbar.action_Label_Multiple.setEnabled(False)
@@ -360,6 +362,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
             # 更新界面
             self.groupBox_inputSetting.setEnabled(False)
             self.groupBox_autoplay.setEnabled(True)
+            self.pushButton_append.setEnabled(True)
             self.pushButton_outputLabel.setEnabled(True)
             self.figToolbar.action_Label_Single.setEnabled(True)
             self.figToolbar.action_Label_Multiple.setEnabled(True)
@@ -570,6 +573,24 @@ class MainWindow(QMainWindow, Ui_MainWindow):
         info(f"Jumped to x_axis: {str(int(x))}.")
         self.textBrowser_update(f"操作:跳转到x坐标: {str(int(x))}")
 
+    def slot_btn_append(self):
+        # TODO
+        reply = QMessageBox.question(self, "警告:确认操作", f"你正在执行<片段合并>,请确保需要被合并的片段已完成标注工作。你确定要将片段合并,并将结果保存到{self.lineEdit_resample1000Hz_save_path.text()}?", QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
+        if reply == QMessageBox.Yes:
+            for idx in range(len(self.ecg_seq)):
+                DataFrame(self.ecg_seq[idx].reshape(-1)).to_csv(
+                    str(Path(self.lineEdit_detect_Rpeaks_save_path.text()) / f"{idx + 1}ecg.txt"), index=False,
+                    header=None)
+                DataFrame(self.R_peak_seq[idx].reshape(-1)).to_csv(
+                    str(Path(self.lineEdit_detect_Rpeaks_save_path.text()) / f"{idx + 1}Rpeak.txt"), index=False,
+                    header=None)
+                info(f"Saved Data {idx + 1} to Directory {self.lineEdit_detect_Rpeaks_save_path.text()}.")
+                self.textBrowser_update(
+                    f"提示:保存片段{idx + 1}成功至文件夹{self.lineEdit_detect_Rpeaks_save_path.text()}")
+            self.msgBox.setText(f"保存成功至{self.lineEdit_detect_Rpeaks_save_path.text()}")
+            self.msgBox.setIcon(QMessageBox.Information)
+            self.msgBox.exec()
+
     def slot_btn_outputLabel(self):
         np.savetxt(Path(self.lineEdit_savepath.text()), self.label2, fmt='%d', newline='\n')
         info(f"Manually Saved Data to: {str(Path(self.lineEdit_savepath.text()))}.")