El panel de edicion de atributos funcionando.

This commit is contained in:
Miguel 2024-05-04 20:35:06 +02:00
parent 58b429c7bf
commit d4ca7e3aa7
9 changed files with 318 additions and 110 deletions

View File

@ -15,10 +15,12 @@ using static System.Runtime.InteropServices.JavaScript.JSType;
using System.Windows.Threading;
using CtrEditor.ObjetosSim;
using System.IO;
using System.Windows.Forms;
// using System.Windows.Forms;
using System.Text.Json.Serialization;
using System.Text.Json;
using Newtonsoft.Json;
using System.Windows.Data;
using System.Windows;
namespace CtrEditor
{
@ -28,6 +30,7 @@ namespace CtrEditor
public DatosDeTrabajo datosDeTrabajo { get; }
public ObservableCollection<string> listaImagenes { get; private set; } // Publicación de las claves del diccionario
public ObservableCollection<TipoSimulable> ListaOsBase { get; } = new ObservableCollection<TipoSimulable>();
private ObservableCollection<osBase> _objetosSimulables = new ObservableCollection<osBase>();
private readonly DispatcherTimer _timerSimulacion;
@ -39,7 +42,7 @@ 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<osBase> OnUserControlSelected;
public event Action<UserControl> OnUserControlSelected;
public MainViewModel()
{
@ -85,11 +88,13 @@ namespace CtrEditor
{
if (parameter is TipoSimulable tipoSimulable)
{
var instance = Activator.CreateInstance(tipoSimulable.Tipo) as osBase;
if (instance != null)
// Crear una nueva instancia del osBase correspondiente
osBase? newosBase = UserControlFactory.GetInstanceForType(tipoSimulable.Tipo);
if (newosBase != null)
{
ObjetosSimulables.Add(instance);
OnUserControlSelected?.Invoke(instance);
if (CrearUsercontrol(newosBase))
// Añadir el nuevo osBase a la colección de objetos simulables
ObjetosSimulables.Add(newosBase);
}
}
}
@ -181,23 +186,21 @@ namespace CtrEditor
//
// Lista de osBase
//
private ObservableCollection<osBase> objetosSimulables = new ObservableCollection<osBase>();
public ObservableCollection<osBase> ObjetosSimulables
{
get => objetosSimulables;
get => _objetosSimulables;
set
{
if (objetosSimulables != value)
if (_objetosSimulables != value)
{
objetosSimulables = value;
_objetosSimulables = value;
OnPropertyChanged(nameof(ObjetosSimulables));
}
}
}
public void SaveStateObjetosSimulables()
{
if (_selectedImage != null)
@ -208,11 +211,11 @@ namespace CtrEditor
NullValueHandling = NullValueHandling.Ignore,
TypeNameHandling = TypeNameHandling.Auto
};
foreach (var obj in objetosSimulables)
foreach (var obj in ObjetosSimulables)
{
obj.VisualRepresentation = null;
}
var serializedData = JsonConvert.SerializeObject(objetosSimulables, settings);
var serializedData = JsonConvert.SerializeObject(ObjetosSimulables, settings);
File.WriteAllText(datosDeTrabajo.ObtenerPathImagenConExtension(_selectedImage, ".json"), serializedData);
}
}
@ -235,11 +238,13 @@ namespace CtrEditor
PreserveReferencesHandling = PreserveReferencesHandling.Objects,
ConstructorHandling = ConstructorHandling.AllowNonPublicDefaultConstructor
};
objetosSimulables = JsonConvert.DeserializeObject<ObservableCollection<osBase>>(jsonString, settings);
foreach (var obj in objetosSimulables)
if (jsonString != null)
{
OnUserControlSelected?.Invoke(obj);
ObjetosSimulables = JsonConvert.DeserializeObject<ObservableCollection<osBase>>(jsonString, settings);
// Ahora recorres la colección de objetos simulables
foreach (var objetoSimulable in ObjetosSimulables)
CrearUsercontrol(objetoSimulable);
}
}
}
@ -247,6 +252,27 @@ namespace CtrEditor
catch { /* Consider logging the error or handling it appropriately */ }
}
private bool CrearUsercontrol(osBase osObjeto)
{
Type tipoObjeto = osObjeto.GetType();
// Obtén el UserControl correspondiente para el tipo de objeto
UserControl? userControl = UserControlFactory.GetControlForType(tipoObjeto);
if (userControl != null)
{
// Asignar los datos al UserControl
UserControlFactory.AssignDatos(userControl, osObjeto);
OnUserControlSelected?.Invoke(userControl);
return true;
}
return false;
}
// Implementación de INotifyPropertyChanged...
public event PropertyChangedEventHandler PropertyChanged;

