Figuras draw.io editáveis para artigos acadêmicos
Você constrói figuras como objetos draw.io nativos a partir de um script de construção em Python (o artefato de registro: cada coordenada, função e tamanho vive lá, para que a figura possa ser regenerada e re-tematizada). Nunca trace pixels, nunca rasterize texto. Detalhes para cada chamada e regra: REFERENCE.md. Padrões para copiar: EXAMPLES.md.
Executando as ferramentas
Todo o código vem em um único arquivo. A abaixo significa python drawio_toolkit.py:
A <ferramenta> [args] # ex.: A lint_drawio fig.drawio --theme tema.yaml (qualquer ferramenta: --help)
A desempacotar ./tidyfigs # opcional: pasta normal scripts/ assets/ examples/; então python scripts/<ferramenta>.py
Em Python: import drawio_toolkit; drawio_toolkit.setup() → from drawio_kit import Diagram,
from figlib import *, from drawio_doc import Doc. Scripts de construção gerados encontram a biblioteca por conta própria.
Nenhuma execução de código disponível? Ainda assim siga o mesmo método: escreva o script de construção (ou, para figuras pequenas, o XML draw.io diretamente — REFERÊNCIA §14) para o usuário executar, e peça a eles a pré-visualização/saída do lint ou capturas de tela em vez de visualizá-las você mesmo.
Escolha o modo
| Entrada | Modo | Saída |
|---|---|---|
| imagem raster para recriar | A imagem | <img>.drawio + <img>#drawio.png (300 dpi) ao lado da imagem |
| prosa / seção de artigo / equação | B texto | 3 protótipos → usuário escolhe → <nome>.drawio |
| um .drawio existente para deixar pronto para publicação | C aprimorar | <nome>#APRIMORADO.drawio + exportações PDF/SVG/PNG |
A ou B é frequentemente seguido por C. Pergunte qual modo apenas se o pedido for genuinamente ambíguo.
Regras compartilhadas (todos os modos)
- Apenas papéis de tema. Cores, fontes, tamanhos, traços, opacidades vêm de um tema YAML/TOML/JSON (
fill="primario",size="corpo",sw="grosso",fill_opacity="tom"). Tons = papel existente + papel de opacidade, não novo hex. Precisa de uma nova cor? Adicione um papel semântico (destaque,bloco_b) e informe o usuário. O lint relata todos os valores fora do tema; os finais não têm nenhum. - Regularizar para intenção: pares recebem tamanhos idênticos, linhas/colunas um único espaço (
linha,larguras_linha,ajustar_linha,coluna,caixas_grid), bordas compartilhadas uma coordenada; centralizar rótulos no que eles rotulam (x + l/2). Ignore ruído de ±1 px. - Anexar conectores com
src/tgt(+ fraçõessaida/entrada) sempre que uma linha tocar uma forma;ptslista apenas o que o draw.io não pode calcular (início livre, pontos de passagem, fim livre). Pontos livres apenas para divisores, eixos de gráficos, vetores não anexados. - Bordas curvas (
rota="curva",flecha_flex,ciclo): pontos de passagem são pontos de controle; a curva passa pelos pontos médios entre pontos de passagem consecutivos. - Ordem Z = ordem de criação (mais recente no topo): tela → painéis → preenchimentos → formas → conectores → texto → anotações. Agrupe coisas que se movem juntas (
com d.grupo("laje")). - Ids estáveis em vértices importantes (necessários para bordas, lint legível).
- Marcação de texto:
**negrito***itálico*__sublinhado__{papel|colorido}\n\*; LaTeX inline\( … \); matemática exibida viad.equacao(r"...")(MathJax nativo, editável).raw=Truepassa HTML. - Verificar olhando: após cada construção, veja a(s) pré-visualização(ões) PNG com sua ferramenta de imagem; os números (lint, pontuações, auditorias) guiam, a verificação visual decide. A pré-visualização aproxima o draw.io: emoji = quadrados cinzas, cilindros/documentos = retângulos, sem versaletes, matemática via mathtext.
- Higiene do espaço de trabalho: scripts de rascunho, sondas e recortes vão em
<dir_de_trabalho>/rascunho/, nunca ao lado dos arquivos do usuário. - Padrões acadêmicos: fundo branco, sem título na figura (esboce uma legenda), ≤ 3 matizes + tons, cor nunca a única codificação, uma família de fontes, ≤ 6–7 papéis de tamanho, ≤ ~25 itens de texto.
Modo A — imagem → draw.io editável
Método: medir → planejar → tema → script de construção → renderizar → comparar → corrigir, até que a pré-visualização corresponda à fonte no layout. Coordenadas são pixels da imagem fonte medidos na grade real (olhar para uma visualização redimensionada é a #1 causa de conversões ruins).
A0 Triagem (define esforço; leia o exemplo mais próximo em EXAMPLES.md primeiro):
| Nível | Parece com | Técnicas principais | Iterações | Pontuação final |
|---|---|---|---|---|
| 1 simples | caixas, rótulos, setas retas/cotovelo, 1–3 painéis | rect, texto, borda anexada, linha | 2–3 | ≥ 0.88 |
| 2 grade/dashboard | lajes com ícones, colunas, mini fluxos, marcadores | painel, grupos, ajustar_linha/caixas_grid, icone, bordas ortogonais | 3–5 | ≥ 0.88 |
| 3 gráfico/geométrico | eixos, vetores, pontos, círculos, setas onduladas, rótulos rotacionados | ponto, círculo, âncoras, flecha_flex, bordas curvas, rotação | 3–6 | ≥ 0.85 |
| 4 complexo | superfícies 3-D, malhas, fotos, dispersão densa, chamadas | malha_superficie, polígono, recorte_imagem, dispersão_*, chamada, camadas z | 5–10 | ≥ 0.78 |
A1 Andaime + inspecionar: A novo_edificio imagens/fig.png [--theme usuario.yaml] [--escala 1] cria imagens/fig_drawio_trabalho/ (construcao.py, tema.yaml, NOTAS.md, inspecao/, iteracoes/, rascunho/, historico.json; mantenha). Leia inspecao/resumo.md e veja fonte.grid*.png (posições), fonte.caixas.png/.json (caixas delimitadoras exatas + cores medianas — use diretamente), fonte.ocr.png/.json (texto + tamanho da fonte: use est_px_se_regular/negrito ajustado por largura, escolha olhando), fonte.paleta.png (cores → papel mais próximo, ΔE). O andaime pré-preenche caixas detectadas em construcao.py — refine-as.
Amplie qualquer região: A inspecionar_imagem zoom SRC --caixa x0 y0 x1 y1 --fator 3 --passo 10; examine características finas/claras numericamente (A inspecionar_imagem sonda SRC --caixa … ou numpy, REFERÊNCIA §6.1). OCR lê errado e o detector mescla formas tocantes — sempre verifique visualmente.
A2 Planejar em NOTAS.md: inventário região por região em ordem Z. Decida por elemento:
vértice nativo (caixas, painéis, pílulas, círculos, losangos, cilindros) · texto nativo (todo texto, sempre) ·
borda anexada (conexões) · borda livre (eixos, divisores) · flecha_flex (larga/ondulada) · pontos em um
grupo (dispersão ≤ ~400) · polígono/camada_svg/malha_superficie (manchas, vigas, malhas, 3-D) ·
recorte_imagem (fotos, texturas, logos apenas — reconstrua seus rótulos nativamente por cima) ·
forma de biblioteca ou ícone emoji icone (ícones; diga qual). Registre toda decisão não nativa para o relatório.
A3 Tema: cores/fontes do usuário → papéis, mapeie cada cor fonte para o papel mais próximo; caso contrário, as cores dominantes da fonte desduplicadas para ≤ 6–8 papéis. Agrupe tamanhos OCR em ≤ 6–7 papéis de tamanho (mesmo nível visual ⇒ mesmo papel). Família mais próxima segura para web (Helvetica/Arial; Times New Roman para serifa estilo LaTeX); google: true para Roboto/Inter. Meça a espessura do traço em um zoom.
A4 Escreva construcao.py (Diagram.de_fonte está pré-configurado; API completa REFERÊNCIA §2):
pid, (cx, cy, cw, ch) = d.painel(52, 110, 620, 570, "**AUTO-CODIFICAÇÃO**", cabecalho_a=70, cabecalho_preenchimento="primario",
cabecalho_cor="fundo", titulo_tamanho="cabecalho")
for (x, y, w, h), t in zip(d.larguras_linha(182, 336, [97, 138, 97, 97], 62, espaco=13), ["[A]", "[MASK]", "[C]", "[D]"]):
d.rect(x, y, w, h, t, preenchimento="token", traco="texto", arredondado=4, tamanho="corpo", id="tok_" + t.strip("[]"))
d.rect(275, 455, 170, 62, "**Codificador**", preenchimento="primario", cor="fundo", arredondado=4, id="cod")
d.borda([], src="cod", tgt="tok_MASK", sw="grosso", saida=(.5, 0), entrada=(.5, 1))
d.borda([(108, 486)], tgt="cod", entrada=(0, .5)) # início livre, fim anexado
d.texto("Dimensão 2", 365, 144, tamanho="pequeno", rotacao=-90)
d.recorte_imagem((49, 199, 143, 309), borda="texto") # foto copiada da fonte
Conteúdo aleatório (dispersão) usa uma seed fixa e retângulos de exclusão ao redor dos rótulos. > ~600 vértices → mescle marcas decorativas em uma camada_svg. Fontes pequenas → --escala 2 para que texto ≥ 10 px.
A5 Iterar: A iterar imagens/fig_drawio_trabalho --nota "o que mudou" = construir → renderizar → comparar → lint → instantâneo + histórico. Veja iter_NN_lado.png (tudo: redação, tamanhos, pesos, quebra de linha), iter_NN_bordas.png (vermelho = apenas fonte, ciano = apenas pré-visualização; mova até que pares se fundam), iter_NN_calor.png + piores células (amplie essas em seguida). Trabalhe em passadas: (1) tela, painéis, grades → (2) formas ajustadas às caixas delimitadoras detectadas e regularizadas → (3) cada conector anexado com portas → (4) papéis de fonte, pesos, centralização, valign → (5) polimento de diferença de borda. Mude algumas coisas relacionadas por iteração; se a pontuação cair, reverta. Pare quando: cada elemento do inventário estiver presente (re-leia a fonte região por região), lint 0 erros e sem avisos de overflow/sobreposição/fora do tema, lado a lado mostra nenhum deslocamento ou texto errado, pontuação estabilizada (< 0.005 de ganho em 2 iterações). Se o CLI draw.io existir: uma final A renderizar_previsao SAIDA --engine drawio.
A6 Finalizar: imagens/fig.drawio é a última construção; exporte A renderizar_previsao imagens/fig.drawio -o "imagens/fig#drawio.png" --dpi 300. A pasta de imagem contém apenas fonte, .drawio, #drawio.png (+ o diretório de trabalho). Relatório: caminhos; nativo vs embutido (fotos, camadas SVG, placeholders de emoji); papéis usados/adicionados; desvios conhecidos; erros de digitação da fonte mantidos; como re-tematizar (editar tema.yaml → python construcao.py) e redimensionar.
Modo B — texto → três protótipos de figuras editáveis
Leia a passagem, inventarie suas afirmações, construa três famílias de figuras diferentes, verifique-as, apresente uma folha lado a lado; o usuário escolhe; você finaliza.
Local de saída: arquivo rascunhos/metodos.md → rascunhos/metodos_figuras/; texto colado → ./figuras/<slug>/; entrada longa/multisseção → uma subpasta por passagem p1_<slug>/ …; uma pasta nomeada pelo usuário → exatamente essa (--dir-saida). Informe o usuário o caminho. Um tema compartilhado por todas as passagens (--tema ou edite tema.yaml na raiz de saída).
B1 Andaime + analisar: A novas_figuras rascunhos/metodos.md [--theme t.yaml] [--dividir|--inteiro] [--passagens 1,3] ou A novas_figuras --texto "<passagem>" --nome pipeline_rag. Imprime por passagem: contagem de palavras, equações, pistas de estrutura, três famílias sugeridas. ≤ 350 palavras sem cabeçalhos = uma passagem. Nenhuma estrutura digna de figura (narrativa pura)? Diga isso em vez de forçar figuras.
B2 Inventário (NOTAS.md): entidades, passos ordenados (com seus verbos), relações (direção + verbo), quantidades com unidades, qualificadores, conclusões — cada um com uma citação curta. Confirme as famílias (REFERÊNCIA §7): padrão = três layouts da estrutura dominante (detalhado / visão geral compacta / lente alternativa); segunda estrutura forte → dois + um; equações → o trio de equações a menos que incidental. Os três devem diferir em topologia (pistas / pilha / radial / matriz / gráfico / placa), não em estilo. Para passagens matemáticas, científicas, algorítmicas, prefira demonstrações ativas (computação de matriz preenchida, espaços contínuos de coordenadas/métricas, placas Bayesianas, DAGs causais) sobre cartões de marcadores estáticos.
B3 Escreva construcao.py — três construtores, cada um recebe um Diagram novo do seu tamanho de tela:
from figlib import *
INFERIDAS = ["v1: classificações ordinais interpretam a redação qualitativa da passagem"] # relatado ao usuário
TERMOS_PERMITIDOS = ["camada"] # palavras estruturais, não afirmações
IGNORAR_LINT = [] # avisos aceitos de propósito (substring)
def v1(d): # pipeline de pista
pista(d, 20, 20, 1060, 175, "Indexação offline")
cadeia(d, ["Relatórios de inspeção\n(digitalizados)", "OCR\nem texto", "Fragmentação\nsemântica"], 80, 78, 140, 60,
formas=["documento", None, None], ids=["rep", "ocr", "frg"])
VARIANTS = [dict(chave="v1", nome="pipeline_pista", tamanho=(1100, 400), construir=v1,
sobre="uma linha para a folha", legenda="Legenda de rascunho nas palavras da passagem."), ...]
Regras: apenas papéis de tema, mesma categoria = mesmo estilo nos três; pares compartilham tamanhos e um espaço (ajudantes, não números ajustados manualmente); conectores anexados, realimentação tracejada/secundária; ≤ ~25 itens de texto, < ~150 vértices (senão divida em duas figuras); sem título na figura — escreva legenda; rótulos na redação da passagem (encurte por exclusão, não por sinônimo; mantenha qualificadores, dígitos, unidades, acrônimos como escrito). Dispositivos interpretativos (classificações, fronteiras, "melhor ajuste", ordenações de eixo, fatos matemáticos não no texto) apenas se listados em INFERIDAS.
B4 Protótipo, inspecionar, corrigir (≥ 2 rodadas): A prototipo <dir passagem> [--apenas v2] --nota "…" constrói todos os três, renderiza, faz lint, executa a verificação de fidelidade, escreve prototipos.png/.md, registra err/aviso/perda.
Veja cada PNG e a folha. Corrija cada aviso de lint ou adicione um IGNORAR_LINT deliberado; resolva cada palavra NÃO NA PASSAGEM (reformule com o termo da passagem · TERMOS_PERMITIDOS se estrutural · INFERIDAS se interpretação). Verifique o que o lint não pode: setas cruzando rótulos, cantos lotados, hierarquia fraca, espaço em branco desbalanceado, dois protótipos muito semelhantes, direção de cada seta contra o inventário. Feito com 0/0/0 (ou avisos aceitos) e limpo em tamanho real.
B5 Apresentar: mostre prototipos.png; por protótipo uma linha sobre sua ênfase, sua legenda de rascunho, seus itens INFERIDAS; aponte peculiaridades da fonte (erros de digitação, nomes inconsistentes) em vez de corrigir silenciosamente. Peça ao usuário para escolher (ou solicitar alterações / uma combinação → edite construcao.py, re-execute).
B6 Finalizar: A finalizar <dir passagem> --escolher v2 [--nome pipeline_rag] [--limpar] → <nome>.drawio
(+ .png) e ESCOLHIDO.md (legenda, inferidas). --limpar descarta os outros protótipos mas mantém _trabalho/.
Ofereça o modo C para polimento específico do veículo.
Modo C — aprimorar um .drawio para publicação
Uma passagem deliberada: entender o trabalho da figura → medir no tamanho de impressão → mudá-la para servir a esse trabalho → verificar → exportar. Nunca edite antes da entrevista.
C1 Iniciar: A iniciar_aprimoramento caminho/FIG.drawio [--imagem-fonte] [--texto] [--artefatos DIR] [--tema].
Ele descobre o contexto (diretório de trabalho do modo A: imagem fonte, construcao.py, tema, NOTAS; pasta de passagem do modo B: passagem.md, construcao.py VARIANTS, ESCOLHIDO.md, legenda, INFERIDAS), detecta edições manuais após a geração, recomenda uma rota, audita "antes", escreve <stem>_aprimorar_trabalho/ (contexto.md, auditoria_antes.md, resumo.yaml, perguntas.md, tema.yaml, construir_aprimorado.py se