diff --git a/annotationitem.py b/annotationitem.py new file mode 100644 index 0000000..b5a5b74 --- /dev/null +++ b/annotationitem.py @@ -0,0 +1,32 @@ +from PyQt4.QtGui import * +from PyQt4.Qt import * + +class AnnotationGraphicsItem(QAbstractGraphicsShapeItem): + def __init__(self,controls_enabled=True, parent=None, **kwargs): + super(AnnotationGraphicsItem, self).__init__(parent) + + self.setFlags(QGraphicsItem.ItemIsSelectable|QGraphicsItem.ItemIsMovable) + + self.text_font_ = QFont() + self.text_font_.setPointSize(4) + self.text_item_ = QGraphicsSimpleTextItem() + self.text_item_.setFont(self.text_font_) + self.updateText() + + def boundingRect(self): + return QRectF(0, 0, 0, 0) + + def updateText(self): + self.text_item_.setText("CLASS") + + def itemChange(self, change, value): + if change == QGraphicsItem.ItemSelectedChange: + self.setControlsVisible(value.toBool()) + return QGraphicsItem.itemChange(self, change, value) + + def setControlsVisible(self, visible=True): + self.controls_visible_ = visible + #for corner in self.corner_items_: + # corner.setVisible(self.controls_enabled_ and self.controls_visible_) + + diff --git a/annotationscene.py b/annotationscene.py new file mode 100644 index 0000000..fd8c555 --- /dev/null +++ b/annotationscene.py @@ -0,0 +1,63 @@ +from PyQt4.QtGui import * +from PyQt4.QtCore import * +from pointitem import * +import math + +modes = range(5) +SELECT, POINT, LINE, RECTANGLE, POLYGON = modes + +class AnnotationScene(QGraphicsScene): + def __init__(self, parent=None): + super(AnnotationScene, self).__init__(parent) + self.setBackgroundBrush(Qt.darkGray) + + self.reset() + self.setSceneRect(0,0, 640, 480) + + self.mode_ = None + self.mousePressed_ = None + self.activeItem_ = None + + def reset(self): + self.clear() + + def setMode(self, mode): + assert (mode in modes) + self.mode_ = mode + print mode + + + def mousePressEvent(self, event): + if not self.sceneRect().contains(event.scenePos()): + return + elif self.mode_ == SELECT: + QGraphicsScene.mousePressEvent(self, event) + return + elif self.mode_ == POINT: + self.insertItem(AnnotationGraphicsPointItem(event.scenePos())) + event.accept() + elif self.mode_ == LINE: + self.mousePressed_ = event.scenePos() + line = QGraphicsLineItem(QLineF(event.scenePos(), event.scenePos())) + self.activeItem_ = line + self.addItem(line) + + event.accept() + self.update() + + def mouseReleaseEvent(self, event): + self.mousePressed_ = None + QGraphicsScene.mouseReleaseEvent(self, event) + + def mouseMoveEvent(self, event): + print LINE + if not self.sceneRect().contains(event.scenePos()): + return + elif self.mode_ == LINE: + ## TODO + activeItem. + else: + QGraphicsScene.mouseMoveEvent(self, event) + + def insertItem(self, item): + self.addItem(item) diff --git a/lineitem.py b/lineitem.py new file mode 100644 index 0000000..9d9895c --- /dev/null +++ b/lineitem.py @@ -0,0 +1,33 @@ +from PyQt4.QtGui import * +from PyQt4.Qt import * +from annotationitem import * + +class AnnotationGraphicsLineItem(AnnotationGraphicsItem): + + def __init__(self, pos, endPoint, parent=None): + AnnotationGraphicsItem.__init__(self, False, parent) + self.setPos(pos) + self.endPoint_ = endPoint + self.setFlags(QGraphicsItem.ItemIsSelectable|QGraphicsItem.ItemIsMovable) + self.setPen(QColor('green')) + + def resizeContents(self, rect): + pass + + def boundingRect(self): + width = abs(self.endPoint_.x() - self.pos().x()) + height = abs(self.endPoint_.y() - self.pos().y()) + return QRectF(-10, -10, width, height) + + def paint(self, painter, option, widget = None): + pen = self.pen() + if self.isSelected(): + pen.setColor(QColor('red')) + painter.setPen(pen) + painter.drawLine(self.pos, self.endPoint_) + + def itemChange(self, change, value): + return AnnotationGraphicsItem.itemChange(self, change, value) + + + diff --git a/object_view.py b/object_view.py new file mode 100755 index 0000000..90e3a58 --- /dev/null +++ b/object_view.py @@ -0,0 +1,68 @@ +#!/usr/bin/python +import sys, os +from PyQt4.QtGui import * +from PyQt4.QtCore import * +from annotationscene import * + +class MainWindow(QMainWindow): + def __init__(self, argv, parent=None): + QMainWindow.__init__(self, parent) + + vlayout = QVBoxLayout() + buttonSelect = QPushButton("Select") + buttonSelect.clicked.connect(self.clickedSelect) + vlayout.addWidget(buttonSelect) + buttonPoint = QPushButton("Point") + buttonPoint.clicked.connect(self.clickedPoint) + vlayout.addWidget(buttonPoint) + buttonLine = QPushButton("Line") + buttonLine.clicked.connect(self.clickedLine) + vlayout.addWidget(buttonLine) + buttonRectangle = QPushButton("Rectangle") + buttonRectangle.clicked.connect(self.clickedRectangle) + vlayout.addWidget(buttonRectangle) + buttonPolygon = QPushButton("Polygon") + buttonPolygon.clicked.connect(self.clickedPolygon) + vlayout.addWidget(buttonPolygon) + + + hlayout = QHBoxLayout() + self.view_ = QGraphicsView() + hlayout.addLayout(vlayout) + hlayout.addWidget(self.view_, 1) + + self.scene_ = AnnotationScene(self) + self.view_.setScene(self.scene_) + + central = QWidget() + central.setLayout(hlayout) + self.setCentralWidget(central) + + def clickedSelect(self): + self.scene_.setMode(SELECT) + + def clickedPoint(self): + self.scene_.setMode(POINT) + + def clickedRectangle(self): + self.scene_.setMode(RECTANGLE) + + def clickedLine(self): + self.scene_.setMode(LINE) + + def clickedPolygon(self): + self.scene_.setMode(POLYGON) + + +def main(): + app = QApplication(sys.argv) + + wnd = MainWindow(sys.argv[1:]) + wnd.resize(800,600) + wnd.show() + + return app.exec_() + +if __name__ == '__main__': + sys.exit(main()) + diff --git a/pointitem.py b/pointitem.py new file mode 100644 index 0000000..02a73e8 --- /dev/null +++ b/pointitem.py @@ -0,0 +1,34 @@ +from PyQt4.QtGui import * +from PyQt4.Qt import * +from annotationitem import * + +class AnnotationGraphicsPointItem(AnnotationGraphicsItem): + size_ = 4 + + def __init__(self, pos, parent=None): + AnnotationGraphicsItem.__init__(self, False, parent) + self.setPos(pos) + self.setFlags(QGraphicsItem.ItemIsSelectable|QGraphicsItem.ItemIsMovable) + self.setPen(QColor('green')) + + def resizeContents(self, rect): + pass + + def boundingRect(self): + return QRectF(-2*self.size_, + -2*self.size_, + 4*self.size_, + 4*self.size_) + + def paint(self, painter, option, widget = None): + pen = self.pen() + if self.isSelected(): + pen.setColor(QColor('red')) + painter.setPen(pen) + painter.drawEllipse(0,0,self.size_,self.size_) + + def itemChange(self, change, value): + return AnnotationGraphicsItem.itemChange(self, change, value) + + +