using AgroBase.Models.Components; using AgroBase.Properties; using AgroBase.Services; using Microsoft.Web.WebView2.WinForms; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using System.Windows.Forms; using static AgroBase.Models.Enums; namespace AgroBase.Models { public class MapasModel { public WebView2 browser { get; set; } public Panel pnlMapa { get; set; } private PictureBox picLoading { get; set; } public Label lblMapa { get; set; } public MapasService mapaService { get; set; } = new MapasService(); public List> TrajetoriaMapa { get; set; } = new List>(); public List RuasPercorrer { get; set; } = new List(); public TipoMapaOperacao TipoMapa { get; set; } = TipoMapaOperacao.Indefinido; private AsyncTaskTimerModel tmrCarregamento; public void btnCarregar_Click(object sender, EventArgs e, string caminhoArquivo = "", bool monitoramento = false) { var Topico = Variaveis.MqttServiceLocal.Topicos.FirstOrDefault(x => x.Topico == MapasVariaveisModel.TopicoSelecaoRuasMapa); Topico.Mensagens.Clear(); TipoMapaOperacao? _tipoMapa = TipoMapa; if (!monitoramento && string.IsNullOrEmpty(caminhoArquivo)) { var opcoes = Enum.GetValues(typeof(TipoMapaOperacao)) .Cast() .ToDictionary( valor => (valor.ToString(), (TipoMapaOperacao?)valor), valor => (Action)null ); _tipoMapa = CustomDialog.ShowDialog( "Tipo de Mapa", "Qual o tipo de mapa está sendo carregado?", MessageBoxIcon.Question, opcoes ); if (_tipoMapa == null) { return; } } mapaService.Carregado = false; string script = monitoramento ? PythonService.ScriptMapFollower : PythonService.ScriptMapConverter; mapaService.CarregarMapa(script, MapasVariaveisModel.NomeArquivoMapaInterativo, MapasVariaveisModel.NomeArquivoMapaInterativoSaida, caminhoArquivo); if (mapaService.MapaUrl != "") { if (picLoading == null) { picLoading = new PictureBox(); } picLoading.Dock = DockStyle.Fill; picLoading.BackColor = System.Drawing.Color.Transparent; picLoading.Image = Resources.loading; picLoading.Name = "picLoading"; picLoading.SizeMode = PictureBoxSizeMode.Zoom; picLoading.Visible = true; if (pnlMapa != null) { pnlMapa.Controls.Add(picLoading); } TipoMapa = _tipoMapa.Value; tmrCarregamento?.Dispose(); tmrCarregamento = new AsyncTaskTimerModel("tmrCarregamento", tmrCarregamento_Tick, 500, pnlMapa); tmrCarregamento.Start(); } } public void CarregarMapaGPS() { if (picLoading == null) { picLoading = new PictureBox() { SizeMode = PictureBoxSizeMode.Zoom, Location = new System.Drawing.Point(0, 0), Size = new System.Drawing.Size(pnlMapa.Width, pnlMapa.Height) }; pnlMapa.Controls.Add(picLoading); } mapaService.CarregarMapaGPS(MapasVariaveisModel.NomeArquivoMapaGPS); TipoMapa = TipoMapaOperacao.GPS; tmrCarregamento?.Dispose(); tmrCarregamento = new AsyncTaskTimerModel("tmrCarregamento", tmrCarregamento_Tick, 500, pnlMapa); tmrCarregamento.Start(); } private async Task tmrCarregamento_Tick() { try { lock (mapaService.processLock) { if (mapaService.pythonProcess == null) { return; } if (mapaService.pythonProcess != null && !mapaService.pythonProcess.HasExited) { return; } } // Processo finalizado ou não associado pnlMapa?.Controls?.Remove(picLoading); picLoading.Visible = false; mapaService.Carregado = true; if (mapaService.NomeArquivoMapa == MapasVariaveisModel.NomeArquivoMapaInterativo) { mapaService.CarregarDadosMapa(); if (lblMapa != null) { lblMapa.Text = "Mapa carregado: " + mapaService.NomeArquivos; } PopularTrajetoriaMapa(); } IniciarProcessamento(); lock (mapaService.processLock) { mapaService.pythonProcess.Dispose(); mapaService.pythonProcess = null; } tmrCarregamento.Dispose(); } catch (InvalidOperationException ex) { Variaveis.MostrarLog($"[MapasModel.tmrCarregamento_Tick] Erro ao verificar o estado do processo: {ex.Message}"); picLoading.Visible = false; tmrCarregamento.Dispose(); } } public void PopularTrajetoriaMapa(MapaFeatureCollectionModel dados = null) { if (dados != null) mapaService.DadosMapa = dados; if (mapaService.DadosMapa == null) return; double OrientacaoRuas = -999; //DistanciaTotal = 0; /*if (!RuasPercorrer.Any()) { RuasPercorrer = mapaService.DadosMapa.features.Select(x => x.geometry.id).ToList(); }*/ TrajetoriaMapa = new List>(); foreach (var ID in RuasPercorrer) { var rua = mapaService.DadosMapa.features.FirstOrDefault(x => ID == x.geometry.id); if (rua != null) { TrajetoriaMapa.Add(new List()); foreach (var ponto in rua.geometry.coordinates) { /*if (rua.geometry.coordinates.IndexOf(ponto) == 0 || rua.geometry.coordinates.IndexOf(ponto) == rua.geometry.coordinates.Count - 1) { continue; }*/ GPSModel item = new GPSModel() { Longitude = ponto[0], Latitude = ponto[1], }; TrajetoriaMapa[TrajetoriaMapa.Count - 1].Add(item); /*if (Trajetoria[Trajetoria.Count - 1].Count > 1) { DistanciaTotal += GPSService.DistanciaEntrePontos(Trajetoria[Trajetoria.Count - 1][Trajetoria[Trajetoria.Count - 1].Count - 2], item); }*/ } var Rua = TrajetoriaMapa[TrajetoriaMapa.Count - 1]; if (OrientacaoRuas == -999) { OrientacaoRuas = GPSUtils.CalcularOrientacao(Rua[Rua.Count - 1], Rua[Rua.Count - 2]); } else { double MargemErroAngulo = 45; double orientacaoRua = GPSUtils.CalcularOrientacao(Rua[Rua.Count - 1], Rua[Rua.Count - 2]); double anguloOposto = (orientacaoRua + 180) % 360; if ((anguloOposto + MargemErroAngulo) >= OrientacaoRuas && (anguloOposto - MargemErroAngulo) <= OrientacaoRuas) { Rua.Reverse(); } } } } if (TrajetoriaMapa.Any()) { var op = Variaveis.OperacaoEmAndamento; op.Trajetoria = new TrajetoriaMapaOperacaoModel(TrajetoriaMapa); op.Trajetoria.ProjetarTrajetoriaFixa(); } } private void IniciarProcessamento() { //APIService.Inicializar(); browser = new WebView2(); browser.Source = new Uri(mapaService.MapaUrl); pnlMapa?.Controls?.Add(browser); browser.Dock = DockStyle.Fill; } public void AtualizarRuasSelecionadas() { List ids = new List(); bool idsMensagem = false; var Topico = Variaveis.MqttServiceLocal.Topicos.FirstOrDefault(x => x.Topico == MapasVariaveisModel.TopicoSelecaoRuasMapa); var Mensagem = Topico.Mensagens.LastOrDefault(); if (Mensagem != null && !Mensagem.Mensagem.Contains("[]")) { Mensagem.Mensagem = Mensagem.Mensagem.Replace("\n", ""); Mensagem.Mensagem = Mensagem.Mensagem.Replace("\"", ""); if (!string.IsNullOrEmpty(Mensagem.Mensagem)) { ids = JsonConvert.DeserializeObject(Mensagem.Mensagem).Select(x => x.ToString()).ToList(); idsMensagem = true; } } if (idsMensagem && ids.Count != RuasPercorrer.Count) { RuasPercorrer = ids; PopularTrajetoriaMapa(); } } public void LimparDados(bool ManterDadosCarregados = false) { lblMapa = null; pnlMapa = null; browser = null; tmrCarregamento = null; picLoading = null; mapaService.CaminhoMapa = null; mapaService.MapaUrl = null; mapaService.CaminhoDadosMapa = null; mapaService.ArquivoSaida = null; mapaService.CaminhoArquivo = null; mapaService.Carregado = false; mapaService.NomeArquivoMapa = null; mapaService.NomeArquivos = null; mapaService.pythonProcess = null; mapaService.opfMapa = null; if (!ManterDadosCarregados) { mapaService.DadosMapa = null; } } } public class MapaFeatureCollectionModel { public string type { get; set; } public List features { get; set; } } public class MapaFeatureModel { public string type { get; set; } public MapaFeaturePropertiesModel properties { get; set; } public MapaFeatureGeometryModel geometry { get; set; } } public class MapaFeaturePropertiesModel { public string Id { get; set; } public string Name { get; set; } public double Length { get; set; } public double Dist1 { get; set; } public double Dist2 { get; set; } } public class MapaFeatureGeometryModel { public string id { get; set; } public string type { get; set; } public List> coordinates { get; set; } } }