diff --git a/MainViewModel.cs b/MainViewModel.cs index b713f44..4d9c303 100644 --- a/MainViewModel.cs +++ b/MainViewModel.cs @@ -1236,34 +1236,49 @@ namespace CtrEditor OnPropertyChanged(nameof(SelectedItemOsList)); } + // Diccionario para manejar la ventana de configuración de escala + private PopUps.ScaleConfigWindow? _scaleConfigWindow; + // Método para configurar la escala desde el menú contextual public void ConfigureScale() { - var currentScale = PixelToMeter.Instance.calc.Scale; - var scaleWindow = new PopUps.ScaleConfigWindow(currentScale); - scaleWindow.Owner = MainWindow; - - if (scaleWindow.ShowDialog() == true) + // Verificar si ya existe una ventana de configuración de escala + if (_scaleConfigWindow != null && _scaleConfigWindow.IsVisible) { - var newScale = scaleWindow.NewScale; - - // Detener simulaciones antes de cambiar la escala - StopSimulation(); - StopFluidSimulation(); - DisconnectPLC(); - - // Actualizar la escala en el UnitConverter - PixelToMeter.Instance.calc.SetScale(newScale); - - // Forzar redibujo completo del canvas y todos los objetos - ForceCanvasRedraw(); - - // Marcar como cambios no guardados ya que esto afecta la configuración de la imagen - HasUnsavedChanges = true; - - // Limpiar historial de undo después de cambiar la escala - MainWindow?.ClearUndoHistory(); + _scaleConfigWindow.Activate(); + return; } + + var currentScale = PixelToMeter.Instance.calc.Scale; + _scaleConfigWindow = new PopUps.ScaleConfigWindow(currentScale, this); + _scaleConfigWindow.Owner = MainWindow; + + // Manejar el cierre de la ventana + _scaleConfigWindow.Closed += (s, e) => _scaleConfigWindow = null; + + // Mostrar como modeless (no modal) + _scaleConfigWindow.Show(); + } + + // Método público para aplicar la escala desde la ventana modeless + public void ApplyScale(float newScale) + { + // Detener simulaciones antes de cambiar la escala + StopSimulation(); + StopFluidSimulation(); + DisconnectPLC(); + + // Actualizar la escala en el UnitConverter + PixelToMeter.Instance.calc.SetScale(newScale); + + // Forzar redibujo completo del canvas y todos los objetos + ForceCanvasRedraw(); + + // Marcar como cambios no guardados ya que esto afecta la configuración de la imagen + HasUnsavedChanges = true; + + // Limpiar historial de undo después de cambiar la escala + MainWindow?.ClearUndoHistory(); } // Método para forzar el redibujo completo del canvas diff --git a/ObjetosSim/osBase.cs b/ObjetosSim/osBase.cs index 0a00369..9970345 100644 --- a/ObjetosSim/osBase.cs +++ b/ObjetosSim/osBase.cs @@ -1202,10 +1202,8 @@ namespace CtrEditor.ObjetosSim public void ForceUpdatePositionBindings() { // Para Left y Top, actualizar directamente el Canvas ya que tienen lógica especial en OnChanged - OnPropertyChanged(nameof(Left)); - OnPropertyChanged(nameof(Top)); - // CanvasSetLeftinMeter(Left); - // CanvasSetTopinMeter(Top); + CanvasSetLeftinMeter(Left); + CanvasSetTopinMeter(Top); // Para Ancho y Alto, disparar PropertyChanged para que los bindings se actualicen OnPropertyChanged(nameof(Ancho)); diff --git a/PopUps/ScaleConfigWindow.xaml b/PopUps/ScaleConfigWindow.xaml index b00a33f..df486dc 100644 --- a/PopUps/ScaleConfigWindow.xaml +++ b/PopUps/ScaleConfigWindow.xaml @@ -80,6 +80,8 @@ + + @@ -88,6 +90,11 @@ +