From 6c7140b73e873969a8106cc36a6c8ee3e599780c Mon Sep 17 00:00:00 2001 From: Miguel Date: Fri, 12 Apr 2024 23:06:46 +0200 Subject: [PATCH] Actualizado logica de ImagenEstado --- DatabaseManager.cs | 113 ----------------------- DatabaseManagerList.cs | 198 +++++++++++++++++++++++++++++++++++++++++ MainWindow.xaml.cs | 88 +++++++++--------- ROI.cs | 150 +------------------------------ 4 files changed, 239 insertions(+), 310 deletions(-) delete mode 100644 DatabaseManager.cs create mode 100644 DatabaseManagerList.cs diff --git a/DatabaseManager.cs b/DatabaseManager.cs deleted file mode 100644 index c0a5989..0000000 --- a/DatabaseManager.cs +++ /dev/null @@ -1,113 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Collections.Generic; -using System.Text.Json; -using Microsoft.Data.Sqlite; -using System.ComponentModel; - -namespace ROIEditor -{ - - public class DatabaseManager - { - private readonly string connectionString; - private readonly string tableName; - private List data = new List(); - - public void Add(T item) - { - data.Add(item); - } - - public void Clear() - { - data.Clear(); - } - - public List GetList() - { - return data; - } - - public int Count => data.Count; - - public DatabaseManager(string dbPath, string tableName) - { - connectionString = $"Data Source={dbPath}"; - this.tableName = tableName; - InitializeDatabase(); - } - - private void InitializeDatabase() - { - using (var connection = new SqliteConnection(connectionString)) - { - connection.Open(); - - var command = connection.CreateCommand(); - command.CommandText = $@" - CREATE TABLE IF NOT EXISTS {tableName} ( - Id INTEGER PRIMARY KEY AUTOINCREMENT, - Clave TEXT, - SerializeData TEXT - )"; - command.ExecuteNonQuery(); - } - } - - public void SaveData(string clave) - { - - using (var connection = new SqliteConnection(connectionString)) - { - connection.Open(); - - var deleteCommand = connection.CreateCommand(); - deleteCommand.CommandText = @"DELETE FROM Roi WHERE Clave = $Clave"; - deleteCommand.Parameters.AddWithValue("$Clave", clave); - deleteCommand.ExecuteNonQuery(); - - foreach (var elemento in data) - { - string serializedData = JsonSerializer.Serialize(elemento); - - var command = connection.CreateCommand(); - command.CommandText = $"INSERT INTO {tableName} (Clave, SerializeData) VALUES ($Clave, $SerializedData)"; - command.Parameters.AddWithValue("$Clave", clave); - command.Parameters.AddWithValue("$SerializedData", serializedData); - command.ExecuteNonQuery(); - } - } - } - - public List LoadData(string clave) - { - var dataList = new List(); - - using (var connection = new SqliteConnection(connectionString)) - { - connection.Open(); - - var command = connection.CreateCommand(); - command.CommandText = $"SELECT SerializeData FROM {tableName} WHERE Clave = $Clave"; - command.Parameters.AddWithValue("$Clave", clave); - - using (var reader = command.ExecuteReader()) - { - while (reader.Read()) - { - string serializedData = reader.GetString(0); - List data = JsonSerializer.Deserialize>(serializedData); - dataList.AddRange(data); - } - } - } - - return dataList; - } - } - -} diff --git a/DatabaseManagerList.cs b/DatabaseManagerList.cs new file mode 100644 index 0000000..d523846 --- /dev/null +++ b/DatabaseManagerList.cs @@ -0,0 +1,198 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Collections.Generic; +using System.Text.Json; +using Microsoft.Data.Sqlite; +using System.ComponentModel; + +namespace ROIEditor +{ + + public class DatabaseManagerList + { + private readonly string connectionString; + private readonly string tableName; + private List data = new(); + + public void Add(T item) + { + data.Add(item); + } + + public void Clear() + { + data.Clear(); + } + + public List GetList() + { + return data; + } + + public int IndexOf(T item) + { + return data.IndexOf(item); + } + + + public int Count => data.Count; + + public DatabaseManagerList(string dbPath, string tableName) + { + connectionString = $"Data Source={dbPath}"; + this.tableName = tableName; + InitializeDatabase(); + } + + private void InitializeDatabase() + { + using (var connection = new SqliteConnection(connectionString)) + { + connection.Open(); + + var command = connection.CreateCommand(); + command.CommandText = $@" + CREATE TABLE IF NOT EXISTS {tableName} ( + Id INTEGER PRIMARY KEY AUTOINCREMENT, + Clave TEXT, + SerializeData TEXT + )"; + command.ExecuteNonQuery(); + } + } + + public void SaveData(string clave) + { + + using (var connection = new SqliteConnection(connectionString)) + { + connection.Open(); + + var deleteCommand = connection.CreateCommand(); + deleteCommand.CommandText = $"DELETE FROM {tableName} WHERE Clave = $Clave"; + deleteCommand.Parameters.AddWithValue("$Clave", clave); + deleteCommand.ExecuteNonQuery(); + + foreach (var elemento in data) + { + string serializedData = JsonSerializer.Serialize(elemento); + + var command = connection.CreateCommand(); + command.CommandText = $"INSERT INTO {tableName} (Clave, SerializeData) VALUES ($Clave, $SerializedData)"; + command.Parameters.AddWithValue("$Clave", clave); + command.Parameters.AddWithValue("$SerializedData", serializedData); + command.ExecuteNonQuery(); + } + } + } + + public void LoadData(string clave) + { + data.Clear(); + + using (var connection = new SqliteConnection(connectionString)) + { + connection.Open(); + + var command = connection.CreateCommand(); + command.CommandText = $"SELECT SerializeData FROM {tableName} WHERE Clave = $Clave"; + command.Parameters.AddWithValue("$Clave", clave); + + using (var reader = command.ExecuteReader()) + { + while (reader.Read()) + { + string serializedData = reader.GetString(0); + data.Add( JsonSerializer.Deserialize(serializedData) ); + } + } + } + } + } + + public class DatabaseManagerItem where T : new() + { + private readonly string connectionString; + private readonly string tableName; + private T data; // Ahora 'data' es un objeto de tipo T + + public DatabaseManagerItem(string dbPath, string tableName) + { + connectionString = $"Data Source={dbPath}"; + this.tableName = tableName; + InitializeDatabase(); + data = new T(); // Inicializa 'data' con el constructor por defecto de T + } + + private void InitializeDatabase() + { + using (var connection = new SqliteConnection(connectionString)) + { + connection.Open(); + var command = connection.CreateCommand(); + command.CommandText = $@" + CREATE TABLE IF NOT EXISTS {tableName} ( + Id INTEGER PRIMARY KEY AUTOINCREMENT, + Clave TEXT UNIQUE, + SerializedData TEXT + )"; + command.ExecuteNonQuery(); + } + } + + public void Save(string clave) + { + string serializedData = JsonSerializer.Serialize(data); + using (var connection = new SqliteConnection(connectionString)) + { + connection.Open(); + var command = connection.CreateCommand(); + command.CommandText = $@" + INSERT INTO {tableName} (Clave, SerializedData) + VALUES ($Clave, $SerializedData) + ON CONFLICT(Clave) DO UPDATE SET + SerializedData = excluded.SerializedData"; + command.Parameters.AddWithValue("$Clave", clave); + command.Parameters.AddWithValue("$SerializedData", serializedData); + command.ExecuteNonQuery(); + } + } + + public bool Load(string clave) + { + using (var connection = new SqliteConnection(connectionString)) + { + connection.Open(); + var command = connection.CreateCommand(); + command.CommandText = $"SELECT SerializedData FROM {tableName} WHERE Clave = $Clave"; + command.Parameters.AddWithValue("$Clave", clave); + using (var reader = command.ExecuteReader()) + { + if (reader.Read()) + { + string serializedData = reader.GetString(0); + data = JsonSerializer.Deserialize(serializedData); + return true; + } + data = new(); + return false; + } + } + } + + public T Get() + { + return data; + } + + public void Set(T newData) + { + data = newData; + } + } + + +} diff --git a/MainWindow.xaml.cs b/MainWindow.xaml.cs index 0ee07de..899e5bb 100644 --- a/MainWindow.xaml.cs +++ b/MainWindow.xaml.cs @@ -22,9 +22,7 @@ namespace ROIEditor /// public partial class MainWindow : Window { - - private ImagenEstado EstadoImagenActual = new ImagenEstado(); - + private Point? clickPosition = null; private bool _isDrawing = false; private Point _startPosition; @@ -32,8 +30,9 @@ namespace ROIEditor private Image imagenDeFondo; private bool _isDragging = false; private Point _lastMousePosition; - public dbROIs ListaDeROIs = new dbROIs(); - + private string NombreImagenEditando; + private DatabaseManagerList ListaDeROIs = new DatabaseManagerList("roiseditor.db","ROIs"); + private DatabaseManagerItem EstadoImagenActual = new DatabaseManagerItem("imagenes.db","estados"); // Constructor de MainWindow public MainWindow() @@ -235,7 +234,7 @@ namespace ROIEditor var height = Math.Abs(endPosition.Y - _startPosition.Y); // Crea el nuevo objeto Roi con la información recopilada - Roi newRoi = new Roi(EstadoImagenActual.NombreImagen, (int)x, (int)y, (int)width, (int)height); + Roi newRoi = new Roi(EstadoImagenActual.Get().NombreImagen, (int)x, (int)y, (int)width, (int)height); // Agrega el nuevo Roi a la lista de ROIs ListaDeROIs.Add(newRoi); @@ -256,9 +255,9 @@ namespace ROIEditor // Aquí actualizas los controles de la interfaz de usuario que muestran los ROIs // Por ejemplo, si tienes una ListBox para los ROIs, actualízala así: ListaROIs.ItemsSource = null; - if (ListaDeROIs.Count() > 0) + if (ListaDeROIs.Count > 0) { - ListaROIs.ItemsSource = ListaDeROIs.rois; + ListaROIs.ItemsSource = ListaDeROIs.GetList(); } DibujarROIsEnCanvas(); } @@ -361,20 +360,19 @@ namespace ROIEditor { if (ListaImagenes.SelectedItem != null) { - if (EstadoImagenActual.NombreImagen != null) + if (NombreImagenEditando != null) { SalvarEstadoImagen(); } - if (ListaDeROIs.Count()>0) + if (ListaDeROIs.Count>0) { - ListaDeROIs.GuardarRois(); + ListaDeROIs.SaveData(NombreImagenEditando); } - EstadoImagenActual = new ImagenEstado(); - EstadoImagenActual.NombreImagen = ListaImagenes.SelectedItem.ToString(); - ListaDeROIs = new dbROIs(EstadoImagenActual.NombreImagen); - + NombreImagenEditando = ListaImagenes.SelectedItem.ToString(); - var imagePath = EstadoImagenActual.PathPlantillasPNG(); + ListaDeROIs.LoadData(EstadoImagenActual.Get().NombreImagen); + + var imagePath = EstadoImagenActual.Get().PathPlantillasPNG(); CargarImagenEnTrabajo(imagePath); CargarEstadoImagen(); @@ -383,50 +381,44 @@ namespace ROIEditor private void CargarEstadoImagen() { - string jsonPath = EstadoImagenActual.PathPlantillasJson(); - - if (File.Exists(jsonPath)) + var st = (ScaleTransform)ImagenEnTrabajoCanvas.LayoutTransform; + if (EstadoImagenActual.Load(NombreImagenEditando)) { - string json = File.ReadAllText(jsonPath); - EstadoImagenActual = JsonConvert.DeserializeObject(json); - var st = (ScaleTransform)ImagenEnTrabajoCanvas.LayoutTransform; + var EACargado = EstadoImagenActual.Get(); - st.ScaleX= EstadoImagenActual.ZoomScaleX ; - st.ScaleY = EstadoImagenActual.ZoomScaleY; + st.ScaleX = EACargado.ZoomScaleX; + st.ScaleY = EACargado.ZoomScaleY; // Aplicar el nuevo desplazamiento - ImagenEnTrabajoScrollViewer.ScrollToHorizontalOffset(EstadoImagenActual.HorizontalOffset); - ImagenEnTrabajoScrollViewer.ScrollToVerticalOffset(EstadoImagenActual.VerticalOffset); + ImagenEnTrabajoScrollViewer.ScrollToHorizontalOffset(EACargado.HorizontalOffset); + ImagenEnTrabajoScrollViewer.ScrollToVerticalOffset(EACargado.VerticalOffset); - DibujarROIsEnCanvas(); - } else - { - var st = (ScaleTransform)ImagenEnTrabajoCanvas.LayoutTransform; - EstadoImagenActual.ZoomScaleX = st.ScaleX; - EstadoImagenActual.ZoomScaleY = st.ScaleY; - EstadoImagenActual.HorizontalOffset = EstadoImagenActual.HorizontalOffset; - EstadoImagenActual.VerticalOffset = EstadoImagenActual.VerticalOffset; + DibujarROIsEnCanvas(); } + else + { + var EANuevo = EstadoImagenActual.Get(); + EANuevo.NombreImagen = ListaImagenes.SelectedItem.ToString(); + EANuevo.ZoomScaleX = st.ScaleX; + EANuevo.ZoomScaleY = st.ScaleY; + EANuevo.HorizontalOffset = EANuevo.HorizontalOffset; + EANuevo.VerticalOffset = EANuevo.VerticalOffset; + } + } private void SalvarEstadoImagen() { - // Cambia la extensión del archivo de imagen a .json - string jsonPath = EstadoImagenActual.PathPlantillasJson(); + var ea = EstadoImagenActual.Get(); var st = (ScaleTransform)ImagenEnTrabajoCanvas.LayoutTransform; - EstadoImagenActual.ZoomScaleX = st.ScaleX; - EstadoImagenActual.ZoomScaleY = st.ScaleY; - EstadoImagenActual.HorizontalOffset = ImagenEnTrabajoScrollViewer.HorizontalOffset; - EstadoImagenActual.VerticalOffset = ImagenEnTrabajoScrollViewer.VerticalOffset; - - // Serializa el estado de la imagen a JSON - string json = JsonConvert.SerializeObject(EstadoImagenActual, Formatting.Indented); - - // Escribe el JSON en un archivo - File.WriteAllText(jsonPath, json); + ea.ZoomScaleX = st.ScaleX; + ea.ZoomScaleY = st.ScaleY; + ea.HorizontalOffset = ImagenEnTrabajoScrollViewer.HorizontalOffset; + ea.VerticalOffset = ImagenEnTrabajoScrollViewer.VerticalOffset; + EstadoImagenActual.Save(NombreImagenEditando); } @@ -442,7 +434,7 @@ namespace ROIEditor } // Dibuja los ROIs - foreach (var roi in ListaDeROIs.rois) + foreach (var roi in ListaDeROIs.GetList()) { Rectangle rect = roi.DibujarRoiEnCanvas(ImagenEnTrabajoCanvas); // Eventos @@ -473,7 +465,7 @@ namespace ROIEditor { if (sender is Rectangle rect && rect.Tag is Roi roi) { - int index = ListaDeROIs.rois.IndexOf(roi); + int index = ListaDeROIs.IndexOf(roi); if (index != -1) { ListaROIs.SelectedIndex = index; // Selecciona el ROI en la lista diff --git a/ROI.cs b/ROI.cs index 8f0acd0..5e65735 100644 --- a/ROI.cs +++ b/ROI.cs @@ -14,155 +14,7 @@ using static System.Runtime.InteropServices.JavaScript.JSType; namespace ROIEditor { - - public class dbROIs - { - public List rois { get; set; } - const string dbPath = "Data Source=roiseditor.db"; - public string NombreImagen; - - public void Add(Roi r) - { - rois.Add(r); - } - public int Count() { return rois.Count; } - - public dbROIs() - { - rois = new List(); - } - - public dbROIs(string nombreImagen) - { - NombreImagen = nombreImagen; - rois = new List(); - CrearBaseDeDatosSiNoExiste(); - CargarROIs(); - } - - private void CrearBaseDeDatosSiNoExiste() - { - using (var connection = new SqliteConnection(dbPath)) - { - connection.Open(); - - var command = connection.CreateCommand(); - command.CommandText = - @" - CREATE TABLE IF NOT EXISTS Roi ( - Id INTEGER PRIMARY KEY AUTOINCREMENT, - X INTEGER NOT NULL, - Y INTEGER NOT NULL, - Width INTEGER NOT NULL, - Height INTEGER NOT NULL, - Nombre TEXT, - NombreImagen TEXT, - CodigoNumerico INTEGER, - Descripcion TEXT, - CampoTexto1 TEXT, - CampoTexto2 TEXT, - CampoTexto3 TEXT - ); - "; - command.ExecuteNonQuery(); - } - } - public void CargarROIs() - { - rois.Clear(); - using (var connection = new SqliteConnection(dbPath)) - { - connection.Open(); - - var command = connection.CreateCommand(); - command.CommandText = @"SELECT * FROM Roi WHERE NombreImagen = $NombreImagen"; - command.Parameters.AddWithValue("$NombreImagen", NombreImagen); - - using (var reader = command.ExecuteReader()) - { - while (reader.Read()) - { - rois.Add(new Roi - { - X = reader.GetInt32(reader.GetOrdinal("X")), - Y = reader.GetInt32(reader.GetOrdinal("Y")), - Width = reader.GetInt32(reader.GetOrdinal("Width")), - Height = reader.GetInt32(reader.GetOrdinal("Height")), - Nombre = reader.IsDBNull(reader.GetOrdinal("Nombre")) ? null : reader.GetString(reader.GetOrdinal("Nombre")), - NombreImagen = reader.GetString(reader.GetOrdinal("NombreImagen")), - CodigoNumerico = reader.GetInt32(reader.GetOrdinal("CodigoNumerico")), - Descripcion = reader.IsDBNull(reader.GetOrdinal("Descripcion")) ? null : reader.GetString(reader.GetOrdinal("Descripcion")), - CampoTexto1 = reader.IsDBNull(reader.GetOrdinal("CampoTexto1")) ? null : reader.GetString(reader.GetOrdinal("CampoTexto1")), - CampoTexto2 = reader.IsDBNull(reader.GetOrdinal("CampoTexto2")) ? null : reader.GetString(reader.GetOrdinal("CampoTexto2")), - CampoTexto3 = reader.IsDBNull(reader.GetOrdinal("CampoTexto3")) ? null : reader.GetString(reader.GetOrdinal("CampoTexto3")), - }); - } - } - } - } - - public void GuardarRois() - { - using (var connection = new SqliteConnection(dbPath)) - { - connection.Open(); - - var deleteCommand = connection.CreateCommand(); - deleteCommand.CommandText = @"DELETE FROM Roi WHERE NombreImagen = $NombreImagen"; - deleteCommand.Parameters.AddWithValue("$NombreImagen", NombreImagen); - deleteCommand.ExecuteNonQuery(); - } - - using (var connection = new SqliteConnection(dbPath)) - { - connection.Open(); - - foreach (var roi in rois) - { - var insertCommand = connection.CreateCommand(); - insertCommand.CommandText = - @"INSERT INTO Roi (X, Y, Width, Height, Nombre, NombreImagen, CodigoNumerico, Descripcion, CampoTexto1, CampoTexto2, CampoTexto3) - VALUES ($X, $Y, $Width, $Height, $Nombre, $NombreImagen, $CodigoNumerico, $Descripcion, $CampoTexto1, $CampoTexto2, $CampoTexto3)"; - - insertCommand.Parameters.AddWithValue("$X", roi.X); - insertCommand.Parameters.AddWithValue("$Y", roi.Y); - insertCommand.Parameters.AddWithValue("$Width", roi.Width); - insertCommand.Parameters.AddWithValue("$Height", roi.Height); - insertCommand.Parameters.AddWithValue("$Nombre", roi.Nombre ?? (object)DBNull.Value); - insertCommand.Parameters.AddWithValue("$NombreImagen", roi.NombreImagen); - insertCommand.Parameters.AddWithValue("$CodigoNumerico", roi.CodigoNumerico); - insertCommand.Parameters.AddWithValue("$Descripcion", roi.Descripcion ?? (object)DBNull.Value); - insertCommand.Parameters.AddWithValue("$CampoTexto1", roi.CampoTexto1 ?? (object)DBNull.Value); - insertCommand.Parameters.AddWithValue("$CampoTexto2", roi.CampoTexto2 ?? (object)DBNull.Value); - insertCommand.Parameters.AddWithValue("$CampoTexto3", roi.CampoTexto3 ?? (object)DBNull.Value); - - insertCommand.ExecuteNonQuery(); - } - } - } - - - public void EliminarRoi( string nombre) - { - using (var connection = new SqliteConnection(dbPath)) - { - connection.Open(); - - var command = connection.CreateCommand(); - command.CommandText = @"DELETE FROM Roi WHERE NombreImagen = $NombreImagen AND Nombre = $Nombre"; - command.Parameters.AddWithValue("$NombreImagen", NombreImagen); - command.Parameters.AddWithValue("$Nombre", nombre); - - command.ExecuteNonQuery(); - } - } - - - - } - - - + public class Roi { public int X { get; set; }