341 lines
7.0 KiB
C#
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;
|
|
}
|
|
}
|
|
} |