En el ejemplo también veremos sobre los tipos de líneas, y con esto finalizaremos el aspecto gráfico con pdfgen.
# -*- coding:utf-8 -*- import os from reportlab.lib.pagesizes import A4 from reportlab.pdfgen import canvas from math import sqrt c=canvas.Canvas("test.pdf", pagesize = A4) #PATH OBJECT #================= #Creamos una estrella de 6 puntas. Como se sabe esta formada por la #intersección de dos triángulos equiláteros. #1. Dibujemos de la forma clásica, línea a línea def estrellaDavid(x1, y1, lado): l = lado h = (l * sqrt(3) / 2) c.line(x1, y1, x1 + l, y1) c.line(x1, y1, x1 + l / 2 , y1 + h) c.line(x1 + l, y1, x1 + l / 2, y1 + h) c.line(x1, y1 + 2*h/3, x1 + l, y1 + 2*h/3) c.line(x1, y1 + 2*h/3, x1 + l / 2, y1 + 2*h/3 - h) c.line(x1 + l, y1 + 2*h/3, x1 + l / 2, y1 + 2*h/3 - h) c.drawString(100, 800, "Dibujo línea a línea") c.setLineWidth(5) estrellaDavid(200, 600, 200) #2. Dibujemos usando Objeto de trayectoria (path object). #A diferencia del método anterior, es como dibujar teniendo un lapiz en mano. #Si tenemos que levantarlo usamos moveTo; si tenemos que trazarlo, lineTo, y #lo importante los puntos de unión se cierran con p.close() def estrellaDavid_po(x1, y1, lado): l = lado h = (l * sqrt(3) / 2) p = c.beginPath() p.moveTo(x1, y1) # Nos movemos a un punto p.lineTo(x1 + l, y1) # Trazamos la linea hasta el punto indicado p.lineTo(x1 + l / 2, y1 + h) p.lineTo(x1 , y1) p.close() # Cierra el trazo de la figura dibujada p.moveTo(x1, y1 + 2*h/3) p.lineTo(x1 + l, y1 + 2*h/3) p.lineTo(x1 + l / 2, y1 + 2*h/3 - h) p.lineTo(x1, y1 + 2*h/3) p.close() c.drawPath(p) #Hay más métodos de los path objects mencionados en el userguide, como: # p.curveTo(x1,y1,x2,y2,x3,y3) Dibuja una curva Bezier # p.arc(x1,y1,x2,y2,startAng=0, extent=90) Dibuja elipses parciales # p.arcTo(x1,y1,x2,y2,startAng=0, extent=90) # p.rect(x, y, ancho, alto) # p.ellipse(x, y, ancho, alto) # p.circle (x_centrado, y_centrado, radio) c.drawString(100, 400, "Dibujo con path object. Notesé la unión de puntos.") estrellaDavid_po(200, 200, 200) c.showPage() #TIPOS DE UNIÓN DE LINEAS (JOIN) #======================== c.setLineWidth(5) # Tamaño de línea estrellaDavid_po(20, 600, 150) c.setLineJoin(1) # Línea redondeada. (0) Default: Es puntiaguda estrellaDavid_po(220, 600, 150) c.setLineJoin(2) # Línea cuadrada estrellaDavid_po(420, 600, 150) #TIPOS DE EXTREMO DE LINEA (CAP) #========================= c.line(220, 400, 350, 400) c.setLineCap(1) # Extremo redondeado. (0) Default: Cuadrado Sin Proyección c.line(220, 380, 350, 380) c.setLineCap(2) # Extremo Cuadrado Con Proyección c.line(220, 360, 350, 360) c.setLineWidth(0.5) c.line(220, 420, 220, 340) c.line(350, 420, 350, 340) #LINEA ENTRECORTADAS (DASH) #=================== c.setLineWidth(1) c.setDash(6, 3) # sucesión de 6 puntos trazados, y 3 no trazados estrellaDavid_po(20, 150, 150) c.setDash(1, 2) # sucesión de 1 punto trazado y 2 no trazados estrellaDavid_po(220, 150, 150) c.setDash([1,3,5,3], 0) # sucesión alternada en la lista. 0: punto de inicio estrellaDavid_po(420, 150, 150) c.showPage() c.save() os.system("test.pdf")
No hay comentarios:
Publicar un comentario