diff --git a/Convertidores/Converters.cs b/Convertidores/Converters.cs index e5aa304..217caf6 100644 --- a/Convertidores/Converters.cs +++ b/Convertidores/Converters.cs @@ -38,6 +38,7 @@ namespace CtrEditor.Convertidores if (parameter != null) if (parameter.ToString() == "0.5") factor = 0.5f; else if (parameter.ToString() == "-0.5") factor = -0.5f; + else if (parameter.ToString() == "1.5") factor = 1.5f; return PixelToMeter.Instance.calc.MetersToPixels(meters) * factor; } @@ -49,6 +50,7 @@ namespace CtrEditor.Convertidores if (parameter != null) if (parameter.ToString() == "0.5") factor = 0.5f; else if (parameter.ToString() == "-0.5") factor = -0.5f; + else if (parameter.ToString() == "1.5") factor = 1.5f; return PixelToMeter.Instance.calc.PixelsToMeters(pixels) * factor; } diff --git a/MainViewModel.cs b/MainViewModel.cs index 11502eb..cf43230 100644 --- a/MainViewModel.cs +++ b/MainViewModel.cs @@ -58,6 +58,7 @@ namespace CtrEditor // Inicializa el PLCViewModel _plcViewModelData = new PLCViewModel(); + _plcViewModelData.RefreshEvent += OnRefreshEvent; InitializeTipoSimulableList(); @@ -143,11 +144,7 @@ namespace CtrEditor { foreach (var objetoSimulable in ObjetosSimulables) - { - if (_plcViewModelData.IsConnected) - objetoSimulable.UpdatePLC(_plcViewModelData.PLCInterface); objetoSimulable.UpdateGeometryStep(); - } simulationManager.Step(); @@ -156,6 +153,15 @@ namespace CtrEditor } + private void OnRefreshEvent(object sender, EventArgs e) + { + foreach (var objetoSimulable in ObjetosSimulables) + { + if (_plcViewModelData.IsConnected) + objetoSimulable.UpdatePLC(_plcViewModelData.PLCInterface); + } + } + //protected virtual void OnTickSimulacion(TickSimulacionEventArgs e) //{ // TickSimulacion?.Invoke(this, e); diff --git a/MainWindow.xaml b/MainWindow.xaml index f3f631c..ed0b2b1 100644 --- a/MainWindow.xaml +++ b/MainWindow.xaml @@ -3,8 +3,9 @@ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:i="http://schemas.microsoft.com/xaml/behaviors" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" - xmlns:Siemens="clr-namespace:CtrEditor.Siemens" x:Class="CtrEditor.MainWindow" + xmlns:Siemens="clr-namespace:CtrEditor.Siemens" xmlns:convert="clr-namespace:CtrEditor.Convertidores" + xmlns:ObjetosSim="clr-namespace:CtrEditor.ObjetosSim" x:Class="CtrEditor.MainWindow" Height="900" Width="1600" ResizeMode="CanResize" Title="{Binding directorioTrabajo}"> diff --git a/MainWindow.xaml.cs b/MainWindow.xaml.cs index 948e239..f42a830 100644 --- a/MainWindow.xaml.cs +++ b/MainWindow.xaml.cs @@ -20,6 +20,7 @@ using MouseEventArgs = System.Windows.Input.MouseEventArgs; using TextBox = System.Windows.Controls.TextBox; using UserControl = System.Windows.Controls.UserControl; using CheckBox = System.Windows.Controls.CheckBox; +using Orientation = System.Windows.Controls.Orientation; //using OpenCvSharp; @@ -417,13 +418,25 @@ namespace CtrEditor foreach (var property in properties) { - var horizontalPanel = new StackPanel { Orientation = Orientation.Horizontal }; + var grid = new Grid(); + grid.ColumnDefinitions.Add(new ColumnDefinition { Width = GridLength.Auto }); + grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) }); - var label = new Label { Content = property.Name }; + var label = new Label + { + Content = property.Name + ":", + Margin = new Thickness(0, 0, 5, 0), + VerticalAlignment = VerticalAlignment.Center + }; if (property.PropertyType == typeof(float) || property.PropertyType == typeof(string) || property.PropertyType == typeof(int)) { - var textBox = new TextBox { Width = 200, Margin = new Thickness(0) }; + var textBox = new TextBox + { + Margin = new Thickness(0), + MinWidth = 200, + VerticalContentAlignment = VerticalAlignment.Center + }; var binding = new Binding(property.Name) { @@ -432,7 +445,6 @@ namespace CtrEditor UpdateSourceTrigger = UpdateSourceTrigger.LostFocus }; - // Aplicar el convertidor solo a propiedades float if (property.PropertyType == typeof(float)) { binding.Converter = (FloatToFormattedStringConverter)Resources["floatFormatter"]; @@ -440,12 +452,19 @@ namespace CtrEditor textBox.SetBinding(TextBox.TextProperty, binding); - horizontalPanel.Children.Add(label); - horizontalPanel.Children.Add(textBox); + Grid.SetColumn(label, 0); + Grid.SetColumn(textBox, 1); + + grid.Children.Add(label); + grid.Children.Add(textBox); } else if (property.PropertyType == typeof(bool)) { - var checkBox = new CheckBox { Margin = new Thickness(5, 0, 0, 0) }; + var checkBox = new CheckBox + { + Margin = new Thickness(5, 0, 0, 0), + VerticalAlignment = VerticalAlignment.Center + }; var binding = new Binding(property.Name) { @@ -455,17 +474,17 @@ namespace CtrEditor checkBox.SetBinding(CheckBox.IsCheckedProperty, binding); - horizontalPanel.Children.Add(label); - horizontalPanel.Children.Add(checkBox); + Grid.SetColumn(label, 0); + Grid.SetColumn(checkBox, 1); + + grid.Children.Add(label); + grid.Children.Add(checkBox); } - PanelEdicion.Children.Add(horizontalPanel); + PanelEdicion.Children.Add(grid); } } - - - private void MainWindow_Closed(object sender, EventArgs e) { if (DataContext is MainViewModel viewModel) diff --git a/ObjetosSim/UserControlFactory.cs b/ObjetosSim/UserControlFactory.cs index 5b9597c..ab8d84e 100644 --- a/ObjetosSim/UserControlFactory.cs +++ b/ObjetosSim/UserControlFactory.cs @@ -25,6 +25,8 @@ namespace CtrEditor.ObjetosSim // return new ucTransporteCurva(); if (tipoObjeto == typeof(osVMmotorSim )) return new ucVMmotorSim(); + if (tipoObjeto == typeof(osBoton)) + return new ucBoton(); // Puedes añadir más condiciones para otros tipos @@ -45,6 +47,8 @@ namespace CtrEditor.ObjetosSim // return new osTransporteCurva(); if (tipoObjeto == typeof(osVMmotorSim)) return new osVMmotorSim(); + if (tipoObjeto == typeof(osBoton)) + return new osBoton(); // Puedes añadir más condiciones para otros tipos diff --git a/ObjetosSim/ucBoton.xaml b/ObjetosSim/ucBoton.xaml new file mode 100644 index 0000000..37b753a --- /dev/null +++ b/ObjetosSim/ucBoton.xaml @@ -0,0 +1,49 @@ + + + + + + + + + + + diff --git a/ObjetosSim/ucBoton.xaml.cs b/ObjetosSim/ucBoton.xaml.cs new file mode 100644 index 0000000..2c52eef --- /dev/null +++ b/ObjetosSim/ucBoton.xaml.cs @@ -0,0 +1,216 @@ +using CtrEditor.Convertidores; +using CtrEditor.Siemens; +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; + +namespace CtrEditor.ObjetosSim +{ + /// + /// Interaction logic for ucBoton.xaml + /// + public class osBoton : osBase + { + // Otros datos y métodos relevantes para la simulación + + private string _nombre = "Boton"; + private float _tamano; + private float _left; + private float _top; + private bool _estado; + private string _tag; + + private Brush _color; + public Brush Color + { + get => _color; + set + { + _color = value; + OnPropertyChanged(nameof(Color)); + } + } + + public ICommand ButtonClickCommand { get; } + public ICommand ButtonDownCommand { get; } + public ICommand ButtonUpCommand { get; } + + 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 Tamano + { + get => _tamano; + set + { + _tamano = value; + OnPropertyChanged(nameof(Tamano)); + } + } + public bool Estado + { + get => _estado; + set + { + _estado = value; + OnPropertyChanged(nameof(Estado)); + } + } + + public override string Nombre + { + get => _nombre; + set + { + if (_nombre != value) + { + _nombre = value; + OnPropertyChanged(nameof(Nombre)); + } + } + } + public string Tag + { + get => _tag; + set + { + if (_tag != value) + { + _tag = value; + OnPropertyChanged(nameof(Tag)); + } + } + } + + private void OnButtonClick() + { + // Handle the click event here + // Example: Change color on click + Color = Brushes.LightGreen; + + } + + private void OnButtonDown() + { + Estado = true; + } + + private void OnButtonUp() + { + Estado = false; + } + + public osBoton() + { + Tamano = 0.30f; + Estado = false; + Tag = "M50.0"; + // Set initial color + Color = Brushes.LightBlue; + + // Initialize the command + ButtonClickCommand = new RelayCommand(OnButtonClick); + ButtonDownCommand = new RelayCommand(OnButtonDown); + ButtonUpCommand = new RelayCommand(OnButtonUp); + } + + public override void UpdateGeometryStart() + { + // Se llama antes de la simulacion + + } + public override void UpdateGeometryStep() + { + } + public override void UpdatePLC(PLCModel plc) + { + plc.EscribirTagBool(Tag, Estado); + } + + public override void UpdateControl() + { + + } + public override void ucLoaded() + { + // El UserControl ya se ha cargado y podemos obtener las coordenadas para + // crear el objeto de simulacion + } + + } + + public partial class ucBoton : UserControl, IDataContainer + { + public osBase? Datos { get; set; } + + public ucBoton() + { + InitializeComponent(); + this.Loaded += OnLoaded; + } + private void OnLoaded(object sender, RoutedEventArgs e) + { + Datos?.ucLoaded(); + } + private void Button_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) + { + if (Datos is osBoton osBotonData) + { + osBotonData.ButtonDownCommand.Execute(null); + Mouse.Capture((UIElement)sender); + } + } + + private void Button_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) + { + if (Datos is osBoton osBotonData) + { + osBotonData.ButtonUpCommand.Execute(null); + Mouse.Capture(null); // Release mouse capture + } + } + public void Resize(float width, float height) { } + 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) { } + public void Highlight(bool State) { } + public int ZIndex() + { + return 10; + } + } +} diff --git a/Siemens/PLCControl.xaml.cs b/Siemens/PLCControl.xaml.cs index c1bd50e..9d8350f 100644 --- a/Siemens/PLCControl.xaml.cs +++ b/Siemens/PLCControl.xaml.cs @@ -36,6 +36,8 @@ namespace CtrEditor.Siemens public event PropertyChangedEventHandler PropertyChanged; + public event EventHandler RefreshEvent; + public PLCViewModel() { IsConnected = false; @@ -119,7 +121,6 @@ namespace CtrEditor.Siemens private void Instance_OnSoftwareConfigurationChanged(IInstance instance, SOnSoftwareConfigChangedParameter event_param) { PLCInterface.UpdateTagList(); - } private void Disconnect() @@ -134,10 +135,12 @@ namespace CtrEditor.Siemens { if (PLCInterface.Instance != null) { - - CpuTime = PLCInterface.LeerTagInt16("\"DB HMI\".CPU_Scan_Time")?.ToString() ?? "N/A"; + CpuTime = PLCInterface.LeerTagInt16("\"DB HMI\".CPU_Scan_Time")?.ToString() ?? "N/A"; LastError = PLCInterface.LastError; } + + // Disparar el evento RefreshEvent + RefreshEvent?.Invoke(this, EventArgs.Empty); } private void OnPropertyChanged([CallerMemberName] string propertyName = null)