Introdução à programação
com Python em um contexto visual


Mais sobre os atributos gráficos

Esta página tenta ampliar um pouco o assundo dos atributos gráficos, que são os ajustes que podemos fazer nas formas que desenhamos, mencionados desde os primeiros passos e também quando falamos mais sobre as cores.

Quais são os ajustes que podemos fazer nos atributos gráficos das formas que desenhamos?

Preservando o estado atual dos atributos (fazendo modificações e depois voltando ao estado anterior)

As funções push_style() e pop_style() (ou push() e pop() que combinam os primeiros com push_matrix/pop_matrix) permitem alterar os atributos gráficos em uso para desenhar(dentro de uma função, por exemplo) e depois devolver os atributos ao que eram antes. Desta forma, uma função pode usar uma cor específica e outra que é a corrente, sem perturbar a segunda.

Lendo o estado atual dos atributos de cor “ativos”

Usando pg = get_graphics() podemos obter uma referência ao objeto Py5Graphics do sketch, que é a superfície em que estamos desenhando. Podemos consultar pg._instance.fillColor e pg._instance.strokeColor para saber as cores que estão atualmente em uso.

Veja um exemplo de uso, uma função que desenha uma pequena seta cuja cabeça é um triângulo preenchido com a mesma cor ‘atual’ do traço(stroke).

def setup():
    size(400, 400)
    seta_vetor((100, 100), (200, 200))


def setup():
    size(400, 400)
    stroke(0, 150, 0)
    translate(200, 200)
    seta_vetor((100, 100))

def seta_vetor(v, origin=(0, 0), head_size=10):
    """
    Desenhe uma seta representando um vetor `v`, partindo da origem (0, 0)
    ou na posição informada com o argumentos opcional `origin`.
    """
    sg = get_graphics()
    current_stroke = sg._instance.strokeColor
    v = Py5Vector(*v)
    body = v.mag
    head_size = min(head_size, body / 2)
    xo, yo = origin
    xh = xo + v.x
    yh = yo + v.y
    ang = v.heading
    xha = xh + cos(ang + QUARTER_PI / 2 + PI) * head_size
    yha = yh + sin(ang + QUARTER_PI / 2 + PI) * head_size
    xhb = xh + cos(ang - QUARTER_PI / 2 + PI) * head_size
    yhb = yh + sin(ang - QUARTER_PI / 2 + PI) * head_size
    line(xo, yo, xh, yh)  # corpo com tamanho fixo
    with push():  # preserva os atributos gráficos atuais
        fill(current_stroke)  # usa a cor de traço como preenchimento!
        no_stroke()
        with begin_closed_shape():
            vertex(xha, yha)
            vertex(xh, yh)
            vertex(xhb, yhb)
            end_shape(CLOSE)