DNATech :: De coordenadas hardcoded a Layout Designer em TLPP para Protheus

# 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

Postagens mais visitadas