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