diff --git a/MainWindow.xaml b/MainWindow.xaml index 59a3017..5cc0c28 100644 --- a/MainWindow.xaml +++ b/MainWindow.xaml @@ -125,11 +125,14 @@ - + - - - + + + + + + diff --git a/MainWindow.xaml.cs b/MainWindow.xaml.cs index 1578eba..6a29038 100644 --- a/MainWindow.xaml.cs +++ b/MainWindow.xaml.cs @@ -1,27 +1,13 @@ using System.Globalization; -using System.Text; using System.Windows; using System.Windows.Controls; -using System.Windows.Data; -using System.Windows.Documents; -using System.Windows.Forms; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; -using System.Windows.Navigation; -using System.Windows.Shapes; - -using CtrEditor.Siemens; -using static System.Runtime.InteropServices.JavaScript.JSType; -using Binding = System.Windows.Data.Binding; -using Label = System.Windows.Controls.Label; 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 ListBox = System.Windows.Controls.ListBox; using CtrEditor.ObjetosSim; +using System.Windows.Threading; namespace CtrEditor @@ -38,6 +24,8 @@ namespace CtrEditor private bool _isDraggingCanvas = false; private Image imagenDeFondo; + private DispatcherTimer _zoomTimer; + // Para los UserControl private Point _startPointUserControl; private UserControl _currentDraggingControl; @@ -51,6 +39,7 @@ namespace CtrEditor public MainWindow() { InitializeComponent(); + this.Loaded += MainWindow_Loaded; ImagenEnTrabajoScrollViewer.PreviewMouseWheel += ImagenEnTrabajoCanvas_MouseWheel; ImagenEnTrabajoCanvas.MouseDown += Canvas_MouseDown_Panning; @@ -374,44 +363,41 @@ namespace CtrEditor private void Canvas_MouseMove_Panning(object sender, MouseEventArgs e) { - if (_isDraggingCanvas && !_isDrawingCanvas) + if (_isDraggingCanvas) { - // Calcula el nuevo desplazamiento basado en el movimiento del ratón var currentPosition = e.GetPosition(ImagenEnTrabajoScrollViewer); var dx = currentPosition.X - _lastMousePosition.X; var dy = currentPosition.Y - _lastMousePosition.Y; - // Ajusta el desplazamiento del ScrollViewer - ImagenEnTrabajoScrollViewer.ScrollToHorizontalOffset(ImagenEnTrabajoScrollViewer.HorizontalOffset - dx); - ImagenEnTrabajoScrollViewer.ScrollToVerticalOffset(ImagenEnTrabajoScrollViewer.VerticalOffset - dy); + // Obtener la transformación actual del Canvas + var transform = (TranslateTransform)((TransformGroup)ImagenEnTrabajoCanvas.RenderTransform).Children.First(t => t is TranslateTransform); + transform.X += dx; + transform.Y += dy; - // Actualiza la posición del ratón para el próximo movimiento _lastMousePosition = currentPosition; } } private void ImagenEnTrabajoCanvas_MouseWheel(object sender, MouseWheelEventArgs e) { - var st = (ScaleTransform)ImagenEnTrabajoCanvas.LayoutTransform; - double zoomFactor = e.Delta > 0 ? 1.1 : 0.9; - Point cursorPosition = e.GetPosition(ImagenEnTrabajoScrollViewer); + var tg = (TransformGroup)ImagenEnTrabajoCanvas.RenderTransform; + var st = (ScaleTransform)tg.Children.First(t => t is ScaleTransform); + var tt = (TranslateTransform)tg.Children.First(t => t is TranslateTransform); - // Calcular el punto focal del zoom relativo al contenido del ScrollViewer - var absoluteX = ImagenEnTrabajoScrollViewer.HorizontalOffset + cursorPosition.X; - var absoluteY = ImagenEnTrabajoScrollViewer.VerticalOffset + cursorPosition.Y; + double zoomFactor = e.Delta > 0 ? 1.1 : 0.9; + Point cursorPosition = e.GetPosition(ImagenEnTrabajoCanvas); + + // Calcular el punto focal del zoom relativo al contenido del Canvas + var relativeX = cursorPosition.X * st.ScaleX + tt.X; + var relativeY = cursorPosition.Y * st.ScaleY + tt.Y; // Aplicar el zoom st.ScaleX *= zoomFactor; st.ScaleY *= zoomFactor; - // Calcular el nuevo desplazamiento para que el zoom se centre en la posición del cursor - ImagenEnTrabajoScrollViewer.UpdateLayout(); // Asegurarse de que el layout del ScrollViewer esté actualizado - var newHorizontalOffset = absoluteX * zoomFactor - cursorPosition.X; - var newVerticalOffset = absoluteY * zoomFactor - cursorPosition.Y; - - // Aplicar el nuevo desplazamiento - ImagenEnTrabajoScrollViewer.ScrollToHorizontalOffset(newHorizontalOffset); - ImagenEnTrabajoScrollViewer.ScrollToVerticalOffset(newVerticalOffset); + // Ajustar la transformación de traducción para mantener el punto de zoom centrado + tt.X = relativeX - cursorPosition.X * st.ScaleX; + tt.Y = relativeY - cursorPosition.Y * st.ScaleY; e.Handled = true; // Evita el procesamiento adicional del evento } diff --git a/ObjetosSim/Decorativos/ucTextPlate.xaml.cs b/ObjetosSim/Decorativos/ucTextPlate.xaml.cs index 48e6e2c..c166453 100644 --- a/ObjetosSim/Decorativos/ucTextPlate.xaml.cs +++ b/ObjetosSim/Decorativos/ucTextPlate.xaml.cs @@ -1,12 +1,8 @@ using System.Windows; using System.Windows.Controls; -using System.Windows.Media.Animation; using System.Windows.Media; using CommunityToolkit.Mvvm.ComponentModel; - -using CtrEditor.Siemens; -using CtrEditor.Simulacion; -using System.Windows.Input; +using Newtonsoft.Json; namespace CtrEditor.ObjetosSim @@ -18,6 +14,10 @@ namespace CtrEditor.ObjetosSim public partial class osTextPlate : osBase, IosBase { + [JsonIgnore] + public float offsetY; + [JsonIgnore] + public float offsetX; public static string NombreClase() { @@ -49,11 +49,11 @@ namespace CtrEditor.ObjetosSim public float angulo; public override void TopChanging(float oldValue, float newValue) { - UpdateChildsTop(newValue - oldValue); + offsetY = newValue - oldValue; } public override void LeftChanging(float oldValue, float newValue) { - UpdateChildsLeft(newValue - oldValue); + offsetX = newValue - oldValue; } public osTextPlate() diff --git a/ObjetosSim/Dinamicos/ucBotella.xaml.cs b/ObjetosSim/Dinamicos/ucBotella.xaml.cs index c703df9..6e75f65 100644 --- a/ObjetosSim/Dinamicos/ucBotella.xaml.cs +++ b/ObjetosSim/Dinamicos/ucBotella.xaml.cs @@ -136,7 +136,7 @@ namespace CtrEditor.ObjetosSim { // El UserControl ya se ha cargado y podemos obtener las coordenadas para // crear el objeto de simulacion - ActualizarLeftTop(); + base.ucLoaded(); SimGeometria = simulationManager.AddCircle(Diametro, GetCentro(), Mass); } public override void ucUnLoaded() diff --git a/ObjetosSim/Dinamicos/ucBotellaCuello.xaml.cs b/ObjetosSim/Dinamicos/ucBotellaCuello.xaml.cs index ba958df..ecec48b 100644 --- a/ObjetosSim/Dinamicos/ucBotellaCuello.xaml.cs +++ b/ObjetosSim/Dinamicos/ucBotellaCuello.xaml.cs @@ -123,7 +123,7 @@ namespace CtrEditor.ObjetosSim { // El UserControl ya se ha cargado y podemos obtener las coordenadas para // crear el objeto de simulacion - ActualizarLeftTop(); + base.ucLoaded(); SimGeometria = simulationManager.AddCircle(Diametro, GetCentro(), Mass); } public override void ucUnLoaded() diff --git a/ObjetosSim/Emuladores/ucBottGenerator.xaml.cs b/ObjetosSim/Emuladores/ucBottGenerator.xaml.cs index f2cf9d0..cfa1687 100644 --- a/ObjetosSim/Emuladores/ucBottGenerator.xaml.cs +++ b/ObjetosSim/Emuladores/ucBottGenerator.xaml.cs @@ -153,7 +153,7 @@ namespace CtrEditor.ObjetosSim { // El UserControl ya se ha cargado y podemos obtener las coordenadas para // crear el objeto de simulacion - ActualizarLeftTop(); + base.ucLoaded(); } } diff --git a/ObjetosSim/Emuladores/ucFiller.xaml.cs b/ObjetosSim/Emuladores/ucFiller.xaml.cs index f9898f1..dfea75d 100644 --- a/ObjetosSim/Emuladores/ucFiller.xaml.cs +++ b/ObjetosSim/Emuladores/ucFiller.xaml.cs @@ -154,7 +154,7 @@ namespace CtrEditor.ObjetosSim { // El UserControl ya se ha cargado y podemos obtener las coordenadas para // crear el objeto de simulacion - ActualizarLeftTop(); + base.ucLoaded(); } } diff --git a/ObjetosSim/Emuladores/ucTanque.xaml.cs b/ObjetosSim/Emuladores/ucTanque.xaml.cs index 89501c2..62358d0 100644 --- a/ObjetosSim/Emuladores/ucTanque.xaml.cs +++ b/ObjetosSim/Emuladores/ucTanque.xaml.cs @@ -87,7 +87,7 @@ namespace CtrEditor.ObjetosSim { // El UserControl ya se ha cargado y podemos obtener las coordenadas para // crear el objeto de simulacion - ActualizarLeftTop(); + base.ucLoaded(); } } diff --git a/ObjetosSim/Estaticos/ucDescarte.xaml.cs b/ObjetosSim/Estaticos/ucDescarte.xaml.cs index 904a9b5..0f05ecf 100644 --- a/ObjetosSim/Estaticos/ucDescarte.xaml.cs +++ b/ObjetosSim/Estaticos/ucDescarte.xaml.cs @@ -94,7 +94,7 @@ namespace CtrEditor.ObjetosSim { // El UserControl ya se ha cargado y podemos obtener las coordenadas para // crear el objeto de simulacion - ActualizarLeftTop(); + base.ucLoaded(); SimGeometria = simulationManager.AddDescarte(Diametro, GetCentro()); } public override void ucUnLoaded() diff --git a/ObjetosSim/Estaticos/ucGuia.xaml.cs b/ObjetosSim/Estaticos/ucGuia.xaml.cs index b032b3b..2e6766e 100644 --- a/ObjetosSim/Estaticos/ucGuia.xaml.cs +++ b/ObjetosSim/Estaticos/ucGuia.xaml.cs @@ -62,7 +62,7 @@ namespace CtrEditor.ObjetosSim { // El UserControl ya se ha cargado y podemos obtener las coordenadas para // crear el objeto de simulacion - ActualizarLeftTop(); + base.ucLoaded(); if (_visualRepresentation is ucGuia uc) SimGeometria = AddLine(simulationManager, uc.Guia); diff --git a/ObjetosSim/Estaticos/ucTransporteCurva.xaml.cs b/ObjetosSim/Estaticos/ucTransporteCurva.xaml.cs index 36051ab..08b5ba3 100644 --- a/ObjetosSim/Estaticos/ucTransporteCurva.xaml.cs +++ b/ObjetosSim/Estaticos/ucTransporteCurva.xaml.cs @@ -144,7 +144,7 @@ namespace CtrEditor.ObjetosSim { // El UserControl ya se ha cargado y podemos obtener las coordenadas para // crear el objeto de simulacion - ActualizarLeftTop(); + base.ucLoaded(); OnId_MotorChanged(Id_Motor); // Link Id_Motor = Motor diff --git a/ObjetosSim/Estaticos/ucTransporteGuias.xaml.cs b/ObjetosSim/Estaticos/ucTransporteGuias.xaml.cs index 012a35d..f91db8b 100644 --- a/ObjetosSim/Estaticos/ucTransporteGuias.xaml.cs +++ b/ObjetosSim/Estaticos/ucTransporteGuias.xaml.cs @@ -171,7 +171,7 @@ namespace CtrEditor.ObjetosSim { // El UserControl ya se ha cargado y podemos obtener las coordenadas para // crear el objeto de simulacion - ActualizarLeftTop(); + base.ucLoaded(); // El UserControl ya se ha cargado y podemos obtener las coordenadas para // crear el objeto de simulacion diff --git a/ObjetosSim/Estaticos/ucTransporteGuiasUnion.xaml.cs b/ObjetosSim/Estaticos/ucTransporteGuiasUnion.xaml.cs index 4af90ca..9b1a4b8 100644 --- a/ObjetosSim/Estaticos/ucTransporteGuiasUnion.xaml.cs +++ b/ObjetosSim/Estaticos/ucTransporteGuiasUnion.xaml.cs @@ -282,7 +282,7 @@ namespace CtrEditor.ObjetosSim { // El UserControl ya se ha cargado y podemos obtener las coordenadas para // crear el objeto de simulacion - ActualizarLeftTop(); + base.ucLoaded(); // El UserControl ya se ha cargado y podemos obtener las coordenadas para // crear el objeto de simulacion diff --git a/ObjetosSim/Estaticos/ucTransporteTTop.xaml.cs b/ObjetosSim/Estaticos/ucTransporteTTop.xaml.cs index afa7e86..ba081ab 100644 --- a/ObjetosSim/Estaticos/ucTransporteTTop.xaml.cs +++ b/ObjetosSim/Estaticos/ucTransporteTTop.xaml.cs @@ -152,7 +152,7 @@ namespace CtrEditor.ObjetosSim { // El UserControl ya se ha cargado y podemos obtener las coordenadas para // crear el objeto de simulacion - ActualizarLeftTop(); + base.ucLoaded(); OnId_MotorChanged(Id_Motor); // Link Id_Motor = Motor if (_visualRepresentation is ucTransporteTTop uc) diff --git a/ObjetosSim/Estaticos/ucVMmotorSim.xaml.cs b/ObjetosSim/Estaticos/ucVMmotorSim.xaml.cs index 5830ef9..46e6b83 100644 --- a/ObjetosSim/Estaticos/ucVMmotorSim.xaml.cs +++ b/ObjetosSim/Estaticos/ucVMmotorSim.xaml.cs @@ -107,7 +107,7 @@ namespace CtrEditor.ObjetosSim { // El UserControl ya se ha cargado y podemos obtener las coordenadas para // crear el objeto de simulacion - ActualizarLeftTop(); + base.ucLoaded(); OnVelocidadChanged(Velocidad); } diff --git a/ObjetosSim/Extraccion Datos/ucBuscarCoincidencias.xaml.cs b/ObjetosSim/Extraccion Datos/ucBuscarCoincidencias.xaml.cs index cf16f2e..92c5f94 100644 --- a/ObjetosSim/Extraccion Datos/ucBuscarCoincidencias.xaml.cs +++ b/ObjetosSim/Extraccion Datos/ucBuscarCoincidencias.xaml.cs @@ -17,7 +17,7 @@ using Size = System.Drawing.Size; using Ookii.Dialogs.Wpf; using Rect = System.Windows.Rect; using System.ComponentModel; - +using Newtonsoft.Json; namespace CtrEditor.ObjetosSim.Extraccion_Datos { @@ -28,6 +28,11 @@ namespace CtrEditor.ObjetosSim.Extraccion_Datos public partial class osBuscarCoincidencias : osBase, IosBase { + [JsonIgnore] + public float offsetY; + [JsonIgnore] + public float offsetX; + [ObservableProperty] List search_rectangles; @@ -84,11 +89,11 @@ namespace CtrEditor.ObjetosSim.Extraccion_Datos public override void TopChanging(float oldValue, float newValue) { - UpdateChildsTop(newValue - oldValue); + offsetY = newValue - oldValue; } public override void LeftChanging(float oldValue, float newValue) { - UpdateChildsLeft(newValue - oldValue); + offsetX = newValue - oldValue; } [ObservableProperty] diff --git a/ObjetosSim/SensoresComandos/ucBoton.xaml.cs b/ObjetosSim/SensoresComandos/ucBoton.xaml.cs index 6232a26..239b74f 100644 --- a/ObjetosSim/SensoresComandos/ucBoton.xaml.cs +++ b/ObjetosSim/SensoresComandos/ucBoton.xaml.cs @@ -113,7 +113,7 @@ namespace CtrEditor.ObjetosSim { // El UserControl ya se ha cargado y podemos obtener las coordenadas para // crear el objeto de simulacion - ActualizarLeftTop(); + base.ucLoaded(); } public override void ucUnLoaded() { diff --git a/ObjetosSim/SensoresComandos/ucGearEncoder.xaml.cs b/ObjetosSim/SensoresComandos/ucGearEncoder.xaml.cs index ebdc703..30aa079 100644 --- a/ObjetosSim/SensoresComandos/ucGearEncoder.xaml.cs +++ b/ObjetosSim/SensoresComandos/ucGearEncoder.xaml.cs @@ -3,9 +3,10 @@ using CtrEditor.Siemens; using System.Windows; using System.Windows.Controls; using System.Windows.Media; -using Newtonsoft.Json; using CommunityToolkit.Mvvm.ComponentModel; using System.Diagnostics; +using Xceed.Wpf.Toolkit.PropertyGrid.Attributes; +using System.ComponentModel; namespace CtrEditor.ObjetosSim { @@ -14,7 +15,7 @@ namespace CtrEditor.ObjetosSim /// public partial class osGearEncoder : osBase, IosBase { - private osBase _osMotor = null; + private osBase Motor = null; private Stopwatch Stopwatch = new Stopwatch(); private double stopwatch_last = 0; @@ -96,12 +97,31 @@ namespace CtrEditor.ObjetosSim public float ancho_Dientes; [ObservableProperty] public float giros_segundo_a_100; - [ObservableProperty] - public string motor; - partial void OnMotorChanged(string value) + [ObservableProperty] + [property: Description("Link to Motor")] + [property: Category("PLC link:")] + [property: ItemsSource(typeof(osBaseItemsSource))] + string id_Motor; + + partial void OnId_MotorChanged(string value) { - _osMotor = ObtenerLink(Motor, typeof(osVMmotorSim)); + if (Motor != null) + Motor.PropertyChanged -= OnMotorPropertyChanged; + if (_mainViewModel != null && value != null && value.Length > 0) + { + Motor = (osVMmotorSim)_mainViewModel.ObjetosSimulables.FirstOrDefault(s => (s is osVMmotorSim && s.Nombre == value), null); + if (Motor != null) + Motor.PropertyChanged += OnMotorPropertyChanged; + } + } + + private void OnMotorPropertyChanged(object sender, PropertyChangedEventArgs e) + { + if (e.PropertyName == nameof(osVMmotorSim.Nombre)) + { + Id_Motor = ((osVMmotorSim)sender).Nombre; + } } public osGearEncoder() @@ -121,9 +141,9 @@ namespace CtrEditor.ObjetosSim } public override void UpdatePLC(PLCModel plc, int elapsedMilliseconds) { - if (_osMotor != null) + if (Motor != null) { - if (_osMotor is osVMmotorSim motor) + if (Motor is osVMmotorSim motor) { VelocidadActual = motor.Velocidad; @@ -139,8 +159,7 @@ namespace CtrEditor.ObjetosSim // Actualizar el ángulo Angulo = (Angulo + incrementoAngulo) % 360; } - } else if (Motor.Length>0) - _osMotor = ObtenerLink(Motor, typeof(osVMmotorSim)); + } } public bool DetectarDiente() @@ -190,8 +209,8 @@ namespace CtrEditor.ObjetosSim { // El UserControl ya se ha cargado y podemos obtener las coordenadas para // crear el objeto de simulacion - ActualizarLeftTop(); - + base.ucLoaded(); + OnId_MotorChanged(Id_Motor); // Link Id_Motor = Motor } } diff --git a/ObjetosSim/SensoresComandos/ucSensTemperatura.xaml.cs b/ObjetosSim/SensoresComandos/ucSensTemperatura.xaml.cs index f981465..435d80e 100644 --- a/ObjetosSim/SensoresComandos/ucSensTemperatura.xaml.cs +++ b/ObjetosSim/SensoresComandos/ucSensTemperatura.xaml.cs @@ -69,7 +69,7 @@ namespace CtrEditor.ObjetosSim { // El UserControl ya se ha cargado y podemos obtener las coordenadas para // crear el objeto de simulacion - ActualizarLeftTop(); + base.ucLoaded(); } diff --git a/ObjetosSim/TagsSignals/ucAnalogTag.xaml.cs b/ObjetosSim/TagsSignals/ucAnalogTag.xaml.cs index 02ee901..cb88d10 100644 --- a/ObjetosSim/TagsSignals/ucAnalogTag.xaml.cs +++ b/ObjetosSim/TagsSignals/ucAnalogTag.xaml.cs @@ -94,7 +94,7 @@ namespace CtrEditor.ObjetosSim { // El UserControl ya se ha cargado y podemos obtener las coordenadas para // crear el objeto de simulacion - ActualizarLeftTop(); + base.ucLoaded(); } } diff --git a/ObjetosSim/TagsSignals/ucBoolTag.xaml.cs b/ObjetosSim/TagsSignals/ucBoolTag.xaml.cs index e305341..8039eaa 100644 --- a/ObjetosSim/TagsSignals/ucBoolTag.xaml.cs +++ b/ObjetosSim/TagsSignals/ucBoolTag.xaml.cs @@ -70,7 +70,7 @@ namespace CtrEditor.ObjetosSim { // El UserControl ya se ha cargado y podemos obtener las coordenadas para // crear el objeto de simulacion - ActualizarLeftTop(); + base.ucLoaded(); } } diff --git a/ObjetosSim/TagsSignals/ucConsensGeneric.xaml.cs b/ObjetosSim/TagsSignals/ucConsensGeneric.xaml.cs index 0802a61..cb3d4cc 100644 --- a/ObjetosSim/TagsSignals/ucConsensGeneric.xaml.cs +++ b/ObjetosSim/TagsSignals/ucConsensGeneric.xaml.cs @@ -38,7 +38,7 @@ namespace CtrEditor.ObjetosSim { // El UserControl ya se ha cargado y podemos obtener las coordenadas para // crear el objeto de simulacion - ActualizarLeftTop(); + base.ucLoaded(); //if (_visualRepresentation is ucConsensGeneric uc) // Tags = UserControlFactory.CargarPropiedadesosDatosTags(Consensos, uc.PanelEdicion, null); diff --git a/ObjetosSim/Traces/ucTraceSimple.xaml.cs b/ObjetosSim/Traces/ucTraceSimple.xaml.cs index 91155c5..dc469c0 100644 --- a/ObjetosSim/Traces/ucTraceSimple.xaml.cs +++ b/ObjetosSim/Traces/ucTraceSimple.xaml.cs @@ -119,7 +119,7 @@ namespace CtrEditor.ObjetosSim { // El UserControl ya se ha cargado y podemos obtener las coordenadas para // crear el objeto de simulacion - ActualizarLeftTop(); + base.ucLoaded(); } } diff --git a/ObjetosSim/osBase.cs b/ObjetosSim/osBase.cs index b89638c..01efdb8 100644 --- a/ObjetosSim/osBase.cs +++ b/ObjetosSim/osBase.cs @@ -121,32 +121,42 @@ namespace CtrEditor.ObjetosSim [ObservableProperty] [property: Description("This is a link to a faceplate. It works like an anchor.")] [property: Category("Group:")] + [property: ItemsSource(typeof(osBaseItemsSource))] private string group_Panel; - protected void UpdateChildsTop(float offsetY) + [JsonIgnore] + private osTextPlate TextPlate; + [JsonIgnore] + private bool isUpdatingFromTextPlate = false; + + partial void OnGroup_PanelChanged(string value) { - if (!string.IsNullOrEmpty(Nombre) && _mainViewModel != null) + if (TextPlate != null) + TextPlate.PropertyChanged -= OnTextPlatePropertyChanged; + if (_mainViewModel != null && value != null && value.Length > 0) { - foreach (var objetoSimulable in _mainViewModel.ObjetosSimulables) - { - if (objetoSimulable != this && objetoSimulable.Group_Panel == Nombre) - { - objetoSimulable.Top += offsetY; - } - } + TextPlate = (osTextPlate)_mainViewModel.ObjetosSimulables.FirstOrDefault(s => (s is osTextPlate && s.Nombre == value), null); + if (TextPlate != null) + TextPlate.PropertyChanged += OnTextPlatePropertyChanged; } } - protected void UpdateChildsLeft(float offsetX) + + private void OnTextPlatePropertyChanged(object sender, PropertyChangedEventArgs e) { - if (!string.IsNullOrEmpty(Nombre) && _mainViewModel != null) + if (!isUpdatingFromTextPlate) { - foreach (var objetoSimulable in _mainViewModel.ObjetosSimulables) - { - if (objetoSimulable != this && objetoSimulable.Group_Panel == Nombre) - { - objetoSimulable.Left += offsetX; - } - } + isUpdatingFromTextPlate = true; + + if (e.PropertyName == nameof(osTextPlate.Nombre)) + Group_Panel = ((osTextPlate)sender).Nombre; + + if (e.PropertyName == nameof(osTextPlate.Top)) + Top += ((osTextPlate)sender).offsetY; + + if (e.PropertyName == nameof(osTextPlate.Left)) + Left += ((osTextPlate)sender).offsetX; + + isUpdatingFromTextPlate = false; } } @@ -381,6 +391,7 @@ namespace CtrEditor.ObjetosSim public virtual void ucLoaded() { ActualizarLeftTop(); + OnGroup_PanelChanged(Group_Panel); // Establece el link y se suscribe a los eventos } /// @@ -443,28 +454,6 @@ namespace CtrEditor.ObjetosSim /// public virtual void UpdatePLCPrimerCiclo() { } - /// - /// Crea una conexion entre los osBase segun el NameLink sea igual al nombre de algun osBase siempre que se cumpla - /// con el requisito que el osBase encontrado sea de tipo tipoOsBase - /// - /// - /// - /// - protected osBase ObtenerLink(string NameLink, Type tipoOsBase) - { - if (!string.IsNullOrEmpty(NameLink) && _mainViewModel != null) - { - foreach (var objetoSimulable in _mainViewModel.ObjetosSimulables) - { - if (tipoOsBase.IsInstanceOfType(objetoSimulable) && objetoSimulable.Nombre == NameLink) - { - return objetoSimulable; - } - } - } - return null; - } - protected Storyboard CrearAnimacionMultiStoryBoardTrasnporte(Rectangle transporte, bool invertirDireccion) { if (_visualRepresentation == null) return null; diff --git a/ObjetosSim/ucBasicExample.xaml.cs b/ObjetosSim/ucBasicExample.xaml.cs index 48b2ac1..b3acc3a 100644 --- a/ObjetosSim/ucBasicExample.xaml.cs +++ b/ObjetosSim/ucBasicExample.xaml.cs @@ -130,7 +130,7 @@ namespace CtrEditor.ObjetosSim { // El UserControl ya se ha cargado y podemos obtener las coordenadas para // crear el objeto de simulacion - ActualizarLeftTop(); + base.ucLoaded(); if (_visualRepresentation is ucBasicExample uc) {