Browse Source

Moving shape ,delete it and prototype of right click and making new copy of the shape.

Hussein 13 năm trước cách đây
mục cha
commit
301c5c84bf
3 tập tin đã thay đổi với 68 bổ sung15 xóa
  1. 49 5
      canvas.py
  2. 10 7
      labelme.py
  3. 9 3
      shape.py

+ 49 - 5
canvas.py

@@ -18,8 +18,12 @@ class Canvas(QWidget):
         self.shapes = []
         self.current = None
         self.selectedShape=None # save the selected shape here
+        self.selectedShapeCopy=None
         self.line_color = QColor(0, 0, 255)
         self.line = Shape(line_color=self.line_color)
+        self.mouseButtonIsPressed=False #when it is true and shape is selected , move the shape with the mouse move event
+        self.prevPoint=QPoint()
+        
         self.scale = 1.0
         self.pixmap = None
 
@@ -27,10 +31,29 @@ class Canvas(QWidget):
 
     def mouseMoveEvent(self, ev):
         """Update line with last point and current coordinates."""
-        if self.startLabeling and self.current:
+
+        if (ev.buttons() & 2):  # wont work , as ev.buttons doesn't work well , or I haven't known how to use it :) to use right click
+            print ev.button()
+            if self.selectedShapeCopy:
+                if self.prevPoint:
+                    point=QPoint(self.prevPoint)
+                    dx= ev.x()-point.x()
+                    dy=ev.y()-point.y()
+                    self.selectedShapeCopy.moveBy(dx,dy)
+                    self.repaint()
+                self.prevPoint=ev.pos()
+            elif self.selectedShape:
+                newShape=Shape()
+                for point in self.selectedShape.points:
+                    newShape.addPoint(point)
+                self.selectedShapeCopy=newShape
+                self.repaint()
+            return
+
+        if self.current and self.startLabeling: 
             pos = self.transformPos(ev.posF())
             # Don't allow the user to draw outside of the pixmap area.
-            # FIXME: Project point to pixmap's edge when getting out too fast.
+            # FIXME: Project point to pixmap's edge when getting out too fast
             if self.outOfPixmap(pos):
                 return ev.ignore()
             if len(self.current) > 1 and self.closeEnough(pos, self.current[0]):
@@ -40,8 +63,18 @@ class Canvas(QWidget):
             else:
                 self.line[1] = pos
                 self.line.line_color = self.line_color
-            self.repaint()
-
+            return self.repaint()
+            
+        if self.selectedShape:
+            if self.prevPoint:
+                    point=QPoint(self.prevPoint)
+                   # print point.x()
+                    dx= ev.x()-point.x()
+                    dy=ev.y()-point.y()
+                    self.selectedShape.moveBy(dx,dy)
+                    self.repaint()
+            self.prevPoint=ev.pos()
+            
     def mousePressEvent(self, ev):
         if ev.button() == 1:
             if self.startLabeling:
@@ -59,6 +92,9 @@ class Canvas(QWidget):
                     self.setMouseTracking(True)
             else: # not in adding new label mode
                 self.selectShape(ev.pos())
+                self.prevPoint=ev.pos()
+       
+                
 
     def mouseDoubleClickEvent(self, ev):
         if self.current and self.startLabeling:
@@ -80,7 +116,12 @@ class Canvas(QWidget):
         if self.selectedShape:
             self.selectedShape.selected = False
             self.repaint()
-
+    def deleteSelected(self):
+        if self.selectedShape:
+             self.shapes.remove(self.selectedShape)
+             self.selectedShape=None
+             #print self.selectedShape()
+             self.repaint()
     def paintEvent(self, event):
         if not self.pixmap:
             return super(Canvas, self).paintEvent(event)
@@ -98,6 +139,9 @@ class Canvas(QWidget):
         if self.current:
             self.current.paint(p)
             self.line.paint(p)
+        if self.selectedShapeCopy:
+            self.selectedShapeCopy.paint(p)
+        
 
         p.end()
 

+ 10 - 7
labelme.py

@@ -102,7 +102,9 @@ class MainWindow(QMainWindow, WindowMixin):
         quit = action(self, '&Quit', self.close, 'Ctrl+Q', u'Exit application')
         open = action(self, '&Open', self.openFile, 'Ctrl+O', u'Open file')
         color = action(self, '&Color', self.chooseColor, 'Ctrl+C', u'Choose line color')
-        newl = action(self, '&New Label', self.newLabel, 'Ctrl+N', u'Add new label')
+        new_Label=action(self,'&New Label',self.newlabel,'Ctrl+N',u'Add new label')
+        delete=action(self,'&delete',self.deleteSelectedShape,'Ctrl+D',u'Delete')
+
         labl = self.dock.toggleViewAction()
         labl.setShortcut('Ctrl+L')
 
@@ -116,12 +118,12 @@ class MainWindow(QMainWindow, WindowMixin):
                 edit=self.menu('&Image'),
                 view=self.menu('&View'))
         add_actions(self.menus.file, (open, quit))
-        add_actions(self.menus.edit, (newl, color, fit_window))
+        add_actions(self.menus.edit, (new_Label,color, fit_window))
 
         add_actions(self.menus.view, (labl,))
 
         self.tools = self.toolbar('Tools')
-        add_actions(self.tools, (open, color, None, newl,None, zoom, fit_window, None, quit))
+        add_actions(self.tools, (open, color, None,new_Label,delete,None, zoom, fit_window, None, quit))
 
 
         self.statusBar().showMessage('%s started.' % __appname__)
@@ -265,11 +267,12 @@ class MainWindow(QMainWindow, WindowMixin):
         # Change the color for all shape lines:
         Shape.line_color = self.color
         self.canvas.repaint()
-
-    def newLabel(self):
+        
+    def newlabel(self):
         self.canvas.deSelectShape()
-        self.canvas.startLabeling = True
-
+        self.canvas.startLabeling=True
+    def deleteSelectedShape(self):
+        self.canvas.deleteSelected()
 class Settings(object):
     """Convenience dict-like wrapper around QSettings."""
     def __init__(self, types=None):

+ 9 - 3
shape.py

@@ -50,11 +50,11 @@ class Shape(object):
             line_path = QPainterPath()
             vrtx_path = QPainterPath()
 
-            line_path.moveTo(self.points[0])
+            line_path.moveTo(QPointF(self.points[0]))
             self.drawVertex(vrtx_path, self.points[0])
 
             for p in self.points[1:]:
-                line_path.lineTo(p)
+                line_path.lineTo(QPointF(p))
                 # Skip last element, otherwise its vertex is not filled.
                 if p != self.points[0]:
                     self.drawVertex(vrtx_path, p)
@@ -75,7 +75,13 @@ class Shape(object):
         for p in self.points[1:]:
             path.lineTo(QPointF(p))
         return path.contains(QPointF(point))
-
+    def moveBy(self,dx,dy):
+        index=0
+        for point in self.points:
+           newXPos= point.x()+dx
+           newYPos=point.y()+dy
+           self.points[index]=QPoint(newXPos,newYPos)
+           index +=1
     def __len__(self):
         return len(self.points)