Compare commits

...

2 Commits

Author SHA1 Message Date
Miguel 58b429c7bf Cambiando a MVVM para los UserControl 2024-05-04 15:53:47 +02:00
Miguel 82b6f9cffc Tabajando en la rotacion de lo usercontrol 2024-05-04 14:06:33 +02:00
5 changed files with 237 additions and 27 deletions

View File

@ -159,8 +159,8 @@ namespace CtrEditor
{ {
SaveStateObjetosSimulables(); // Guarda el estado antes de cambiar la imagen SaveStateObjetosSimulables(); // Guarda el estado antes de cambiar la imagen
_selectedImage = value; _selectedImage = value;
LoadStateObjetosSimulables();
ImageSelected?.Invoke(this, datosDeTrabajo.Imagenes[value]); // Dispara el evento con la nueva ruta de imagen ImageSelected?.Invoke(this, datosDeTrabajo.Imagenes[value]); // Dispara el evento con la nueva ruta de imagen
LoadStateObjetosSimulables();
} }
_selectedImage = value; _selectedImage = value;
OnPropertyChanged(nameof(SelectedImage)); OnPropertyChanged(nameof(SelectedImage));

View File

@ -17,11 +17,22 @@ namespace CtrEditor
/// </summary> /// </summary>
public partial class MainWindow : Window public partial class MainWindow : Window
{ {
// Para el Canvas
private Point _lastMousePosition; private Point _lastMousePosition;
private bool _isDrawing = false; private bool _isDrawingCanvas = false;
private bool _isDragging = false; private bool _isDraggingCanvas = false;
private Image imagenDeFondo; private Image imagenDeFondo;
// Para los UserControl
private Point _startPointUserControl;
private UserControl _currentDraggingControl;
private bool _isRotatingUserControl = false;
private bool _isResizingUserControl = false;
private bool _isDraggingUserControl = false;
private bool _isMovingUserControl = false;
private double _initialAngleUserControl;
private TextBlock _angleDisplayTextBlock;
public MainWindow() public MainWindow()
{ {
InitializeComponent(); InitializeComponent();
@ -53,39 +64,231 @@ namespace CtrEditor
if (!NuevoOS.Inicializado) // Aun no fue inicializado 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 // Obtiene el área visible del ScrollViewer
var visibleWidth = ImagenEnTrabajoScrollViewer.ViewportWidth; double visibleWidth = ImagenEnTrabajoScrollViewer.ViewportWidth;
var visibleHeight = ImagenEnTrabajoScrollViewer.ViewportHeight; double visibleHeight = ImagenEnTrabajoScrollViewer.ViewportHeight;
// Obtiene la posición actual del desplazamiento // Obtiene la posición actual del desplazamiento ajustada por el zoom
var offsetX = ImagenEnTrabajoScrollViewer.HorizontalOffset; double offsetX = ImagenEnTrabajoScrollViewer.HorizontalOffset / scaleX;
var offsetY = ImagenEnTrabajoScrollViewer.VerticalOffset; double offsetY = ImagenEnTrabajoScrollViewer.VerticalOffset / scaleY;
// Calcula el centro visible del Canvas // Calcula el centro visible ajustado
double centerX = offsetX + visibleWidth / 2; double centerX = offsetX + (visibleWidth / scaleX) / 2;
double centerY = offsetY + visibleHeight / 2; double centerY = offsetY + (visibleHeight / scaleY) / 2;
// Ajusta la posición del UserControl para que esté centrado en el área visible // Ajusta la posición del UserControl para que esté centrado en el área visible
double left = centerX - (userControl.ActualWidth / 2); double left = centerX - (userControl.ActualWidth / 2);
double top = centerY - (userControl.ActualHeight / 2); double top = centerY - (userControl.ActualHeight / 2);
// Establece la posición del UserControl // Establece la posición del UserControl
Canvas.SetLeft(userControl, left); NuevoOS.Left = left;
Canvas.SetTop(userControl, top); NuevoOS.Top = top;
NuevoOS.x = left;
NuevoOS.y = top;
NuevoOS.Inicializado = true; 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 // Añade el UserControl al Canvas
ImagenEnTrabajoCanvas.Children.Add(userControl); ImagenEnTrabajoCanvas.Children.Add(userControl);
} }
} }
} }
private void UserControl_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
if (!_isDrawingCanvas)
{
var userControl = sender as UserControl;
_currentDraggingControl = userControl;
userControl.CaptureMouse(); // Importante para recibir eventos de movimiento incluso fuera del control
_isMovingUserControl = true;
// ROTACION
if (Keyboard.IsKeyDown(Key.LeftShift))
{
// Inicializar la rotación
_isRotatingUserControl = true;
RotateTransform rotateTransform = userControl.RenderTransform as RotateTransform;
if (rotateTransform == null)
{
rotateTransform = new RotateTransform();
userControl.RenderTransform = rotateTransform;
}
_initialAngleUserControl = rotateTransform.Angle;
// Establecer el punto inicial de referencia para el cálculo de rotación
_startPointUserControl = new Point(rotateTransform.CenterX, rotateTransform.CenterY);
// Ajusta el punto inicial al espacio del Canvas
_startPointUserControl = userControl.TranslatePoint(_startPointUserControl, ImagenEnTrabajoCanvas);
// Crear y configurar el TextBlock si no existe
if (_angleDisplayTextBlock == null)
{
_angleDisplayTextBlock = new TextBlock
{
Foreground = Brushes.Black,
Background = Brushes.White,
Opacity = 0.8,
Padding = new Thickness(5)
};
ImagenEnTrabajoCanvas.Children.Add(_angleDisplayTextBlock);
}
PositionAngleDisplay(userControl);
_angleDisplayTextBlock.Visibility = Visibility.Visible;
}
// TAMANO
else if (Keyboard.IsKeyDown(Key.LeftCtrl) || Keyboard.IsKeyDown(Key.RightCtrl))
{
// Inicializar el cambio de tamaño
_isResizingUserControl = true;
}
// MOVIMIENTO
else
{
// Inicializar el movimiento/panning
_isDraggingUserControl = true;
_startPointUserControl = e.GetPosition(ImagenEnTrabajoCanvas);
}
}
}
private void UserControl_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
if (_isMovingUserControl)
{
var userControl = sender as UserControl;
userControl.ReleaseMouseCapture();
_currentDraggingControl = null;
_isResizingUserControl = _isRotatingUserControl = _isDraggingUserControl = false ;
_isMovingUserControl = false;
// Ocultar el TextBlock de ángulo
if (_angleDisplayTextBlock != null)
{
_angleDisplayTextBlock.Visibility = Visibility.Collapsed;
}
}
}
private void UserControl_MouseMove(object sender, MouseEventArgs e)
{
if (_isMovingUserControl && _currentDraggingControl != null)
{
var currentPosition = e.GetPosition(ImagenEnTrabajoCanvas);
if (_isDraggingUserControl)
{
// Código para mover el control
var dx = currentPosition.X - _startPointUserControl.X;
var dy = currentPosition.Y - _startPointUserControl.Y;
var newX = Canvas.GetLeft(_currentDraggingControl) + dx;
var newY = Canvas.GetTop(_currentDraggingControl) + dy;
Canvas.SetLeft(_currentDraggingControl, newX);
Canvas.SetTop(_currentDraggingControl, newY);
_startPointUserControl = currentPosition; // Actualiza el punto inicial para el siguiente movimiento
}
else if (_isRotatingUserControl)
{
// Código para rotar el control
RotateControl(_currentDraggingControl, currentPosition);
}
else if (_isResizingUserControl)
{
// Código para cambiar el tamaño del control
ResizeControl(_currentDraggingControl, currentPosition);
}
}
}
private void RotateControl(UserControl control, Point currentPosition)
{
double deltaX = currentPosition.X - _startPointUserControl.X;
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
// Actualizar el ángulo mostrado
_angleDisplayTextBlock.Text = $"Ángulo: {angle:F2}°";
PositionAngleDisplay(control);
}
private void PositionAngleDisplay(UserControl control)
{
// Posicionar el TextBlock sobre el control
Canvas.SetLeft(_angleDisplayTextBlock, Canvas.GetLeft(control));
Canvas.SetTop(_angleDisplayTextBlock, Canvas.GetTop(control));
}
private void ResizeControl(UserControl control, Point currentPosition)
{
// Calcular la diferencia en la posición X desde el punto de inicio
double widthChange = currentPosition.X - _startPointUserControl.X;
// Actualizar el ancho del control
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
}
}
}
// Actualizar el punto de inicio para el próximo evento de movimiento
_startPointUserControl = currentPosition;
}
private void UserControl_MouseEnter(object sender, MouseEventArgs e)
{
// Lógica a ejecutar cuando el mouse entra en el UserControl
if (sender is UserControl userControl)
{
// Por ejemplo, cambiar el color de fondo para indicar el foco
userControl.Background = Brushes.LightBlue;
}
}
private void UserControl_MouseLeave(object sender, MouseEventArgs e)
{
// Lógica a ejecutar cuando el mouse sale del UserControl
if (sender is UserControl userControl)
{
// Restaurar el color de fondo original
userControl.Background = Brushes.White;
}
}
private void ViewModel_ImageSelected(object sender, string imagePath) private void ViewModel_ImageSelected(object sender, string imagePath)
{ {
@ -126,19 +329,19 @@ namespace CtrEditor
private void Canvas_MouseUp_Panning(object sender, MouseButtonEventArgs e) private void Canvas_MouseUp_Panning(object sender, MouseButtonEventArgs e)
{ {
if (_isDragging) if (_isDraggingCanvas)
{ {
_isDragging = false; _isDraggingCanvas = false;
ImagenEnTrabajoScrollViewer.ReleaseMouseCapture(); // Finaliza la captura del ratón ImagenEnTrabajoScrollViewer.ReleaseMouseCapture(); // Finaliza la captura del ratón
} }
} }
private void Canvas_MouseDown_Panning(object sender, MouseButtonEventArgs e) private void Canvas_MouseDown_Panning(object sender, MouseButtonEventArgs e)
{ {
if (e.LeftButton == MouseButtonState.Pressed && !_isDrawing) if (e.LeftButton == MouseButtonState.Pressed && !_isDrawingCanvas && !_isMovingUserControl)
{ {
// Indica que se inicia el panning // Indica que se inicia el panning
_isDragging = true; _isDraggingCanvas = true;
// Guarda la posición actual del ratón // Guarda la posición actual del ratón
_lastMousePosition = e.GetPosition(ImagenEnTrabajoScrollViewer); _lastMousePosition = e.GetPosition(ImagenEnTrabajoScrollViewer);
//ImagenEnTrabajoScrollViewer.CaptureMouse(); // Importante para capturar el movimiento //ImagenEnTrabajoScrollViewer.CaptureMouse(); // Importante para capturar el movimiento
@ -147,7 +350,7 @@ namespace CtrEditor
private void Canvas_MouseMove_Panning(object sender, MouseEventArgs e) private void Canvas_MouseMove_Panning(object sender, MouseEventArgs e)
{ {
if (_isDragging && !_isDrawing) if (_isDraggingCanvas && !_isDrawingCanvas)
{ {
// Calcula el nuevo desplazamiento basado en el movimiento del ratón // Calcula el nuevo desplazamiento basado en el movimiento del ratón
var currentPosition = e.GetPosition(ImagenEnTrabajoScrollViewer); var currentPosition = e.GetPosition(ImagenEnTrabajoScrollViewer);

View File

@ -36,8 +36,8 @@ namespace CtrEditor.ObjetosSim
public string Nombre => "Base"; public string Nombre => "Base";
public abstract void Update(); public abstract void Update();
public bool Inicializado = false; public bool Inicializado = false;
public double x { get; set; } public double Left { get; set; }
public double y { get; set; } public double Top { get; set; }
} }

View File

@ -4,6 +4,10 @@
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:CtrEditor" xmlns:local="clr-namespace:CtrEditor"
mc:Ignorable="d" > mc:Ignorable="d"
<Rectangle HorizontalAlignment="Left" Height="10" Margin="0,0,0,0" Stroke="Black" VerticalAlignment="Top" Width="100"/> DataContext="{Binding RelativeSource={RelativeSource Self}}">
<Canvas>
<Rectangle Width="{Binding Datos.Ancho}" Height="{Binding Datos.Alto}" Fill="Gray"/>
</Canvas>
</UserControl> </UserControl>

View File

@ -23,6 +23,8 @@ namespace CtrEditor.ObjetosSim
public class osTransporteTTop : osBase public class osTransporteTTop : osBase
{ {
public double diametro { get; set; } 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 // Otros datos y métodos relevantes para la simulación
public new string Nombre => "Transporte TTOP"; public new string Nombre => "Transporte TTOP";
@ -38,5 +40,6 @@ namespace CtrEditor.ObjetosSim
{ {
InitializeComponent(); InitializeComponent();
} }
public osTransporteTTop Datos { get; set; }
} }
} }