Loading ballontranslator/ui/canvas.py +4 −2 Original line number Diff line number Diff line Loading @@ -147,7 +147,7 @@ class Canvas(QGraphicsScene): self.imgLayer.setParentItem(self.baseLayer) self.maskLayer.setParentItem(self.baseLayer) self.drawingLayer.setParentItem(self.baseLayer) self.addItem(self.txtblkShapeControl) self.txtblkShapeControl.setParentItem(self.inpaintLayer) self.scalefactor_changed.connect(self.onScaleFactorChanged) self.selectionChanged.connect(self.on_selection_changed) Loading Loading @@ -210,6 +210,7 @@ class Canvas(QGraphicsScene): self.old_size = sbr.size() self.scale_factor = s_f self.baseLayer.setScale(self.scale_factor) self.txtblkShapeControl.updateScale(self.scale_factor) self.adjustScrollBar(self.gv.horizontalScrollBar(), factor) self.adjustScrollBar(self.gv.verticalScrollBar(), factor) Loading Loading @@ -258,6 +259,7 @@ class Canvas(QGraphicsScene): item.setParentItem(self.drawingLayer) def startCreateTextblock(self, pos: QPointF, hide_control: bool = False): pos = pos / self.scale_factor self.creating_textblock = True self.create_block_origin = pos self.gv.setCursor(Qt.CursorShape.CrossCursor) Loading @@ -281,7 +283,7 @@ class Canvas(QGraphicsScene): def mouseMoveEvent(self, event: QGraphicsSceneMouseEvent) -> None: if self.creating_textblock: self.txtblkShapeControl.setRect(QRectF(self.create_block_origin, event.scenePos()).normalized()) self.txtblkShapeControl.setRect(QRectF(self.create_block_origin, event.scenePos() / self.scale_factor).normalized()) elif self.stroke_path_item is not None: self.stroke_path_item.addNewPoint(self.imgLayer.mapFromScene(event.scenePos())) elif self.scale_tool_mode: Loading ballontranslator/ui/drawingpanel.py +1 −1 Original line number Diff line number Diff line Loading @@ -653,7 +653,7 @@ class DrawingPanel(Widget): im_h, im_w = img.shape[:2] xyxy = [rect.x(), rect.y(), rect.x() + rect.width(), rect.y() + rect.height()] xyxy = np.array(xyxy) / self.canvas.scale_factor xyxy = np.array(xyxy) xyxy[[0, 2]] = np.clip(xyxy[[0, 2]], 0, im_w - 1) xyxy[[1, 3]] = np.clip(xyxy[[1, 3]], 0, im_h - 1) x1, y1, x2, y2 = xyxy.astype(np.int64) Loading ballontranslator/ui/mainwindow.py +1 −2 Original line number Diff line number Diff line Loading @@ -410,8 +410,7 @@ class MainWindow(QMainWindow): def save_proj(self): if self.leftBar.imgTransChecker.isChecked()\ and self.imgtrans_proj.directory is not None: self.st_manager.updateTextBlkList() self.saveCurrentPage() self.saveCurrentPage(update_scene_text=True) def saveCurrentPage(self, update_scene_text=True, save_proj=True): if update_scene_text: Loading ballontranslator/ui/scenetext_manager.py +3 −13 Original line number Diff line number Diff line Loading @@ -86,7 +86,6 @@ class ReshapeItemCommand(QUndoCommand): self.newRect = item.rect() def redo(self): print("new rect: ", self.newRect) self.item.setRect(self.newRect) def undo(self): Loading Loading @@ -267,11 +266,6 @@ class SceneTextManager(QObject): def adjustSceneTextRect(self): new_size = self.canvas.imgLayer.sceneBoundingRect().size() scale_factor = new_size.width() / self.canvas.old_size.width() for blk_item in self.textblk_item_list: rel_pos = blk_item.scenePos() * scale_factor blk_item.setScale(self.canvas.scale_factor) blk_item.setPos(blk_item.pos() + rel_pos - blk_item.scenePos()) self.txtblkShapeControl.updateBoundingRect() def clearSceneTextitems(self): Loading Loading @@ -309,9 +303,6 @@ class SceneTextManager(QObject): blk.translation = translation self.layout_textblk(blk_item, text=translation) self.addTextBlkItem(blk_item) rel_pos = blk_item.scenePos() * self.canvas.scale_factor blk_item.setScale(self.canvas.scale_factor) blk_item.setPos(blk_item.pos() + rel_pos - blk_item.scenePos()) pair_widget = TransPairWidget(blk, len(self.pairwidget_list)) self.pairwidget_list.append(pair_widget) Loading @@ -325,7 +316,7 @@ class SceneTextManager(QObject): def addTextBlkItem(self, textblk_item: TextBlkItem) -> TextBlkItem: self.textblk_item_list.append(textblk_item) self.canvas.addItem(textblk_item) textblk_item.setParentItem(self.canvas.inpaintLayer) textblk_item.begin_edit.connect(self.onTextBlkItemBeginEdit) textblk_item.end_edit.connect(self.onTextBlkItemEndEdit) textblk_item.hover_enter.connect(self.onTextBlkItemHoverEnter) Loading Loading @@ -359,7 +350,7 @@ class SceneTextManager(QObject): blkitem.idx = len(self.textblk_item_list) p_widget.idx = len(self.pairwidget_list) self.textblk_item_list.append(blkitem) self.canvas.addItem(blkitem) blkitem.setParentItem(self.canvas.inpaintLayer) self.pairwidget_list.append(p_widget) self.textEditList.addPairWidget(p_widget) Loading Loading @@ -643,10 +634,9 @@ class SceneTextManager(QObject): def onEndCreateTextBlock(self, rect: QRectF): scale_f = self.canvas.scale_factor if rect.width() > 1 and rect.height() > 1: xyxy = np.array([rect.x(), rect.y(), rect.right(), rect.bottom()]) xyxy = np.round(xyxy / scale_f).astype(np.int) xyxy = np.round(xyxy).astype(np.int) block = TextBlock(xyxy) xywh = np.copy(xyxy) xywh[[2, 3]] -= xywh[[0, 1]] Loading ballontranslator/ui/texteditshapecontrol.py +66 −48 Original line number Diff line number Diff line Loading @@ -15,21 +15,23 @@ class ControlBlockItem(QGraphicsRectItem): DRAG_RESHAPE = 1 DRAG_ROTATE = 2 CURSOR_IDX = -1 def __init__(self, parent, idx: int, edge_len: float): def __init__(self, parent, idx: int): super().__init__(parent) # self.setParentItem(parent) self.idx = idx self.ctrl: TextBlkShapeControl = parent self.edge_len = edge_len self.visible_len = self.edge_len // 2 self.pen_width = 2 self.setPen(QPen(QColor(75, 75, 75), self.pen_width, Qt.PenStyle.SolidLine, Qt.SquareCap)) offset = self.edge_len // 4 + self.pen_width / 2 self.visible_rect = QRectF(offset, offset, self.visible_len, self.visible_len) self.edge_width = 0 self.drag_mode = self.DRAG_NONE self.setAcceptHoverEvents(True) self.setFlags(QGraphicsItem.ItemIsMovable | QGraphicsItem.ItemIsSelectable) self.setRect(0, 0, self.edge_len, self.edge_len) self.setFlags(QGraphicsItem.GraphicsItemFlag.ItemIsMovable | QGraphicsItem.GraphicsItemFlag.ItemIsSelectable) self.updateEdgeWidth(CBEDGE_WIDTH) def updateEdgeWidth(self, edge_width: float): self.edge_width = edge_width self.visible_len = self.edge_width // 2 self.pen_width = edge_width / CBEDGE_WIDTH * 2 offset = self.edge_width // 4 + self.pen_width / 2 self.visible_rect = QRectF(offset, offset, self.visible_len, self.visible_len) self.setRect(0, 0, self.edge_width, self.edge_width) def paint(self, painter: QPainter, option: QStyleOptionGraphicsItem, widget: QWidget) -> None: rect = QRectF(self.visible_rect) Loading @@ -56,21 +58,26 @@ class ControlBlockItem(QGraphicsRectItem): self.CURSOR_IDX = idx return super().hoverMoveEvent(event) def hoverLeaveEvent(self, event: 'QGraphicsSceneHoverEvent') -> None: if self.drag_mode == self.DRAG_NONE: self.setCursor(Qt.CursorShape.SizeAllCursor) return super().hoverLeaveEvent(event) def mousePressEvent(self, event: QGraphicsSceneMouseEvent) -> None: self.ctrl.ctrlblockPressed() if event.button() == Qt.MouseButton.LeftButton: self.ctrl.reshaping = True if self.visible_rect.contains(event.pos()): self.ctrl.reshaping = True self.drag_mode = self.DRAG_RESHAPE self.setFlag(QGraphicsItem.GraphicsItemFlag.ItemIsMovable, True) self.ctrl.blk_item.startReshape() else: self.drag_mode = self.DRAG_ROTATE self.setFlag(QGraphicsItem.GraphicsItemFlag.ItemIsMovable, False) preview = self.ctrl.previewPixmap preview.setPixmap(self.ctrl.blk_item.toPixmap()) preview.setOpacity(0.7) preview.setScale(self.ctrl.blk_item.scale()) preview.setVisible(True) rotate_vec = event.scenePos() - self.ctrl.pos() - self.ctrl.boundingRect().center() self.updateAngleLabelPos() rotation = np.rad2deg(math.atan2(rotate_vec.y(), rotate_vec.x())) Loading @@ -91,13 +98,11 @@ class ControlBlockItem(QGraphicsRectItem): angleLabel.raise_() def mouseMoveEvent(self, event: QGraphicsSceneMouseEvent) -> None: super().mouseMoveEvent(event) blk_item = self.ctrl.blk_item if self.drag_mode == self.DRAG_RESHAPE: block_group = self.ctrl.ctrlblock_group old_pos = QPointF(block_group[0].scenePos()) super().mouseMoveEvent(event) crect = self.ctrl.rect() pos_x, pos_y = 0, 0 opposite_block = block_group[(self.idx + 4) % 8 ] Loading Loading @@ -138,20 +143,17 @@ class ControlBlockItem(QGraphicsRectItem): crect.setX(pos_x+self.visible_len) self.ctrl.setRect(crect) rect = QRectF() rect.setTopLeft(blk_item.pos()+block_group[0].scenePos()-old_pos) rect.setBottomRight(crect.bottomRight()-crect.topLeft()+rect.topLeft()) rect.setHeight(rect.height()/blk_item.scale()) rect.setWidth(rect.width()/blk_item.scale()) scale = self.ctrl.current_scale new_center = self.ctrl.sceneBoundingRect().center() rect.setX(new_center.x()-rect.width()/2) rect.setY(new_center.y()-rect.height()/2) new_xy = QPointF(new_center.x() / scale - crect.width() / 2, new_center.y() / scale - crect.height() / 2) rect = QRectF(new_xy.x(), new_xy.y(), crect.width(), crect.height()) blk_item.setRect(rect) elif self.drag_mode == self.DRAG_ROTATE: # rotating rotate_vec = event.scenePos() - self.ctrl.pos() - self.ctrl.boundingRect().center() rotate_vec = event.scenePos() - self.ctrl.sceneBoundingRect().center() rotation = np.rad2deg(math.atan2(rotate_vec.y(), rotate_vec.x())) self.ctrl.setAngle(rotation+self.rotate_start) self.ctrl.setAngle((rotation+self.rotate_start) % 360) # angle = self.ctrl.rotation() angle = self.ctrl.rotation() + 45 * self.idx idx = self.get_angle_idx(angle) if self.CURSOR_IDX != idx: Loading @@ -178,10 +180,10 @@ class ControlBlockItem(QGraphicsRectItem): self.ctrl.updateBoundingRect() return super().mouseReleaseEvent(event) CBEDGE_WIDTH = 40 class TextBlkShapeControl(QGraphicsRectItem): blk_item : TextBlkItem = None cb_edge_len : float = 40 ctrl_block: ControlBlockItem = None reshaping: bool = False Loading @@ -189,14 +191,14 @@ class TextBlkShapeControl(QGraphicsRectItem): super().__init__() self.gv = parent self.ctrlblock_group = [ ControlBlockItem(self, 0, self.cb_edge_len), ControlBlockItem(self, 1, self.cb_edge_len), ControlBlockItem(self, 2, self.cb_edge_len), ControlBlockItem(self, 3, self.cb_edge_len), ControlBlockItem(self, 4, self.cb_edge_len), ControlBlockItem(self, 5, self.cb_edge_len), ControlBlockItem(self, 6, self.cb_edge_len), ControlBlockItem(self, 7, self.cb_edge_len), ControlBlockItem(self, 0), ControlBlockItem(self, 1), ControlBlockItem(self, 2), ControlBlockItem(self, 3), ControlBlockItem(self, 4), ControlBlockItem(self, 5), ControlBlockItem(self, 6), ControlBlockItem(self, 7), ] self.previewPixmap = QGraphicsPixmapItem(self) Loading @@ -205,7 +207,6 @@ class TextBlkShapeControl(QGraphicsRectItem): pen.setDashPattern([7, 14]) self.setPen(pen) self.setVisible(False) self.setZValue(1) self.angleLabel = QLabel(parent) self.angleLabel.setText("{:.1f}°".format(self.rotation())) Loading @@ -213,6 +214,8 @@ class TextBlkShapeControl(QGraphicsRectItem): self.angleLabel.setAlignment(Qt.AlignmentFlag.AlignCenter) self.angleLabel.setHidden(True) self.current_scale = 1. self.need_rescale = False self.setCursor(Qt.CursorShape.SizeAllCursor) def setBlkItem(self, blk_item: TextBlkItem): Loading @@ -237,15 +240,10 @@ class TextBlkShapeControl(QGraphicsRectItem): if self.blk_item is None: return br = self.blk_item.boundingRect() center = br.center() scale = self.blk_item.scale() ds = 1 - scale br = [0, 0, br.width()*scale, br.height()*scale] self.setRect(br) self.blk_item.setCenterTransform() self.setTransformOriginPoint(self.blk_item.transformOriginPoint()) self.setRect(*br) pos = self.blk_item.pos() self.setPos(pos.x()+ds*center.x(), pos.y()+ds*center.y()) self.setPos(self.blk_item.pos()) self.setAngle(self.blk_item.angle) def setRect(self, *args): Loading @@ -258,11 +256,10 @@ class TextBlkShapeControl(QGraphicsRectItem): corner_pnts = xywh2xyxypoly(np.array([b_rect])).reshape(-1, 2) edge_pnts = (corner_pnts[[1, 2, 3, 0]] + corner_pnts) / 2 pnts = [edge_pnts, corner_pnts] offset = -0.5 * self.cb_edge_len for ii, ctrlblock in enumerate(self.ctrlblock_group): is_corner = not ii % 2 idx = ii // 2 pos = pnts[is_corner][idx] + offset pos = pnts[is_corner][idx] -0.5 * ctrlblock.edge_width ctrlblock.setPos(pos[0], pos[1]) def setAngle(self, angle: int) -> None: Loading @@ -286,3 +283,24 @@ class TextBlkShapeControl(QGraphicsRectItem): def showControls(self): for ctrl in self.ctrlblock_group: ctrl.show() def updateScale(self, scale: float): if not self.isVisible(): if scale != self.current_scale: self.need_rescale = True self.current_scale = scale return self.current_scale = scale scale = 1 / scale pen = self.pen() pen.setWidthF(2 * scale) self.setPen(pen) for ctrl in self.ctrlblock_group: ctrl.updateEdgeWidth(CBEDGE_WIDTH * scale) def show(self) -> None: super().show() if self.need_rescale: self.updateScale(self.current_scale) self.need_rescale = False Loading
ballontranslator/ui/canvas.py +4 −2 Original line number Diff line number Diff line Loading @@ -147,7 +147,7 @@ class Canvas(QGraphicsScene): self.imgLayer.setParentItem(self.baseLayer) self.maskLayer.setParentItem(self.baseLayer) self.drawingLayer.setParentItem(self.baseLayer) self.addItem(self.txtblkShapeControl) self.txtblkShapeControl.setParentItem(self.inpaintLayer) self.scalefactor_changed.connect(self.onScaleFactorChanged) self.selectionChanged.connect(self.on_selection_changed) Loading Loading @@ -210,6 +210,7 @@ class Canvas(QGraphicsScene): self.old_size = sbr.size() self.scale_factor = s_f self.baseLayer.setScale(self.scale_factor) self.txtblkShapeControl.updateScale(self.scale_factor) self.adjustScrollBar(self.gv.horizontalScrollBar(), factor) self.adjustScrollBar(self.gv.verticalScrollBar(), factor) Loading Loading @@ -258,6 +259,7 @@ class Canvas(QGraphicsScene): item.setParentItem(self.drawingLayer) def startCreateTextblock(self, pos: QPointF, hide_control: bool = False): pos = pos / self.scale_factor self.creating_textblock = True self.create_block_origin = pos self.gv.setCursor(Qt.CursorShape.CrossCursor) Loading @@ -281,7 +283,7 @@ class Canvas(QGraphicsScene): def mouseMoveEvent(self, event: QGraphicsSceneMouseEvent) -> None: if self.creating_textblock: self.txtblkShapeControl.setRect(QRectF(self.create_block_origin, event.scenePos()).normalized()) self.txtblkShapeControl.setRect(QRectF(self.create_block_origin, event.scenePos() / self.scale_factor).normalized()) elif self.stroke_path_item is not None: self.stroke_path_item.addNewPoint(self.imgLayer.mapFromScene(event.scenePos())) elif self.scale_tool_mode: Loading
ballontranslator/ui/drawingpanel.py +1 −1 Original line number Diff line number Diff line Loading @@ -653,7 +653,7 @@ class DrawingPanel(Widget): im_h, im_w = img.shape[:2] xyxy = [rect.x(), rect.y(), rect.x() + rect.width(), rect.y() + rect.height()] xyxy = np.array(xyxy) / self.canvas.scale_factor xyxy = np.array(xyxy) xyxy[[0, 2]] = np.clip(xyxy[[0, 2]], 0, im_w - 1) xyxy[[1, 3]] = np.clip(xyxy[[1, 3]], 0, im_h - 1) x1, y1, x2, y2 = xyxy.astype(np.int64) Loading
ballontranslator/ui/mainwindow.py +1 −2 Original line number Diff line number Diff line Loading @@ -410,8 +410,7 @@ class MainWindow(QMainWindow): def save_proj(self): if self.leftBar.imgTransChecker.isChecked()\ and self.imgtrans_proj.directory is not None: self.st_manager.updateTextBlkList() self.saveCurrentPage() self.saveCurrentPage(update_scene_text=True) def saveCurrentPage(self, update_scene_text=True, save_proj=True): if update_scene_text: Loading
ballontranslator/ui/scenetext_manager.py +3 −13 Original line number Diff line number Diff line Loading @@ -86,7 +86,6 @@ class ReshapeItemCommand(QUndoCommand): self.newRect = item.rect() def redo(self): print("new rect: ", self.newRect) self.item.setRect(self.newRect) def undo(self): Loading Loading @@ -267,11 +266,6 @@ class SceneTextManager(QObject): def adjustSceneTextRect(self): new_size = self.canvas.imgLayer.sceneBoundingRect().size() scale_factor = new_size.width() / self.canvas.old_size.width() for blk_item in self.textblk_item_list: rel_pos = blk_item.scenePos() * scale_factor blk_item.setScale(self.canvas.scale_factor) blk_item.setPos(blk_item.pos() + rel_pos - blk_item.scenePos()) self.txtblkShapeControl.updateBoundingRect() def clearSceneTextitems(self): Loading Loading @@ -309,9 +303,6 @@ class SceneTextManager(QObject): blk.translation = translation self.layout_textblk(blk_item, text=translation) self.addTextBlkItem(blk_item) rel_pos = blk_item.scenePos() * self.canvas.scale_factor blk_item.setScale(self.canvas.scale_factor) blk_item.setPos(blk_item.pos() + rel_pos - blk_item.scenePos()) pair_widget = TransPairWidget(blk, len(self.pairwidget_list)) self.pairwidget_list.append(pair_widget) Loading @@ -325,7 +316,7 @@ class SceneTextManager(QObject): def addTextBlkItem(self, textblk_item: TextBlkItem) -> TextBlkItem: self.textblk_item_list.append(textblk_item) self.canvas.addItem(textblk_item) textblk_item.setParentItem(self.canvas.inpaintLayer) textblk_item.begin_edit.connect(self.onTextBlkItemBeginEdit) textblk_item.end_edit.connect(self.onTextBlkItemEndEdit) textblk_item.hover_enter.connect(self.onTextBlkItemHoverEnter) Loading Loading @@ -359,7 +350,7 @@ class SceneTextManager(QObject): blkitem.idx = len(self.textblk_item_list) p_widget.idx = len(self.pairwidget_list) self.textblk_item_list.append(blkitem) self.canvas.addItem(blkitem) blkitem.setParentItem(self.canvas.inpaintLayer) self.pairwidget_list.append(p_widget) self.textEditList.addPairWidget(p_widget) Loading Loading @@ -643,10 +634,9 @@ class SceneTextManager(QObject): def onEndCreateTextBlock(self, rect: QRectF): scale_f = self.canvas.scale_factor if rect.width() > 1 and rect.height() > 1: xyxy = np.array([rect.x(), rect.y(), rect.right(), rect.bottom()]) xyxy = np.round(xyxy / scale_f).astype(np.int) xyxy = np.round(xyxy).astype(np.int) block = TextBlock(xyxy) xywh = np.copy(xyxy) xywh[[2, 3]] -= xywh[[0, 1]] Loading
ballontranslator/ui/texteditshapecontrol.py +66 −48 Original line number Diff line number Diff line Loading @@ -15,21 +15,23 @@ class ControlBlockItem(QGraphicsRectItem): DRAG_RESHAPE = 1 DRAG_ROTATE = 2 CURSOR_IDX = -1 def __init__(self, parent, idx: int, edge_len: float): def __init__(self, parent, idx: int): super().__init__(parent) # self.setParentItem(parent) self.idx = idx self.ctrl: TextBlkShapeControl = parent self.edge_len = edge_len self.visible_len = self.edge_len // 2 self.pen_width = 2 self.setPen(QPen(QColor(75, 75, 75), self.pen_width, Qt.PenStyle.SolidLine, Qt.SquareCap)) offset = self.edge_len // 4 + self.pen_width / 2 self.visible_rect = QRectF(offset, offset, self.visible_len, self.visible_len) self.edge_width = 0 self.drag_mode = self.DRAG_NONE self.setAcceptHoverEvents(True) self.setFlags(QGraphicsItem.ItemIsMovable | QGraphicsItem.ItemIsSelectable) self.setRect(0, 0, self.edge_len, self.edge_len) self.setFlags(QGraphicsItem.GraphicsItemFlag.ItemIsMovable | QGraphicsItem.GraphicsItemFlag.ItemIsSelectable) self.updateEdgeWidth(CBEDGE_WIDTH) def updateEdgeWidth(self, edge_width: float): self.edge_width = edge_width self.visible_len = self.edge_width // 2 self.pen_width = edge_width / CBEDGE_WIDTH * 2 offset = self.edge_width // 4 + self.pen_width / 2 self.visible_rect = QRectF(offset, offset, self.visible_len, self.visible_len) self.setRect(0, 0, self.edge_width, self.edge_width) def paint(self, painter: QPainter, option: QStyleOptionGraphicsItem, widget: QWidget) -> None: rect = QRectF(self.visible_rect) Loading @@ -56,21 +58,26 @@ class ControlBlockItem(QGraphicsRectItem): self.CURSOR_IDX = idx return super().hoverMoveEvent(event) def hoverLeaveEvent(self, event: 'QGraphicsSceneHoverEvent') -> None: if self.drag_mode == self.DRAG_NONE: self.setCursor(Qt.CursorShape.SizeAllCursor) return super().hoverLeaveEvent(event) def mousePressEvent(self, event: QGraphicsSceneMouseEvent) -> None: self.ctrl.ctrlblockPressed() if event.button() == Qt.MouseButton.LeftButton: self.ctrl.reshaping = True if self.visible_rect.contains(event.pos()): self.ctrl.reshaping = True self.drag_mode = self.DRAG_RESHAPE self.setFlag(QGraphicsItem.GraphicsItemFlag.ItemIsMovable, True) self.ctrl.blk_item.startReshape() else: self.drag_mode = self.DRAG_ROTATE self.setFlag(QGraphicsItem.GraphicsItemFlag.ItemIsMovable, False) preview = self.ctrl.previewPixmap preview.setPixmap(self.ctrl.blk_item.toPixmap()) preview.setOpacity(0.7) preview.setScale(self.ctrl.blk_item.scale()) preview.setVisible(True) rotate_vec = event.scenePos() - self.ctrl.pos() - self.ctrl.boundingRect().center() self.updateAngleLabelPos() rotation = np.rad2deg(math.atan2(rotate_vec.y(), rotate_vec.x())) Loading @@ -91,13 +98,11 @@ class ControlBlockItem(QGraphicsRectItem): angleLabel.raise_() def mouseMoveEvent(self, event: QGraphicsSceneMouseEvent) -> None: super().mouseMoveEvent(event) blk_item = self.ctrl.blk_item if self.drag_mode == self.DRAG_RESHAPE: block_group = self.ctrl.ctrlblock_group old_pos = QPointF(block_group[0].scenePos()) super().mouseMoveEvent(event) crect = self.ctrl.rect() pos_x, pos_y = 0, 0 opposite_block = block_group[(self.idx + 4) % 8 ] Loading Loading @@ -138,20 +143,17 @@ class ControlBlockItem(QGraphicsRectItem): crect.setX(pos_x+self.visible_len) self.ctrl.setRect(crect) rect = QRectF() rect.setTopLeft(blk_item.pos()+block_group[0].scenePos()-old_pos) rect.setBottomRight(crect.bottomRight()-crect.topLeft()+rect.topLeft()) rect.setHeight(rect.height()/blk_item.scale()) rect.setWidth(rect.width()/blk_item.scale()) scale = self.ctrl.current_scale new_center = self.ctrl.sceneBoundingRect().center() rect.setX(new_center.x()-rect.width()/2) rect.setY(new_center.y()-rect.height()/2) new_xy = QPointF(new_center.x() / scale - crect.width() / 2, new_center.y() / scale - crect.height() / 2) rect = QRectF(new_xy.x(), new_xy.y(), crect.width(), crect.height()) blk_item.setRect(rect) elif self.drag_mode == self.DRAG_ROTATE: # rotating rotate_vec = event.scenePos() - self.ctrl.pos() - self.ctrl.boundingRect().center() rotate_vec = event.scenePos() - self.ctrl.sceneBoundingRect().center() rotation = np.rad2deg(math.atan2(rotate_vec.y(), rotate_vec.x())) self.ctrl.setAngle(rotation+self.rotate_start) self.ctrl.setAngle((rotation+self.rotate_start) % 360) # angle = self.ctrl.rotation() angle = self.ctrl.rotation() + 45 * self.idx idx = self.get_angle_idx(angle) if self.CURSOR_IDX != idx: Loading @@ -178,10 +180,10 @@ class ControlBlockItem(QGraphicsRectItem): self.ctrl.updateBoundingRect() return super().mouseReleaseEvent(event) CBEDGE_WIDTH = 40 class TextBlkShapeControl(QGraphicsRectItem): blk_item : TextBlkItem = None cb_edge_len : float = 40 ctrl_block: ControlBlockItem = None reshaping: bool = False Loading @@ -189,14 +191,14 @@ class TextBlkShapeControl(QGraphicsRectItem): super().__init__() self.gv = parent self.ctrlblock_group = [ ControlBlockItem(self, 0, self.cb_edge_len), ControlBlockItem(self, 1, self.cb_edge_len), ControlBlockItem(self, 2, self.cb_edge_len), ControlBlockItem(self, 3, self.cb_edge_len), ControlBlockItem(self, 4, self.cb_edge_len), ControlBlockItem(self, 5, self.cb_edge_len), ControlBlockItem(self, 6, self.cb_edge_len), ControlBlockItem(self, 7, self.cb_edge_len), ControlBlockItem(self, 0), ControlBlockItem(self, 1), ControlBlockItem(self, 2), ControlBlockItem(self, 3), ControlBlockItem(self, 4), ControlBlockItem(self, 5), ControlBlockItem(self, 6), ControlBlockItem(self, 7), ] self.previewPixmap = QGraphicsPixmapItem(self) Loading @@ -205,7 +207,6 @@ class TextBlkShapeControl(QGraphicsRectItem): pen.setDashPattern([7, 14]) self.setPen(pen) self.setVisible(False) self.setZValue(1) self.angleLabel = QLabel(parent) self.angleLabel.setText("{:.1f}°".format(self.rotation())) Loading @@ -213,6 +214,8 @@ class TextBlkShapeControl(QGraphicsRectItem): self.angleLabel.setAlignment(Qt.AlignmentFlag.AlignCenter) self.angleLabel.setHidden(True) self.current_scale = 1. self.need_rescale = False self.setCursor(Qt.CursorShape.SizeAllCursor) def setBlkItem(self, blk_item: TextBlkItem): Loading @@ -237,15 +240,10 @@ class TextBlkShapeControl(QGraphicsRectItem): if self.blk_item is None: return br = self.blk_item.boundingRect() center = br.center() scale = self.blk_item.scale() ds = 1 - scale br = [0, 0, br.width()*scale, br.height()*scale] self.setRect(br) self.blk_item.setCenterTransform() self.setTransformOriginPoint(self.blk_item.transformOriginPoint()) self.setRect(*br) pos = self.blk_item.pos() self.setPos(pos.x()+ds*center.x(), pos.y()+ds*center.y()) self.setPos(self.blk_item.pos()) self.setAngle(self.blk_item.angle) def setRect(self, *args): Loading @@ -258,11 +256,10 @@ class TextBlkShapeControl(QGraphicsRectItem): corner_pnts = xywh2xyxypoly(np.array([b_rect])).reshape(-1, 2) edge_pnts = (corner_pnts[[1, 2, 3, 0]] + corner_pnts) / 2 pnts = [edge_pnts, corner_pnts] offset = -0.5 * self.cb_edge_len for ii, ctrlblock in enumerate(self.ctrlblock_group): is_corner = not ii % 2 idx = ii // 2 pos = pnts[is_corner][idx] + offset pos = pnts[is_corner][idx] -0.5 * ctrlblock.edge_width ctrlblock.setPos(pos[0], pos[1]) def setAngle(self, angle: int) -> None: Loading @@ -286,3 +283,24 @@ class TextBlkShapeControl(QGraphicsRectItem): def showControls(self): for ctrl in self.ctrlblock_group: ctrl.show() def updateScale(self, scale: float): if not self.isVisible(): if scale != self.current_scale: self.need_rescale = True self.current_scale = scale return self.current_scale = scale scale = 1 / scale pen = self.pen() pen.setWidthF(2 * scale) self.setPen(pen) for ctrl in self.ctrlblock_group: ctrl.updateEdgeWidth(CBEDGE_WIDTH * scale) def show(self) -> None: super().show() if self.need_rescale: self.updateScale(self.current_scale) self.need_rescale = False