Ignore:
Timestamp:
02/25/13 12:53:23 (14 months ago)
Author:
Ales Erjavec <ales.erjavec@…>
Branch:
default
Message:

Include the axis scale in the saved dendrogram image.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • Orange/OrangeWidgets/Unsupervised/OWHierarchicalClustering.py

    r11354 r11355  
    1717from PyQt4.QtGui import * 
    1818from PyQt4.QtCore import * 
     19from PyQt4.QtSvg import QSvgGenerator 
    1920 
    2021from OWWidget import OWWidget, DomainContextHandler, ContextField 
     
    265266        self.selected_clusters = [] 
    266267 
    267     def sendReport(self): 
    268         self.reportSettings( 
    269             "Settings", 
    270             [("Linkage", self.linkageMethods[self.Linkage]), 
    271              ("Annotation", self.labelCombo.currentText()), 
    272              self.PrintDepthCheck and ("Shown depth limited to", 
    273                                        self.PrintDepth), 
    274              self.SelectionMode and hasattr(self, "cutoff_height") and 
    275              ("Cutoff line at", self.cutoff_height)] 
    276         ) 
    277  
    278         self.reportSection("Dendrogram") 
    279         header = self.headerView.scene() 
    280         graph = self.dendrogramView.scene() 
    281         footer = self.footerView.scene() 
    282         canvases = header, graph, footer 
    283  
    284         pixmap = QPixmap(max(c.width() for c in canvases), 
    285                          sum(c.height() for c in canvases)) 
    286  
    287         painter = QPainter(pixmap) 
    288         painter.fillRect(pixmap.rect(), QBrush(QColor(255, 255, 255))) 
    289         header.render(painter, 
    290                       QRectF(0, 0, header.width(), header.height()), 
    291                       QRectF(0, 0, header.width(), header.height())) 
    292  
    293         graph.render(painter, 
    294                      QRectF(0, header.height(), graph.width(), graph.height()), 
    295                      QRectF(0, 0, graph.width(), graph.height())) 
    296  
    297         footer.render(painter, 
    298                       QRectF(0, header.height() + graph.height(), 
    299                              footer.width(), footer.height()), 
    300                       QRectF(0, 0, footer.width(), footer.height())) 
    301  
    302         painter.end() 
    303  
    304         def save_to(filename): 
    305             _, ext = os.path.splitext(filename) 
    306             pixmap.save(filename, ext[1:]) 
    307  
    308         self.reportImage(save_to) 
    309  
    310268    def clear(self): 
    311269        """ 
     
    651609            self.send("Structured Data Files", data) 
    652610 
     611    def sendReport(self): 
     612        self.reportSettings( 
     613            "Settings", 
     614            [("Linkage", self.linkageMethods[self.Linkage]), 
     615             ("Annotation", self.labelCombo.currentText()), 
     616             self.PrintDepthCheck and ("Shown depth limited to", 
     617                                       self.PrintDepth), 
     618             self.SelectionMode and hasattr(self, "cutoff_height") and 
     619             ("Cutoff line at", self.cutoff_height)] 
     620        ) 
     621 
     622        self.reportSection("Dendrogram") 
     623 
     624        header = self.headerView.scene() 
     625        graph = self.dendrogramView.scene() 
     626        footer = self.footerView.scene() 
     627        canvases = header, graph, footer 
     628 
     629        pixmap = QPixmap(max(c.width() for c in canvases), 
     630                         sum(c.height() for c in canvases)) 
     631        pixmap.fill(Qt.white) 
     632        painter = QPainter(pixmap) 
     633        painter.setRenderHint(QPainter.Antialiasing) 
     634        self.renderDendrogram(painter) 
     635        painter.end() 
     636 
     637        def save_to(filename): 
     638            _, ext = os.path.splitext(filename) 
     639            pixmap.save(filename, ext[1:]) 
     640 
     641        self.reportImage(save_to) 
     642 
    653643    def saveGraph(self): 
    654644        sizeDlg = OWChooseImageSizeDlg(self.dendrogram, parent=self) 
    655         sizeDlg.exec_() 
     645        filename = sizeDlg.getFileName( 
     646            "graph", 
     647            "Portable Network Graphics (*.PNG);;" 
     648            "Windows Bitmap (*.BMP);;" 
     649            "Graphics Interchange Format (*.GIF);;" 
     650            "Scalable Vector Graphics (*.SVG)", 
     651            ".png" 
     652        ) 
     653        _, ext = os.path.splitext(filename) 
     654        ext = ext.lower() 
     655 
     656        canvases = (self.headerView.scene(), 
     657                    self.dendrogramView.scene(), 
     658                    self.footerView.scene()) 
     659        width = max([c.width() for c in canvases]) 
     660        height = sum([c.height() for c in canvases]) 
     661 
     662        size = QSize(width, height) 
     663 
     664        if ext == ".svg": 
     665            device = QSvgGenerator() 
     666            device.setTitle("Dendrogram Plot") 
     667            device.setFileName(filename) 
     668            device.setSize(size) 
     669            device.setViewBox(QRect(QPoint(0, 0), size)) 
     670        else: 
     671            device = QPixmap(size) 
     672            device.fill(Qt.white) 
     673 
     674        painter = QPainter() 
     675        painter.begin(device) 
     676        painter.setRenderHint(QPainter.Antialiasing) 
     677 
     678        self.renderDendrogram(painter) 
     679        painter.end() 
     680 
     681        if ext != ".svg": 
     682            device.save(filename) 
     683 
     684    def renderDendrogram(self, painter): 
     685        """ 
     686        Render the dendrogram onto the `painter`, including both axis. 
     687        """ 
     688        header = self.headerView.scene() 
     689        graph = self.dendrogramView.scene() 
     690        footer = self.footerView.scene() 
     691 
     692        header.render(painter, 
     693                      QRectF(0, 0, header.width(), header.height()), 
     694                      QRectF(0, 0, header.width(), header.height())) 
     695 
     696        graph.render(painter, 
     697                     QRectF(0, header.height(), graph.width(), graph.height()), 
     698                     QRectF(0, 0, graph.width(), graph.height())) 
     699 
     700        footer.render(painter, 
     701                      QRectF(0, header.height() + graph.height(), 
     702                             footer.width(), footer.height()), 
     703                      QRectF(0, 0, footer.width(), footer.height())) 
    656704 
    657705 
     
    845893            # Fix widget top and bottom margins. 
    846894            spacing = QFontMetrics(self.font()).lineSpacing() 
    847             left, top, right, bottom = self.widget.layout().getContentsMargins() 
     895            left, _, right, _ = self.widget.layout().getContentsMargins() 
    848896            self.widget.layout().setContentsMargins(left, spacing / 2.0, right, 
    849897                                                    spacing / 2.0) 
    850             self.grid_widget.resize(self.grid_widget.sizeHint(Qt.PreferredSize)) 
     898            self.grid_widget.resize( 
     899                self.grid_widget.sizeHint(Qt.PreferredSize) 
     900            ) 
    851901 
    852902    def _update_scene_rect(self): 
     
    10181068        self.scale_widget.setPos(start, 0) 
    10191069        size_hint = self.scale_widget.sizeHint(Qt.PreferredSize) 
    1020         self.scale_widget.resize(end - start, self.scale_widget.size().height()) 
     1070        self.scale_widget.resize(end - start, 
     1071                                 self.scale_widget.size().height()) 
    10211072 
    10221073    def scene_rect_update(self, rect): 
Note: See TracChangeset for help on using the changeset viewer.