Răsfoiți Sursa

Fill drawing shape by a pale color

Kentaro Wada 6 ani în urmă
părinte
comite
0fb2188829
3 a modificat fișierele cu 31 adăugiri și 13 ștergeri
  1. 11 0
      labelme/app.py
  2. 5 5
      labelme/shape.py
  3. 15 8
      labelme/widgets/canvas.py

+ 11 - 0
labelme/app.py

@@ -309,6 +309,16 @@ class MainWindow(QtWidgets.QMainWindow, WindowMixin):
         shapeFillColor = action(
             'Shape &Fill Color', self.chshapeFillColor, icon='color',
             tip='Change the fill color for this specific shape', enabled=False)
+        fill_drawing = action(
+            'Fill Drawing Polygon',
+            lambda x: self.canvas.setFillDrawing(x),
+            None,
+            'color',
+            'Fill polygon while drawing',
+            checkable=True,
+            enabled=True,
+        )
+        fill_drawing.setChecked(True)
 
         # Lavel list context menu.
         labelMenu = QtWidgets.QMenu()
@@ -379,6 +389,7 @@ class MainWindow(QtWidgets.QMainWindow, WindowMixin):
                                      save, saveAs, close, None, quit))
         addActions(self.menus.help, (help,))
         addActions(self.menus.view, (
+            fill_drawing, None,
             hideAll, showAll, None,
             zoomIn, zoomOut, zoomOrg, None,
             fitWindow, fitWidth))

+ 5 - 5
labelme/shape.py

@@ -1,3 +1,5 @@
+import copy
+
 from qtpy import QtGui
 
 import labelme.utils
@@ -174,14 +176,12 @@ class Shape(object):
 
     def copy(self):
         shape = Shape(self.label)
-        shape.points = [p for p in self.points]
+        shape.points = [copy.deepcopy(p) for p in self.points]
         shape.fill = self.fill
         shape.selected = self.selected
         shape._closed = self._closed
-        if self.line_color != Shape.line_color:
-            shape.line_color = self.line_color
-        if self.fill_color != Shape.fill_color:
-            shape.fill_color = self.fill_color
+        shape.line_color = copy.deepcopy(self.line_color)
+        shape.fill_color = copy.deepcopy(self.fill_color)
         return shape
 
     def __len__(self):

+ 15 - 8
labelme/widgets/canvas.py

@@ -33,6 +33,8 @@ class Canvas(QtWidgets.QWidget):
     # polygon, rectangle, line, or point
     _createMode = 'polygon'
 
+    _fill_drawing = False
+
     def __init__(self, *args, **kwargs):
         self.epsilon = kwargs.pop('epsilon', 11.0)
         super(Canvas, self).__init__(*args, **kwargs)
@@ -70,6 +72,12 @@ class Canvas(QtWidgets.QWidget):
         self.setMouseTracking(True)
         self.setFocusPolicy(QtCore.Qt.WheelFocus)
 
+    def fillDrawing(self):
+        return self._fill_drawing
+
+    def setFillDrawing(self, value):
+        self._fill_drawing = value
+
     @property
     def createMode(self):
         return self._createMode
@@ -486,14 +494,13 @@ class Canvas(QtWidgets.QWidget):
         if self.selectedShapeCopy:
             self.selectedShapeCopy.paint(p)
 
-        if (
-            self.createMode == 'polygon' and self.current is not None and
-            len(self.current.points) >= 2
-        ):
-            realTimeShape = self.current.copy()
-            realTimeShape.addPoint(self.line[1])
-            realTimeShape.fill = True
-            realTimeShape.paint(p)
+        if (self.fillDrawing() and self.createMode == 'polygon' and
+                self.current is not None and len(self.current.points) >= 2):
+            drawing_shape = self.current.copy()
+            drawing_shape.addPoint(self.line[1])
+            drawing_shape.fill = True
+            drawing_shape.fill_color.setAlpha(64)
+            drawing_shape.paint(p)
 
         p.end()