Ver Fonte

Adding ability to remove a point from a closed shape (polygon).
Making sure that "Save" is triggered with a point is added or removed.
Making minor change to ensure that "Save" is only triggered when a change has actually been made.

LATENTIX\ht há 5 anos atrás
pai
commit
2eb18d1234
4 ficheiros alterados com 37 adições e 4 exclusões
  1. 1 0
      .gitignore
  2. 11 2
      labelme/app.py
  3. 3 0
      labelme/shape.py
  4. 22 2
      labelme/widgets/canvas.py

+ 1 - 0
.gitignore

@@ -8,3 +8,4 @@
 *.py[cdo]
 
 .DS_Store
+.idea/

+ 11 - 2
labelme/app.py

@@ -52,7 +52,7 @@ class MainWindow(QtWidgets.QMainWindow):
         output=None,
         output_file=None,
         output_dir=None,
-    ):
+        ):
         if output is not None:
             logger.warning(
                 'argument output is deprecated, use output_file instead'
@@ -341,6 +341,10 @@ class MainWindow(QtWidgets.QMainWindow):
             enabled=False,
         )
 
+        removePoint = action('Remove Selected Point', self.canvas.removeSelectedPoint,
+                             None, 'edit', 'Remove selected point from polygon',
+                             enabled=False)
+
         undo = action(self.tr('Undo'), self.undoShapeEdit,
                       shortcuts['undo'], 'undo',
                       self.tr('Undo last add and edit of shape'),
@@ -452,7 +456,7 @@ class MainWindow(QtWidgets.QMainWindow):
             toggleKeepPrevMode=toggle_keep_prev_mode,
             delete=delete, edit=edit, copy=copy,
             undoLastPoint=undoLastPoint, undo=undo,
-            addPointToEdge=addPointToEdge,
+            addPointToEdge=addPointToEdge, removePoint=removePoint,
             createMode=createMode, editMode=editMode,
             createRectangleMode=createRectangleMode,
             createCircleMode=createCircleMode,
@@ -499,6 +503,7 @@ class MainWindow(QtWidgets.QMainWindow):
                 undo,
                 undoLastPoint,
                 addPointToEdge,
+                removePoint,
             ),
             onLoadActive=(
                 close,
@@ -514,6 +519,7 @@ class MainWindow(QtWidgets.QMainWindow):
         )
 
         self.canvas.edgeSelected.connect(self.canvasShapeEdgeSelected)
+        self.canvas.vertexSelected.connect(self.actions.removePoint.setEnabled)
 
         self.menus = utils.struct(
             file=self.menu(self.tr('&File')),
@@ -796,6 +802,9 @@ class MainWindow(QtWidgets.QMainWindow):
         url = 'https://github.com/wkentaro/labelme/tree/master/examples/tutorial'  # NOQA
         webbrowser.open(url)
 
+    def toggleRemovePointEnabled(self, enabled):
+        self.actions.removePoint.setEnabled(enabled)
+
     def toggleDrawingSensitive(self, drawing=True):
         """Toggle drawing sensitive.
 

+ 3 - 0
labelme/shape.py

@@ -95,6 +95,9 @@ class Shape(object):
     def insertPoint(self, i, point):
         self.points.insert(i, point)
 
+    def removePoint(self, i):
+        self.points.pop(i)
+
     def isClosed(self):
         return self._closed
 

+ 22 - 2
labelme/widgets/canvas.py

@@ -27,6 +27,7 @@ class Canvas(QtWidgets.QWidget):
     shapeMoved = QtCore.Signal()
     drawingPolygon = QtCore.Signal(bool)
     edgeSelected = QtCore.Signal(bool, object)
+    vertexSelected = QtCore.Signal(bool)
 
     CREATE, EDIT = 0, 1
 
@@ -268,6 +269,7 @@ class Canvas(QtWidgets.QWidget):
                 self.update()
             self.hVertex, self.hShape, self.hEdge = None, None, None
         self.edgeSelected.emit(self.hEdge is not None, self.hShape)
+        self.vertexSelected.emit(self.hVertex is not None)
 
     def addPointToEdge(self):
         if (self.hShape is None and
@@ -282,6 +284,21 @@ class Canvas(QtWidgets.QWidget):
         self.hShape = shape
         self.hVertex = index
         self.hEdge = None
+        self.movingShape = True
+
+    def removeSelectedPoint(self):
+        if (self.hShape is None and
+                self.prevMovePoint is None):
+            return
+        shape = self.hShape
+        point = self.prevMovePoint
+        index = shape.nearestVertex(point, self.epsilon)
+        shape.removePoint(index)
+        # shape.highlightVertex(index, shape.MOVE_VERTEX)
+        self.hShape = shape
+        self.hVertex = None
+        self.hEdge = None
+        self.movingShape = True  # Save changes
 
     def mousePressEvent(self, ev):
         if QT5:
@@ -342,8 +359,11 @@ class Canvas(QtWidgets.QWidget):
         elif ev.button() == QtCore.Qt.LeftButton and self.selectedShapes:
             self.overrideCursor(CURSOR_GRAB)
         if self.movingShape:
-            self.storeShapes()
-            self.shapeMoved.emit()
+            # Only save if changes have actually been made
+            currentShapeIndex = self.shapes.index(self.hShape)
+            if not self.shapesBackups[-1][currentShapeIndex].points == self.shapes[currentShapeIndex].points:
+                self.storeShapes()
+                self.shapeMoved.emit()
 
     def endMove(self, copy):
         assert self.selectedShapes and self.selectedShapesCopy