This commit is contained in:
Diego Freitas 2026-09-17 13:59:02 -03:00
commit 00c9af952a
3 changed files with 237 additions and 4 deletions

View File

@ -22,6 +22,7 @@ namespace OperationControl.ViewModels
public event PropertyChangedEventHandler? PropertyChanged;
public event Action<string, AgroBase.Models.Enums.TipoMapaOperacao>? CarregarMapaSolicitado;
public event Action? EditarMapaSolicitado;
// Método, latitude, longitude, altitude, offset frontal cm, offset lateral cm
public event Action<MetodoFixacaoBase, double?, double?, double?>? 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;
/// <summary>
/// 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.
/// </summary>
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;

View File

@ -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(

View File

@ -510,6 +510,14 @@
Command="{Binding CarregarMapaCommand}"
IsEnabled="{Binding PodeCarregarMapa}"/>
<Button
Content="✎ Editar mapa"
Style="{StaticResource PanelButtonStyle}"
Command="{Binding EditarMapaCommand}"
IsEnabled="{Binding PodeEditarMapa}"
Margin="0,8,0,0"
ToolTip="Abre o editor operacional neste mapa, sem exigir rover conectado."/>
</StackPanel>
</Border>