209 lines
6.5 KiB
C#
209 lines
6.5 KiB
C#
|
using CtrEditor.Siemens;
|
|||
|
using System.Windows;
|
|||
|
using System.Windows.Controls;
|
|||
|
using CommunityToolkit.Mvvm.ComponentModel;
|
|||
|
using System.Diagnostics;
|
|||
|
|
|||
|
namespace CtrEditor.ObjetosSim
|
|||
|
{
|
|||
|
/// <summary>
|
|||
|
/// Interaction logic for ucBottGenerator.xaml
|
|||
|
/// </summary>
|
|||
|
public partial class osBottGenerator : osBase, IosBase
|
|||
|
{
|
|||
|
TimerTON_TOFF _TON_TOFF = new TimerTON_TOFF();
|
|||
|
// Otros datos y métodos relevantes para la simulación
|
|||
|
|
|||
|
private float TiempoRestante;
|
|||
|
private osBotella UltimaBotella;
|
|||
|
|
|||
|
public static string NombreClase()
|
|||
|
{
|
|||
|
return "BottGenerator";
|
|||
|
}
|
|||
|
private string nombre = NombreClase();
|
|||
|
public override string Nombre
|
|||
|
{
|
|||
|
get => nombre;
|
|||
|
set => SetProperty(ref nombre, value);
|
|||
|
}
|
|||
|
|
|||
|
[ObservableProperty]
|
|||
|
private float offsetLeftSalida;
|
|||
|
[ObservableProperty]
|
|||
|
private float offsetTopSalida;
|
|||
|
|
|||
|
[ObservableProperty]
|
|||
|
private string tag_consenso;
|
|||
|
[ObservableProperty]
|
|||
|
private bool consenso;
|
|||
|
|
|||
|
partial void OnConsensoChanged(bool value)
|
|||
|
{
|
|||
|
_TON_TOFF.Senal = value;
|
|||
|
}
|
|||
|
[ObservableProperty]
|
|||
|
private bool consenso_NC;
|
|||
|
[ObservableProperty]
|
|||
|
private bool consenso_Filtrado;
|
|||
|
[ObservableProperty]
|
|||
|
float filtro_consenso_s;
|
|||
|
|
|||
|
[ObservableProperty]
|
|||
|
private float botellas_hora;
|
|||
|
|
|||
|
partial void OnBotellas_horaChanged(float value)
|
|||
|
{
|
|||
|
Botellas_segundo = value / 3600;
|
|||
|
}
|
|||
|
|
|||
|
[ObservableProperty]
|
|||
|
private float botellas_segundo;
|
|||
|
|
|||
|
partial void OnBotellas_segundoChanged(float value)
|
|||
|
{
|
|||
|
Botellas_hora = value * 3600;
|
|||
|
}
|
|||
|
|
|||
|
[ObservableProperty]
|
|||
|
private float velocidad_actual_percentual;
|
|||
|
[ObservableProperty]
|
|||
|
private float diametro_botella;
|
|||
|
[ObservableProperty]
|
|||
|
private float ancho;
|
|||
|
[ObservableProperty]
|
|||
|
private float alto;
|
|||
|
[ObservableProperty]
|
|||
|
private float angulo;
|
|||
|
|
|||
|
public osBottGenerator()
|
|||
|
{
|
|||
|
Ancho = 0.30f;
|
|||
|
Alto = 0.30f;
|
|||
|
Angulo = 0;
|
|||
|
Velocidad_actual_percentual = 0;
|
|||
|
Diametro_botella = 0.1f;
|
|||
|
Botellas_hora = 10000;
|
|||
|
Filtro_consenso_s = 1;
|
|||
|
}
|
|||
|
|
|||
|
public override void UpdatePLC(PLCModel plc, int elapsedMilliseconds)
|
|||
|
{
|
|||
|
if (Consenso_NC)
|
|||
|
Consenso = !LeerBitTag(Tag_consenso);
|
|||
|
else
|
|||
|
Consenso = LeerBitTag(Tag_consenso);
|
|||
|
}
|
|||
|
|
|||
|
public override void UpdateControl(int elapsedMilliseconds)
|
|||
|
{
|
|||
|
bool habilitado;
|
|||
|
|
|||
|
_TON_TOFF.Tiempo_ON_s = _TON_TOFF.Tiempo_OFF_s = Filtro_consenso_s;
|
|||
|
|
|||
|
if (Consenso_Filtrado)
|
|||
|
habilitado = _TON_TOFF.SenalFiltrada();
|
|||
|
else
|
|||
|
habilitado = Consenso;
|
|||
|
|
|||
|
if (habilitado && Velocidad_actual_percentual > 0)
|
|||
|
{
|
|||
|
TiempoRestante -= elapsedMilliseconds / 1000.0f;
|
|||
|
if (TiempoRestante <= 0)
|
|||
|
{
|
|||
|
TiempoRestante += 3600 / (Botellas_hora * (Velocidad_actual_percentual / 100.0f));
|
|||
|
|
|||
|
var X = Left + OffsetLeftSalida;
|
|||
|
var Y = Top + OffsetTopSalida;
|
|||
|
|
|||
|
if (UltimaBotella != null && UltimaBotella.RemoverDesdeSimulacion)
|
|||
|
UltimaBotella = null;
|
|||
|
|
|||
|
if (UltimaBotella == null)
|
|||
|
{
|
|||
|
// No hay botellas, se puede crear una nueva directamente
|
|||
|
var nuevaBotella = _mainViewModel.CrearObjetoSimulable(typeof(osBotella), X, Y);
|
|||
|
((osBotella)nuevaBotella).Diametro = Diametro_botella;
|
|||
|
nuevaBotella.AutoCreated = true;
|
|||
|
UltimaBotella = (osBotella)nuevaBotella;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
// Calcular la distancia entre el centro de la última botella y la nueva posición
|
|||
|
float distancia = (float)Math.Sqrt(Math.Pow(UltimaBotella.Left - X, 2) + Math.Pow(UltimaBotella.Top - Y, 2));
|
|||
|
float distanciaMinima = Diametro_botella / 2; // Asumiendo que el diámetro de la nueva botella es similar
|
|||
|
|
|||
|
if (distancia > distanciaMinima)
|
|||
|
{
|
|||
|
var nuevaBotella = _mainViewModel.CrearObjetoSimulable(typeof(osBotella), X, Y);
|
|||
|
((osBotella)nuevaBotella).Diametro = Diametro_botella;
|
|||
|
nuevaBotella.AutoCreated = true;
|
|||
|
UltimaBotella = (osBotella)nuevaBotella;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
TiempoRestante = 0;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public override void ucLoaded()
|
|||
|
{
|
|||
|
// El UserControl ya se ha cargado y podemos obtener las coordenadas para
|
|||
|
// crear el objeto de simulacion
|
|||
|
ActualizarLeftTop();
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
public partial class ucBottGenerator : UserControl, IDataContainer
|
|||
|
{
|
|||
|
public osBase? Datos { get; set; }
|
|||
|
|
|||
|
public ucBottGenerator()
|
|||
|
{
|
|||
|
InitializeComponent();
|
|||
|
this.Loaded += OnLoaded;
|
|||
|
this.Unloaded += OnUnloaded;
|
|||
|
}
|
|||
|
private void OnLoaded(object sender, RoutedEventArgs e)
|
|||
|
{
|
|||
|
Datos?.ucLoaded();
|
|||
|
}
|
|||
|
private void OnUnloaded(object sender, RoutedEventArgs e)
|
|||
|
{
|
|||
|
Datos?.ucUnLoaded();
|
|||
|
}
|
|||
|
public void Resize(float width, float height)
|
|||
|
{
|
|||
|
if (Datos is osBottGenerator datos)
|
|||
|
{
|
|||
|
datos.Ancho = PixelToMeter.Instance.calc.PixelsToMeters(width);
|
|||
|
datos.Alto = PixelToMeter.Instance.calc.PixelsToMeters(width);
|
|||
|
}
|
|||
|
}
|
|||
|
public void Move(float LeftPixels, float TopPixels)
|
|||
|
{
|
|||
|
if (Datos != null)
|
|||
|
{
|
|||
|
Datos.Left = PixelToMeter.Instance.calc.PixelsToMeters(LeftPixels);
|
|||
|
Datos.Top = PixelToMeter.Instance.calc.PixelsToMeters(TopPixels);
|
|||
|
}
|
|||
|
}
|
|||
|
public void Rotate(float Angle)
|
|||
|
{
|
|||
|
if (Datos != null)
|
|||
|
if (Datos is osBottGenerator datos)
|
|||
|
datos.Angulo = Angle;
|
|||
|
}
|
|||
|
public void Highlight(bool State) { }
|
|||
|
public int ZIndex()
|
|||
|
{
|
|||
|
return 10;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
}
|