diff --git a/MainViewModel.cs b/MainViewModel.cs index 7ad26c2..c54036d 100644 --- a/MainViewModel.cs +++ b/MainViewModel.cs @@ -59,8 +59,8 @@ namespace CtrEditor // Evento que se dispara cuando se selecciona una nueva imagen public event EventHandler ImageSelected; public event EventHandler TickSimulacion; - public event Action OnUserControlSelected; + // Propiedades private bool isSimulationRunning; private bool isConnected; @@ -70,6 +70,9 @@ namespace CtrEditor private ObservableCollection _objetosSimulables = new ObservableCollection(); private float _left; private float _top; + private MainWindow mainWindow; + + public MainWindow MainWindow { get => mainWindow; set => mainWindow = value; } public float CanvasLeft { @@ -80,6 +83,7 @@ namespace CtrEditor OnPropertyChanged(nameof(CanvasLeft)); } } + public float CanvasTop { get => _top; @@ -200,6 +204,9 @@ namespace CtrEditor } } + // + // Constructor + // public MainViewModel() { @@ -237,21 +244,35 @@ namespace CtrEditor directorioTrabajo = EstadoPersistente.Instance.directorio; } - - - public void CrearUserControl(Type tipoSimulable) + // Crear un nuevo Objeto + private void ExecuteDoubleClick(object parameter) { - // Crear una nueva instancia del osBase correspondiente - osBase? newosBase = UserControlFactory.GetInstanceForType(tipoSimulable); - if (newosBase != null) + if (parameter is TipoSimulable tipoSimulable) { - if (CrearUsercontrol(newosBase)) - // Añadir el nuevo osBase a la colección de objetos simulables - ObjetosSimulables.Add(newosBase); + CrearObjetoSimulable(tipoSimulable.Tipo); } } - private bool CrearUsercontrol(osBase osObjeto) + public void CrearObjetoSimulable(Type tipoSimulable) + { + // Crear una nueva instancia del osBase correspondiente + osBase? NuevoOsBase = UserControlFactory.GetInstanceForType(tipoSimulable); + + var CentroCanvas = MainWindow.ObtenerCentroCanvasPixels(); + + NuevoOsBase.Left = CentroCanvas.X; + NuevoOsBase.Top = CentroCanvas.Y; + + if (NuevoOsBase != null) + { + if (CrearUserControlDesdeObjetoSimulable(NuevoOsBase)) + // Añadir el nuevo osBase a la colección de objetos simulables + ObjetosSimulables.Add(NuevoOsBase); + } + } + + // Crear UserControl desde osBase : Nuevo o desde Deserealizacion + private bool CrearUserControlDesdeObjetoSimulable(osBase osObjeto) { Type tipoObjeto = osObjeto.GetType(); @@ -264,21 +285,13 @@ namespace CtrEditor UserControlFactory.AssignDatos(userControl, osObjeto, simulationManager); osObjeto._mainViewModel = this; - OnUserControlSelected?.Invoke(userControl); + MainWindow.AgregarRegistrarUserControlCanvas(userControl); return true; } return false; } - private void ExecuteDoubleClick(object parameter) - { - if (parameter is TipoSimulable tipoSimulable) - { - CrearUserControl(tipoSimulable.Tipo); - } - } - private void InitializeTipoSimulableList() { var baseType = typeof(osBase); @@ -455,7 +468,7 @@ namespace CtrEditor // Recorrer la colección de objetos simulables foreach (var objetoSimulable in ObjetosSimulables) - CrearUsercontrol(objetoSimulable); + CrearUserControlDesdeObjetoSimulable(objetoSimulable); } } } diff --git a/MainWindow.xaml.cs b/MainWindow.xaml.cs index 2709948..6b369a6 100644 --- a/MainWindow.xaml.cs +++ b/MainWindow.xaml.cs @@ -61,15 +61,14 @@ namespace CtrEditor { if (DataContext is MainViewModel viewModel) { - viewModel.ImageSelected += ViewModel_ImageSelected; - //viewModel.TickSimulacion += MainViewModel_TickSimulacion; - viewModel.OnUserControlSelected += AgregarUserControl; + viewModel.MainWindow = this; + viewModel.ImageSelected += ViewModel_ImageSelected; viewModel?.LoadInitialData(); // Carga la primera imagen por defecto una vez cargada la ventana principal viewModel.simulationManager.DebugCanvas = ImagenEnTrabajoCanvas; } } - private (float X, float Y) ObtenerCentroCanvasPixels() + public (float X, float Y) ObtenerCentroCanvasPixels() { var scaleTransform = ImagenEnTrabajoCanvas.LayoutTransform as ScaleTransform; float scaleX = (float)(scaleTransform?.ScaleX ?? 1.0); @@ -90,48 +89,28 @@ namespace CtrEditor return (centerX, centerY); } - private (float X, float Y) ObtenerCentroCanvasMeters() + public (float X, float Y) ObtenerCentroCanvasMeters() { var c = ObtenerCentroCanvasPixels(); return (PixelToMeter.Instance.calc.PixelsToMeters(c.X), PixelToMeter.Instance.calc.PixelsToMeters(c.Y)); } - private void AgregarUserControl(UserControl userControl) + public void SuscribirEventos(UserControl userControl) + { + userControl.MouseEnter += UserControl_MouseEnter; + userControl.MouseLeave += UserControl_MouseLeave; + + // Suscribir a eventos de mouse para panning + userControl.MouseLeftButtonDown += UserControl_MouseLeftButtonDown; + userControl.MouseLeftButtonUp += UserControl_MouseLeftButtonUp; + userControl.MouseMove += UserControl_MouseMove; + } + + public void AgregarRegistrarUserControlCanvas(UserControl userControl) { if (userControl is IDataContainer dataContainer) { - var NuevoOS = dataContainer.Datos; - if (!NuevoOS.Inicializado) // Aun no fue inicializado - { - Random rnd = new Random(); - - var centro = ObtenerCentroCanvasPixels(); - - // Ajusta la posición del UserControl para que esté centrado en el área visible - double leftPixels = centro.X - (userControl.ActualWidth / 2); - double topPixels = centro.Y - (userControl.ActualHeight / 2); - - // Establece la posición del UserControl - NuevoOS.Left = PixelToMeter.Instance.calc.PixelsToMeters((float)leftPixels + (float)(rnd.NextDouble() - 0.5) ); - NuevoOS.Top = PixelToMeter.Instance.calc.PixelsToMeters((float)topPixels + (float)(rnd.NextDouble() - 0.5) ); - - NuevoOS.Inicializado = true; - } - else - { - // Fuerza a Establecer la posición del UserControl - NuevoOS.Left = NuevoOS.Left; - NuevoOS.Top = NuevoOS.Top; - } - - // Suscribirse a eventos de mouse para marcar el Control - userControl.MouseEnter += UserControl_MouseEnter; - userControl.MouseLeave += UserControl_MouseLeave; - - // Suscribir a eventos de mouse para panning - userControl.MouseLeftButtonDown += UserControl_MouseLeftButtonDown; - userControl.MouseLeftButtonUp += UserControl_MouseLeftButtonUp; - userControl.MouseMove += UserControl_MouseMove; + SuscribirEventos(userControl); // Añade el UserControl al Canvas Canvas.SetZIndex(userControl, dataContainer.ZIndex()); diff --git a/ObjetosSim/osBase.cs b/ObjetosSim/osBase.cs index 607e349..9d86fe7 100644 --- a/ObjetosSim/osBase.cs +++ b/ObjetosSim/osBase.cs @@ -89,6 +89,12 @@ namespace CtrEditor.ObjetosSim return null; } + public void ActualizarLeftTop() + { + Left = Left; + Top = Top; + } + public bool LeerBitTag(PLCModel plc, string Tag) { if (!string.IsNullOrEmpty(Tag)) diff --git a/ObjetosSim/ucBasicExample.xaml.cs b/ObjetosSim/ucBasicExample.xaml.cs index 7448c26..da10b1b 100644 --- a/ObjetosSim/ucBasicExample.xaml.cs +++ b/ObjetosSim/ucBasicExample.xaml.cs @@ -120,6 +120,7 @@ namespace CtrEditor.ObjetosSim { // El UserControl ya se ha cargado y podemos obtener las coordenadas para // crear el objeto de simulacion + ActualizarLeftTop(); } } diff --git a/ObjetosSim/ucBotella.xaml.cs b/ObjetosSim/ucBotella.xaml.cs index 25364f9..189c00f 100644 --- a/ObjetosSim/ucBotella.xaml.cs +++ b/ObjetosSim/ucBotella.xaml.cs @@ -150,6 +150,7 @@ namespace CtrEditor.ObjetosSim { // El UserControl ya se ha cargado y podemos obtener las coordenadas para // crear el objeto de simulacion + ActualizarLeftTop(); Simulacion_Botella = simulationManager.AddCircle(Diametro, _centro, Mass); } diff --git a/ObjetosSim/ucBoton.xaml.cs b/ObjetosSim/ucBoton.xaml.cs index e8b43dd..06f0870 100644 --- a/ObjetosSim/ucBoton.xaml.cs +++ b/ObjetosSim/ucBoton.xaml.cs @@ -162,6 +162,7 @@ namespace CtrEditor.ObjetosSim { // El UserControl ya se ha cargado y podemos obtener las coordenadas para // crear el objeto de simulacion + ActualizarLeftTop(); } } diff --git a/ObjetosSim/ucFiller.xaml.cs b/ObjetosSim/ucFiller.xaml.cs index 8c0ceb9..25ddd32 100644 --- a/ObjetosSim/ucFiller.xaml.cs +++ b/ObjetosSim/ucFiller.xaml.cs @@ -193,6 +193,7 @@ namespace CtrEditor.ObjetosSim { // El UserControl ya se ha cargado y podemos obtener las coordenadas para // crear el objeto de simulacion + ActualizarLeftTop(); } } diff --git a/ObjetosSim/ucGuia.xaml.cs b/ObjetosSim/ucGuia.xaml.cs index a53bf3f..7ce67f8 100644 --- a/ObjetosSim/ucGuia.xaml.cs +++ b/ObjetosSim/ucGuia.xaml.cs @@ -126,6 +126,8 @@ namespace CtrEditor.ObjetosSim { // El UserControl ya se ha cargado y podemos obtener las coordenadas para // crear el objeto de simulacion + ActualizarLeftTop(); + if (_visualRepresentation is ucGuia uc) Simulation_Guia = AddLine(simulationManager, uc.Guia); } diff --git a/ObjetosSim/ucSensTemperatura.xaml.cs b/ObjetosSim/ucSensTemperatura.xaml.cs index 72c92e3..132f78f 100644 --- a/ObjetosSim/ucSensTemperatura.xaml.cs +++ b/ObjetosSim/ucSensTemperatura.xaml.cs @@ -169,6 +169,8 @@ namespace CtrEditor.ObjetosSim { // El UserControl ya se ha cargado y podemos obtener las coordenadas para // crear el objeto de simulacion + ActualizarLeftTop(); + } } diff --git a/ObjetosSim/ucTanque.xaml.cs b/ObjetosSim/ucTanque.xaml.cs index 1b431fc..ba7dae9 100644 --- a/ObjetosSim/ucTanque.xaml.cs +++ b/ObjetosSim/ucTanque.xaml.cs @@ -287,6 +287,8 @@ namespace CtrEditor.ObjetosSim { // El UserControl ya se ha cargado y podemos obtener las coordenadas para // crear el objeto de simulacion + ActualizarLeftTop(); + } } diff --git a/ObjetosSim/ucTransporteGuias.xaml.cs b/ObjetosSim/ucTransporteGuias.xaml.cs index 963b71b..d8186b1 100644 --- a/ObjetosSim/ucTransporteGuias.xaml.cs +++ b/ObjetosSim/ucTransporteGuias.xaml.cs @@ -211,6 +211,8 @@ namespace CtrEditor.ObjetosSim { // El UserControl ya se ha cargado y podemos obtener las coordenadas para // crear el objeto de simulacion + ActualizarLeftTop(); + simulationManager.rectangles.Add(TransporteCentral); simulationManager.lines.Add(Guia_Superior); simulationManager.lines.Add(Guia_Inferior); diff --git a/ObjetosSim/ucTransporteTTop.xaml.cs b/ObjetosSim/ucTransporteTTop.xaml.cs index 0d802af..1811a4b 100644 --- a/ObjetosSim/ucTransporteTTop.xaml.cs +++ b/ObjetosSim/ucTransporteTTop.xaml.cs @@ -163,6 +163,8 @@ namespace CtrEditor.ObjetosSim { // El UserControl ya se ha cargado y podemos obtener las coordenadas para // crear el objeto de simulacion + ActualizarLeftTop(); + if (_visualRepresentation is ucTransporteTTop uc) Simulation_Transporte = AddRectangle(simulationManager, uc.Transporte, Alto, Ancho, Angulo); } diff --git a/ObjetosSim/ucVMmotorSim.xaml.cs b/ObjetosSim/ucVMmotorSim.xaml.cs index 438a43d..d4acaef 100644 --- a/ObjetosSim/ucVMmotorSim.xaml.cs +++ b/ObjetosSim/ucVMmotorSim.xaml.cs @@ -198,6 +198,8 @@ namespace CtrEditor.ObjetosSim { // El UserControl ya se ha cargado y podemos obtener las coordenadas para // crear el objeto de simulacion + ActualizarLeftTop(); + } }