[general]
name=OrIFSC
qgisMinimumVersion=3.40
qgisMaximumVersion=4.99
description=Generate cartographic base maps for the sport of orienteering
description[pt]=Gerador de bases cartográficas para mapas de orientação esportiva
version=0.1.18
author= arthur berbert
email=arthur@berbert.eng.br
about=OrIFSC automates the production of cartographic base maps for the sport of orienteering. It is a partnership between IFSC (Instituto Federal de Santa Catarina) and the Florianópolis Orienteering Club (FLORA). The plugin loads a georeferenced satellite image, generates smoothed contour lines from free elevation data (Copernicus 30 m DEM) and exports a ready-to-open project for OCAD and OpenOrienteering Mapper, already set up with georeferencing, magnetic declination, the satellite backdrop and the contour lines as map objects.
about[pt]=Plugin para geração automatizada de bases cartográficas para mapas de orientação esportiva, em parceria entre o IFSC e o Clube de Orientação de Florianópolis. Carrega imagem georreferenciada de satélite, gera curvas de nível suavizadas (MDT Copernicus 30 m) e exporta um projeto pronto para abrir no OCAD e no OpenOrienteering Mapper, já com georreferência, declinação magnética, o satélite como fundo e as curvas como objetos.
tracker=https://github.com/arthurberbert-ifsc/orifsc/issues
repository=https://github.com/arthurberbert-ifsc/orifsc
hasProcessingProvider=yes
tags=orienteering,orientacao,mapa,contour,curvas de nivel,orientismo,ocad
homepage=https://github.com/arthurberbert-ifsc/orifsc
category=Vector
icon=icons/icon.svg
experimental=False
deprecated=False
changelog=
    0.1.18
    - Segurança: zerados todos os apontamentos do scanner Bandit do repositório oficial, que bloqueava a publicação. O parse de XML remoto do SIG@SC passa a recusar DOCTYPE/ENTITY antes de interpretar (bloqueia XXE e "billion laughs"); os demais apontamentos (parse de arquivos embutidos confiáveis, blocos try/except best-effort, imports de XML) foram anotados como seguros, e os asserts de validação de layout do OCD viraram checagem explícita com raise (passam a rodar também em bytecode otimizado). Sem mudança de comportamento.
    0.1.16
    - Curvas de nível: removida a opção "Fonte do MDT" que baixava o MDT de SC pelo WCS do SIG@SC — o serviço não respondia de forma confiável. A geração passa a usar apenas o Copernicus 30 m. O menu Dados Públicos → SIG@SC (camadas WMS/WMTS) continua disponível.
    - Correção: o menu Dados Públicos → Santa Catarina quebrava ao abrir (TypeError no QMessageBox por receber a interface do QGIS em vez da janela principal).
    0.1.15
    - Simbologia oficial completa nos projetos exportados: o .omap e o .ocd podem sair com toda a paleta de símbolos da norma — ISOM 2017-2 (floresta; variantes 1:15.000 e 1:10.000, esta com símbolos ampliados em 150%% como manda a norma) ou ISSprOM 2019-2 (sprint) — pronta para desenhar. Os symbol sets oficiais do OpenOrienteering Mapper (GPLv3) vêm embutidos no plugin (recursos/simbologias, com proveniência documentada); a opção "Nenhuma (só o símbolo de curva)" mantém o comportamento anterior. As paletas cobrem qualquer escala derivada (1:7.500, 1:5.000, 1:3.000...): os símbolos têm dimensão fixa em mm de papel e a escala real do projeto vai na georreferência.
    - Paleta sprint atualizada para a ISSprOM 2019-2 Revisão 6 (IOF, jan/2024), à frente do próprio OOM: nova cor "Dark green" (CMYK 100-0-80-30, conforme o documento oficial de cores da IOF), vegetação intransponível renumerada 410→411, novo 410 "Vegetation: fight" e novo símbolo 533 "Area with obstacles" — tudo implementado a partir da especificação aberta da IOF (mudanças documentadas em recursos/simbologias/PROVENIENCIA.txt e reproduzíveis via tools/atualizar_issprom_2019_2.py).
    - Curvas mestras automáticas: com simbologia selecionada, curvas cuja elevação (campo ELEV) é múltiplo de 5x a equidistância (deduzida dos próprios dados) saem no símbolo 102 (curva mestra); as demais no 101. Sem o campo ELEV, tudo sai como 101 com aviso no log.
    - Novo parâmetro "Simbologia" no diálogo de exportação, com padrão sugerido pela escala do projeto (<= 1:5.000 sugere ISSprOM; demais, ISOM) e nova preferência global nas Configurações ("Simbologia da exportação").
    - No .ocd a paleta vem de um arquivo doador OCD v10 derivado do symbol set do OOM; se o doador ainda não estiver presente no pacote, o .ocd sai como antes (aviso no log) e o .omap sai completo mesmo assim.
    - Licença do plugin alinhada para GPLv3: os escritores .ocd/.omap sempre foram portes do OpenOrienteering Mapper (GPLv3) e os symbol sets embutidos são GPLv3 — o LICENSE (antes GPLv2) agora reflete isso.
    - Qualidade: 20 novos testes automatizados (injeção da simbologia no .omap, doador .ocd, curvas mestras), 43 no total.
    - Curvas de nível (Copernicus) muito mais rápidas em folhas pequenas: o MDT agora é recortado na janela da folha (mosaico virtual com outputBounds) antes do gdal:contour, e curvas totalmente fora da área de recorte são puladas antes da suavização (pré-filtro com geometria preparada e folga de 2x a tolerância). Acaba o longo "suavizando... (0 linhas gravadas)"; o resultado dentro da folha é idêntico.
    - Correção: o ISSprOM_2019_4000.omap embutido não abria no OpenOrienteering Mapper. A atualização para a ISSprOM 2019-2 havia inserido dois símbolos novos no meio da lista sem renumerar os `id` dos demais — como o OOM referencia símbolos combinados e objetos de exemplo por esse número, a lista ficou desalinhada e o arquivo era rejeitado. Corrigido: os `id` são renumerados pela posição final e todas as referências cruzadas são atualizadas junto (48 referências verificadas uma a uma).
    - Correção: texto de ajuda de "Recortar curvas por" (Gerar Curvas de Nível) dizia "deixe em branco para gerar sem recorte" — o comportamento real sempre recortou pela própria área a mapear quando o campo fica vazio. Texto corrigido para refletir o comportamento.
    0.1.11
    - Correção importante nas curvas de nível (fonte Copernicus): a simplificação era aplicada com as curvas ainda em graus (EPSG:4326), o que equivalia a uma tolerância de ~22 km e deformava as curvas em "triângulos/retângulos". Agora as curvas são reprojetadas para o CRS UTM da folha ANTES da suavização, e a tolerância de 0,2 passa a valer 0,2 metro. A camada "Curvas de Nível" também passa a ser criada já em UTM.
    - QGIS 4 (Qt6/PyQt6): todos os enums restantes migraram para a forma escopada (QMessageBox.Icon/ButtonRole/StandardButton, Qgis.MessageLevel, QgsBlockingNetworkRequest.ErrorCode, Qgis.ProcessingSourceType, Qgis.ProcessingNumberParameterType, Qgis.WkbType, QgsFeatureSink.Flag, Qgis.ProcessingAlgorithmFlag). Um único código atende QGIS 3.40+ e QGIS 4.
    - Requisito mínimo atualizado para QGIS 3.40 LTR (versões anteriores não eram de fato suportadas: o código já usava APIs do QGIS 3.38+).
    - Removida a opção FABDEM ("em breve") do menu Relevo e das Configurações.
    - Curvas de nível muito mais rápidas: suavização Chaikin vetorizada com NumPy (resultado idêntico bit a bit, ~10-50x mais rápido), recorte com geometria preparada (índice GEOS) e pré-simplificação de 0,05 mm na escala do papel antes da suavização (invisível no mapa; essencial com o MDT de alta resolução do SIG@SC). O log agora mostra um contador dinâmico ("suavizando: N/total curvas") durante a etapa pesada.
    - Correção de travamento (access violation) ao concluir a geração de curvas: o sink de saída agora é liberado (flush + del) antes de o QGIS carregar a camada no projeto.
    - Exportação do satélite muito mais leve (PCs lentos): o mosaico agora é escrito por faixas direto no disco (streaming), eliminando a imagem gigante na RAM e o PNG intermediário — pico de memória cai de ~1,5 GB para menos de ~150 MB. Reprojeção (GDAL Warp) multithread. O GeoTIFF final continua idêntico: RGB, LZW, sem tiling — requisito do OCAD 10.
    - Cache persistente (perfil do QGIS, limite de 1 GB com poda automática): tiles do MDT Copernicus e tiles do satélite ficam guardadas entre sessões — re-exportar a mesma área fica muito mais rápido. Tiles do Copernicus agora combinadas por mosaico virtual (VRT), sem reescrever o raster inteiro.
    - Tolerância de simplificação das curvas agora acompanha a escala do projeto, derivada do menor objeto visível no papel (0,15 mm): 0,075 mm de papel por passada (duas passadas; desvio total < 0,15 mm, invisível), entre 0,1 m e 1,5 m. Mapas 1:2.000 preservam mais detalhe; 1:15.000 ficam bem mais leves.
    - Arquivos temporários com nome único por execução (sem colisão entre execuções simultâneas).
    - SIG@SC: a consulta ao serviço (GetCapabilities) agora roda em segundo plano (QgsTask) — o QGIS não congela mais no clique do menu enquanto o servidor, que é lento, responde; a camada aparece quando o serviço retornar.
    - Correção de vazamento leve: as ações do menu agora são destruídas junto com o menu ao recarregar/desinstalar o plugin.
    - Qualidade: suíte de testes automatizados (pytest, 23 testes) cobrindo o escritor binário OCAD, o XML do OOM, os cálculos UTM/convergência e a suavização Chaikin (equivalência bit a bit com a implementação original); roda em CI (GitHub Actions) a cada alteração.
    0.1.9
    - SIG@SC (Santa Catarina): as camadas passam a ser adicionadas pelo gerenciador WMS/WMTS nativo do QGIS (assíncrono — não trava mais o QGIS); ortofoto via WMTS e o CRS acompanha o projeto (reprojeção on-the-fly). Código formatado (PEP8/flake8).
    - Curvas de nível: nova opção "Fonte do MDT" — além do Copernicus 30 m (global, padrão), dá para usar o MDT de SC via WCS do SIG@SC (alta resolução), gerando curvas bem melhores em Santa Catarina.
    - Qualidade/segurança (revisão automática do repositório QGIS): auditado o uso de urlopen (apenas http/https são aceitos, marcado como seguro); removido o campo obsoleto supportsQt6 do metadata; removidos imports e uma variável sem uso; permissões dos arquivos do pacote normalizadas. Sem mudança de funcionalidade.
    0.1.8
    - Assistente: o menu indica o progresso do fluxo (✓ etapa concluída, ▶ próxima sugerida) sem travar nada; avisos amigáveis quando falta um pré-requisito; o diálogo de exportação já vem pré-preenchido (folha, curvas e pasta de saída) e mostra a escala do projeto.
    - Curvas de nível: geração mais robusta — a suavização passou a usar um algoritmo próprio (Chaikin) que não depende de algoritmos do QGIS que podiam travar/fechar o programa; saída como camada limpa "Curvas de Nível"; recorte por folha/limite aplicado de forma controlada.
    - Satélite de fundo: download paralelo confiável (não trava nem prende o QGIS ao fechar), sempre no melhor zoom, com progresso visível (contador de tiles e porcentagem da reprojeção), cancelável e com re-tentativas para a imagem sair completa.
    - Exportação OCAD 10 / OpenOrienteering Mapper: projeto pronto com georreferência (UTM + escala + grade), declinação magnética (WMM/NOAA) com grivação correta, satélite como mapa de fundo e curvas como objetos de linha.
    - Importar KML/GPX e camadas de base (Satélite Google, OpenStreetMap, WMS/WMTS, SIG@SC).
    - Compatível com QGIS 3.16+ e QGIS 4 (Qt5/Qt6).
    0.1.7.3
    - Qualidade: código de reload de módulos movido para trás de variável de ambiente ORIFSC_DEV — não roda mais em produção, evitando comportamento imprevisível com referências a classes recarregadas.
    - Qualidade: função _ocultar_da_toolbox centralizada em algorithms/utils.py, eliminando duplicação entre gerar_curvas.py e exportar_ocad.py.
    - Correção: cache de tiles Copernicus agora valida o tamanho mínimo do arquivo (1 KB); arquivos corrompidos ou incompletos de downloads anteriores são detectados e re-baixados automaticamente.
    - Correção: validação de intervalo das coordenadas no diálogo "Definir Local" — latitude fora de [-90, 90] ou longitude fora de [-180, 180] exibe mensagem clara em vez de gerar um CRS inválido silenciosamente.
    0.1.7
    - Correção: o satélite exportado não é mais carregado automaticamente no QGIS (evita o QGIS travar/ficar preso na memória ao fechar com imagens grandes); o .tif fica salvo na pasta de saída para abrir manualmente e é usado pelo OCAD. Os datasets GDAL da geração são fechados explicitamente (sem handle preso no arquivo).
    - Correção: download das tiles do satélite passa a ser assíncrono numa thread só (via QgsNetworkAccessManager), em vez de um pool de threads. As threads do pool criavam gerenciadores de rede do QGIS que ficavam órfãos e travavam o QGIS ao fechar. O GeoTIFF do satélite segue em LZW (necessário: sem compressão o arquivo passa de ~290 MB e o OCAD 10 falha ao ler).
    - Correção: o GeoTIFF do satélite voltou a sair com 3 bandas RGB (sem canal alpha). O alpha gerava um TIFF de 4 bandas que o OCAD lia como falsa-cor/infravermelho (OCAD 2020) ou nem abria (OCAD 10); os cantos vazios da rotação agora ficam brancos.
    - Exportação OCAD: o .ocd passa a ser gravado no formato OCD v10 (antes v9), abrindo direto no OCAD 10+ sem o pedido de conversão. A pasta de saída agora é obrigatória e não pode ser um diretório temporário (o satélite .tif precisa ficar junto dos projetos).
    - Exportação: novo seletor "Formato(s) a gerar" (OCAD .ocd / OpenOrienteering Mapper .omap / ambos), com "OCAD (.ocd)" como padrão — antes os dois arquivos eram sempre gerados. O campo de declinação manual agora deixa claro que só é usado se o automático estiver desmarcado ou falhar.
    - Compatibilidade com QGIS 4 (Qt6/PyQt6): enums de classes Qt agora usam a forma escopada (QImage.Format.Format_RGB888, Qt.PenStyle.DashLine, Qt.BrushStyle.NoBrush, QDialogButtonBox.StandardButton.*, QXmlStreamReader.TokenType.*) e os diálogos usam exec() em vez de exec_(). As mudanças continuam funcionando no QGIS 3.16+ (PyQt5). metadata: supportsQt6=True e qgisMaximumVersion=4.99.
