瀏覽代碼

Add point to the nearest edge by right-click

Kentaro Wada 7 年之前
父節點
當前提交
eab7e7db1e
共有 3 個文件被更改,包括 39 次插入26 次删除
  1. 10 1
      labelme/app.py
  2. 28 25
      labelme/canvas.py
  3. 1 0
      labelme/config/default_config.yaml

+ 10 - 1
labelme/app.py

@@ -278,6 +278,9 @@ class MainWindow(QtWidgets.QMainWindow, WindowMixin):
         undoLastPoint = action('Undo last point', self.canvas.undoLastPoint,
                                shortcuts['undo_last_point'], 'undo',
                                'Undo last drawn point', enabled=False)
+        addPoint = action('Add Point to Edge', self.canvas.addPointToEdge,
+                          None, 'edit', 'Add point to the nearest edge',
+                          enabled=False)
 
         undo = action('Undo', self.undoShapeEdit, shortcuts['undo'], 'undo',
                       'Undo last add and edit of shape', enabled=False)
@@ -359,6 +362,7 @@ class MainWindow(QtWidgets.QMainWindow, WindowMixin):
             lineColor=color1, fillColor=color2,
             delete=delete, edit=edit, copy=copy,
             undoLastPoint=undoLastPoint, undo=undo,
+            addPoint=addPoint,
             createMode=createMode, editMode=editMode,
             shapeLineColor=shapeLineColor, shapeFillColor=shapeFillColor,
             zoom=zoom, zoomIn=zoomIn, zoomOut=zoomOut, zoomOrg=zoomOrg,
@@ -371,12 +375,14 @@ class MainWindow(QtWidgets.QMainWindow, WindowMixin):
             menu=(
                 createMode, editMode, edit, copy,
                 delete, shapeLineColor, shapeFillColor,
-                undo, undoLastPoint,
+                undo, undoLastPoint, addPoint,
             ),
             onLoadActive=(close, createMode, editMode),
             onShapesPresent=(saveAs, hideAll, showAll),
         )
 
