
# De coordenadas hardcoded a Layout Designer em TLPP para Protheus
Quem trabalha com impressão de relatórios, rótulos e PDFs no Protheus sabe o quanto posicionar informações pode virar tentativa e erro.
No meu caso, o problema nasceu em um programa de impressão de rótulos: imagem de fundo, código de barras, lote, fabricação, validade, peso líquido, volume e espécie. Tudo funcionando, mas com dezenas de coordenadas fixas (hardcoded) espalhadas pelo código.
A cada ajuste visual era o mesmo ciclo:
> altera coordenada → compila → gera PDF → abre o arquivo → mede visualmente → ajusta novamente.
Percebi que estava resolvendo o mesmo problema repetidamente.
Foi daí que nasceu o projeto **dnatech-tlpp-layoutdesigner**.
A proposta foi transformar o PDF gerado pelo **FWMSPrinter** em uma superfície de desenho e medição, adicionando recursos como:
* grade em milímetros;
* réguas horizontal e vertical;
* marcação de áreas;
* conversão entre milímetros e a unidade interna utilizada pelo FWMSPrinter;
* pontos, caixas, baselines e guias de apoio;
* exportação das marcações para JSON;
* rotinas de teste e calibração.
Com isso, ficou muito mais simples utilizar o **Inkscape** para medir exatamente onde cada informação deve ser impressa.
[Inkscape](https://inkscape.org/?utm_source=chatgpt.com)
Agora o fluxo é muito mais natural:
1. Gero o PDF em **Modo Designer**.
2. Abro o PDF no Inkscape.
3. Meço as posições e dimensões em **milímetros**.
4. Ajusto apenas os valores de impressão.
5. Gero um novo PDF já praticamente na posição correta.
Na prática, deixei de trabalhar com coordenadas "no chute" e passei a trabalhar com medidas reais.
O código para habilitar esse modo ficou bastante simples:
```tlpp
if (lLayoutDesigner)
oDesign:=TLayoutDesigner():New(oPrint)
oDesign:SetPageMm(jCoords["nLarRot"],jCoords["nAltRot"],010,005)
oDesign:SetColors(RGB(0,80,255),RGB(255,0,0),RGB(255,0,0),RGB(0,80,255))
oDesign:SetGridHighlight(.F.,RGB(255,255,255))
oDesign:SetGridSubdivisions(5,RGB(190,215,255))
oDesign:SetGridTextMode("NONE")
oDesign:SetRulerTextStep(2)
oDesign:ShowMarkInfo(.F.)
oDesign:GridMm(10,jCoords["nAltImg"],jCoords["nLarImg"])
oDesign:SetGridTextMode("STEPS")
oDesign:RulerMm(10,jCoords["nAltImg"],jCoords["nLarImg"])
oDesign:Mark("AREA_ROTULO",0,0,jCoords["nLarImg"],jCoords["nAltImg"])
oDesign:Finalize()
FreeObj(@oDesign)
endif
```
O mais interessante é que o projeto nasceu para resolver um único relatório de impressão de rótulos, mas acabou evoluindo para uma ferramenta genérica que pode ser utilizada em qualquer relatório baseado em **FWMSPrinter**, servindo como uma camada de diagnóstico, calibração e desenho de layouts.
O próximo passo do projeto é desacoplar completamente as coordenadas do código-fonte, permitindo que cada layout seja descrito em JSON e carregado dinamicamente conforme o produto ou template utilizado.
No fim, foi uma boa lembrança de que nem todo código legado precisa apenas de manutenção pontual. Às vezes, uma dor recorrente merece virar ferramenta.
**Projeto no GitHub:**
[DNATech TLPP Layout Designer](https://github.com/DNATechByNaldoDJ/dnatech-tlpp-layoutdesigner?utm_source=chatgpt.com)
---
#DNATech #Protheus #TLPP #AdvPL #TOTVS #FWMSPrinter #PDF #Inkscape #OpenSource #SoftwareEngineering #LegacyCode #Refactoring
---
Comentários
Postar um comentário