优化事件矩形处理逻辑,添加获取矩形宽度的辅助函数,确保支持不同类型的矩形对象

This commit is contained in:
marques
2025-09-03 22:43:35 +08:00
parent edd4178e4e
commit ca767d46cb

View File

@ -11,6 +11,8 @@ from PySide6.QtWidgets import QMessageBox, QMainWindow, QApplication, QButtonGro
from matplotlib import gridspec from matplotlib import gridspec
from matplotlib.backends.backend_qt import NavigationToolbar2QT from matplotlib.backends.backend_qt import NavigationToolbar2QT
from matplotlib.backends.backend_qtagg import FigureCanvasQTAgg 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 numpy import array, zeros, append, linspace, place, nan
from overrides import overrides from overrides import overrides
@ -280,7 +282,7 @@ class Data:
for file_key in check_file_list: for file_key in check_file_list:
if (not self.config["Path"][file_key].is_file()) or (not self.config["Path"][file_key].exists()): 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" + 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"]) Constants.FAILURE_REASON["Path_Not_Exist"])
try: try:
@ -342,6 +344,11 @@ class Data:
self.df_origin = read_csv(self.config["Path"]["Input_SA_Label"], encoding="gbk") 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["Start"] = self.df_origin["Start"].astype(int)
self.df_origin["End"] = self.df_origin["End"].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["Index"] = self.df_origin["Index"].astype(int)
self.df_origin = self.df_origin.sort_values(by="Start", ascending=True) self.df_origin = self.df_origin.sort_values(by="Start", ascending=True)
@ -995,8 +1002,7 @@ class MainWindow_SA_label(QMainWindow):
else: else:
# 已经选中事件的情况下 # 已经选中事件的情况下
if self.selected_event_rect is not None: if self.selected_event_rect is not None:
x_rect = self.selected_event_rect.get_x() x_rect, width = self.__get_x_and_width__(self.selected_event_rect)
width = self.selected_event_rect.get_width()
event_left = x_rect event_left = x_rect
event_right = x_rect + width event_right = x_rect + width
@ -1065,7 +1071,7 @@ class MainWindow_SA_label(QMainWindow):
color="orange", color="orange",
alpha=0.4) alpha=0.4)
else: 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_right = round(int(x_press) + dx)
new_width = new_right - x_rect new_width = new_right - x_rect
self.selected_event_rect.set_width(new_width) self.selected_event_rect.set_width(new_width)
@ -1083,8 +1089,7 @@ class MainWindow_SA_label(QMainWindow):
elif event.button is None: elif event.button is None:
if self.selected_event_info is not None and self.selected_event_rect is not 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() x_rect, width = self.__get_x_and_width__(self.selected_event_rect)
width = self.selected_event_rect.get_width()
event_left = x_rect event_left = x_rect
event_right = x_rect + width event_right = x_rect + width
@ -1121,9 +1126,9 @@ class MainWindow_SA_label(QMainWindow):
self.show_selected_event(int(event_row["Index"])) self.show_selected_event(int(event_row["Index"]))
# 高亮 透明度设置为0.4 # 高亮 透明度设置为0.4
self.selected_event_rect.set_alpha(0.4) self.selected_event_rect.set_alpha(0.4)
self.ui.spinBox_correctStart.setValue(self.selected_event_rect.get_x()) x_rect, width = self.__get_x_and_width__(self.selected_event_rect)
self.ui.spinBox_correctEnd.setValue( self.ui.spinBox_correctStart.setValue(x_rect)
self.selected_event_rect.get_x() + self.selected_event_rect.get_width()) self.ui.spinBox_correctEnd.setValue(x_rect + width)
elif self.press is None and event_row is None: elif self.press is None and event_row is None:
pass pass
@ -1173,8 +1178,7 @@ class MainWindow_SA_label(QMainWindow):
if self.press is None: if self.press is None:
# 点击了新建SA事件区域 # 点击了新建SA事件区域
if event_row is None and self.selected_event_info["Index"] == -1: if event_row is None and self.selected_event_info["Index"] == -1:
x_rect = self.selected_event_rect.get_x() x_rect, width = self.__get_x_and_width__(self.selected_event_rect)
width = self.selected_event_rect.get_width()
event_left = x_rect event_left = x_rect
event_right = x_rect + width event_right = x_rect + width
@ -1244,8 +1248,7 @@ class MainWindow_SA_label(QMainWindow):
def __reset_rect__(self): def __reset_rect__(self):
if self.selected_event_info is not None and self.selected_event_rect is not None: if self.selected_event_info is not None and self.selected_event_rect is not None:
self.selected_event_rect.set_alpha(0.2) self.selected_event_rect.set_alpha(0.2)
x_rect = self.selected_event_rect.get_x() x_rect, width = self.__get_x_and_width__(self.selected_event_rect)
width = self.selected_event_rect.get_width()
event_left = self.selected_event_info["correct_Start"] if self.selected_event_info["isLabeled"] != -1 else \ event_left = self.selected_event_info["correct_Start"] if self.selected_event_info["isLabeled"] != -1 else \
self.selected_event_info["Start"] self.selected_event_info["Start"]
@ -1999,7 +2002,20 @@ class MainWindow_SA_label(QMainWindow):
row["Index"]: span 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): class CustomNavigationToolbar(NavigationToolbar2QT):
def __init__(self, canvas, parent): def __init__(self, canvas, parent):
super().__init__(canvas, parent) super().__init__(canvas, parent)