Seite 2 von 2

Re: Teilkreislinie ohne Winkellinie zeichnen

Verfasst: Dienstag 24. Oktober 2023, 10:50
von Nobuddy
Als nächstes möchte ich die Fensterausgabe als PDF ausdrucken.
Dazu habe ich dies hier https://doc.qt.io/qtforpython-6/overvie ... sview.html gefunden.
Ich habe dies folgendermaßen umgesetzt:

Code: Alles auswählen

import sys
from PyQt5.QtCore import (
	Qt,
	QEvent,
	QRectF
	)
from PyQt5.QtWidgets import (
	QApplication,
	QDialog,
	QGraphicsView,
	QGraphicsScene,
	QGraphicsItem,
	QGraphicsEllipseItem,
	)
from PyQt5.QtGui import  (
	QPen,
	QBrush,
	QPixmap,
	QPainter,
	QPdfWriter,
	QPagedPaintDevice
	)
from PyQt5.QtPrintSupport import (
	QPrinter,
	QPrintDialog,
	QPrintPreviewDialog
	)

class GeometryDraw(QGraphicsView):
	def __init__(self, ellipses=[]):
		super().__init__()

		if ellipses == []:
			return
		self.viewport().installEventFilter(self)
		self.scene = QGraphicsScene(self)
		self.setScene(self.scene)
		self.setCacheMode(QGraphicsView.CacheBackground)
		self.ellipses(ellipses)
		self.show()

	def ellipses(self, ellipses):
		for x, y, d, start_angle, span_angle, color in ellipses:
			item = QGraphicsEllipseItem(x, y, d, d)
			item.setStartAngle(start_angle)
			item.setSpanAngle(span_angle)
			self.finish(color, item)

	def finish(self, color, item):
		pen = QPen()
		pen.setBrush(QBrush(color))
		item.setPen(pen)
		item.setFlags(QGraphicsItem.ItemIsMovable |
			QGraphicsItem.ItemIsSelectable)
		self.scene.addItem(item)


def main():
	app = QApplication(sys.argv)
	screen = app.screens()[0]
	dpi = screen.physicalDotsPerInch()
	f = factor = dpi/25.4
	# data to draw
	start_angle = int(0*16)
	alpha = 121.081
	span_angle = int(alpha*16)
	r0 = 148.660
	r1 = 74.330
	circles = [
		(-r0*factor, -r0*f, r0*f*2, start_angle, span_angle, Qt.green),
		(-r1*factor, -r1*f, r1*f*2, start_angle, span_angle, Qt.green),
		]
	# draw geometry
	GD = GeometryDraw(ellipses=circles)
	# print
	scene = GD.scene
	try:
		#scene.addRect(QRectF(0, 0, 800, 1000), QPen(Qt.black),
		#	QBrush(Qt.green))
		printer = QPrinter()
		if QPrintDialog(printer).exec() == QDialog.Accepted:
			painter = QPainter(printer)
			painter.setRenderHint(QPainter.Antialiasing)
			scene.render(painter)
	except AttributeError:
		pass
	sys.exit(app.exec_())

if __name__ == '__main__':
	main()
Mit meinem integrierten PDF-Drucker über die Druckerauswahl, starte ich den Druck.
Eine PDF-Datei wird erstellt, leider erhalte ich beim Versuch die Datei zu öffnen eine Fehlermeldung "Datei kann nicht geöffnet werden".

Vielleicht fällt Euch auf, welchen Fehler ich dabei gemacht habe.
Ich habe die mit und ohne scene.addRect versucht.

Grüße Nobuddy

Re: Teilkreislinie ohne Winkellinie zeichnen

Verfasst: Mittwoch 25. Oktober 2023, 14:41
von Nobuddy
Nach längerem, bin ich auf die Lösung gekommen.
Ich habe versucht scene an den Drucker weiterzugeben, was falsch war.
Die Schnittstelle ist QGraphicsView.

Ich habe QPrintPreviewDialog verwendet, um gleich das Druckresultat vor Druck zu sehen.

Code: Alles auswählen

import sys
from PyQt5.QtCore import (
	Qt,
	QEvent,
	QRectF
	)
from PyQt5.QtWidgets import (
	QApplication,
	QDialog,
	QGraphicsView,
	QGraphicsScene,
	QGraphicsItem,
	QGraphicsEllipseItem,
	)
from PyQt5.QtGui import  (
	QPen,
	QBrush,
	QPixmap,
	QPainter,
	QPdfWriter,
	QPagedPaintDevice
	)
from PyQt5.QtPrintSupport import (
	QPrinter,
	QPrintDialog,
	QPrintPreviewDialog
	)


class GeometryDraw(QGraphicsView):
	def __init__(self, ellipses=[]):
		super().__init__()

		if ellipses == []:
			return
		self.viewport().installEventFilter(self)
		self.scene = QGraphicsScene(self)
		self.setScene(self.scene)
		self.setCacheMode(QGraphicsView.CacheBackground)
		self.ellipses(ellipses)
		self.show()
		self.handle_preview()

	def ellipses(self, ellipses):
		for x, y, d, start_angle, span_angle, color in ellipses:
			item = QGraphicsEllipseItem(x, y, d, d)
			item.setStartAngle(start_angle)
			item.setSpanAngle(span_angle)
			self.finish(color, item)

	def finish(self, color, item):
		pen = QPen()
		pen.setBrush(QBrush(color))
		item.setPen(pen)
		item.setFlags(QGraphicsItem.ItemIsMovable |
			QGraphicsItem.ItemIsSelectable)
		self.scene.addItem(item)

	def handle_preview(self):
		dialog = QPrintPreviewDialog()
		dialog.paintRequested.connect(self.handle_paint_request)
		dialog.exec_()

	def handle_paint_request(self, printer):
		printer.setFullPage(True)
		painter = QPainter(printer)
		grafic = self.rect()
		painter.setViewport(grafic)
		painter.setWindow(grafic)
		self.render(painter)
		painter.end()


def main():

	app = QApplication(sys.argv)
	screen = app.screens()[0]
	dpi = screen.physicalDotsPerInch()
	f = factor = dpi/25.4
	# data to draw
	start_angle = int(0*16)
	alpha = 121.081
	span_angle = int(alpha*16)
	r0 = 148.660
	r1 = 74.330
	circles = [
		(-r0*factor, -r0*f, r0*f*2, start_angle, span_angle, Qt.green),
		(-r1*factor, -r1*f, r1*f*2, start_angle, span_angle, Qt.green),
		]
	# draw geometry
	GD = GeometryDraw(ellipses=circles)
	sys.exit(app.exec_())

if __name__ == '__main__':
	main()