Se realizaron mejoras en la gestión de objetos visuales en la clase ObjectManipulationManager. Se optimizó la lógica para purgar objetos eliminados y se mejoró la rotación de objetos, permitiendo rotaciones en incrementos de 45 grados al mantener presionada la tecla Shift. Además, se ajustaron espacios en blanco y se mejoró la legibilidad del código en varias secciones.
This commit is contained in:
parent
75c507be4e
commit
ac8773ebc7
|
@ -260,7 +260,8 @@ namespace CtrEditor
|
||||||
|
|
||||||
// Calcular el bounding box que contenga todos los objetos seleccionados
|
// Calcular el bounding box que contenga todos los objetos seleccionados
|
||||||
Rect boundingBox = CalculateTotalBoundingBox(selectedObjects);
|
Rect boundingBox = CalculateTotalBoundingBox(selectedObjects);
|
||||||
if (_selectedObjectsAreVisible) {
|
if (_selectedObjectsAreVisible)
|
||||||
|
{
|
||||||
|
|
||||||
FuncionesBase.MutableRect rectBox = new FuncionesBase.MutableRect(boundingBox);
|
FuncionesBase.MutableRect rectBox = new FuncionesBase.MutableRect(boundingBox);
|
||||||
rectBox.Left -= (float)rectHighlightSize;
|
rectBox.Left -= (float)rectHighlightSize;
|
||||||
|
@ -303,7 +304,7 @@ namespace CtrEditor
|
||||||
|
|
||||||
foreach (var obj in selectedObjects)
|
foreach (var obj in selectedObjects)
|
||||||
{
|
{
|
||||||
if (obj.VisualRepresentation != null && obj.VisualRepresentation.Visibility!=Visibility.Collapsed)
|
if (obj.VisualRepresentation != null && obj.VisualRepresentation.Visibility != Visibility.Collapsed)
|
||||||
{
|
{
|
||||||
// Obtener el bounding box del objeto actual
|
// Obtener el bounding box del objeto actual
|
||||||
Rect objectBounds = VisualTreeHelper.GetDescendantBounds(obj.VisualRepresentation);
|
Rect objectBounds = VisualTreeHelper.GetDescendantBounds(obj.VisualRepresentation);
|
||||||
|
@ -1125,6 +1126,9 @@ namespace CtrEditor
|
||||||
|
|
||||||
RemoveAllSelectionHighlights(); // Remover antes de rotar
|
RemoveAllSelectionHighlights(); // Remover antes de rotar
|
||||||
|
|
||||||
|
// Verificar si la tecla Shift está presionada para rotación en incrementos de 45 grados
|
||||||
|
bool isShiftPressed = Keyboard.IsKeyDown(Key.LeftShift) || Keyboard.IsKeyDown(Key.RightShift);
|
||||||
|
|
||||||
// Calcular el ángulo respecto al centro del bounding box que contiene todos los objetos seleccionados
|
// Calcular el ángulo respecto al centro del bounding box que contiene todos los objetos seleccionados
|
||||||
double deltaX = currentPosition.X - _transformedBoundingBoxCenter.X;
|
double deltaX = currentPosition.X - _transformedBoundingBoxCenter.X;
|
||||||
double deltaY = currentPosition.Y - _transformedBoundingBoxCenter.Y;
|
double deltaY = currentPosition.Y - _transformedBoundingBoxCenter.Y;
|
||||||
|
@ -1137,11 +1141,48 @@ namespace CtrEditor
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
double deltaAngle = angle - _lastAngle;
|
double deltaAngle = angle - _lastAngle;
|
||||||
foreach (var selectedObject in _selectedObjects)
|
|
||||||
|
if (isShiftPressed)
|
||||||
{
|
{
|
||||||
selectedObject.Rotate(deltaAngle);
|
// Rotación en incrementos de 45 grados
|
||||||
|
// Calcular el ángulo total acumulado desde el inicio de la rotación
|
||||||
|
double totalAngleChange = angle - _lastAngle;
|
||||||
|
|
||||||
|
// Determinar a qué incremento de 45 grados corresponde
|
||||||
|
double snapAngle = Math.Round(totalAngleChange / 45.0) * 45.0;
|
||||||
|
|
||||||
|
// Solo aplicar la rotación si hay un cambio significativo (al menos 22.5 grados de movimiento)
|
||||||
|
if (Math.Abs(totalAngleChange) > 22.5)
|
||||||
|
{
|
||||||
|
// Calcular el cambio real que necesitamos aplicar
|
||||||
|
double actualRotationChange = snapAngle;
|
||||||
|
|
||||||
|
foreach (var selectedObject in _selectedObjects)
|
||||||
|
{
|
||||||
|
// Obtener el ángulo actual del objeto
|
||||||
|
double currentObjectAngle = selectedObject.Angulo;
|
||||||
|
|
||||||
|
// Calcular el nuevo ángulo alineado a incrementos de 45 grados
|
||||||
|
double targetAngle = Math.Round((currentObjectAngle + actualRotationChange) / 45.0) * 45.0;
|
||||||
|
|
||||||
|
// Aplicar la rotación necesaria para llegar al ángulo objetivo
|
||||||
|
double rotationNeeded = targetAngle - currentObjectAngle;
|
||||||
|
selectedObject.Rotate(rotationNeeded);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Actualizar el ángulo de referencia para evitar aplicar la misma rotación múltiples veces
|
||||||
|
_lastAngle = (float)angle;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Rotación libre (comportamiento original)
|
||||||
|
foreach (var selectedObject in _selectedObjects)
|
||||||
|
{
|
||||||
|
selectedObject.Rotate(deltaAngle);
|
||||||
|
}
|
||||||
|
_lastAngle = (float)angle;
|
||||||
}
|
}
|
||||||
_lastAngle = (float)angle;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
UpdateAllSelectionHighlights();
|
UpdateAllSelectionHighlights();
|
||||||
|
|
Loading…
Reference in New Issue