View File

@ -69,7 +69,10 @@
<RowDefinition Height="1*"/>
<RowDefinition Height="1*"/>
</Grid.RowDefinitions>
<ListBox x:Name="ListaROIs" Grid.Row="0" Margin="5"/>
<ListBox x:Name="ListaOs"
Grid.Row="0"
Margin="5"
ItemsSource="{Binding ObjetosSimulables}" DisplayMemberPath="Nombre" SelectionChanged="ListaOs_SelectionChanged"/>
<StackPanel x:Name="PanelEdicion" Grid.Row="1" Margin="5">
<!-- Aquí puedes agregar los controles para editar propiedades -->
</StackPanel>

View File

@ -9,6 +9,7 @@ using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using CtrEditor.ObjetosSim;
using static System.Runtime.InteropServices.JavaScript.JSType;
namespace CtrEditor
{
@ -53,61 +54,56 @@ namespace CtrEditor
}
}
private void AgregarUserControl(osBase NuevoOS)
private void AgregarUserControl(UserControl userControl)
{
if (NuevoOS != null)
if (userControl is IDataContainer dataContainer)
{
if (NuevoOS.VisualRepresentation is null)
var NuevoOS = dataContainer.Datos;
if (!NuevoOS.Inicializado) // Aun no fue inicializado
{
UserControl userControl = UserControlFactory.GetControlForType(NuevoOS.GetType());
NuevoOS.VisualRepresentation = userControl;
// Obtiene el factor de escala
var scaleTransform = ImagenEnTrabajoCanvas.LayoutTransform as ScaleTransform;
double scaleX = scaleTransform?.ScaleX ?? 1.0;
double scaleY = scaleTransform?.ScaleY ?? 1.0;
if (!NuevoOS.Inicializado) // Aun no fue inicializado
{
// Obtiene el factor de escala
var scaleTransform = ImagenEnTrabajoCanvas.LayoutTransform as ScaleTransform;
double scaleX = scaleTransform?.ScaleX ?? 1.0;
double scaleY = scaleTransform?.ScaleY ?? 1.0;
// Obtiene el área visible del ScrollViewer
double visibleWidth = ImagenEnTrabajoScrollViewer.ViewportWidth;
double visibleHeight = ImagenEnTrabajoScrollViewer.ViewportHeight;
// Obtiene el área visible del ScrollViewer
double visibleWidth = ImagenEnTrabajoScrollViewer.ViewportWidth;
double visibleHeight = ImagenEnTrabajoScrollViewer.ViewportHeight;
// Obtiene la posición actual del desplazamiento ajustada por el zoom
double offsetX = ImagenEnTrabajoScrollViewer.HorizontalOffset / scaleX;
double offsetY = ImagenEnTrabajoScrollViewer.VerticalOffset / scaleY;
// Obtiene la posición actual del desplazamiento ajustada por el zoom
double offsetX = ImagenEnTrabajoScrollViewer.HorizontalOffset / scaleX;
double offsetY = ImagenEnTrabajoScrollViewer.VerticalOffset / scaleY;
// Calcula el centro visible ajustado
double centerX = offsetX + (visibleWidth / scaleX) / 2;
double centerY = offsetY + (visibleHeight / scaleY) / 2;
// Calcula el centro visible ajustado
double centerX = offsetX + (visibleWidth / scaleX) / 2;
double centerY = offsetY + (visibleHeight / scaleY) / 2;
// Ajusta la posición del UserControl para que esté centrado en el área visible
double left = centerX - (userControl.ActualWidth / 2);
double top = centerY - (userControl.ActualHeight / 2);
// Establece la posición del UserControl
NuevoOS.Left = left;
NuevoOS.Top = top;
NuevoOS.Inicializado = true;
}
// Ajusta la posición del UserControl para que esté centrado en el área visible
double left = centerX - (userControl.ActualWidth / 2);
double top = centerY - (userControl.ActualHeight / 2);
// Establece la posición del UserControl
Canvas.SetLeft(userControl, NuevoOS.Left);
Canvas.SetTop(userControl, NuevoOS.Top);
NuevoOS.Left = left;
NuevoOS.Top = 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;
// Añade el UserControl al Canvas
ImagenEnTrabajoCanvas.Children.Add(userControl);
NuevoOS.Inicializado = true;
}
// Establece la posición del UserControl
Canvas.SetLeft(userControl, NuevoOS.Left);
Canvas.SetTop(userControl, 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;
// Añade el UserControl al Canvas
ImagenEnTrabajoCanvas.Children.Add(userControl);
}
}
@ -203,8 +199,9 @@ namespace CtrEditor
var newX = Canvas.GetLeft(_currentDraggingControl) + dx;
var newY = Canvas.GetTop(_currentDraggingControl) + dy;
Canvas.SetLeft(_currentDraggingControl, newX);
Canvas.SetTop(_currentDraggingControl, newY);
if (_currentDraggingControl is IDataContainer dataContainer)
dataContainer.Move(newX, newY);
_startPointUserControl = currentPosition; // Actualiza el punto inicial para el siguiente movimiento
}
else if (_isRotatingUserControl)
@ -227,9 +224,11 @@ namespace CtrEditor
double deltaY = currentPosition.Y - _startPointUserControl.Y;
double angle = Math.Atan2(deltaY, deltaX) * (180 / Math.PI);
RotateTransform rotateTransform = control.RenderTransform as RotateTransform;
rotateTransform.Angle = angle; // - _initialAngleUserControl; // Asegúrate de ajustar esta parte según cómo calcules el ángulo inicial
//RotateTransform rotateTransform = control.RenderTransform as RotateTransform;
//rotateTransform.Angle = angle; // - _initialAngleUserControl; // Asegúrate de ajustar esta parte según cómo calcules el ángulo inicial
if (control is IDataContainer dataContainer)
dataContainer.Rotate(angle);
// Actualizar el ángulo mostrado
_angleDisplayTextBlock.Text = $"Ángulo: {angle:F2}°";
@ -252,17 +251,8 @@ namespace CtrEditor
double newWidth = Math.Max(control.ActualWidth + widthChange, control.MinWidth);
control.Width = newWidth; // Asegurar que no sea menor que el mínimo
// Actualizar el ancho de los elementos internos
if (control.Content is Panel panel)
{
foreach (var child in panel.Children)
{
if (child is Rectangle rect)
{
rect.Width = newWidth; // Establece el nuevo ancho
}
}
}
if (control is IDataContainer dataContainer)
dataContainer.Resize(newWidth, 0);
// Actualizar el punto de inicio para el próximo evento de movimiento
_startPointUserControl = currentPosition;
@ -392,6 +382,40 @@ namespace CtrEditor
e.Handled = true; // Evita el procesamiento adicional del evento
}
private void ListaOs_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
PanelEdicion.Children.Clear(); // Limpiar el panel existente
if (e.AddedItems.Count > 0 && e.AddedItems[0] is osBase selectedObject)
CargarPropiedadesosDatos(selectedObject);
}
private void CargarPropiedadesosDatos(osBase selectedObject)
{
PanelEdicion.Children.Clear(); // Limpiar el panel existente
// Reflexión para obtener todas las propiedades del objeto seleccionado
var properties = selectedObject.GetType().GetProperties();
foreach (var property in properties)
{
// Crear un Label y un TextBox para cada propiedad
var label = new Label { Content = property.Name };
var textBox = new TextBox { Width = 200, Margin = new Thickness(2) };
textBox.SetBinding(TextBox.TextProperty, new Binding(property.Name)
{
Source = selectedObject,
Mode = BindingMode.TwoWay,
UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged
});
// Agregar controles al StackPanel
PanelEdicion.Children.Add(label);
PanelEdicion.Children.Add(textBox);
}
}
private void MainViewModel_TickSimulacion(object sender, TickSimulacionEventArgs e)
{
// aquí puedes agregar la lógica para actualizar tus UserControl

View File

@ -1,4 +1,5 @@
using System;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
@ -9,7 +10,7 @@ namespace CtrEditor.ObjetosSim
{
public static class UserControlFactory
{
public static UserControl GetControlForType(Type tipoObjeto)
public static UserControl? GetControlForType(Type tipoObjeto)
{
if (tipoObjeto == typeof(osBotella))
return new ucBotella();
@ -18,9 +19,42 @@ namespace CtrEditor.ObjetosSim
// Puedes añadir más condiciones para otros tipos
return null;
}
public static osBase? GetInstanceForType(Type tipoObjeto)
{
if (tipoObjeto == typeof(osBotella))
return new osBotella();
if (tipoObjeto == typeof(osTransporteTTop))
return new osTransporteTTop();
// Puedes añadir más condiciones para otros tipos
return null;
}
public static osBase? CreateInstanceAndPopulate(Type tipoObjeto, string jsonString)
{
osBase? instance = GetInstanceForType(tipoObjeto);
if (instance != null)
{
// Deserializa los datos desde jsonString y popula la instancia
JsonConvert.PopulateObject(jsonString, instance);
}
return instance;
}
public static void AssignDatos(UserControl userControl, osBase datos)
{
if (userControl is IDataContainer dataContainer)
{
dataContainer.Datos = datos;
userControl.DataContext = datos;
datos.VisualRepresentation = userControl;
}
}
}
}

View File

@ -1,10 +1,12 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Text.Json.Serialization;
using System.Threading.Tasks;
using System.Windows.Controls;
using static System.Runtime.InteropServices.JavaScript.JSType;
namespace CtrEditor.ObjetosSim
{
@ -15,30 +17,76 @@ namespace CtrEditor.ObjetosSim
void Update();
}
public abstract class osBase : IosBase
public interface IDataContainer
{
osBase? Datos { get; set; }
void Resize(double width, double height);
void Move(double Left, double Top);
void Rotate(double Angle);
}
public abstract class osBase : INotifyPropertyChanged, IosBase
{
private string _nombre = "Base";
public double _left;
public double _top;
public bool Inicializado = false;
public double Left
{
get => _left;
set
{
_left = value;
if (_visualRepresentation != null)
Canvas.SetLeft(_visualRepresentation, _left);
OnPropertyChanged(nameof(Left));
}
}
public double Top
{
get => _top;
set
{
_top = value;
if (_visualRepresentation != null)
Canvas.SetTop(_visualRepresentation, _top);
OnPropertyChanged(nameof(Top));
}
}
private UserControl? _visualRepresentation = null;
public string Nombre
{
get => _nombre;
set
{
if (_nombre != value)
{
_nombre = value;
OnPropertyChanged(nameof(Nombre));
}
}
}
public abstract void Update();
[JsonIgnore]
public UserControl? VisualRepresentation
{
get => _visualRepresentation;
set => _visualRepresentation = value;
}
public event PropertyChangedEventHandler PropertyChanged;
// Método para inicializar la representación visual, si es necesario
//public void InitializeVisualRepresentation()
//{
// // Suponiendo que existe un método estático para obtener el UserControl adecuado
// _visualRepresentation = UserControlFactory.GetControlForType(this.GetType());
//}
public string Nombre => "Base";
public abstract void Update();
public bool Inicializado = false;
public double Left { get; set; }
public double Top { get; set; }
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
}

View File

@ -1,5 +1,6 @@
<UserControl x:Class="CtrEditor.ObjetosSim.ucBotella"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
DataContext="{Binding RelativeSource={RelativeSource Self}}">
<Border Background="Brown" CornerRadius="10" Height="10" Width="10"/>
</UserControl>

View File

@ -25,18 +25,31 @@ namespace CtrEditor.ObjetosSim
public double diametro { get; set; }
// Otros datos y métodos relevantes para la simulación
public new string Nombre => "Botella";
private string _nombre = "Botella";
public override void Update()
{
// implementation of Update method
}
}
public partial class ucBotella : UserControl
public partial class ucBotella : UserControl, IDataContainer
{
public osBase? Datos { get; set; }
public ucBotella()
{
InitializeComponent();
}
public void Resize(double width, double height) { }
public void Move(double Left, double Top)
{
if (Datos != null)
{
Datos.Left = Left;
Datos.Top = Top;
}
}
public void Rotate(double Angle) { }
}
}

View File

@ -4,10 +4,13 @@
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:CtrEditor"
mc:Ignorable="d"
DataContext="{Binding RelativeSource={RelativeSource Self}}">
mc:Ignorable="d">
<Canvas>
<Rectangle Width="{Binding Datos.Ancho}" Height="{Binding Datos.Alto}" Fill="Gray"/>
<Rectangle Width="{Binding Ancho}" Height="{Binding Alto}" Fill="Gray">
<Rectangle.RenderTransform>
<RotateTransform Angle="{Binding Angulo}"/>
</Rectangle.RenderTransform>
</Rectangle>
</Canvas>
</UserControl>

View File

@ -12,6 +12,7 @@ using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using static System.Runtime.InteropServices.JavaScript.JSType;
namespace CtrEditor.ObjetosSim
{
@ -22,24 +23,79 @@ namespace CtrEditor.ObjetosSim
public class osTransporteTTop : osBase
{
public double diametro { get; set; }
public double Ancho { get; set; }
public double Alto { get; set; }
// Otros datos y métodos relevantes para la simulación
private string _nombre = "Transporte TTOP";
private double _Ancho;
private double _Alto;
private double _Angulo;
public double diametro { get; set; }
public double Ancho {
get { return _Ancho; }
set
{
_Ancho = value;
OnPropertyChanged(nameof(Ancho));
}
}
public double Alto {
get { return _Alto; }
set
{
_Alto = value;
OnPropertyChanged(nameof(Alto));
}
}
public double Angulo
{
get { return _Angulo; }
set
{
_Angulo = value;
OnPropertyChanged(nameof(Angulo));
}
}
public osTransporteTTop()
{
Ancho = 100;
Alto = 10;
}
public new string Nombre => "Transporte TTOP";
public override void Update()
{
// implementation of Update method
}
}
public partial class ucTransporteTTop : UserControl
public partial class ucTransporteTTop : UserControl, IDataContainer
{
public osBase? Datos { get; set; }
public ucTransporteTTop()
{
InitializeComponent();
}
public osTransporteTTop Datos { get; set; }
public void Resize(double width, double height)
{
if (Datos is osTransporteTTop datos)
datos.Ancho = width;
}
public void Move(double Left, double Top)
{
if (Datos != null)
{
Datos.Left = Left;
Datos.Top = Top;
}
}
public void Rotate(double Angle) {
if (Datos != null)
if (Datos is osTransporteTTop datos)
datos.Angulo = Angle;
}
}
}