diff --git a/Documentation/BibliotecaObjetos.md b/Documentation/BibliotecaObjetos.md
new file mode 100644
index 0000000..a3b9a94
--- /dev/null
+++ b/Documentation/BibliotecaObjetos.md
@@ -0,0 +1,110 @@
+# Biblioteca de Objetos Simulables
+
+## Descripción
+
+La biblioteca de objetos simulables es una nueva funcionalidad que permite gestionar y organizar objetos simulables en bibliotecas independientes del proyecto actual. Esto facilita la reutilización de objetos entre diferentes proyectos.
+
+## Características Principales
+
+### 1. Gestión de Directorios de Biblioteca
+- **Agregar directorios**: Permite agregar nuevos directorios que contendrán bibliotecas de objetos
+- **Eliminar directorios**: Permite remover directorios de la lista de bibliotecas
+- **Persistencia global**: Los directorios se mantienen independientemente del proyecto actual
+
+### 2. Bibliotecas de Objetos
+- **Proyecto actual**: El proyecto actual siempre aparece como una biblioteca
+- **Archivos JSON**: Cada archivo JSON en los directorios de biblioteca se muestra como una biblioteca independiente
+- **Visualización jerárquica**: Los objetos se organizan por tipo en un TreeView
+
+### 3. Sistema de Filtros
+- **Filtros por tipo**: Permite mostrar/ocultar tipos específicos de objetos
+- **Filtros por etiquetas**: Filtrado por etiquetas usando # (ej: #motor #bomba)
+- **Filtros especiales**:
+ - Cloned (objetos clonados)
+ - Auto Created (objetos creados automáticamente)
+ - Enable On All Pages (objetos globales)
+ - Show On This Page (objetos visibles en página actual)
+
+### 4. Operaciones de Objetos
+- **Copiar (Ctrl+C)**: Copia objetos seleccionados al portapapeles interno
+- **Pegar (Ctrl+V)**: Pega objetos del portapapeles a la biblioteca seleccionada
+- **Eliminar**: Elimina objetos de bibliotecas (no disponible para proyecto actual)
+- **Visualizar propiedades**: PropertyGrid de solo lectura para inspeccionar objetos
+
+### 5. Gestión de Bibliotecas
+- **Crear nueva biblioteca**: Crea un archivo JSON vacío como nueva biblioteca
+- **Cargar automáticamente**: Las bibliotecas se cargan automáticamente al seleccionar directorios
+
+## Cómo Usar
+
+### Acceso
+1. Haga clic en el botón **"Biblioteca"** en la barra de herramientas principal (al lado de "Assing Pages")
+2. Se abrirá la ventana modal de gestión de bibliotecas
+
+### Configurar Directorios de Biblioteca
+1. En la columna izquierda "Directorios de Biblioteca", haga clic en **"Agregar"**
+2. Seleccione la carpeta que contendrá sus bibliotecas de objetos
+3. El directorio se agregará a la lista y se guardará automáticamente
+
+### Navegar Bibliotecas
+1. Seleccione un directorio de la lista en la columna izquierda
+2. En la columna central aparecerán todas las bibliotecas (archivos JSON) encontradas
+3. Seleccione una biblioteca para ver sus objetos organizados por tipo
+
+### Filtrar Objetos
+1. Use la sección "Filtros" para mostrar/ocultar tipos específicos
+2. Use el campo de búsqueda para filtrar por etiquetas (ej: `#motor #conveyor`)
+3. Active los filtros especiales según sea necesario
+
+### Copiar/Pegar Objetos
+1. **Para copiar**: Seleccione un objeto y presione Ctrl+C o haga clic en "Copiar"
+2. **Para pegar**: Seleccione la biblioteca destino y presione Ctrl+V o haga clic en "Pegar"
+3. Los objetos se copiarán con nuevos IDs únicos
+
+### Crear Nueva Biblioteca
+1. Seleccione un directorio de biblioteca
+2. Haga clic en **"Nueva Biblioteca"**
+3. Elija nombre y ubicación para el archivo JSON
+4. Se creará una biblioteca vacía lista para usar
+
+## Casos de Uso
+
+### Biblioteca de Componentes Estándar
+- Cree una biblioteca con motores, sensores y actuadores estándar
+- Reutilice estos componentes en múltiples proyectos
+- Mantenga configuraciones consistentes entre proyectos
+
+### Plantillas de Sistemas
+- Guarde sistemas completos (ej: línea de ensamblaje básica)
+- Use como punto de partida para nuevos proyectos
+- Facilite la estandarización de diseños
+
+### Backup y Versioning
+- Mantenga copias de objetos importantes en bibliotecas externas
+- Cree versiones de componentes con diferentes configuraciones
+- Facilite la colaboración entre equipos
+
+## Estructura de Archivos
+
+Las bibliotecas se almacenan como archivos JSON con la misma estructura que los archivos de proyecto:
+
+```json
+{
+ "ObjetosSimulables": [...],
+ "UnitConverter": {...},
+ "PLC_ConnectionData": {...}
+}
+```
+
+## Notas Técnicas
+
+- Los directorios de biblioteca se almacenan en `EstadoPersistente.Instance.LibraryDirectories`
+- Los objetos se serializan usando Newtonsoft.Json con `TypeNameHandling.All`
+- La funcionalidad es independiente del directorio de trabajo actual
+- Los filtros utilizan el mismo sistema que la aplicación principal (`osVisFilter`)
+
+## Limitaciones
+
+- No se pueden editar objetos directamente en las bibliotecas (solo copia/pegar)
+- La eliminación solo está disponible para bibliotecas externas (no proyecto actual)
+- Los archivos JSON deben tener estructura válida de SimulationData
\ No newline at end of file
diff --git a/MainViewModel.cs b/MainViewModel.cs
index 679c6f6..fbc4c90 100644
--- a/MainViewModel.cs
+++ b/MainViewModel.cs
@@ -24,6 +24,7 @@ using System.Text.RegularExpressions;
using System.Collections.Specialized;
using CtrEditor.Serialization; // Add this line
using CtrEditor.Controls; // Add this using directive
+using CtrEditor.PopUps; // Add this using directive
namespace CtrEditor
{
@@ -105,6 +106,7 @@ namespace CtrEditor
public ICommand TBMultiPageExtractTagsCommand { get; }
public ICommand TBMultiPageAnalizeCommand { get; }
public ICommand TBMultiPageMatrixCommand { get; }
+ public ICommand TBLibraryManagerCommand { get; }
public ICommand TBTogglePLCConnectionCommand => new RelayCommand(() =>
@@ -380,6 +382,7 @@ namespace CtrEditor
TBAssingPagesCommand = new RelayCommand(AssingPagesCommand);
TBMultiPageAnalizeCommand = new RelayCommand(MultiPageAnalizeCommand);
TBMultiPageMatrixCommand = new RelayCommand(MultiPageMatrixCommand);
+ TBLibraryManagerCommand = new RelayCommand(ShowLibraryManager);
stopwatch_Sim = new Stopwatch();
stopwatch_Sim.Start();
@@ -1158,6 +1161,15 @@ namespace CtrEditor
{
OnPropertyChanged(nameof(SelectedItemOsList));
}
+
+ private void ShowLibraryManager()
+ {
+ var libraryWindow = new PopUps.LibraryWindow();
+ var libraryViewModel = new PopUps.LibraryWindowViewModel(this);
+ libraryWindow.DataContext = libraryViewModel;
+ libraryWindow.Owner = MainWindow;
+ libraryWindow.ShowDialog();
+ }
}
public class SimulationData
diff --git a/MainWindow.xaml b/MainWindow.xaml
index e90630e..cc4fa6d 100644
--- a/MainWindow.xaml
+++ b/MainWindow.xaml
@@ -251,6 +251,12 @@
+
diff --git a/PopUps/LibraryWindow.xaml b/PopUps/LibraryWindow.xaml
new file mode 100644
index 0000000..8ba4467
--- /dev/null
+++ b/PopUps/LibraryWindow.xaml
@@ -0,0 +1,168 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/PopUps/LibraryWindow.xaml.cs b/PopUps/LibraryWindow.xaml.cs
new file mode 100644
index 0000000..d5f1c00
--- /dev/null
+++ b/PopUps/LibraryWindow.xaml.cs
@@ -0,0 +1,61 @@
+using System.Windows;
+using System.Windows.Controls;
+using CtrEditor.ObjetosSim;
+
+namespace CtrEditor.PopUps
+{
+ ///
+ /// Interaction logic for LibraryWindow.xaml
+ ///
+ public partial class LibraryWindow : Window
+ {
+ public LibraryWindow()
+ {
+ InitializeComponent();
+ }
+
+ private void LibrariesTreeView_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs