Utilizando MainWindow desde MainViewModel

This commit is contained in:
Miguel 2024-05-18 11:49:02 +02:00
parent 664d325de8
commit ebe7986142
13 changed files with 73 additions and 59 deletions

View File

@ -59,8 +59,8 @@ namespace CtrEditor
// Evento que se dispara cuando se selecciona una nueva imagen
public event EventHandler<string> ImageSelected;
public event EventHandler<TickSimulacionEventArgs> TickSimulacion;
public event Action<UserControl> OnUserControlSelected;
// Propiedades
private bool isSimulationRunning;
private bool isConnected;
@ -70,6 +70,9 @@ namespace CtrEditor
private ObservableCollection<osBase> _objetosSimulables = new ObservableCollection<osBase>();
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);
}
}
}

View File

@ -61,15 +61,14 @@ namespace CtrEditor
{
if (DataContext is MainViewModel viewModel)
{
viewModel.MainWindow = this;
viewModel.ImageSelected += ViewModel_ImageSelected;
//viewModel.TickSimulacion += MainViewModel_TickSimulacion;
viewModel.OnUserControlSelected += AgregarUserControl;
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());

View File

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

View File

@ -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();
}
}

View File

@ -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);
}

View File

@ -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();
}
}

View File

@ -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();
}
}

View File

@ -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);
}

View File

@ -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();
}
}

View File

@ -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();
}
}

View File

@ -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);

View File

@ -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);
}

View File

@ -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();
}
}