agrobot_base/AgroBase/AgroBase/Forms/Simuladores/frmSimulacaoMapeamentoVisua...

187 lines
6.7 KiB
C#

using AgroBase.Models;
using AgroBase.Models.Operadores;
using AgroBase.Services;
using AgroBase.Services.Operadores;
using Newtonsoft.Json;
using StackExchange.Redis;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using static AgroBase.Models.Enums;
namespace AgroBase.Forms.Simuladores
{
public partial class frmSimulacaoMapeamentoVisual : Form
{
private List<string> imagens = new List<string>();
private int indiceAtual = 0;
private string pastaSelecionada = "";
private readonly object imgLock = new object();
public frmSimulacaoMapeamentoVisual()
{
InitializeComponent();
}
private void btnCarregarFotos_Click(object sender, EventArgs e)
{
using (var dialog = new FolderBrowserDialog())
{
if (dialog.ShowDialog() == DialogResult.OK)
{
pastaSelecionada = dialog.SelectedPath;
imagens = Directory.GetFiles(pastaSelecionada, "*_rgb.jpeg", SearchOption.TopDirectoryOnly)
.OrderBy(f =>
{
var nome = Path.GetFileNameWithoutExtension(f);
var numTexto = nome.Split('_').FirstOrDefault();
return int.TryParse(numTexto, out int num) ? num : int.MaxValue;
})
.ToList();
indiceAtual = 0;
MostrarImagemAtual();
}
}
}
private void MostrarImagemAtual()
{
if (imagens.Count == 0 || indiceAtual < 0 || indiceAtual >= imagens.Count)
return;
var caminho = imagens[indiceAtual];
var bmpTemp = new Bitmap(caminho); // evita locking de arquivo
imgOriginal.Image = new Bitmap(bmpTemp);
lblInfo.Text = $"{indiceAtual + 1}/{imagens.Count} - {Path.GetFileName(caminho)}";
Task.Run(async () => await EnviarImagemVisualWorker(caminho));
}
private void AtualizarDadosTela()
{
Task.Run(async () =>
{
OAKCameraFrameModel frame = await VisualWorkerService.GetCameraFrame(TipoFrameCamera.Segmentacao);
var dadosSeg = Variaveis.OperacaoEmAndamento.Sensoriamento.OperadorVisual.Analises.segmentacao;
DesenharCorredor(frame?.image(), dadosSeg.centros_corredor, dadosSeg.width, dadosSeg.height, 80);
this.Invoke((MethodInvoker)(() =>
{
var _controle = Variaveis.OperacaoEmAndamento.Controle;
txtErroAngular.Text = dadosSeg.erro_angular.ToString();
txtErroLateral.Text = dadosSeg.erro_lateral_pct.ToString();
txtStatusCarro.Text = dadosSeg.status_corredor.ToString();
txtVelocidadeSP.Text = _controle.PercentualVelocidadeSP.ToString();
txtAnguloSP.Text = _controle.Angulo.ToString();
txtTipoMovimento.Text = _controle.TipoMovimento.ToString();
txtImagemAtual.Text = indiceAtual.ToString();
}));
});
}
private async Task EnviarImagemVisualWorker(string caminho)
{
var comando = new
{
cmd = VisualWorkerCommandType.EnviarImagemMock,
@params = caminho
};
RedisService.Publish(CmdKey.VisualWorkerRx, JsonConvert.SerializeObject(comando));
await Task.Delay(50);
AtualizarDadosTela();
}
private void DesenharCorredor(Bitmap imagemBase, List<double?[]> centrosCorredor, int largura, int altura, int larguraRoboPx)
{
try
{
if (imagemBase == null)
return;
Bitmap imagemComDesenho = new Bitmap(imagemBase.Clone() as Bitmap);
using (Graphics g = Graphics.FromImage(imagemComDesenho))
{
Pen penCentro = new Pen(Color.Yellow, 2);
Pen penLargura = new Pen(Color.Magenta, 1);
Brush brushCentro = Brushes.Yellow;
float fatorX = (float)imagemBase.Width / largura;
float fatorY = (float)imagemBase.Height / altura;
for (int i = 0; i < centrosCorredor.Count; i++)
{
Point ponto = new Point(
(int)(centrosCorredor[i][0] * fatorX),
(int)(centrosCorredor[i][1] * fatorY)
);
g.FillEllipse(brushCentro, ponto.X - 2, ponto.Y - 2, 4, 4);
g.DrawLine(penLargura, ponto.X - larguraRoboPx / 2, ponto.Y, ponto.X + larguraRoboPx / 2, ponto.Y);
if (i < centrosCorredor.Count - 1)
{
Point proximoPonto = new Point((int)(centrosCorredor[i + 1][0] * fatorX), (int)(centrosCorredor[i + 1][1] * fatorY));
g.DrawLine(penCentro, ponto, proximoPonto);
}
}
}
this.Invoke((MethodInvoker)(() =>
{
imgSegmentacao.Image?.Dispose();
imgSegmentacao.Image = imagemComDesenho;
}));
}
catch (Exception ex)
{
Console.WriteLine("Erro ao desenhar corredor: " + ex.Message);
}
}
private void btnAnterior_Click(object sender, EventArgs e)
{
if (indiceAtual > 0)
{
indiceAtual--;
MostrarImagemAtual();
}
}
private void btnProximo_Click(object sender, EventArgs e)
{
if (indiceAtual < imagens.Count - 1)
{
indiceAtual++;
MostrarImagemAtual();
}
}
private void btnIr_Click(object sender, EventArgs e)
{
indiceAtual = Convert.ToInt32(txtImagemAtual.Text);
MostrarImagemAtual();
}
private void btnIniciarSimulacao_Click(object sender, EventArgs e)
{
Variaveis.OperacaoEmAndamento.IniciarSimulacao();
}
private void btnAtualizar_Click(object sender, EventArgs e)
{
AtualizarDadosTela();
}
}
}