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)
{