524 lines
17 KiB
C#
524 lines
17 KiB
C#
using System.Windows;
|
|
using UserControl = System.Windows.Controls.UserControl;
|
|
|
|
namespace OperationControl.Mapas.Editing.Views
|
|
{
|
|
public partial class MapaEditorOverlay : UserControl
|
|
{
|
|
public event Action<MapaFerramentaEdicao>? FerramentaSelecionada;
|
|
public event Action? LimparSelecaoSolicitado;
|
|
public event Action? DesfazerSolicitado;
|
|
public event Action? RefazerSolicitado;
|
|
public event Action? ExcluirSelecionadasSolicitado;
|
|
public event Action? AplicarEdicaoSolicitado;
|
|
public event Action? CancelarEdicaoSolicitado;
|
|
public event Action<MapaEscopoRecorte>? EscopoRecorteAlterado;
|
|
public event Action<MapaAcaoBordaGnss>? BordaGnssAcaoSolicitada;
|
|
public event Action? RestaurarMapaFonteSolicitado;
|
|
public event Action? SalvarMapaEditadoSolicitado;
|
|
|
|
private bool _atualizandoEstado;
|
|
|
|
|
|
public MapaEditorOverlay()
|
|
{
|
|
InitializeComponent();
|
|
}
|
|
|
|
|
|
public void DefinirEstado(
|
|
bool ativo,
|
|
MapaFerramentaEdicao ferramenta,
|
|
int quantidadeSelecionadas,
|
|
bool modificado,
|
|
bool podeDesfazer,
|
|
bool podeRefazer,
|
|
MapaEscopoRecorte escopoRecorte = MapaEscopoRecorte.TodasRuasAtingidas,
|
|
MapaResumoBordaGnss? bordaGnss = null,
|
|
bool possuiMapaFonte = false)
|
|
{
|
|
Visibility = ativo ? Visibility.Visible : Visibility.Collapsed;
|
|
|
|
if (!ativo)
|
|
return;
|
|
|
|
_atualizandoEstado = true;
|
|
|
|
try
|
|
{
|
|
bool ferramentaRecorte =
|
|
ferramenta == MapaFerramentaEdicao.RecorteLivre ||
|
|
ferramenta == MapaFerramentaEdicao.RecortePorPontos ||
|
|
ferramenta == MapaFerramentaEdicao.RecorteBordaGnss;
|
|
|
|
|
|
pnlEscopoRecorte.Visibility =
|
|
ferramentaRecorte
|
|
? Visibility.Visible
|
|
: Visibility.Collapsed;
|
|
|
|
|
|
rbRecorteTodas.IsChecked = escopoRecorte == MapaEscopoRecorte.TodasRuasAtingidas;
|
|
rbRecorteSelecionadas.IsChecked = escopoRecorte == MapaEscopoRecorte.SomenteRuasSelecionadas;
|
|
|
|
bool avisarSemSelecao =
|
|
ferramentaRecorte &&
|
|
escopoRecorte == MapaEscopoRecorte.SomenteRuasSelecionadas &&
|
|
quantidadeSelecionadas <= 0;
|
|
|
|
txtEscopoRecorteAviso.Visibility =
|
|
avisarSemSelecao
|
|
? Visibility.Visible
|
|
: Visibility.Collapsed;
|
|
}
|
|
finally
|
|
{
|
|
_atualizandoEstado = false;
|
|
}
|
|
|
|
btnDesfazer.IsEnabled = podeDesfazer;
|
|
|
|
btnRefazer.IsEnabled = podeRefazer;
|
|
|
|
btnSelecionar.IsChecked = ferramenta == MapaFerramentaEdicao.Selecionar;
|
|
|
|
btnSelecionarRetangulo.IsChecked = ferramenta == MapaFerramentaEdicao.SelecionarRetangulo;
|
|
|
|
btnRecorteLivre.IsChecked = ferramenta == MapaFerramentaEdicao.RecorteLivre;
|
|
|
|
btnRecortePorPontos.IsChecked = ferramenta == MapaFerramentaEdicao.RecortePorPontos;
|
|
|
|
btnExcluirSelecionadas.IsEnabled = quantidadeSelecionadas > 0;
|
|
|
|
btnLimparSelecao.IsEnabled = quantidadeSelecionadas > 0;
|
|
|
|
btnAplicarEdicao.IsEnabled = modificado;
|
|
|
|
btnCancelarEdicao.IsEnabled = ativo;
|
|
|
|
btnRecorteBordaGnss.IsChecked = ferramenta == MapaFerramentaEdicao.RecorteBordaGnss;
|
|
|
|
btnRestaurarMapaFonte.IsEnabled = possuiMapaFonte;
|
|
|
|
bool exibindoBordaGnss = ferramenta == MapaFerramentaEdicao.RecorteBordaGnss;
|
|
pnlBordaGnss.Visibility = exibindoBordaGnss ? Visibility.Visible : Visibility.Collapsed;
|
|
if (exibindoBordaGnss && bordaGnss != null)
|
|
{
|
|
rbGnssManual.IsChecked = bordaGnss.Modo == MapaModoCapturaGnss.Manual;
|
|
|
|
bool automatico = bordaGnss.Modo == MapaModoCapturaGnss.Automatico;
|
|
bool gravandoAutomatico = bordaGnss.GravacaoAutomaticaAtiva;
|
|
|
|
rbGnssManual.IsChecked = !automatico;
|
|
rbGnssAutomatico.IsChecked = automatico;
|
|
|
|
|
|
/*
|
|
* Não permitimos trocar de modo
|
|
* no meio de uma gravação ou depois
|
|
* da borda finalizada.
|
|
*/
|
|
bool podeTrocarModo =
|
|
!bordaGnss.Finalizada &&
|
|
!gravandoAutomatico;
|
|
|
|
rbGnssManual.IsEnabled = podeTrocarModo;
|
|
rbGnssAutomatico.IsEnabled = podeTrocarModo;
|
|
|
|
btnGnssRegistrarPonto.Visibility =
|
|
!automatico &&
|
|
!bordaGnss.Finalizada
|
|
? Visibility.Visible
|
|
: Visibility.Collapsed;
|
|
|
|
|
|
btnGnssRegistrarPonto.IsEnabled =
|
|
!automatico &&
|
|
bordaGnss.CapturaAtiva &&
|
|
bordaGnss.LeituraGnssValida;
|
|
|
|
|
|
btnGnssIniciarAutomatico.Visibility =
|
|
automatico &&
|
|
!bordaGnss.Finalizada &&
|
|
!gravandoAutomatico
|
|
? Visibility.Visible
|
|
: Visibility.Collapsed;
|
|
|
|
|
|
btnGnssIniciarAutomatico.IsEnabled =
|
|
automatico &&
|
|
!bordaGnss.Finalizada &&
|
|
!gravandoAutomatico &&
|
|
bordaGnss.LeituraGnssValida;
|
|
|
|
|
|
btnGnssRemoverUltimo.IsEnabled =
|
|
!bordaGnss.Finalizada &&
|
|
bordaGnss.QuantidadePontos > 0 &&
|
|
!gravandoAutomatico;
|
|
|
|
|
|
bool podeFinalizar =
|
|
bordaGnss.QuantidadePontos >= 2 &&
|
|
(
|
|
!automatico
|
|
||
|
|
gravandoAutomatico
|
|
);
|
|
|
|
btnGnssFinalizar.IsEnabled = podeFinalizar;
|
|
|
|
btnGnssFinalizar.Visibility =
|
|
bordaGnss.Finalizada
|
|
? Visibility.Collapsed
|
|
: (
|
|
automatico &&
|
|
!gravandoAutomatico
|
|
? Visibility.Collapsed
|
|
: Visibility.Visible
|
|
);
|
|
|
|
|
|
btnGnssFinalizar.Content =
|
|
automatico
|
|
? "■ Finalizar gravação"
|
|
: "✓ Finalizar borda";
|
|
|
|
|
|
txtBordaGnssResumo.Text =
|
|
$"{bordaGnss.QuantidadePontos} " +
|
|
$"{(bordaGnss.QuantidadePontos == 1 ? "ponto" : "pontos")} " +
|
|
$"• {bordaGnss.ComprimentoMetros:F2} m";
|
|
|
|
|
|
txtGnssAutomaticoInfo.Visibility =
|
|
automatico
|
|
? Visibility.Visible
|
|
: Visibility.Collapsed;
|
|
|
|
|
|
txtGnssAutomaticoInfo.Text =
|
|
$"Registro automático a cada " +
|
|
$"{bordaGnss.DistanciaMinimaAutomaticaMetros:F2} m";
|
|
|
|
|
|
txtBordaGnssEstado.Text =
|
|
bordaGnss.Finalizada
|
|
? "PRONTA"
|
|
: automatico
|
|
? (
|
|
gravandoAutomatico
|
|
? "GRAVANDO"
|
|
: "PRONTO"
|
|
)
|
|
: "CAPTURANDO";
|
|
|
|
|
|
txtBordaGnssStatus.Text =
|
|
bordaGnss.StatusGnss;
|
|
|
|
|
|
txtBordaGnssStatus.Foreground =
|
|
bordaGnss.LeituraGnssValida
|
|
? (
|
|
bordaGnss.QualidadeAlta
|
|
? new System.Windows.Media
|
|
.SolidColorBrush(
|
|
System.Windows.Media
|
|
.Color
|
|
.FromRgb(
|
|
95,
|
|
207,
|
|
128
|
|
)
|
|
)
|
|
: new System.Windows.Media
|
|
.SolidColorBrush(
|
|
System.Windows.Media
|
|
.Color
|
|
.FromRgb(
|
|
240,
|
|
180,
|
|
91
|
|
)
|
|
)
|
|
)
|
|
: new System.Windows.Media
|
|
.SolidColorBrush(
|
|
System.Windows.Media
|
|
.Color
|
|
.FromRgb(
|
|
240,
|
|
100,
|
|
100
|
|
)
|
|
);
|
|
|
|
|
|
txtBordaGnssEstado.Text =
|
|
bordaGnss.Finalizada
|
|
? "PRONTA"
|
|
: "CAPTURANDO";
|
|
|
|
|
|
txtBordaGnssEstado.Foreground =
|
|
bordaGnss.Finalizada
|
|
? System.Windows.Media.Brushes
|
|
.DeepSkyBlue
|
|
: new System.Windows.Media
|
|
.SolidColorBrush(
|
|
System.Windows.Media
|
|
.Color
|
|
.FromRgb(
|
|
95,
|
|
207,
|
|
128
|
|
)
|
|
);
|
|
|
|
|
|
btnGnssRegistrarPonto.IsEnabled =
|
|
bordaGnss.CapturaAtiva &&
|
|
bordaGnss.LeituraGnssValida;
|
|
|
|
|
|
btnGnssRemoverUltimo.IsEnabled =
|
|
bordaGnss.CapturaAtiva &&
|
|
bordaGnss.QuantidadePontos > 0;
|
|
|
|
|
|
btnGnssFinalizar.IsEnabled =
|
|
bordaGnss.CapturaAtiva &&
|
|
bordaGnss.QuantidadePontos >= 2;
|
|
|
|
|
|
btnGnssFinalizar.Visibility =
|
|
bordaGnss.Finalizada
|
|
? Visibility.Collapsed
|
|
: Visibility.Visible;
|
|
|
|
|
|
btnGnssContinuar.Visibility =
|
|
bordaGnss.Finalizada
|
|
? Visibility.Visible
|
|
: Visibility.Collapsed;
|
|
|
|
|
|
btnGnssDescartar.IsEnabled =
|
|
bordaGnss.QuantidadePontos > 0;
|
|
|
|
|
|
bool escopoBordaValido =
|
|
escopoRecorte !=
|
|
MapaEscopoRecorte
|
|
.SomenteRuasSelecionadas
|
|
||
|
|
quantidadeSelecionadas > 0;
|
|
|
|
|
|
btnGnssAplicarBorda.Visibility =
|
|
bordaGnss.Finalizada
|
|
? Visibility.Visible
|
|
: Visibility.Collapsed;
|
|
|
|
|
|
btnGnssAplicarBorda.IsEnabled =
|
|
bordaGnss.Finalizada &&
|
|
bordaGnss.QuantidadePontos >= 2 &&
|
|
escopoBordaValido;
|
|
}
|
|
|
|
|
|
txtSelecionadas.Text =
|
|
quantidadeSelecionadas switch
|
|
{
|
|
0 => "Nenhuma rua selecionada",
|
|
1 => "1 rua selecionada",
|
|
_ => $"{quantidadeSelecionadas} ruas selecionadas"
|
|
};
|
|
|
|
txtInstrucao.Text =
|
|
ferramenta switch
|
|
{
|
|
MapaFerramentaEdicao.Selecionar =>
|
|
"Clique nas ruas que deseja editar.",
|
|
|
|
MapaFerramentaEdicao.SelecionarRetangulo =>
|
|
"Arraste para selecionar ruas. Ctrl + arraste para mover o mapa.",
|
|
|
|
MapaFerramentaEdicao.RecorteLivre =>
|
|
"Arraste contornando a área a remover. Ctrl + arraste move o mapa.",
|
|
|
|
MapaFerramentaEdicao.SelecionarPoligono =>
|
|
"Defina os vértices da área desejada.",
|
|
|
|
MapaFerramentaEdicao.RecortePorPontos =>
|
|
"Clique para marcar os vértices. Enter ou duplo clique conclui. Backspace remove o último ponto. Esc descarta o traçado.",
|
|
|
|
MapaFerramentaEdicao.RecorteBordaGnss =>
|
|
"Registre a borda real usando GNSS.",
|
|
|
|
_ =>
|
|
"Selecione uma ferramenta."
|
|
};
|
|
}
|
|
|
|
|
|
private void btnSelecionar_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
FerramentaSelecionada?.Invoke(MapaFerramentaEdicao.Selecionar);
|
|
}
|
|
|
|
|
|
private void btnSelecionarRetangulo_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
FerramentaSelecionada?.Invoke(MapaFerramentaEdicao.SelecionarRetangulo);
|
|
}
|
|
|
|
|
|
private void btnRecorteLivre_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
FerramentaSelecionada?.Invoke(MapaFerramentaEdicao.RecorteLivre);
|
|
}
|
|
|
|
|
|
private void btnRecortePorPontos_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
FerramentaSelecionada?.Invoke(MapaFerramentaEdicao.RecortePorPontos);
|
|
}
|
|
|
|
|
|
private void btnLimparSelecao_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
LimparSelecaoSolicitado?.Invoke();
|
|
}
|
|
|
|
|
|
private void btnDesfazer_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
DesfazerSolicitado?.Invoke();
|
|
}
|
|
|
|
|
|
private void btnRefazer_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
RefazerSolicitado?.Invoke();
|
|
}
|
|
|
|
|
|
private void btnExcluirSelecionadas_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
ExcluirSelecionadasSolicitado?.Invoke();
|
|
}
|
|
|
|
|
|
private void rbRecorteTodas_Checked(object sender, RoutedEventArgs e)
|
|
{
|
|
if (_atualizandoEstado)
|
|
return;
|
|
|
|
EscopoRecorteAlterado?.Invoke(MapaEscopoRecorte.TodasRuasAtingidas);
|
|
}
|
|
|
|
|
|
private void rbRecorteSelecionadas_Checked(object sender, RoutedEventArgs e)
|
|
{
|
|
if (_atualizandoEstado)
|
|
return;
|
|
|
|
EscopoRecorteAlterado?.Invoke(MapaEscopoRecorte.SomenteRuasSelecionadas);
|
|
}
|
|
|
|
|
|
private void btnRecorteBordaGnss_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
FerramentaSelecionada?.Invoke(MapaFerramentaEdicao.RecorteBordaGnss);
|
|
}
|
|
|
|
|
|
private void btnGnssRegistrarPonto_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
BordaGnssAcaoSolicitada?.Invoke(MapaAcaoBordaGnss.RegistrarPonto);
|
|
}
|
|
|
|
|
|
private void btnGnssRemoverUltimo_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
BordaGnssAcaoSolicitada?.Invoke(MapaAcaoBordaGnss.RemoverUltimo);
|
|
}
|
|
|
|
|
|
private void btnGnssFinalizar_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
BordaGnssAcaoSolicitada?.Invoke(MapaAcaoBordaGnss.Finalizar);
|
|
}
|
|
|
|
|
|
private void btnGnssContinuar_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
BordaGnssAcaoSolicitada?.Invoke(MapaAcaoBordaGnss.Continuar);
|
|
}
|
|
|
|
|
|
private void btnGnssDescartar_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
BordaGnssAcaoSolicitada?.Invoke(MapaAcaoBordaGnss.Descartar);
|
|
}
|
|
|
|
|
|
private void btnGnssAplicarBorda_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
BordaGnssAcaoSolicitada?.Invoke(MapaAcaoBordaGnss.Aplicar);
|
|
}
|
|
|
|
|
|
private void btnAplicarEdicao_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
AplicarEdicaoSolicitado?.Invoke();
|
|
}
|
|
|
|
|
|
private void btnCancelarEdicao_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
CancelarEdicaoSolicitado?.Invoke();
|
|
}
|
|
|
|
|
|
private void btnRestaurarMapaFonte_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
RestaurarMapaFonteSolicitado?.Invoke();
|
|
}
|
|
|
|
|
|
private void btnSalvarMapaEditado_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
SalvarMapaEditadoSolicitado?.Invoke();
|
|
}
|
|
|
|
|
|
private void rbGnssManual_Checked(object sender, RoutedEventArgs e)
|
|
{
|
|
if (_atualizandoEstado)
|
|
return;
|
|
|
|
BordaGnssAcaoSolicitada?.Invoke(MapaAcaoBordaGnss.DefinirModoManual);
|
|
}
|
|
|
|
|
|
private void rbGnssAutomatico_Checked(object sender, RoutedEventArgs e)
|
|
{
|
|
if (_atualizandoEstado)
|
|
return;
|
|
|
|
BordaGnssAcaoSolicitada?.Invoke(MapaAcaoBordaGnss.DefinirModoAutomatico);
|
|
}
|
|
|
|
|
|
private void btnGnssIniciarAutomatico_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
BordaGnssAcaoSolicitada?.Invoke(MapaAcaoBordaGnss.IniciarGravacaoAutomatica);
|
|
}
|
|
|
|
}
|
|
} |