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


Como usar recursos vetoriais externos

Carregando um arquivo SVG com loadShape()

arquivo: bot1.svg, uma ilustração de George Brower.

Podemos carregar (load) na memória dados de arquivos vetoriais externos nos formatos SVG e OBJ. Para isso usamos a função loadShape(), mas é preciso indicar onde está o arquivo (o chamado ‘caminho completo’ do arquivo), ou que ele esteja na pasta /data/ dentro da pasta do seu sketch (programa).

sketch_2020_04a                (pasta/folder do sketch)
  L  sketch_2020_04a.pyde      (arquivo com o código)
  L  data                      (pasta/folder)
       L  bot1.svg          (arquivo svg)

Note que a operação de carregar o arquivo é relativamente demorada e nunca deve ser executada dentro do laço draw(). Em geral só precisamos carregar uma vez e fazemos isso no setup(). Também é comum criarmos uma variável global que faz referência aos recurso vetoriais carregados, neste exemplo a variável svg:

def setup():
    size(400, 400)
    global svg
    svg = loadShape("bot1.svg")  # arquivo SVG na pasta /data/

def draw():
    # shape(svg, x, y) desenha o arquivo no tamanho original
    shape(svg, 100, 100) 
    # shape(svg, x, y, largura, altura) força um tamanho
    # svg.width e svg.height apontam as dimensões do arquivo original
    # podemos mostrar o recurso com metade da sua largura e altura originais assim:
    shape(svg, 0, 0, svg.width / 2, svg.height / 2)

Os objetos PShape, que armazenam os dados vetoriais, tem uma série de métodos (funções internas desses objetos) que podem ser consultados na referência do Processing modo Java / PShape. A página da referência do Processing modo Python está incompleta mas os métodos de PShape são os mesmos.

Um dos métodos mais úteis é o .disableSyle() que permite ignorar os atributos grágifos das formas no arquivo SVG, permitinho aplicar o traço e preenchimento por nossa conta. O .enableStyle() devolve o comportamento original.

def setup():
    size(400, 200)
    bot = loadShape("bot1.svg")
    background(102)
    bot.disableStyle()    # Ignore as cores no SVG
    fill(0, 102, 153)     # preenchimento azul
    stroke(255)           # traço branco
    strokeWeight(2)       # traço mais espesso
    shape(bot, 5, 5, 190, 190)
    bot.enableStyle()
    shape(bot, 205, 5, 190, 190)
    saveFrame("disable_style.png")

Assuntos relacionados