Browse Source

Add create point mode

Kentaro Wada 6 years ago
parent
commit
2f0e93ce9f
3 changed files with 50 additions and 11 deletions
  1. 34 5
      labelme/app.py
  2. 15 6
      labelme/canvas.py
  3. 1 0
      labelme/config/default_config.yaml

+ 34 - 5
labelme/app.py

@@ -285,6 +285,14 @@ class MainWindow(QtWidgets.QMainWindow, WindowMixin):
             'Start drawing lines',
             enabled=True,
         )
+        createPointMode = action(
+            'Create Point',
+            lambda: self.toggleDrawMode(False, createMode='point'),
+            shortcuts['create_point'],
+            'objects',
+            'Start drawing points',
+            enabled=True,
+        )
         editMode = action('Edit Polygons', self.setEditMode,
                           shortcuts['edit_polygon'], 'edit',
                           'Move and edit polygons', enabled=True)
@@ -387,6 +395,7 @@ class MainWindow(QtWidgets.QMainWindow, WindowMixin):
             createMode=createMode, editMode=editMode,
             createRectangleMode=createRectangleMode,
             createLineMode=createLineMode,
+            createPointMode=createPointMode,
             shapeLineColor=shapeLineColor, shapeFillColor=shapeFillColor,
             zoom=zoom, zoomIn=zoomIn, zoomOut=zoomOut, zoomOrg=zoomOrg,
             fitWindow=fitWindow, fitWidth=fitWidth,
@@ -397,16 +406,26 @@ class MainWindow(QtWidgets.QMainWindow, WindowMixin):
                       None, color1, color2),
             # menu shown at right click
             menu=(
-                createMode, createRectangleMode, createLineMode,
-                editMode, edit, copy,
-                delete, shapeLineColor, shapeFillColor,
-                undo, undoLastPoint, addPoint,
+                createMode,
+                createRectangleMode,
+                createLineMode,
+                createPointMode,
+                editMode,
+                edit,
+                copy,
+                delete,
+                shapeLineColor,
+                shapeFillColor,
+                undo,
+                undoLastPoint,
+                addPoint,
             ),
             onLoadActive=(
                 close,
                 createMode,
                 createRectangleMode,
                 createLineMode,
+                createPointMode,
                 editMode,
             ),
             onShapesPresent=(saveAs, hideAll, showAll),
@@ -540,6 +559,7 @@ class MainWindow(QtWidgets.QMainWindow, WindowMixin):
             self.actions.createMode,
             self.actions.createRectangleMode,
             self.actions.createLineMode,
+            self.actions.createPointMode,
             self.actions.editMode,
         )
         addActions(self.menus.edit, actions + self.actions.editMenu)
@@ -563,6 +583,7 @@ class MainWindow(QtWidgets.QMainWindow, WindowMixin):
         self.actions.createMode.setEnabled(True)
         self.actions.createRectangleMode.setEnabled(True)
         self.actions.createLineMode.setEnabled(True)
+        self.actions.createPointMode.setEnabled(True)
         title = __appname__
         if self.filename is not None:
             title = '{} - {}'.format(title, self.filename)
@@ -635,16 +656,24 @@ class MainWindow(QtWidgets.QMainWindow, WindowMixin):
             self.actions.createMode.setEnabled(edit)
             self.actions.createRectangleMode.setEnabled(not edit)
             self.actions.createLineMode.setEnabled(not edit)
+            self.actions.createPointMode.setEnabled(not edit)
         elif createMode == 'rectangle':
             self.actions.createMode.setEnabled(not edit)
             self.actions.createRectangleMode.setEnabled(edit)
             self.actions.createLineMode.setEnabled(not edit)
+            self.actions.createPointMode.setEnabled(not edit)
         elif createMode == 'line':
             self.actions.createMode.setEnabled(not edit)
             self.actions.createRectangleMode.setEnabled(not edit)
             self.actions.createLineMode.setEnabled(edit)
+            self.actions.createPointMode.setEnabled(not edit)
+        elif createMode == 'point':
+            self.actions.createMode.setEnabled(not edit)
+            self.actions.createRectangleMode.setEnabled(not edit)
+            self.actions.createLineMode.setEnabled(not edit)
+            self.actions.createPointMode.setEnabled(edit)
         else:
-            raise ValueError
+            raise ValueError('Unsupported createMode: %s' % createMode)
         self.actions.editMode.setEnabled(not edit)
 
     def setEditMode(self):

+ 15 - 6
labelme/canvas.py

@@ -30,7 +30,7 @@ class Canvas(QtWidgets.QWidget):
 
     CREATE, EDIT = 0, 1
 
-    # polygon, rectangle, or line
+    # polygon, rectangle, line, or point
     _createMode = 'polygon'
 
     def __init__(self, *args, **kwargs):
@@ -48,6 +48,7 @@ class Canvas(QtWidgets.QWidget):
         #   - createMode == 'polygon': edge from last point to current
         #   - createMode == 'rectangle': diagonal line of the rectangle
         #   - createMode == 'line': the line
+        #   - createMode == 'point': the point
         self.line = Shape(line_color=self.lineColor)
         self.prevPoint = QtCore.QPoint()
         self.prevMovePoint = QtCore.QPoint()
@@ -75,7 +76,7 @@ class Canvas(QtWidgets.QWidget):
 
     @createMode.setter
     def createMode(self, value):
-        if value not in ['polygon', 'rectangle', 'line']:
+        if value not in ['polygon', 'rectangle', 'line', 'point']:
             raise ValueError('Unsupported createMode: %s' % value)
         self._createMode = value
 
@@ -174,6 +175,9 @@ class Canvas(QtWidgets.QWidget):
             elif self.createMode == 'line':
                 self.line.points = [self.current[0], pos]
                 self.line.close()
+            elif self.createMode == 'point':
+                self.line.points = [self.current[0]]
+                self.line.close()
             self.line.line_color = color
             self.repaint()
             self.current.highlightClear()
@@ -288,10 +292,13 @@ class Canvas(QtWidgets.QWidget):
                     # Create new shape.
                     self.current = Shape()
                     self.current.addPoint(pos)
-                    self.line.points = [pos, pos]
-                    self.setHiding()
-                    self.drawingPolygon.emit(True)
-                    self.update()
+                    if self.createMode == 'point':
+                        self.finalise()
+                    else:
+                        self.line.points = [pos, pos]
+                        self.setHiding()
+                        self.drawingPolygon.emit(True)
+                        self.update()
             else:
                 self.selectShapePoint(pos)
                 self.prevPoint = pos
@@ -627,6 +634,8 @@ class Canvas(QtWidgets.QWidget):
             self.line.points = [self.current[-1], self.current[0]]
         elif self.createMode in ['rectangle', 'line']:
             self.current.points = self.current.points[0:1]
+        elif self.createMode == 'point':
+            self.current = None
         self.drawingPolygon.emit(True)
 
     def undoLastPoint(self):

+ 1 - 0
labelme/config/default_config.yaml

@@ -31,6 +31,7 @@ shortcuts:
   create_polygon: Ctrl+N
   create_rectangle: Ctrl+R
   create_line: null
+  create_point: null
   edit_polygon: Ctrl+J
   delete_polygon: Delete
   duplicate_polygon: Ctrl+D