Ejemplo n.º 1
0
    def boundingRect(self) -> QtCore.QRectF:
        rect = super().boundingRect()
        view = next(iter(self.scene().views()), None)
        if view is None:
            return rect

        dist = view.mapToScene(QtCore.QRect(0, 0,self.cursor_dist, 1)).boundingRect().width()
        return rect.marginsAdded(QtCore.QMarginsF(dist, dist, dist, dist))
Ejemplo n.º 2
0
    def save_pdf(self, path, dpi=200):

        cmax = 4
        self.view.progress.update_state(text="Rendering...",
                                        value=1,
                                        maximum=cmax)
        if self.view.progress.cancel_pressed():
            return

        self.scene().clearSelection()

        scale = self.get_scale()
        scale_tgt = SCALE_CUTOFF * 2
        if scale < scale_tgt:
            self.scale_view(scale_tgt / scale)

        rect = self.scene().itemsBoundingRect()
        m = min(rect.width(), rect.height()) * 0.05
        rect = rect.marginsAdded(QtCore.QMarginsF(m, m, m, m))
        w, h = rect.width(), rect.height()

        self.view.progress.update_state(text="Rendering...",
                                        value=2,
                                        maximum=cmax)
        if self.view.progress.cancel_pressed():
            return

        printer = QtPrintSupport.QPrinter()
        printer.setWinPageSize(QtGui.QPageSize.A4)
        printer.setFullPage(True)
        printer.setOrientation(QtPrintSupport.QPrinter.Landscape)
        printer.setOutputFormat(QtPrintSupport.QPrinter.PdfFormat)
        printer.setOutputFileName(path)
        size = printer.pageLayout().pageSize().sizePoints()
        pw, ph = size.height(), size.width()
        scale = min(pw / w, ph / h)
        printer.setResolution(int(round(dpi / scale)))
        ph = int(round(h * (pw / w)))
        printer.setPageSize(
            QtGui.QPageSize(QtCore.QSize(ph, pw), units=QtGui.QPageSize.Point))
        painter = QtGui.QPainter(printer)

        self.view.progress.update_state(text="Rendering...",
                                        value=3,
                                        maximum=cmax)
        if self.view.progress.cancel_pressed():
            painter.end()
            os.remove(path)
            return

        self.scene().render(painter, source=rect)
        painter.end()

        self.view.progress.update_state(text="Rendering...",
                                        value=4,
                                        maximum=cmax)
Ejemplo n.º 3
0
    def zoom(self, direction=None):

        if direction is None:
            rect = self.scene.itemsBoundingRect().marginsAdded(
                QtCore.QMarginsF(10, 10, 10, 10))
            self.setSceneRect(rect)
            self.fitInView(rect, QtCore.Qt.KeepAspectRatio)
        else:
            factor = 1
            if direction == 1:
                factor = 1.1
            elif direction == -1:
                factor = 0.9
            self.scale(factor, factor)
Ejemplo n.º 4
0
    def save_pdf(self, path, dpi=72):

        self.scene().clearSelection()

        scale = self.get_scale()

        rect = self.scene().itemsBoundingRect()
        m = min(rect.width(), rect.height()) * 0.05
        rect = rect.marginsAdded(QtCore.QMarginsF(m, m, m, m))
        w, h = rect.width(), rect.height()

        printer = QtPrintSupport.QPrinter()
        printer.setWinPageSize(QtGui.QPageSize.A4)
        printer.setFullPage(True)
        is_landscape = False
        if w > h:
            is_landscape = True
            printer.setOrientation(QtPrintSupport.QPrinter.Landscape)
        else:
            printer.setOrientation(QtPrintSupport.QPrinter.Portrait)
        printer.setOutputFormat(QtPrintSupport.QPrinter.PdfFormat)
        printer.setOutputFileName(path)
        size = printer.pageLayout().pageSize().sizePoints()
        if is_landscape:
            pw, ph = size.height(), size.width()
        else:
            pw, ph = size.width(), size.height()
        scale = min(pw / w, ph / h)
        printer.setResolution(int(round(dpi / scale)))
        ph = int(round(h * (pw / w)))
        if is_landscape:
            printer.setPageSize(
                QtGui.QPageSize(QtCore.QSize(ph, pw),
                                units=QtGui.QPageSize.Point))
        else:
            printer.setPageSize(
                QtGui.QPageSize(QtCore.QSize(pw, ph),
                                units=QtGui.QPageSize.Point))

        painter = QtGui.QPainter(printer)
        self.scene().render(painter, source=rect)
        painter.end()
Ejemplo n.º 5
0
    def boundingRect(self) -> QtCore.QRectF:
        view = next(iter(self.scene().views()))
        angle = self.line.angle()

        fm = QtGui.QFontMetrics(self.font)
        text = fm.boundingRect(self.text)
        text = view.mapToScene(text).boundingRect()

        # Corners above the text height
        n1 = QtCore.QLineF(self.line.p2(), self.line.p1()).normalVector()
        n2 = QtCore.QLineF(self.line.p1(), self.line.p2()).normalVector()
        if 90 < angle < 270:
            n1.setLength(text.height())
            n2.setLength(-text.height())
        else:
            n1.setLength(-text.height())
            n2.setLength(text.height())

        poly = QtGui.QPolygonF([self.line.p1(), n1.p2(), n2.p2(), self.line.p2()])

        w = view.mapToScene(QtCore.QRect(0, 0, 5, 1)).boundingRect().width()
        return poly.boundingRect().marginsAdded(QtCore.QMarginsF(w, w, w, w))
Ejemplo n.º 6
0
    def reset_scene(self):

        rect = self.scene().itemsBoundingRect().marginsAdded(
            QtCore.QMarginsF(10, 10, 10, 10))
        self.setSceneRect(rect)
        self.fitInView(rect, QtCore.Qt.KeepAspectRatio)