Compare commits
2 Commits
73e6f1ef2b
...
58b429c7bf
Author | SHA1 | Date |
---|---|---|
Miguel | 58b429c7bf | |
Miguel | 82b6f9cffc |
|
@ -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));
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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; }
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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>
|
||||||
|
|
||||||
|
|
|
@ -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; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue