Changeset 6980:80d6495865b7 in orange


Ignore:
Timestamp:
09/21/10 12:37:18 (4 years ago)
Author:
ales_erjavec <ales.erjavec@…>
Branch:
default
Convert:
2b13d05558b814dc124d7497682c6ef0db71e13d
Message:
  • added Lasso tool
File:
1 edited

Legend:

Unmodified
Added
Removed
  • orange/OrangeWidgets/Prototypes/OWDataGenerator.py

    r6979 r6980  
    149149        elif isinstance(region, tuple): 
    150150            path.addRect(QRectF(*region).normalized()) 
     151        elif isinstance(region, list): 
     152            path.addPolygon(QPolygonF(region + [region[0]])) 
    151153        return path 
    152154             
     
    193195        self.emit(SIGNAL("selectionGeometryChanged()")) 
    194196     
    195     def end(self, event, index=-1): 
     197    def end(self, event): 
    196198        self.update(event) 
    197199        if self._moving_index != -1: 
     
    202204    def regionAt(self, event): 
    203205        pos = self.getPos(event) 
    204         for i, (p1, p2) in enumerate(self.selection): 
    205             if QRectF(p1, p2).contains(pos): 
     206        for i, region in enumerate(self.selection): 
     207            if self.toPath(region).contains(pos): 
    206208                return i 
    207209        return -1 
     
    210212        data = numpy.asarray(data) 
    211213        region = QPainterPath() 
    212         for p1, p2 in self.selection: 
    213             region.addRect(QRectF(p1, p2).normalized()) 
     214        for region in self.selection: 
     215            region = region.united(self.toPath(region)) 
    214216        def test(point): 
    215217            return region.contains(QPointF(point[0], point[1])) 
     
    225227    def path(self): 
    226228        region = QPainterPath() 
    227         for p1, p2 in self.selection: 
    228             p = QPainterPath() 
    229             p.addRect(QRectF(p1, p2).normalized()) 
    230             region = region.united(p) 
     229        for region in self.selection: 
     230            region = region.united(self.toPath(region)) 
    231231        return region 
    232232     
     
    270270             
    271271            painter.setTransform(inverted) 
    272             for p1, p2 in self.selection.selection: 
    273                 painter.drawRect(QRectF(p1, p2)) 
     272            for region in self.selection.selection: 
     273                painter.drawPath(self.selection.toPath(region)) 
    274274            del painter 
    275275            self.graph._tool_pixmap = pixmap 
     
    317317            ex[attr2] = y + diff.y() 
    318318        self.graph.updateGraph() 
    319              
    320          
     319         
     320class GraphLassoSelections(GraphSelections): 
     321    def start(self, event): 
     322        pos = self.getPos(event) 
     323        index = self.regionAt(event) 
     324        if index == -1: 
     325            self.clearSelection() 
     326            self.addSelectionRegion([pos]) 
     327        else: 
     328            self._moving_index, self._moving_pos, self._selection_region = index, pos, self.selection[index] 
     329            self.emit(SIGNAL("selectionRegionMoveStarted(int, QPointF, QPainterPath)"), index, pos, self.toPath(self.selection[index]))   
     330        self.emit(SIGNAL("selectionGeometryChanged()")) 
     331         
     332    def update(self, event): 
     333        pos = self.getPos(event) 
     334        index = self._moving_index 
     335        if index == -1: 
     336            self.selection[-1].append(pos) 
     337            self.emit(SIGNAL("selectionRegionUpdated(int, QPainterPath)"), len(self.selection) - 1 , self.toPath(self.selection[-1])) 
     338        else: 
     339            diff = self._moving_pos - pos 
     340            self.selection[index] = [p - diff for p in self._selection_region] 
     341            self.emit(SIGNAL("selectionRegionMoved(int, QPointF, QPainterPath)"), index, pos, self.toPath(self.selection[index])) 
     342             
     343        self.emit(SIGNAL("selectionGeometryChanged()")) 
     344         
     345    def end(self, event): 
     346        self.update(event) 
     347        if self._moving_index != -1: 
     348            self.emit(SIGNAL("selectionRegionMoveEnd(int)"), self._moving_index) 
     349        self._moving_index = -1 
     350         
     351class LassoTool(SelectTool): 
     352    def __init__(self, graph, parent=None): 
     353        DataTool.__init__(self, graph, parent) 
     354        self.selection = GraphLassoSelections(graph) 
     355        self.pen = QPen(Qt.red, 1, Qt.DashDotLine) 
     356        self.pen.setCosmetic(True) 
     357        self.pen.setJoinStyle(Qt.RoundJoin) 
     358        self.pen.setCapStyle(Qt.RoundCap) 
     359        self.connect(self.selection, SIGNAL("selectionRegionMoveStarted(int, QPointF, QPainterPath)"), self.onMoveStarted) 
     360        self.connect(self.selection, SIGNAL("selectionRegionMoved(int, QPointF, QPainterPath)"), self.onMove) 
     361     
    321362class ZoomTool(DataTool): 
    322363    def __init__(self, graph, parent=None): 
     
    342383     
    343384class PutInstanceTool(DataTool): 
    344     class optionsWidget(QFrame): 
    345         def __init__(self, tool, parent=None): 
    346             QFrame.__init__(self, parent) 
    347              
    348         def setClassListModel(self, model): 
    349             self.cb.setModel(model) 
    350              
    351         def onClusterChanged(self, index): 
    352             self.tool.classIndex = index 
    353385     
    354386    def mousePressEvent(self, event): 
     
    414446        return True 
    415447     
    416     def mouseReleseEvent(self, event): 
    417         sself.graph.replot() 
     448    def mouseReleaseEvent(self, event): 
     449        self.graph.replot() 
    418450        return True 
    419451     
     
    424456         
    425457    def paintEvent(self, event): 
    426 #        self.graph.canvas().paintEvent(event) 
    427458        pixmap = QPixmap(self.graph.canvas().size()) 
    428459        pixmap.fill(QColor(255, 255, 255, 0)) 
    429460        painter = QPainter(pixmap) 
    430 #        painter = QPainter(self.graph.canvas()) 
    431461        painter.setRenderHint(QPainter.Antialiasing) 
    432462        try: 
     
    458488        self.graph.data.extend(new) 
    459489        self.graph.updateGraph(dataInterval=(-len(new), sys.maxint)) 
    460          
    461 class AddClusterTool(DataTool): 
    462     class optionsWidget(QFrame): 
    463         def __init__(self, tool, parent=None): 
    464             QFrame.__init__(self, parent) 
    465             self.tool = tool 
    466             layout = QVBoxLayout() 
    467             self.listView = QListView() 
    468             layout.addWidget(self.listView) 
    469              
    470     def __init__(self, graph, parent=None): 
    471         DataTool.__init__(graph, parent) 
    472          
    473     def mousePressEvent(self, event): 
    474         coords = self.invTransform(event.pos()) 
    475         covMatrix = self.getCov() 
    476         return False 
    477      
    478     def paintEvent(self, event): 
    479         self.graph.canvas().paintEvent(event) 
    480         for cluster in self.clusters: 
    481             name, cov = cluster 
    482             x, y = numpy.array([1.0, 0.0]), numpy.array([0.0, 1.0]) 
    483             x = numpy.multiply(x, cov) 
    484             y = numpy.multiply(y, cov) 
    485490     
    486491class MagnetTool(BrushTool): 
    487492     
    488493    def dataTransform(self, attr1, x, rx, attr2, y, ry): 
    489         import random 
    490494        for ex in self.graph.data: 
    491495            x1, y1 = float(ex[attr1]), float(ex[attr2]) 
     
    499503            ex[attr2] = y1 + dy 
    500504        self.graph.updateGraph() 
    501          
    502 class MultiplyTool(DataTool): 
    503     multiplier = 1.0 
    504     class optionsWidget(QFrame): 
    505         def __init__(self, tool, parent=None): 
    506             QFrame.__init__(self, parent) 
    507             self.tool = tool 
    508              
    509505     
    510506class JitterTool(BrushTool): 
     
    528524             ("Put", "Put individual instances", PutInstanceTool, "GenerateDataPutTool.png"), 
    529525             ("Select", "Select and move instances", SelectTool, "GenerateDataSelectTool.png"), 
     526             ("Lasso", "Select and move instances", LassoTool, "GenerateDataLassoTool.png"), 
    530527             ("Jitter", "Jitter instances", JitterTool, "GenerateDataJitterTool.png"), 
    531528             ("Magnet", "Move (drag) multiple instances", MagnetTool, "GenerateDataMagnetTool.png"), 
    532              ("Zoom", "Zoom", ZoomTool, "GenerateDataZoomTool.png") 
     529             ("Zoom", "Zoom", ZoomTool, "system-search.svg") #"GenerateDataZoomTool.png") 
    533530             ] 
    534531    def __init__(self, parent=None, signalManager=None, name="Data Generator"): 
     
    690687    app.exec_() 
    691688         
    692          
    693          
Note: See TracChangeset for help on using the changeset viewer.