From 9ae270aee2401ec50c8ebbf0a5800c53596c3f55 Mon Sep 17 00:00:00 2001 From: Diego Freitas Date: Thu, 17 Sep 2026 08:17:59 -0300 Subject: [PATCH] =?UTF-8?q?adicionado=20editor=20na=20tela=20de=20parametr?= =?UTF-8?q?iza=C3=A7=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PreparacaoMapaBottomViewModel.cs | 70 ++++++++ .../ViewModels/Windows/DockWindowViewModel.cs | 163 +++++++++++++++++- .../PreparacaoMapaBottomView.xaml | 8 + 3 files changed, 237 insertions(+), 4 deletions(-) diff --git a/AgroBase/OperationControl/ViewModels/Views/PreparacaoMapa/PreparacaoMapaBottomViewModel.cs b/AgroBase/OperationControl/ViewModels/Views/PreparacaoMapa/PreparacaoMapaBottomViewModel.cs index 87e37da25..61acc89e5 100644 --- a/AgroBase/OperationControl/ViewModels/Views/PreparacaoMapa/PreparacaoMapaBottomViewModel.cs +++ b/AgroBase/OperationControl/ViewModels/Views/PreparacaoMapa/PreparacaoMapaBottomViewModel.cs @@ -22,6 +22,7 @@ namespace OperationControl.ViewModels public event PropertyChangedEventHandler? PropertyChanged; public event Action? CarregarMapaSolicitado; + public event Action? EditarMapaSolicitado; // Método, latitude, longitude, altitude, offset frontal cm, offset lateral cm public event Action? FixarBaseSolicitado; @@ -62,6 +63,7 @@ namespace OperationControl.ViewModels }; public ICommand CarregarMapaCommand { get; } + public ICommand EditarMapaCommand { get; } public ICommand FixarBaseCommand { get; } public ICommand AplicarOffsetCommand { get; } public ICommand UsarGnssMovelCommand { get; } @@ -71,6 +73,7 @@ namespace OperationControl.ViewModels public PreparacaoMapaBottomViewModel() { CarregarMapaCommand = new RelayCommand(_ => ExecutarCarregarMapa(), _ => PodeCarregarMapa); + EditarMapaCommand = new RelayCommand(_ => EditarMapaSolicitado?.Invoke(), _ => PodeEditarMapa); FixarBaseCommand = new RelayCommand(_ => ExecutarFixarBase(), _ => PodeFixarBase); AplicarOffsetCommand = new RelayCommand(_ => ExecutarAplicarOffset(), _ => PodeEditarOffsetBase); UsarGnssMovelCommand = new RelayCommand(_ => ExecutarUsarGnssMovel(), _ => PodeUsarGnssMovel); @@ -120,13 +123,34 @@ namespace OperationControl.ViewModels private bool _mapaCarregado; + private bool _edicaoMapaAtiva; + + /// + /// Enquanto o editor estiver aberto nesta etapa: + /// - não trocamos o arquivo de mapa; + /// - não navegamos para outra etapa; + /// - não abrimos uma segunda sessão de edição. + /// + /// Os controles de GNSS permanecem disponíveis porque + /// o levantamento de borda pode depender do modo móvel. + /// + public bool EdicaoMapaAtiva => + _edicaoMapaAtiva; + + public bool PodeEditarMapa => + _mapaCarregado && + !_edicaoMapaAtiva && + !FixacaoEmAndamento && + !AlteracaoPapelGnssEmAndamento; public bool PodeContinuar => _mapaCarregado && + !_edicaoMapaAtiva && !FixacaoEmAndamento && !AlteracaoPapelGnssEmAndamento; public bool PodeVoltar => + !_edicaoMapaAtiva && !FixacaoEmAndamento && !AlteracaoPapelGnssEmAndamento; @@ -145,11 +169,51 @@ namespace OperationControl.ViewModels carregado; + OnPropertyChanged( + nameof(PodeEditarMapa) + ); + OnPropertyChanged( nameof(PodeContinuar) ); } + public void DefinirEdicaoMapaAtiva(bool ativa) + { + if ( + _edicaoMapaAtiva == + ativa + ) + { + return; + } + + + _edicaoMapaAtiva = + ativa; + + + OnPropertyChanged( + nameof(EdicaoMapaAtiva) + ); + + OnPropertyChanged( + nameof(PodeEditarMapa) + ); + + OnPropertyChanged( + nameof(PodeCarregarMapa) + ); + + OnPropertyChanged( + nameof(PodeContinuar) + ); + + OnPropertyChanged( + nameof(PodeVoltar) + ); + } + private GnssPapelEstacao _papelGnssAtual = GnssPapelEstacao.Indefinido; public GnssPapelEstacao PapelGnssAtual { @@ -248,6 +312,10 @@ namespace OperationControl.ViewModels nameof(PodeCarregarMapa) ); + OnPropertyChanged( + nameof(PodeEditarMapa) + ); + OnPropertyChanged( nameof(PodeEditarMetodoFixacao) ); @@ -382,6 +450,7 @@ namespace OperationControl.ViewModels OnPropertyChanged(nameof(FixacaoEmAndamento)); OnPropertyChanged(nameof(PodeCarregarMapa)); + OnPropertyChanged(nameof(PodeEditarMapa)); OnPropertyChanged(nameof(PodeEditarMetodoFixacao)); OnPropertyChanged(nameof(PodeEditarCoordenadasManuais)); OnPropertyChanged(nameof(PodeEditarOffsetBase)); @@ -410,6 +479,7 @@ namespace OperationControl.ViewModels } public bool PodeCarregarMapa => + !_edicaoMapaAtiva && !FixacaoEmAndamento && !AlteracaoPapelGnssEmAndamento; diff --git a/AgroBase/OperationControl/ViewModels/Windows/DockWindowViewModel.cs b/AgroBase/OperationControl/ViewModels/Windows/DockWindowViewModel.cs index af22046da..8cf2cd2b5 100644 --- a/AgroBase/OperationControl/ViewModels/Windows/DockWindowViewModel.cs +++ b/AgroBase/OperationControl/ViewModels/Windows/DockWindowViewModel.cs @@ -58,6 +58,7 @@ namespace OperationControl.ViewModels _viewPreparacaoMapaBottom = new PreparacaoMapaBottomView(); _viewPreparacaoMapaBottom._vm.CarregarMapaSolicitado += OnCarregarMapaSolicitado; + _viewPreparacaoMapaBottom._vm.EditarMapaSolicitado += OnEditarMapaPreparacaoSolicitado; _viewPreparacaoMapaBottom._vm.FixarBaseSolicitado += OnFixarBaseSolicitado; _viewPreparacaoMapaBottom._vm.AplicarOffsetSolicitado += OnAplicarOffsetSolicitado; _viewPreparacaoMapaBottom._vm.UsarGnssMovelSolicitado += OnUsarGnssMovelSolicitado; @@ -85,6 +86,17 @@ namespace OperationControl.ViewModels .SalvarMapaEditadoSolicitado += OnSalvarMapaEditadoSolicitado; + /* + * O mesmo cockpit também existe no mapa da preparação. + * Assim o botão "Salvar versão editada" funciona antes + * mesmo de existir Rover selecionado/conectado. + */ + _viewPreparacaoMapa + .MapaPreparacao + .EditorOverlay + .SalvarMapaEditadoSolicitado += + OnSalvarMapaEditadoSolicitado; + _viewOperacaoLeft = new OperacaoLeftView(); _viewOperacaoRight = new OperacaoRightView(); @@ -224,7 +236,12 @@ namespace OperationControl.ViewModels } } - public bool CanGoBack => CurrentStep != DockStep.ConfigConexao; + public bool CanGoBack => + CurrentStep != DockStep.ConfigConexao && + !( + CurrentStep == DockStep.PreparacaoMapa && + _mapas.EdicaoAtiva + ); public bool CanGoNext { @@ -232,9 +249,15 @@ namespace OperationControl.ViewModels { return CurrentStep switch { - DockStep.ConfigConexao => PodeAvancarConfigConexao(), - DockStep.PreparacaoMapa => MapaCarregado, - _ => false + DockStep.ConfigConexao => + PodeAvancarConfigConexao(), + + DockStep.PreparacaoMapa => + MapaCarregado && + !_mapas.EdicaoAtiva, + + _ => + false }; } } @@ -465,6 +488,12 @@ namespace OperationControl.ViewModels MapaCarregado ); + _viewPreparacaoMapaBottom? + ._vm? + .DefinirEdicaoMapaAtiva( + _mapas.EdicaoAtiva + ); + SincronizarEstadoGnssPreparacao(); break; @@ -1330,6 +1359,23 @@ namespace OperationControl.ViewModels private void OnEstadoMapaAlterado() { + _viewPreparacaoMapaBottom? + ._vm? + .DefinirEdicaoMapaAtiva( + _mapas.EdicaoAtiva + ); + + OnPropertyChanged( + nameof(CanGoBack) + ); + + OnPropertyChanged( + nameof(CanGoNext) + ); + + CommandManager + .InvalidateRequerySuggested(); + AtualizarEstadoMapaParametrizacao(); } @@ -1496,6 +1542,102 @@ namespace OperationControl.ViewModels ); } + private void OnEditarMapaPreparacaoSolicitado() + { + try + { + if ( + CurrentStep != + DockStep.PreparacaoMapa + ) + { + return; + } + + + if (!_mapas.PossuiMapa) + { + MessageBox.Show( + "Carregue um mapa antes de abrir o editor.", + "Editar mapa", + MessageBoxButton.OK, + MessageBoxImage.Information + ); + + return; + } + + + if (_mapas.EdicaoAtiva) + { + /* + * Proteção contra uma segunda entrada enquanto + * a sessão global de edição já está aberta. + */ + _viewPreparacaoMapaBottom? + ._vm? + .DefinirEdicaoMapaAtiva( + true + ); + + return; + } + + + MapViewControl? mapa = + _viewPreparacaoMapa? + .MapaPreparacao; + + + if (mapa == null) + return; + + + /* + * Intencionalmente NÃO existe qualquer requisito + * de Rover aqui. + * + * A edição atua somente no Workspace/Documento + * e no MapViewControl da tela de preparação. + */ + _mapas.IniciarEdicao( + mapa + ); + + + _viewPreparacaoMapaBottom? + ._vm? + .DefinirEdicaoMapaAtiva( + true + ); + + + Models.Variaveis.MostrarLog( + "[MAPA][EDICAO][PREPARACAO] " + + "Editor aberto sem dependência de Rover." + ); + } + catch (Exception ex) + { + Models.Variaveis.MostrarLog( + "[MAPA][EDICAO][PREPARACAO][ERRO] " + + ex + ); + + + MessageBox.Show( + "Não foi possível iniciar a edição do mapa." + + Environment.NewLine + + Environment.NewLine + + ex.Message, + "Editar mapa", + MessageBoxButton.OK, + MessageBoxImage.Error + ); + } + } + + private void OnEditarMapaSolicitado() { try @@ -1636,6 +1778,19 @@ namespace OperationControl.ViewModels { try { + if (_mapas.EdicaoAtiva) + { + MessageBox.Show( + "Finalize ou cancele a edição atual antes de trocar o mapa.", + "Editor de mapa ativo", + MessageBoxButton.OK, + MessageBoxImage.Information + ); + + return; + } + + _mapas.CarregarMapaArquivo(caminhoArquivo, tipo); _mapas.PrepararMapa( diff --git a/AgroBase/OperationControl/Views/PreparacaoMapa/PreparacaoMapaBottomView.xaml b/AgroBase/OperationControl/Views/PreparacaoMapa/PreparacaoMapaBottomView.xaml index 5c1cba9d7..93eb51299 100644 --- a/AgroBase/OperationControl/Views/PreparacaoMapa/PreparacaoMapaBottomView.xaml +++ b/AgroBase/OperationControl/Views/PreparacaoMapa/PreparacaoMapaBottomView.xaml @@ -510,6 +510,14 @@ Command="{Binding CarregarMapaCommand}" IsEnabled="{Binding PodeCarregarMapa}"/> +