+        self.canvas.edgeSelected.connect(self.actions.addPoint.setEnabled)
+
         self.menus = struct(
             file=self.menu('&File'),
             edit=self.menu('&Edit'),
@@ -555,6 +561,9 @@ class MainWindow(QtWidgets.QMainWindow, WindowMixin):
         url = 'https://github.com/wkentaro/labelme/tree/master/examples/tutorial'  # NOQA
         webbrowser.open(url)
 
+    def toggleAddPointEnabled(self, enabled):
+        self.actions.addPoint.setEnabled(enabled)
+
     def toggleDrawingSensitive(self, drawing=True):
         """Toggle drawing sensitive.
 

+ 28 - 25
labelme/canvas.py

@@ -21,12 +21,14 @@ CURSOR_GRAB = QtCore.Qt.OpenHandCursor
 
 
 class Canvas(QtWidgets.QWidget):
+
     zoomRequest = QtCore.Signal(int, QtCore.QPoint)
     scrollRequest = QtCore.Signal(int, int)
     newShape = QtCore.Signal()
     selectionChanged = QtCore.Signal(bool)
     shapeMoved = QtCore.Signal()
     drawingPolygon = QtCore.Signal(bool)
+    edgeSelected = QtCore.Signal(bool)
 
     CREATE, EDIT = 0, 1
 
@@ -44,6 +46,7 @@ class Canvas(QtWidgets.QWidget):
         self.lineColor = QtGui.QColor(0, 0, 255)
         self.line = Shape(line_color=self.lineColor)
         self.prevPoint = QtCore.QPointF()
+        self.prevMovePoint = QtCore.QPointF()
         self.offsets = QtCore.QPointF(), QtCore.QPointF()
         self.scale = 1.0
         self.pixmap = QtGui.QPixmap()
@@ -52,7 +55,7 @@ class Canvas(QtWidgets.QWidget):
         self.hideBackround = False
         self.hShape = None
         self.hVertex = None
-        self.addVertex = None
+        self.hEdge = None
         self.movingShape = False
         self._painter = QtGui.QPainter()
         self._cursor = CURSOR_DEFAULT
@@ -117,9 +120,6 @@ class Canvas(QtWidgets.QWidget):
     def selectedVertex(self):
         return self.hVertex is not None
 
-    def addedVertex(self):
-        return self.addVertex is not None
-
     def mouseMoveEvent(self, ev):
         """Update line with last point and current coordinates."""
         if QT5:
@@ -127,6 +127,7 @@ class Canvas(QtWidgets.QWidget):
         else:
             pos = self.transformPos(ev.posF())
 
+        self.prevMovePoint = pos
         self.restoreCursor()
 
         # Polygon drawing.
@@ -187,31 +188,25 @@ class Canvas(QtWidgets.QWidget):
             # Look for a nearby vertex to highlight. If that fails,
             # check if we happen to be inside a shape.
             index = shape.nearestVertex(pos, self.epsilon)
-            index2 = shape.nearestEdge(pos, self.epsilon)
+            index_edge = shape.nearestEdge(pos, self.epsilon)
             if index is not None:
                 if self.selectedVertex():
                     self.hShape.highlightClear()
-                self.hVertex, self.hShape = index, shape
+                self.hVertex = index
+                self.hShape = shape
+                self.hEdge = index_edge
                 shape.highlightVertex(index, shape.MOVE_VERTEX)
                 self.overrideCursor(CURSOR_POINT)
                 self.setToolTip("Click & drag to move point")
                 self.setStatusTip(self.toolTip())
                 self.update()
                 break
-            elif index2 is not None:
-                if self.selectedVertex():
-                    self.hShape.highlightClear()
-                self.addVertex, self.hShape = index2, shape
-                self.hVertex = None
-                self.overrideCursor(CURSOR_DRAW)
-                self.setToolTip("Click & drag to add point")
-                self.setStatusTip(self.toolTip())
-                self.update()
-                break
             elif shape.containsPoint(pos):
                 if self.selectedVertex():
                     self.hShape.highlightClear()
-                self.hVertex, self.addVertex, self.hShape = None, None, shape
+                self.hVertex = None
+                self.hShape = shape
+                self.hEdge = index_edge
                 self.setToolTip(
                     "Click & drag to move shape '%s'" % shape.label)
                 self.setStatusTip(self.toolTip())
@@ -222,7 +217,22 @@ class Canvas(QtWidgets.QWidget):
             if self.hShape:
                 self.hShape.highlightClear()
                 self.update()
-            self.hVertex, self.hShape = None, None
+            self.hVertex, self.hShape, self.hEdge = None, None, None
+        self.edgeSelected.emit(self.hEdge is not None)
+
+    def addPointToEdge(self):
+        if (self.hShape is None and
+                self.hEdge is None and
+                self.prevMovePoint is None):
+            return
+        shape = self.hShape
+        index = self.hEdge
+        point = self.prevMovePoint
+        shape.insertPoint(index, point)
+        shape.highlightVertex(index, shape.MOVE_VERTEX)
+        self.hShape = shape
+        self.hVertex = index
+        self.hEdge = None
 
     def mousePressEvent(self, ev):
         if QT5:
@@ -320,13 +330,6 @@ class Canvas(QtWidgets.QWidget):
             index, shape = self.hVertex, self.hShape
             shape.highlightVertex(index, shape.MOVE_VERTEX)
             return
-        if self.addedVertex() and self.hShape is not None:
-            index2, shape = self.addVertex, self.hShape
-            shape.insertPoint(index2, point)
-            shape.highlightVertex(index2, shape.MOVE_VERTEX)
-            self.addVertex = None
-            self.hVertex = index2
-            return
         for shape in reversed(self.shapes):
             if self.isVisible(shape) and shape.containsPoint(point):
                 shape.selected = True

+ 1 - 0
labelme/config/default_config.yaml

@@ -25,6 +25,7 @@ shortcuts:
   fit_window: Ctrl+F
   fit_width: Ctrl+Shift+F
 
+  add_point: Ctrl+Shift+P
   create_polygon: Ctrl+N
   edit_polygon: Ctrl+J
   delete_polygon: Delete