using CtrEditor.Convertidores; using CtrEditor.Siemens; using CtrEditor.Simulacion; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using Microsoft.Xna.Framework; namespace CtrEditor.ObjetosSim { /// /// Interaction logic for ucFiller.xaml /// public class osFiller : osBase { // Otros datos y métodos relevantes para la simulación private string _nombre = "Filler"; private float _ancho; private float _alto; private float _left; private float _top; private float _angulo; private float _botellas_hora; private float _velocidad_actual; private float _diametro_botella; private string _tag_consenso; private bool _consenso; private float TiempoRestante; private float _leftSalida; private float _topSalida; private List Botellas = new List(); public float OffsetLeftSalida { get => _leftSalida; set { _leftSalida = value; OnPropertyChanged(nameof(OffsetLeftSalida)); } } public float OffsetTopSalida { get => _topSalida; set { _topSalida = value; OnPropertyChanged(nameof(OffsetTopSalida)); } } public bool Consenso { get => _consenso; set { _consenso = value; OnPropertyChanged(nameof(Consenso)); } } public float Botellas_hora { get => _botellas_hora; set { _botellas_hora = value; OnPropertyChanged(nameof(Botellas_hora)); } } public float Velocidad_actual_percentual { get => _velocidad_actual; set { _velocidad_actual = value; OnPropertyChanged(nameof(Velocidad_actual_percentual)); } } public float Diametro_botella { get => _diametro_botella; set { _diametro_botella = value; OnPropertyChanged(nameof(Diametro_botella)); } } public string Tag_consenso { get => _tag_consenso; set { _tag_consenso = value; OnPropertyChanged(nameof(Tag_consenso)); } } public override float Left { get => _left; set { _left = value; CanvasSetLeftinMeter(value); OnPropertyChanged(nameof(Left)); } } public override float Top { get => _top; set { _top = value; CanvasSetTopinMeter(value); OnPropertyChanged(nameof(Top)); } } public float Ancho { get => _ancho; set { _ancho = value; OnPropertyChanged(nameof(Ancho)); } } public float Alto { get => _alto; set { _alto = value; OnPropertyChanged(nameof(Alto)); } } public float Angulo { get => _angulo; set { _angulo = value; OnPropertyChanged(nameof(Angulo)); } } public override string Nombre { get => _nombre; set { if (_nombre != value) { _nombre = value; OnPropertyChanged(nameof(Nombre)); } } } public osFiller() { Ancho = 0.30f; Alto = 0.30f; Angulo = 0; Velocidad_actual_percentual = 0; Diametro_botella = 0.1f; Botellas_hora = 10000; } public override void UpdateGeometryStart() { // Se llama antes de la simulacion } public override void UpdateGeometryStep() { } public override void UpdatePLC(PLCModel plc, int elapsedMilliseconds) { Consenso = LeerBitTag(plc, Tag_consenso); } public override void UpdateControl(int elapsedMilliseconds) { if (Consenso && Velocidad_actual_percentual > 0) { TiempoRestante -= elapsedMilliseconds / 1000.0f; if (TiempoRestante <= 0) { TiempoRestante = 3600 / (Botellas_hora * (Velocidad_actual_percentual / 100.0f)); var UltimaBotellla = GetLastElement(Botellas); if (UltimaBotellla == null || (UltimaBotellla != null && !(UltimaBotellla.Left == Left && UltimaBotellla.Top == Top))) { var Botella = _mainViewModel.CrearObjetoSimulable(typeof(osBotella), Left + OffsetLeftSalida, Top + OffsetTopSalida); Botella.AutoCreated = true; Botellas.Add((osBotella)Botella); } } } 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 override void ucUnLoaded() { // El UserControl se esta eliminando // eliminar el objeto de simulacion } } public partial class ucFiller : UserControl, IDataContainer { public osBase? Datos { get; set; } public ucFiller() { 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 osFiller 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 osFiller datos) datos.Angulo = Angle; } public void Highlight(bool State) { } public int ZIndex() { return 10; } } }