diff --git a/AgroBase/OperationControl/Mapas/Controller/MapaOperacaoController.Edicao.cs b/AgroBase/OperationControl/Mapas/Controller/MapaOperacaoController.Edicao.cs index ed500f3d1..b051cd1de 100644 --- a/AgroBase/OperationControl/Mapas/Controller/MapaOperacaoController.Edicao.cs +++ b/AgroBase/OperationControl/Mapas/Controller/MapaOperacaoController.Edicao.cs @@ -1001,6 +1001,228 @@ namespace OperationControl.Mapas } + /// + /// Sugere um nome previsível para a versão persistida do + /// DocumentoTrabalho sem alterar o documento nem a sessão. + /// + public string ObterNomeArquivoSugeridoMapaEditado() + { + MapaDocumento? documento = + _estadoEdicao + .DocumentoTrabalho; + + + string nomeBase = + string.Empty; + + + if ( + documento != null && + !string.IsNullOrWhiteSpace( + documento.CaminhoOrigem + ) + ) + { + nomeBase = + System.IO.Path + .GetFileNameWithoutExtension( + documento.CaminhoOrigem + ); + } + + + if ( + string.IsNullOrWhiteSpace( + nomeBase + ) + ) + { + nomeBase = + documento?.Nome; + } + + + if ( + string.IsNullOrWhiteSpace( + nomeBase + ) + ) + { + nomeBase = + "mapa"; + } + + + char[] invalidos = + System.IO.Path + .GetInvalidFileNameChars(); + + + nomeBase = + new string( + nomeBase + .Select( + c => + invalidos.Contains(c) + ? '_' + : c + ) + .ToArray() + ) + .Trim(); + + + if ( + !nomeBase.EndsWith( + "_operacional", + StringComparison.OrdinalIgnoreCase + ) + ) + { + nomeBase += + "_operacional"; + } + + + return + nomeBase + + ".geojson"; + } + + + /// + /// Retorna a pasta do arquivo que originou o mapa somente + /// como conveniência para o SaveFileDialog. + /// + public string? ObterDiretorioOrigemMapaEdicao() + { + string? caminhoOrigem = + _estadoEdicao + .DocumentoTrabalho? + .CaminhoOrigem; + + + if ( + string.IsNullOrWhiteSpace( + caminhoOrigem + ) + ) + { + return null; + } + + + string? diretorio = + System.IO.Path + .GetDirectoryName( + caminhoOrigem + ); + + + return + !string.IsNullOrWhiteSpace( + diretorio + ) && + System.IO.Directory.Exists( + diretorio + ) + ? diretorio + : null; + } + + + /// + /// Salva uma fotografia independente do DocumentoTrabalho atual. + /// + /// Não executa Apply, não fecha a sessão, não altera DocumentoFonte, + /// não altera o documento oficial, não limpa Undo/Redo e não toca + /// na seleção operacional. + /// + public bool SalvarMapaEditadoGeoJson( + string caminhoArquivo) + { + if ( + !_estadoEdicao.EmEdicao || + _estadoEdicao.DocumentoTrabalho == null + ) + { + Log( + "[MAPA][EDICAO][SALVAR] " + + "Não existe sessão de edição ativa." + ); + + + return false; + } + + + if ( + string.IsNullOrWhiteSpace( + caminhoArquivo + ) + ) + { + throw new ArgumentException( + "O caminho para salvar o mapa não foi informado.", + nameof(caminhoArquivo) + ); + } + + + /* + * ObterResultado devolve uma cópia profunda. + * O exportador jamais recebe DocumentoTrabalho diretamente. + */ + MapaDocumento documentoSalvar = + _edicaoService + .ObterResultado( + _estadoEdicao + ); + + + documentoSalvar.Modificado = + true; + + + /* + * Reaproveita a mesma fronteira que protege o Apply. + * Se a validação falhar, nenhum arquivo é gravado. + */ + if ( + !ValidarDocumentoAntesDoApply( + documentoSalvar + ) + ) + { + Log( + "[MAPA][EDICAO][SALVAR] " + + "Cancelado por falha de validação." + ); + + + return false; + } + + + _exportService + .SalvarGeoJson( + documentoSalvar, + caminhoArquivo + ); + + + Log( + "[MAPA][EDICAO][SALVAR] " + + $"OK | " + + $"Ruas={documentoSalvar.QuantidadeRuas} | " + + $"Arquivo={System.IO.Path.GetFileName(caminhoArquivo)}" + ); + + + return true; + } + + public MapaDocumento ObterResultadoEdicao() { return _edicaoService diff --git a/AgroBase/OperationControl/Mapas/Editing/Views/MapaEditorOverlay.xaml b/AgroBase/OperationControl/Mapas/Editing/Views/MapaEditorOverlay.xaml index c16c3e5c5..77b9a41e0 100644 --- a/AgroBase/OperationControl/Mapas/Editing/Views/MapaEditorOverlay.xaml +++ b/AgroBase/OperationControl/Mapas/Editing/Views/MapaEditorOverlay.xaml @@ -723,6 +723,16 @@ ToolTip="Restaura no editor o mapa que entrou originalmente no sistema. Ctrl+Z desfaz." Click="btnRestaurarMapaFonte_Click"/> +