agrobot_base/AgroBase/OperationControl/Mapas/Editing/MapaEstadoRecorte.cs

341 lines
7.0 KiB
C#

using NetTopologySuite.Geometries;
namespace OperationControl.Mapas.Editing
{
public sealed class MapaEstadoRecorte
{
public double DistanciaMinimaCapturaAutomaticaMetros
{
get;
internal set;
} = 0.50;
public MapaEscopoRecorte Escopo
{
get;
internal set;
} =
MapaEscopoRecorte
.TodasRuasAtingidas;
public bool SomenteSelecionadas =>
Escopo ==
MapaEscopoRecorte
.SomenteRuasSelecionadas;
private readonly List<Coordinate> _pontos = new();
private bool _bordaGnssFinalizada;
public MapaTipoRecorte Tipo
{
get;
internal set;
} =
MapaTipoRecorte.Nenhum;
public MapaModoCapturaGnss ModoCapturaGnss
{
get;
internal set;
} =
MapaModoCapturaGnss.Manual;
public bool CapturaAtiva
{
get;
internal set;
}
public IReadOnlyList<Coordinate> Pontos =>
_pontos;
public int QuantidadePontos =>
_pontos.Count;
public bool PossuiPontos =>
_pontos.Count > 0;
/*
* Para polígono precisamos de pelo menos
* três vértices distintos.
*/
public bool PodeConcluirPoligono =>
_pontos.Count >= 3;
/*
* Para uma borda GNSS aberta precisamos
* de pelo menos dois pontos.
*/
public bool PodeConcluirLinha =>
_pontos.Count >= 2;
internal List<Coordinate> PontosMutaveis => _pontos;
public bool BordaGnssFinalizada => Tipo == MapaTipoRecorte.BordaGnss && _bordaGnssFinalizada;
public bool GravacaoAutomaticaAtiva => Tipo == MapaTipoRecorte.BordaGnss && ModoCapturaGnss == MapaModoCapturaGnss.Automatico && CapturaAtiva && !_bordaGnssFinalizada;
internal void AtivarBordaGnssManual()
{
/*
* Primeira entrada na ferramenta.
*/
if (Tipo != MapaTipoRecorte.BordaGnss)
{
_pontos.Clear();
Tipo = MapaTipoRecorte.BordaGnss;
ModoCapturaGnss = MapaModoCapturaGnss.Manual;
CapturaAtiva = true;
_bordaGnssFinalizada = false;
return;
}
/*
* Se já existia uma borda, preservamos
* exatamente o estado.
*
* Isso permite sair da ferramenta,
* selecionar ruas e voltar sem perder
* a caminhada.
*/
}
internal void AdicionarPontoBordaGnss(Coordinate ponto)
{
if (
Tipo !=
MapaTipoRecorte.BordaGnss ||
!CapturaAtiva
)
{
throw new InvalidOperationException(
"A captura de borda GNSS não está ativa."
);
}
_pontos.Add(
new Coordinate(
ponto.X,
ponto.Y
)
);
}
internal bool RemoverUltimoPontoBordaGnss()
{
if (
Tipo !=
MapaTipoRecorte.BordaGnss ||
_bordaGnssFinalizada ||
_pontos.Count == 0
)
{
return false;
}
/*
* Durante gravação automática não deixamos
* o usuário disputar com o gravador.
*/
if (
ModoCapturaGnss ==
MapaModoCapturaGnss.Automatico &&
CapturaAtiva
)
{
return false;
}
_pontos.RemoveAt(
_pontos.Count - 1
);
return true;
}
internal bool FinalizarBordaGnss()
{
if (
Tipo !=
MapaTipoRecorte.BordaGnss ||
!CapturaAtiva ||
!PodeConcluirLinha
)
{
return false;
}
CapturaAtiva =
false;
_bordaGnssFinalizada =
true;
return true;
}
internal bool ContinuarBordaGnss()
{
if (
Tipo !=
MapaTipoRecorte.BordaGnss ||
!_bordaGnssFinalizada
)
{
return false;
}
_bordaGnssFinalizada =
false;
/*
* Manual volta imediatamente a aceitar pontos.
*
* Automático volta para "pronto",
* aguardando Iniciar gravação.
*/
CapturaAtiva =
ModoCapturaGnss ==
MapaModoCapturaGnss.Manual;
return true;
}
internal void DescartarBordaGnss()
{
_pontos.Clear();
_bordaGnssFinalizada =
false;
/*
* Manual já fica pronto.
* Automático espera Iniciar novamente.
*/
CapturaAtiva =
ModoCapturaGnss ==
MapaModoCapturaGnss.Manual;
}
internal bool DefinirModoCapturaGnss(MapaModoCapturaGnss modo)
{
if (
Tipo !=
MapaTipoRecorte.BordaGnss ||
_bordaGnssFinalizada
)
{
return false;
}
if (
ModoCapturaGnss ==
modo
)
{
return false;
}
ModoCapturaGnss =
modo;
/*
* MANUAL:
* operador já pode registrar pontos.
*
* AUTOMÁTICO:
* espera explicitamente o botão
* "Iniciar gravação".
*/
CapturaAtiva =
modo ==
MapaModoCapturaGnss.Manual;
return true;
}
internal bool IniciarGravacaoAutomatica()
{
if (
Tipo !=
MapaTipoRecorte.BordaGnss ||
ModoCapturaGnss !=
MapaModoCapturaGnss.Automatico ||
_bordaGnssFinalizada ||
CapturaAtiva
)
{
return false;
}
CapturaAtiva =
true;
return true;
}
internal void Limpar()
{
_pontos.Clear();
Tipo = MapaTipoRecorte.Nenhum;
ModoCapturaGnss = MapaModoCapturaGnss.Manual;
CapturaAtiva = false;
Escopo = MapaEscopoRecorte.TodasRuasAtingidas;
_bordaGnssFinalizada = false;
}
}
}