febrero 03, 2014

ReportLab: pdfgen - Objeto de trayectoria y Tipo de líneas (06)

Ya vimos sobre los objetos de texto, que permiten dibujar de forma más comoda los textos. Para los gráficos, contamos con path object. La ventaja de usarlo, reside en la comparativa de dibujar a mano alzada, en la que el cierre de los puntos de unión se da automáticamente.

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