{ "metadata": { "name": "" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "[Python para Desenvolvedores](http://ricardoduarte.github.io/python-para-desenvolvedores/#conteudo)\n", "===================================\n", "2ª edi\u00e7\u00e3o, revisada e ampliada\n", "-----------------------------------\n", "\n", "Cap\u00edtulo 36: SVG\n", "=============================\n", "_____________________________\n", "[SVG](http://www.w3.org/Graphics/SVG/) (*Scalable Vector Graphics*) \u00e9 um formato aberto, baseado no XML, que descreve imagens vetoriais, na forma de estruturas compostas por instru\u00e7\u00f5es de alto n\u00edvel que representam primitivas geom\u00e9tricas. O formato foi proposto pelo W3C (*World Wide Web Consortium*), a entidade que define os padr\u00f5es vigentes na Internet, como o HTML e o pr\u00f3prio XML.\n", "\n", "![SVG](files/bpypd_diags25.png)\n", "\n", "Arquivos SVG podem armazenar v\u00e1rios tipos de informa\u00e7\u00f5es vetoriais, incluindo pol\u00edgonos b\u00e1sicos, que s\u00e3o representados por linhas que delimitam uma \u00e1rea fechada, tais como ret\u00e2ngulos, elipses e outras formas simples. Al\u00e9m disso, ele tamb\u00e9m suporta caminhos (*paths*), que s\u00e3o figuras, com preenchimento ou n\u00e3o, compostas por linhas e/ou curvas definidas por pontos, que s\u00e3o codificados atrav\u00e9s de comandos de um caractere (\u201cL\u201d significa \u201cLine To\u201d, por exemplo) e um par de coordenadas X e Y, o que gera um c\u00f3digo muito compacto.\n", "\n", "Texto *unicode* pode ser inclu\u00eddo em um arquivo SVG, com efeitos visuais, e a especifica\u00e7\u00e3o inclui tratamento de texto bidirecional, vertical e seguindo caminhos curvos. O texto pode ser formatadas com fontes de texto externas, mas para amenizar o problema do texto n\u00e3o ser apresentado corretamente em sistemas diferentes, existe uma fonte interna, que est\u00e1 sempre dispon\u00edvel.\n", "\n", "As figuras geom\u00e9tricas, caminhos e texto podem ser usados como contornos, internos ou externos, que pode usar tr\u00eas tipos de preenchimento:\n", "\n", "+ Cores s\u00f3lidas, que podem ser opacas ou com transpar\u00eancia.\n", "+ Gradientes, que podem ser lineares ou radiais.\n", "+ Padr\u00f5es, que s\u00e3o imagens bitmap ou vetoriais que se repetem ao longo do objeto.\n", "\n", "Tantos os gradientes quantos os padr\u00f5es podem ser animados.\n", "\n", "O SVG tamb\u00e9m permite que o autor inclua metadados com informa\u00e7\u00f5es a respeito da imagem, tais como t\u00edtulo, descri\u00e7\u00e3o e outros, com o objetivo de facilitar a cataloga\u00e7\u00e3o, indexa\u00e7\u00e3o e recupera\u00e7\u00e3o dos arquivos.\n", "\n", "Todos os componentes de um arquivo SVG pode ser lidos e alterados usando scripts da mesma forma que o HTML, tendo como padr\u00e3o a linguagem *ECMAScript*. A especifica\u00e7\u00e3o tamb\u00e9m prev\u00ea tratamento de eventos de mouse e teclado, o que, junto com *hyperlinks*, permite adicionar interatividade aos gr\u00e1ficos.\n", "\n", "O formato tamb\u00e9m suporta anima\u00e7\u00e3o atrav\u00e9s do ECMAScript, que pode transformar os elementos da imagem e temporizar o movimento. Isso tamb\u00e9m poder ser feito atrav\u00e9s de recursos pr\u00f3prios do SVG, usando *tags*.\n", "\n", "Para o SVG, filtros s\u00e3o conjuntos de opera\u00e7\u00f5es gr\u00e1ficas que s\u00e3o aplicadas a um determinado gr\u00e1fico vetorial, para produzir uma imagem matricial com o resultado. Tais opera\u00e7\u00f5es gr\u00e1ficas s\u00e3o chamadas primitivas de filtro, que geralmente realizam uma forma de processamento de imagem, como, por exemplo, o efeito *Gaussian Blur*, e por isso, geram um *bitmap* com transpar\u00eancia (padr\u00e3o RGBA) como sa\u00edda, que \u00e9 regerado se necess\u00e1rio. O resultado de uma primitiva pode ser usado como entrada para outra primitiva, permitindo a concatena\u00e7\u00e3o de v\u00e1rias para gerar o efeito desejado.\n", "\n", "SVGFig\n", "------\n", "Os arquivos SVG podem manipulados atrav\u00e9s de bibliotecas XML, como o ElementTree, mas \u00e9 mais produtivo usar componentes que j\u00e1 projetados com essa finalidade. O SVGFig \u00e9 um m\u00f3dulo para SVG com muitos recursos prontos. O m\u00f3dulo permite tanto usar as primitivas de desenho do SVG diretamente, como tamb\u00e9m rotinas pr\u00f3prias de alto n\u00edvel.\n", "\n", "Exemplo (usando primitivas do SVG):" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# Importa SVGFig\n", "from svgfig import *\n", "\n", "cores = ['#dddddd', '#306090', '#609030', '#906030']\n", "\n", "# Um ret\u00e2ngulo usando SVG\n", "# x, y -> posi\u00e7\u00e3o do canto superior esquerdo\n", "# width, height -> tamanho\n", "# fill -> cor do preenchimento\n", "# opacity -> opacidade (1.0 = 100%)\n", "# stroke_width -> largura da linha (em pontos)\n", "q1 = SVG('rect', x=0, y=0, width=100, height=100,\n", " fill=cores[0], opacity='1.0', stroke_width='0.2pt')\n", "\n", "# Primeiro c\u00edrculo\n", "# cx, cy -> posi\u00e7\u00e3o do centro\n", "# r -> raio\n", "c1 = SVG('circle', cx=35, cy=65, r=30,\n", " fill=cores[1], opacity='0.5', stroke_width='0.2pt')\n", "\n", "# Segundo c\u00edrculo\n", "c2 = SVG('circle', cx=65, cy=65, r=30,\n", " fill=cores[2], opacity='0.5', stroke_width='0.2pt')\n", "\n", "# Terceiro c\u00edrculo\n", "c3 = SVG('circle', cx=50, cy=35, r=30,\n", " fill=cores[3], opacity='0.5', stroke_width='0.2pt')\n", "\n", "# Criando um grupo com as figuras\n", "g = SVG('g', q1, c1, c2, c3)\n", "\n", "# Salvando\n", "g.save(\"tmp.svg\")\n", "\n", "#Imprimindo o resultado\n", "print open('tmp.svg').read()" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n" ] } ], "prompt_number": 3 }, { "cell_type": "markdown", "metadata": {}, "source": [ "![SVG Circles](files/tmp.svg)\n", "\n", "Exemplo (com rotinas do SVGFig):" ] }, { "cell_type": "code", "collapsed": false, "input": [ "from math import sin, cos, pi\n", "from svgfig import *\n", "\n", "# Cria uma curva para t = seno(2t) / 2 + cosseno(3t)\n", "# de -2Pi a 2 Pi, da cor #ccbbaa\n", "curva = Curve('t, 0.5 * sin(2*t) + cos(3*t)',\n", " -2*pi, 2*pi, stroke='#ccbbaa')\n", "\n", "# Gera um gr\u00e1fico com eixos\n", "# X (-2Pi a 2Pi) e Y (-2 a 2) com a curva\n", "grafico = Plot(-2*pi, 2*pi, -2, 2, curva)\n", "\n", "# Cria um objeto SVG\n", "svg = grafico.SVG()\n", "\n", "# Salva em um arquivo\n", "svg.save(\"tmp2.svg\")" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 4 }, { "cell_type": "markdown", "metadata": {}, "source": [ "![SVG Curves](files/tmp2.svg)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "O SVGFig tem v\u00e1rias primitivas de desenho implementadas na forma de fun\u00e7\u00f5es, incluindo caminhos (`Path()`), linhas (`Line()`) e texto (`Text()`)." ] }, { "cell_type": "code", "collapsed": false, "input": [], "language": "python", "metadata": {}, "outputs": [ { "html": [ "\n", "" ], "output_type": "pyout", "prompt_number": 1, "text": [ "" ] } ], "prompt_number": 1 } ], "metadata": {} } ] }