diff --git a/func/Module_SA_label_v2.py b/func/Module_SA_label_v2.py index 4be3d55..b2e9010 100644 --- a/func/Module_SA_label_v2.py +++ b/func/Module_SA_label_v2.py @@ -11,6 +11,8 @@ from PySide6.QtWidgets import QMessageBox, QMainWindow, QApplication, QButtonGro from matplotlib import gridspec from matplotlib.backends.backend_qt import NavigationToolbar2QT from matplotlib.backends.backend_qtagg import FigureCanvasQTAgg +from matplotlib.collections import PolyCollection +from matplotlib.patches import Rectangle from numpy import array, zeros, append, linspace, place, nan from overrides import overrides @@ -280,7 +282,7 @@ class Data: for file_key in check_file_list: if (not self.config["Path"][file_key].is_file()) or (not self.config["Path"][file_key].exists()): return Result().failure(info=Constants.INPUT_FAILURE + "\n" + - self.config["Path"][file_key] + + str(self.config["Path"][file_key]) + Constants.FAILURE_REASON["Path_Not_Exist"]) try: @@ -342,6 +344,11 @@ class Data: self.df_origin = read_csv(self.config["Path"]["Input_SA_Label"], encoding="gbk") self.df_origin["Start"] = self.df_origin["Start"].astype(int) self.df_origin["End"] = self.df_origin["End"].astype(int) + # 查看index是否存在 + if "Index" not in self.df_origin.columns: + # 添加Index列 + self.df_origin.insert(0, "Index", range(1, len(self.df_origin) + 1)) + self.df_origin["Index"] = self.df_origin["Index"].astype(int) self.df_origin = self.df_origin.sort_values(by="Start", ascending=True) @@ -995,8 +1002,7 @@ class MainWindow_SA_label(QMainWindow): else: # 已经选中事件的情况下 if self.selected_event_rect is not None: - x_rect = self.selected_event_rect.get_x() - width = self.selected_event_rect.get_width() + x_rect, width = self.__get_x_and_width__(self.selected_event_rect) event_left = x_rect event_right = x_rect + width @@ -1065,7 +1071,7 @@ class MainWindow_SA_label(QMainWindow): color="orange", alpha=0.4) else: - x_rect = self.selected_event_rect.get_x() + x_rect, width = self.__get_x_and_width__(self.selected_event_rect) new_right = round(int(x_press) + dx) new_width = new_right - x_rect self.selected_event_rect.set_width(new_width) @@ -1083,8 +1089,7 @@ class MainWindow_SA_label(QMainWindow): elif event.button is None: if self.selected_event_info is not None and self.selected_event_rect is not None: # 非按下时,靠近边界时,修改光标样式 - x_rect = self.selected_event_rect.get_x() - width = self.selected_event_rect.get_width() + x_rect, width = self.__get_x_and_width__(self.selected_event_rect) event_left = x_rect event_right = x_rect + width @@ -1121,9 +1126,9 @@ class MainWindow_SA_label(QMainWindow): self.show_selected_event(int(event_row["Index"])) # 高亮 透明度设置为0.4 self.selected_event_rect.set_alpha(0.4) - self.ui.spinBox_correctStart.setValue(self.selected_event_rect.get_x()) - self.ui.spinBox_correctEnd.setValue( - self.selected_event_rect.get_x() + self.selected_event_rect.get_width()) + x_rect, width = self.__get_x_and_width__(self.selected_event_rect) + self.ui.spinBox_correctStart.setValue(x_rect) + self.ui.spinBox_correctEnd.setValue(x_rect + width) elif self.press is None and event_row is None: pass @@ -1173,8 +1178,7 @@ class MainWindow_SA_label(QMainWindow): if self.press is None: # 点击了新建SA事件区域 if event_row is None and self.selected_event_info["Index"] == -1: - x_rect = self.selected_event_rect.get_x() - width = self.selected_event_rect.get_width() + x_rect, width = self.__get_x_and_width__(self.selected_event_rect) event_left = x_rect event_right = x_rect + width @@ -1244,8 +1248,7 @@ class MainWindow_SA_label(QMainWindow): def __reset_rect__(self): if self.selected_event_info is not None and self.selected_event_rect is not None: self.selected_event_rect.set_alpha(0.2) - x_rect = self.selected_event_rect.get_x() - width = self.selected_event_rect.get_width() + x_rect, width = self.__get_x_and_width__(self.selected_event_rect) event_left = self.selected_event_info["correct_Start"] if self.selected_event_info["isLabeled"] != -1 else \ self.selected_event_info["Start"] @@ -1999,7 +2002,20 @@ class MainWindow_SA_label(QMainWindow): row["Index"]: span }) - + def __get_x_and_width__(self, event_rect): + """Get the width of a rectangle in data coordinates.""" + # pyside6.9.0 axvspan 返回的是一个Rectangle对象 + # pyside6.9.1 axvspan 返回的是一个PolyCollection对象 + if isinstance(event_rect, Rectangle): + x = event_rect.get_x() + width = event_rect.get_width() + elif isinstance(event_rect, PolyCollection): + verts = event_rect.get_paths()[0].vertices + x = verts[0, 0] + width = verts[2, 0] - verts[0, 0] + else: + raise TypeError("Unsupported event_rect type") + return x, width class CustomNavigationToolbar(NavigationToolbar2QT): def __init__(self, canvas, parent): super().__init__(canvas, parent)