# Sistema de Persistencia de Configuración del Entorno de Trabajo ## Resumen Se ha implementado un sistema completo para guardar y restaurar la configuración del entorno de trabajo para cada imagen, incluyendo la posición del GridSplitter, el estado del canvas (zoom, posición, offset) y el estado de `Is3DUpdateEnabled`. ## Archivos Creados/Modificados ### 1. Nuevo Archivo: `Models/WorkspaceConfiguration.cs` - **Propósito**: Contiene la configuración del entorno de trabajo - **Propiedades principales**: - `GridSplitterPosition`: Altura del GridSplitter que separa vista 2D y 3D - `CanvasCenterX/Y`: Posición central del canvas en píxeles - `ZoomLevel`: Nivel de zoom actual del canvas - `CanvasOffsetX/Y`: Offset de transformación del canvas - `Is3DUpdateEnabled`: Estado de las actualizaciones 3D - `HorizontalScrollOffset/VerticalScrollOffset`: Posición del scroll ### 2. Modificado: `MainViewModel.cs` - **Agregado**: Propiedad `WorkspaceConfig` para manejar la configuración - **Nuevos métodos**: - `CaptureWorkspaceState()`: Captura el estado actual desde la UI - `RestoreWorkspaceState()`: Restaura el estado a la UI - `InitializeDefaultWorkspaceConfig()`: Inicializa configuración por defecto ### 3. Modificado: `SimulationData` (en MainViewModel.cs) - **Agregado**: Propiedad `WorkspaceConfig` para persistir la configuración junto con cada imagen ### 4. Modificado: `Serialization/StateSerializer.cs` - **Modificado `SaveState()`**: Ahora captura automáticamente el estado del workspace antes de guardar - **Modificado `LoadCurrentPageState()`**: Carga y restaura la configuración del workspace ### 5. Modificado: `MainWindow.xaml` - **Agregado**: Nombres a los elementos Grid para poder accederlos desde código: - `x:Name="MainGrid"` al Grid principal - `x:Name="MiddleColumnGrid"` al Grid de la segunda columna ## Funcionamiento ### Guardado Automático 1. Cuando se guarda el estado de una imagen (`SaveState()`), el sistema automáticamente: - Captura la posición actual del GridSplitter - Captura el estado actual del canvas (zoom, posición, scroll) - Captura el estado de `Is3DUpdateEnabled` - Guarda toda esta información junto con los datos de la imagen ### Carga Automática 1. Cuando se carga una imagen (`LoadState()`), el sistema: - Carga la configuración del workspace guardada para esa imagen - Restaura automáticamente todos los valores a la UI - Si no hay configuración guardada, usa valores por defecto ### Persistencia por Imagen - Cada imagen tiene su propia configuración independiente - La configuración se guarda en el mismo archivo JSON que los objetos simulables - Compatible con versiones anteriores (si no hay configuración, usa valores por defecto) ## Características Técnicas ### Manejo de Errores - Todos los métodos de captura y restauración tienen manejo de excepciones - Los errores se registran en Debug pero no interrumpen el proceso de guardado/carga ### Compatibilidad - Compatible con archivos existentes (retro-compatibilidad) - Si un archivo no tiene configuración del workspace, se crea una por defecto ### Uso del Dispatcher - La restauración del estado usa `Dispatcher.BeginInvoke()` para asegurar que la UI esté lista - Prioridad `Background` para no bloquear la interfaz ## Beneficios 1. **Consistencia**: Cada imagen mantiene su configuración visual específica 2. **Productividad**: Los usuarios no necesitan reconfigurar la vista cada vez que cambian de imagen 3. **Flexibilidad**: Diferentes imágenes pueden tener diferentes configuraciones de trabajo 4. **Transparencia**: El sistema funciona automáticamente sin intervención del usuario 5. **Robustez**: Manejo de errores y compatibilidad con versiones anteriores ## Uso El sistema es completamente automático. Los usuarios simplemente trabajan normalmente y: - Al cambiar de imagen, la configuración se guarda automáticamente - Al seleccionar una imagen, su configuración se restaura automáticamente - El estado de `Is3DUpdateEnabled` se mantiene independiente para cada imagen - La posición del GridSplitter se recuerda para cada imagen ## Notas de Implementación - Se usa `TransformGroup`, `ScaleTransform` y `TranslateTransform` para manejar el canvas - El GridSplitter se maneja a través de las `RowDefinitions` del Grid de la segunda columna - La configuración se serializa junto con los datos de simulación en formato JSON - Se mantiene la estructura existente del sistema de serialización