OpenCADIrrigation Abrir o app

Arquitetura do código

bin/oci.dart                linha de comando: import, new, set, pack add, design, analyze, check, validate,
                            export, bom e schema de projetos .oci.json, um ou vários de uma vez
lib/
  core/                     Dart puro, sem Flutter (roda no worker, no isolate, nas ferramentas e na CLI)
    api.dart                o motor inteiro numa importação (docs/API.pt-BR.md)
    hydraulics/             fórmulas e solvers
      friction.dart           Hazen-Williams, Darcy-Weisbach (Swamee-Jain, Colebrook, Blasius, laminar,
                              transição), Scobey, Manning
      minor_losses.dart       K de acessórios, comprimento equivalente, curva h = K·Q^n + C
      emitter.dart            q = k·H^x, raio molhado, ajuste pela tabela do fabricante, janela de
                              pressão, CU de sobreposição
      lateral.dart            análise passo a passo de laterais, comprimento máximo, posições de alimentação
      network.dart            solver de rede (Global Gradient Algorithm) com emissores, bombas, PRV, PSV,
                              FCV, retenção
      sparse_solver.dart      LDLᵀ esparso com ordenação por grau mínimo
      pump.dart               curvas de bomba e do sistema, ponto de operação, potência, NPSH, CRF, energia
      uniformity.dart         CU, DU, EU, Us, variação de vazão
      water_hammer.dart       celeridade, Joukowsky, tempo crítico
      transient.dart          transientes pelo método das características (desligamento de bomba,
                              ventosas, reservatórios hidropneumáticos, cavidades de vapor)
      eps.dart                simulação de período estendido: reservatórios, horários, padrões,
                              controles, energia
    model/                  dados
      geometry.dart           Pt, Bounds, segmentos, polígonos, offsets, casco convexo, transformações afins
      entities.dart           entidades de desenho e hidráulicas (JSON, clone, transformar, grips, distância)
      catalog.dart            catálogo de componentes e base padrão, redução da classe dos tubos
      catalog_packs.dart      pacotes de fabricantes (em memória) e fusão
      currency.dart           moedas, padrão por idioma/região, câmbios de referência, conversão de preços
      project.dart            projeto: meta, parâmetros, catálogo, camadas, entidades, turnos
      terrain.dart, tin.dart  modelo do terreno: TIN de Delaunay restrito por linhas de quebra, IDW,
                              curvas de nível
      slope_map.dart          declividade e exposição numa grade
      spatial_index.dart      R-tree STR para culling, seleção e snap
      split.dart              divisão de entidades lineares
      blocks.dart, label_rules.dart, scenario.dart, proposal_settings.dart, site_climate.dart,
      pivot_machine.dart      blocos do usuário, rótulos condicionais, alternativas, configurações do
                              orçamento, clima do local, dados da máquina do pivô
      agronomy_plan.dart, agb_settings.dart, deliverables.dart, title_block.dart, pump_station.dart,
      reservoir.dart, valve_pilot.dart, dim_style.dart, layer_states.dart
                              configurações guardadas no projeto desde a 1.6.0: plano agronômico, energia
                              e água, documentos técnicos, carimbo, estações de bombeamento,
                              reservatórios, pilotos de válvula, estilo de cota, estados de camadas
      area_holes.dart, boundary.dart, lengthen.dart, edit_ops.dart, paste.dart, project_merge.dart,
      project_compare.dart    ilhas das áreas, contorno por clique interno, alongar, edições de geometria,
                              colagem, inserir projeto, comparação de duas cópias
      pipe_standards.dart, catalog_check.dart, regional.dart, read_report.dart, schema.dart
                              tubos por norma, plausibilidade do catálogo, padrões por região, leitura
                              tolerante com o seu relatório, JSON Schema do arquivo de projeto
    design/                 projetista
      network_builder.dart    entidades → grafo hidráulico (nós, trechos, zonas, agregação de emissores,
                              conexões)
      designer.dart           orquestração: zonas, linha principal, classes de pressão, telescopagem,
                              lavagem, golpe de aríete, máquinas, fiação, BOM
      lp.dart, lp_sizing.dart simplex denso de duas fases e formulação do dimensionamento
      block_generator.dart    blocos de laterais (retos e guiados) e grades de aspersores
      auto_layout.dart, zoning.dart, routing.dart, templates.dart, field_subdivision.dart,
      tree_rings.dart, pivot_fit.dart, vegetation.dart
                              projeto automático: aspersores, zonas, árvores de tubos e da linha
                              principal, modelos de gramado, blocos, anéis, ajuste de pivô, vegetação
                              em imagem aérea
      pivot.dart              hidráulica de pivô central e linear
      mechanised.dart, pivot_package.dart, corner_arm.dart, vri.dart, pivot_electrical.dart
                              pacote de aspersores e temporizador, braço de canto, taxa variável,
                              elétrica do pivô
      traveller.dart, surface_irrigation.dart, gated_pipe.dart
                              autopropelidos, sulcos, faixas e bacias, tubo janelado
      fittings.dart           seleção automática de conexões
      pump_selection.dart     escolha de bomba e motor
      agronomy.dart           ETc, balanço hídrico, programa do controlador
      climate.dart, crops.dart, soils.dart, effective_rain.dart, irrigation_requirement.dart,
      area_requirement.dart   ETo e culturas da FAO-56, solos do USDA, chuva efetiva, tabelas de necessidade
      solar_pumping.dart, wetted_bulb.dart, water_budget.dart
                              bombeamento fotovoltaico, bulbo molhado, orçamento hídrico do paisagismo
      management.dart         demandas das zonas, pivôs e estações, turnos automáticos
      valve_in_head.dart      estações de aspersores com válvula
      densogram.dart          água aplicada pelos aspersores como desenhados, uniformidade por área, vento
      electrical.dart         fiação das válvulas: rotas, estações, bitolas pela tensão no solenoide
      two_wire.dart, wire_routing.dart
                              dimensionamento de dois fios (decodificadores), rotas de fios pelas valas
      transient_analysis.dart, air_valves.dart
                              transientes da linha principal, ventosas (AWWA M51), simulação de 24 horas
      network_ops.dart, on_demand.dart, tariff.dart, energy_grouping.dart, criticality.dart,
      calibration.dart, fertigation.dart
                              operação: vazões de Clément, horários pela tarifa, agrupamento por
                              energia, N−1, calibração, fertirrigação
      proposal.dart           orçamento comercial, valas, retorno, cronograma de obra
      soil_water_balance.dart, irrigation_programme.dart, runoff_potential.dart, system_capacity.dart,
      catch_cans.dart, fertigation_stages.dart, agr_tables.dart
                              balanço hídrico diário, programa do controlador, escoamento, capacidade
                              contra o pico, uniformidade no campo, fertirrigação por estágio, as
                              tabelas de relatório deles
      pump_house.dart, solar_design.dart, water_quality.dart, multi_pivot.dart, field_machines.dart,
      agb_design.dart, agb_reports.dart
                              elétrica da casa de bombas, bombeamento solar, qualidade da água, vários
                              pivôs, faixas de carretel e sulcos, rodando como etapa do cálculo
      permit.dart, memorial.dart, om_plan.dart, budget.dart, life_cycle.dart, report_standards.dart,
      slope_report.dart       documentos técnicos, as normas dos relatórios, declividade por área
      life_scenarios.dart, reservoir.dart, analysis_control.dart, lateral_limit.dart, region_trace.dart
                              envelhecimento e entupimento, estudo do reservatório, progresso e
                              cancelamento das análises, comprimento máximo da lateral, contornos
                              traçados em imagem aérea
      design_check.dart       verificação de projeto
      advisor.dart            problemas explicados, configurações impossíveis, correções aplicáveis
      auto_fix.dart           correções, corrigir automaticamente, otimização
      results.dart, report_tables.dart  resultados serializáveis e tabelas dos relatórios
    io/                     leitura e escrita de formatos
      dxf.dart, dwg.dart, dgn.dart, kml.dart, shp.dart, geojson_reader.dart, gpx.dart, landxml.dart,
      las.dart, epanet_inp.dart, points_csv.dart, point_grid.dart, geoimage.dart, dem_tiff.dart
                              leitores (os de EPANET, GPX e LandXML também escrevem)
      cad_drawing.dart, cad_export.dart, dxf_r2000.dart, dwg_writer.dart
                              DXF e DWG R2000 com entidades nativas
      pdf_reader.dart, pdf_reader_fonts.dart, pdf_reader_images.dart, pdf_import.dart
                              plantas em PDF como base de fundo
      plot.dart, pdf.dart, pdf_sheet.dart, sheet_set.dart, sheet_canvas.dart, details.dart,
      plot_charts.dart, svg.dart
                              cena de plotagem, escritor PDF, conjuntos de folhas, detalhes
                              construtivos, gráficos, SVG
      fonts/                  leitor e subconjunto de TrueType, formatação OpenType (árabe, índicas),
                              bidi, dados Unicode, o registro de fontes do PDF
      shp_writer.dart, geo_export.dart, ifc.dart, xlsx.dart, catalog_io.dart, project_export.dart
                              shapefile, KML/GeoJSON, IFC 4, Excel, catálogos, despacho das exportações
      geo.dart, datum.dart    UTM, datums (SIRGAS 2000, SAD 69, Córrego Alegre), o datum do local, projeções
                              (Albers, cônica conforme de Lambert, policônica), reconhecimento de sistemas
      drawing_import.dart, import_async.dart, work_slicer.dart, safe_archive.dart, tiff_raster.dart,
      cad_xdata.dart, codepages.dart, typed_geo.dart, stakeout.dart, data_cache.dart, data_credits.dart
                              desenhos para dentro de um projeto (também para a linha de comando),
                              leitura em fatias, limites de zip, TIFF grandes, XDATA hidráulico, páginas
                              de código, coordenadas de campo digitadas, pontos para locação, downloads
                              guardados, créditos de terceiros
      doc_package.dart, doc_pdf.dart, doc_sections.dart, tech_doc.dart, tech_doc_sections.dart,
      title_block_sheet.dart, sheet_grid.dart, sheet_theme.dart, sheet_check.dart, icc_srgb.dart
                              pacotes de documentos, documentos técnicos, carimbo profissional,
                              quadrícula de coordenadas, folhas de declividade e de exposição, conferência
                              da folha, perfil sRGB do PDF/A
      dem_online.dart, climate_online.dart, share_link.dart
                              elevação e clima online, projetos num link
    ai/                     assistente de IA opcional, duas empresas atrás de uma só interface
      llm.dart                modelos com seus níveis e preços de tabela, tokens e custo, erros, o
                              cliente que cada empresa implementa
      llm_formats.dart        conversão de mensagens, ferramentas e resultados para o formato de cada empresa
      claude_api.dart         API Messages da Anthropic: streaming, raciocínio adaptativo, esforço,
                              cache, fallback de recusa, orçamento da tarefa, compactação, limpeza de
                              resultados antigos de ferramentas
      openai_api.dart         API Responses da OpenAI: streaming, ferramentas de função, esforço de
                              raciocínio, store: false, compactação
      agent_loop.dart         o laço do agente: ferramentas, aprovações por modo, limite de etapas,
                              teto de gasto
      project_context.dart    os dados do projeto enviados com uma mensagem
    units.dart              unidades (métrico/US), viscosidade da água, tabelas digitadas
    translate.dart          gancho de tradução para relatórios e plotagens rotularem a saída sem Flutter
    i18n/language_packs.dart registro dos pacotes de idioma (textos, tutorial, nomes do catálogo)
  app/                      Flutter
    state/                  ProjectController (projeto, seleção, câmera, undo, índice espacial, cálculo),
                            Workspace (abas e área de transferência), DesignRunner (worker/isolate/thread)
    canvas/                 CadCanvas, CadPainter, Camera, Snapper, mapa base
    tools/                  ferramentas de desenho, edição e hidráulica, pontos digitados, inserção de blocos
    keys/                   despachador de atalhos e listener nativo
    widgets/                menus, paleta, painéis, relatórios, gráficos, diálogos, layout compacto, e
                            ai/: o painel encaixado da IA e as suas vistas (conversa, dados enviados,
                            configurações)
    ai/                     o agente de uma aba: 75 ferramentas e 205 operações sobre o controller e o
                            motor (agent_tools*, agent_ops*, ops_*, op_parts/ por área), o mapa de
                            cobertura (ai_coverage.dart, coverage_parts/), o prompt de sistema, o
                            manual e os procedimentos,
                            visão (imagens, tiles, terreno), transportes (fetch, HttpClient),
                            aprovações, voltar e desfazer
    tutorial/               tutorial interativo
    io/                     arquivos, preferências, HTTP, armazenamento local, documento HTML, links externos,
                            GPS, fontes do PDF, exportação PNG de uma prancha
    actions.dart            ações de arquivo, área de transferência e exportação compartilhadas por menus, paleta e atalhos
    examples.dart           galeria de exemplos
    i18n.dart               tabela de textos pt/en/es (com as partes por área em i18n_parts/), lista de
                            idiomas e carregamento sob demanda dos pacotes
    i18n_assets.dart        lê assets/i18n/<código>.json para o idioma escolhido
    shortcuts.dart          aliases de comando (pt/en/es) e tabela de atalhos
    theme.dart              paletas escura e clara (CadPalette, 76 cores lidas por Cad.*), a regra de
                            cores CAD do canvas claro, troca de tema (CadThemeHost)
    version.dart            versão do app gerada (tool/gen_version.dart)
  worker/design_worker.dart entrada do Web Worker
assets/                     pacotes de idioma (i18n/) e os subconjuntos Noto dos PDFs (fonts/)
catalogs/                   pacotes de fabricantes (JSON) e índice
docs/                       estudo técnico, a API do motor (API.md, API.pt-BR.md) e o que a IA alcança
                            (AI_TOOLS.md, gerado)
examples/                   projetos de exemplo, uma pasta por idioma da interface (20)
tool/                       geradores: site (com o guia do usuário), catálogos, exemplos, marca, versão,
                            service worker; builds do worker e da web; fontes e fixtures de formatação
                            de texto (tool/fonts); o motor como pacote sem Flutter (engine_package.dart);
                            o checklist de lançamento (release.dart); a revisão das traduções
                            (i18n_review.dart); o hook de pre-commit e a lista de nomes proibidos
                            (hooks/); o teste de fumaça de ponta a ponta (e2e/)
test/                       testes do motor, do modelo, dos formatos e da interface; guards/ (arquivos
                            gerados, worker, pureza do motor, rede), seams/ (testes que atravessam
                            módulos), goldens/, web/
web/                        páginas, manifest, ícones, robots, sitemap, worker compilado, abertura sem rede
                            (sw.js, offline.js)

Decisões de projeto

  • Motor em Dart puro. lib/core não importa Flutter, por isso roda no Web Worker, no isolate, em dart run (ferramentas e linha de comando) e em testes rápidos. A interface só monta requisições e mostra resultados.
  • Um controller por projeto. ProjectController guarda o projeto, a seleção, a câmera, a pilha de desfazer (snapshots das entidades), o índice espacial e o estado do cálculo. Toda edição passa por mutate, que tira o snapshot, marca o projeto como sujo, invalida resultados e o índice, notifica a interface e agenda o autosave.
  • Cálculo fora da thread. O projeto vai serializado ao worker; o worker devolve resultados e as entidades redimensionadas; um contador de edições descarta resultados de um projeto que mudou enquanto calculava.
  • Índice espacial. R-tree empacotada por STR reconstruída a cada edição; a pintura consulta só a janela visível e seleção, snap e janela de seleção consultam o índice (consulta em microssegundos com dezenas de milhares de entidades).
  • Desenho na tela. A prancheta guarda o desenho entre um quadro e outro (SceneCache): ele só é gravado de novo quando muda algo que ele mostra (uma edição, a seleção, a vista, o mapa base, os resultados), de modo que mover o cursor repinta só o marcador de snap, a prévia da ferramenta e o item sob o cursor sobre uma imagem da cena. Uma cena demorada de desenhar acompanha o arrasto e o zoom como imagem deslocada e é redesenhada nítida quando a vista para. O painter agrupa as chamadas de desenho por estilo (algumas centenas de chamadas para dezenas de milhares de itens) e omite vértices a menos de um pixel; linhas de até um pixel físico são desenhadas como hairlines e as mais largas segmento a segmento (no navegador um traço largo é rasterizado na CPU), e uma vista lotada de linhas numa tela de alta densidade desenha as linhas de 1 px com um pixel físico. Só a barra de status escuta as coordenadas do cursor, então a janela não é reconstruída a cada movimento.
  • Formatos próprios em Dart puro. Leitores e escritores de DWG, PDF (com as suas fontes e a formatação do texto), XLSX, SHP, GeoTIFF, LAS, IFC etc. não dependem de bibliotecas nativas, o que mantém o app 100 % web.
  • Textos centralizados. Todas as strings da interface são chaves de i18n.dart, com os textos em português, inglês e espanhol compilados e os outros 17 idiomas nos pacotes de assets/i18n; o motor devolve códigos (velocity_exceeded:e12) que a interface traduz. Todo arquivo de teste falha quando a interface pede uma chave que a tabela não tem (test/flutter_test_config.dart), que de outro modo apareceria crua na tela.
  • A IA usa o programa, não uma cópia dele. As ferramentas do assistente são invólucros finos sobre o controller e o motor, toda alteração passa por mutate (um grupo de desfazer por resposta), e um mapa de cobertura leva cada função que o usuário alcança a uma ferramenta, uma operação, um comando ou uma configuração. As duas empresas ficam atrás de uma só interface (llm.dart), com a conversão de formatos num só lugar (llm_formats.dart) e um só laço do agente; o código das requisições recebe a troca HTTP como parâmetro, então os testes o executam contra imitações programadas.