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

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.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)