فهرست منبع

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

Hussein 13 سال پیش
والد
کامیت
301c5c84bf
3فایلهای تغییر یافته به همراه68 افزوده شده و 15 حذف شده
  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)