From 58781c13a3a324f20fc8c7d6e49094c38db7fcce Mon Sep 17 00:00:00 2001 From: Miguel Date: Wed, 18 Jun 2025 21:23:39 +0200 Subject: [PATCH] =?UTF-8?q?Se=20implement=C3=B3=20una=20nueva=20ventana=20?= =?UTF-8?q?de=20configuraci=C3=B3n=20de=20escala=20que=20permite=20a=20los?= =?UTF-8?q?=20usuarios=20ajustar=20la=20escala=20de=20simulaci=C3=B3n=20de?= =?UTF-8?q?=20manera=20modeless.=20Se=20a=C3=B1adi=C3=B3=20un=20temporizad?= =?UTF-8?q?or=20para=20aplicar=20autom=C3=A1ticamente=20los=20cambios=20de?= =?UTF-8?q?=20escala=20despu=C3=A9s=20de=200.5=20segundos.=20Adem=C3=A1s,?= =?UTF-8?q?=20se=20mejor=C3=B3=20la=20gesti=C3=B3n=20de=20la=20escala=20en?= =?UTF-8?q?=20el=20ViewModel=20principal=20y=20se=20actualizaron=20los=20b?= =?UTF-8?q?indings=20de=20posici=C3=B3n=20en=20osBase=20para=20asegurar=20?= =?UTF-8?q?una=20correcta=20visualizaci=C3=B3n.=20Se=20incluy=C3=B3=20un?= =?UTF-8?q?=20bot=C3=B3n=20de=20"Aplicar"=20en=20la=20interfaz=20de=20usua?= =?UTF-8?q?rio=20para=20facilitar=20la=20aplicaci=C3=B3n=20de=20cambios.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MainViewModel.cs | 61 +++++++++++++++++----------- ObjetosSim/osBase.cs | 6 +-- PopUps/ScaleConfigWindow.xaml | 7 ++++ PopUps/ScaleConfigWindow.xaml.cs | 70 ++++++++++++++++++++++++++++---- 4 files changed, 109 insertions(+), 35 deletions(-) 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 @@ +