Changeset 8316:5866c83a0ca4 in orange


Ignore:
Timestamp:
06/13/11 17:50:40 (3 years ago)
Author:
Noughmad <Noughmad@…>
Branch:
default
Convert:
9b90f6246ed23d44452d6356e69f7e7658efc9a0
Message:

Anable polygon selection

Location:
orange/OrangeWidgets
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • orange/OrangeWidgets/Graph/axis.py

    r8313 r8316  
    8282                 
    8383        if self.labels: 
    84             qDebug('Labels defined: ' + str(len(self.labels))) 
    8584            for i in range(len(self.labels)): 
    8685                self._ticks.append( ( i, self.labels[i], medium ) ) 
    8786        else: 
    88             qDebug('Constructing labels: ') 
    8987            magnitude = int(3*log10(abs(max-min)) + 1) 
    9088            if magnitude % 3 == 0: 
     
    152150        self.transform = QTransform().translate(-self.line.x1(), -self.line.y2()) * self.zoom_transform * QTransform().translate(self.line.x1(), self.line.y2()) 
    153151        ratio = self.transform.map(self.line).length() / self.line.length() 
    154         qDebug('Axis zoom ratio = ' + str(ratio)) 
    155152        for pos, text, size in self._ticks: 
    156153            label_pos = self.map_to_graph( pos ) 
     
    158155            test_rect.adjust(-1, -1, 1, 1) 
    159156            if not test_rect.contains(label_pos): 
    160                 qDebug('Skipping label ' + text) 
    161157                continue 
    162158            hs = 0.5*step 
     
    179175                tick_line.setAngle(tick_line.angle() + 180) 
    180176            item.setLine( tick_line ) 
    181             qDebug('Adding tick at ' + str(pos)) 
    182177            item.setPen(self.style.pen()) 
    183178            item.setPos(self.map_to_graph(pos)) 
     
    237232    def continuous_labels(self): 
    238233        min, max, step = self.scale 
    239         qDebug(' Step = ' + str(step)) 
    240234        magnitude = log10(abs(max-min)) 
    241235         
  • orange/OrangeWidgets/OWGraphQt.py

    r8315 r8316  
    6666from Graph import * 
    6767from Graph.axis import * 
    68 from PyQt4.QtGui import QGraphicsView,  QGraphicsScene, QPainter, QTransform 
     68from PyQt4.QtGui import QGraphicsView,  QGraphicsScene, QPainter, QTransform, QPolygonF, QGraphicsPolygonItem 
    6969from PyQt4.QtCore import QPointF, QPropertyAnimation 
    7070 
     
    122122        self._pressed_mouse_button = Qt.NoButton 
    123123        self.selection_items = [] 
     124        self._current_rs_item = None 
    124125        self._current_ps_item = None 
     126        self.polygon_close_treshold = 10 
    125127        self.auto_send_selection_callback = None 
    126128         
     
    382384            a.update() 
    383385             
    384         for i in self.selection_items: 
    385             i.setTransform(self.zoom_transform) 
     386        for item, region in self.selection_items: 
     387            item.setTransform(self.zoom_transform) 
    386388        self.setSceneRect(self.canvas.itemsBoundingRect()) 
    387389         
     
    428430        if event.button() == Qt.LeftButton and self.state == SELECT_RECTANGLE and self.graph_area.contains(point): 
    429431            self._selection_start_point = self.map_from_widget(event.pos()) 
    430             self._current_ps_item = QGraphicsRectItem(parent=self.graph_item, scene=self.canvas) 
     432            self._current_rs_item = QGraphicsRectItem(parent=self.graph_item, scene=self.canvas) 
    431433             
    432434    def mouseMoveEvent(self, event): 
     
    436438        if event.buttons(): 
    437439            self.static_click = False 
     440        point = self.map_from_widget(event.pos()) 
    438441        if self._pressed_mouse_button == Qt.LeftButton: 
    439             point = self.map_from_widget(event.pos()) 
    440             if self.state == SELECT_RECTANGLE and self._current_ps_item and self.graph_area.contains(point): 
    441                 self._current_ps_item.setRect(QRectF(self._selection_start_point, point)) 
     442            if self.state == SELECT_RECTANGLE and self._current_rs_item and self.graph_area.contains(point): 
     443                self._current_rs_item.setRect(QRectF(self._selection_start_point, point)) 
     444        if not self._pressed_mouse_button and self.state == SELECT_POLYGON and self._current_ps_item: 
     445            self._current_ps_polygon[-1] = point 
     446            self._current_ps_item.setPolygon(self._current_ps_polygon) 
     447            if self._current_ps_polygon.size() > 2 and self.points_equal(self._current_ps_polygon.first(), self._current_ps_polygon.last()): 
     448                highlight_pen = QPen() 
     449                highlight_pen.setWidth(2) 
     450                highlight_pen.setStyle(Qt.DashDotLine) 
     451                self._current_ps_item.setPen(highlight_pen) 
     452            else: 
     453                self._current_ps_item.setPen(QPen(Qt.black)) 
    442454             
    443455    def mouseReleaseEvent(self, event): 
     
    449461            return 
    450462        self._pressed_mouse_button = Qt.NoButton 
    451         if event.button() == Qt.LeftButton and self._current_ps_item: 
    452             self.selection_items.append(self._current_ps_item) 
    453             self._current_ps_item = None 
    454             if self.auto_send_selection_callback:  
    455                 self.auto_send_selection_callback() 
    456             
     463        if event.button() == Qt.LeftButton and self.state == SELECT_RECTANGLE and self._current_rs_item: 
     464            self.add_selection_item(self._current_rs_item, self._current_rs_item.rect()) 
     465            self._current_rs_item = None 
    457466     
    458467    def mouseStaticClick(self, event): 
     
    473482            self.zoom_factor_animation.start(QAbstractAnimation.DeleteWhenStopped) 
    474483            return True 
     484             
    475485        elif self.state == SELECT_POLYGON and event.button() == Qt.LeftButton: 
    476             self._current_ps_polygon.addPoint(point) 
     486            if not self._current_ps_item: 
     487                self._current_ps_polygon = QPolygonF() 
     488                self._current_ps_polygon.append(point) 
     489                self._current_ps_item = QGraphicsPolygonItem(self.graph_item, self.canvas) 
     490            self._current_ps_polygon.append(point) 
    477491            self._current_ps_item.setPolygon(self._current_ps_polygon) 
    478         elif (self.state == SELECT_RECTANGLE or self.state == SELECT_POLYGON) and event.button() == Qt.RightButton: 
     492            if self._current_ps_polygon.size() > 2 and self.points_equal(self._current_ps_polygon.first(), self._current_ps_polygon.last()): 
     493                self._current_ps_item.setPen(QPen(Qt.black)) 
     494                self._current_ps_polygon.append(self._current_ps_polygon.first()) 
     495                self.add_selection_item(self._current_ps_item, self._current_ps_polygon) 
     496                self._current_ps_item = None 
     497                 
     498        elif self.state in [SELECT_RECTANGLE, SELECT_POLYGON] and event.button() == Qt.RightButton: 
     499            qDebug('Right conditions for removing a selection curve ' + repr(self.selection_items)) 
    479500            self.selection_items.reverse() 
    480             for i in self.selection_items: 
    481                 if i.shape().contains(point): 
    482                     self.canvas.removeItem(i) 
    483                     self.selection_items.remove(i) 
     501            for item, region in self.selection_items: 
     502                qDebug(repr(point) + '   ' + repr(region.rects())) 
     503                if region.contains(point.toPoint()): 
     504                    self.canvas.removeItem(item) 
     505                    qDebug('Removed a selection curve') 
     506                    self.selection_items.remove((item, region)) 
    484507                    if self.auto_send_selection_callback:  
    485508                        self.auto_send_selection_callback() 
     
    537560    def set_state(self, state): 
    538561        self.state = state 
     562        if state != SELECT_RECTANGLE: 
     563            self._current_rs_item = None 
     564        if state != SELECT_POLYGON: 
     565            self._current_ps_item = None 
    539566         
    540567    def map_from_widget(self, point): 
     
    542569         
    543570    def get_selected_points(self, xData, yData, validData): 
    544         reg = QRegion() 
     571        region = QRegion() 
    545572        selected = [] 
    546573        unselected = [] 
    547         for i in self.selection_items: 
    548             reg = reg.united(i.rect().toRect()) 
     574        for item, reg in self.selection_items: 
     575            region |= reg 
    549576        for j in range(len(xData)): 
    550577            (x, y) = self.map_to_graph( (xData[j], yData[j]) ) 
    551             p = QPointF(x, y).toPoint() 
    552             sel = reg.contains(p) 
     578            p = (QPointF(xData[j], yData[j]) * self.map_transform).toPoint() 
     579            sel = region.contains(p) 
    553580            selected.append(sel) 
    554581            unselected.append(not sel) 
    555582        return selected, unselected 
     583         
     584    def add_selection_item(self, item, reg): 
     585        if type(reg) == QRectF: 
     586            reg = reg.toRect() 
     587        elif type(reg) == QPolygonF: 
     588            reg = reg.toPolygon() 
     589        t = (item, QRegion(reg)) 
     590        self.selection_items.append(t) 
     591        if self.auto_send_selection_callback: 
     592            self.auto_send_selection_callback() 
     593         
     594    def points_equal(self, p1, p2): 
     595        if type(p1) == tuple: 
     596            (x, y) = p1 
     597            p1 = QPointF(x, y) 
     598        if type(p2) == tuple: 
     599            (x, y) = p2 
     600            p2 = QPointF(x, y) 
     601        return (QPointF(p1)-QPointF(p2)).manhattanLength() < self.polygon_close_treshold 
Note: See TracChangeset for help on using the changeset viewer.