Actualizado logica de ImagenEstado

This commit is contained in:
Miguel 2024-04-12 23:06:46 +02:00
parent 10ceff7c70
commit 6c7140b73e
4 changed files with 239 additions and 310 deletions

View File

@ -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<T>
{
private readonly string connectionString;
private readonly string tableName;
private List<T> data = new List<T>();
public void Add(T item)
{
data.Add(item);
}
public void Clear()
{
data.Clear();
}
public List<T> 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<T> LoadData(string clave)
{
var dataList = new List<T>();
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<T> data = JsonSerializer.Deserialize<List<T>>(serializedData);
dataList.AddRange(data);
}
}
}
return dataList;
}
}
}

198
DatabaseManagerList.cs Normal file
View File

@ -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<T>
{
private readonly string connectionString;
private readonly string tableName;
private List<T> data = new();
public void Add(T item)
{
data.Add(item);
}
public void Clear()
{
data.Clear();
}
public List<T> 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<T>(serializedData) );
}
}
}
}
}
public class DatabaseManagerItem<T> 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<T>(serializedData);
return true;
}
data = new();
return false;
}
}
}
public T Get()
{
return data;
}
public void Set(T newData)
{
data = newData;
}
}
}

View File

@ -23,8 +23,6 @@ namespace ROIEditor
public partial class MainWindow : Window public partial class MainWindow : Window
{ {
private ImagenEstado EstadoImagenActual = new ImagenEstado();
private Point? clickPosition = null; private Point? clickPosition = null;
private bool _isDrawing = false; private bool _isDrawing = false;
private Point _startPosition; private Point _startPosition;
@ -32,8 +30,9 @@ namespace ROIEditor
private Image imagenDeFondo; private Image imagenDeFondo;
private bool _isDragging = false; private bool _isDragging = false;
private Point _lastMousePosition; private Point _lastMousePosition;
public dbROIs ListaDeROIs = new dbROIs(); private string NombreImagenEditando;
private DatabaseManagerList<Roi> ListaDeROIs = new DatabaseManagerList<Roi>("roiseditor.db","ROIs");
private DatabaseManagerItem<ImagenEstado> EstadoImagenActual = new DatabaseManagerItem<ImagenEstado>("imagenes.db","estados");
// Constructor de MainWindow // Constructor de MainWindow
public MainWindow() public MainWindow()
@ -235,7 +234,7 @@ namespace ROIEditor
var height = Math.Abs(endPosition.Y - _startPosition.Y); var height = Math.Abs(endPosition.Y - _startPosition.Y);
// Crea el nuevo objeto Roi con la información recopilada // 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 // Agrega el nuevo Roi a la lista de ROIs
ListaDeROIs.Add(newRoi); ListaDeROIs.Add(newRoi);
@ -256,9 +255,9 @@ namespace ROIEditor
// Aquí actualizas los controles de la interfaz de usuario que muestran los ROIs // 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í: // Por ejemplo, si tienes una ListBox para los ROIs, actualízala así:
ListaROIs.ItemsSource = null; ListaROIs.ItemsSource = null;
if (ListaDeROIs.Count() > 0) if (ListaDeROIs.Count > 0)
{ {
ListaROIs.ItemsSource = ListaDeROIs.rois; ListaROIs.ItemsSource = ListaDeROIs.GetList();
} }
DibujarROIsEnCanvas(); DibujarROIsEnCanvas();
} }
@ -361,20 +360,19 @@ namespace ROIEditor
{ {
if (ListaImagenes.SelectedItem != null) if (ListaImagenes.SelectedItem != null)
{ {
if (EstadoImagenActual.NombreImagen != null) if (NombreImagenEditando != null)
{ {
SalvarEstadoImagen(); SalvarEstadoImagen();
} }
if (ListaDeROIs.Count()>0) if (ListaDeROIs.Count>0)
{ {
ListaDeROIs.GuardarRois(); ListaDeROIs.SaveData(NombreImagenEditando);
} }
EstadoImagenActual = new ImagenEstado(); NombreImagenEditando = ListaImagenes.SelectedItem.ToString();
EstadoImagenActual.NombreImagen = ListaImagenes.SelectedItem.ToString();
ListaDeROIs = new dbROIs(EstadoImagenActual.NombreImagen);
ListaDeROIs.LoadData(EstadoImagenActual.Get().NombreImagen);
var imagePath = EstadoImagenActual.PathPlantillasPNG(); var imagePath = EstadoImagenActual.Get().PathPlantillasPNG();
CargarImagenEnTrabajo(imagePath); CargarImagenEnTrabajo(imagePath);
CargarEstadoImagen(); CargarEstadoImagen();
@ -383,50 +381,44 @@ namespace ROIEditor
private void CargarEstadoImagen() private void CargarEstadoImagen()
{ {
string jsonPath = EstadoImagenActual.PathPlantillasJson();
if (File.Exists(jsonPath))
{
string json = File.ReadAllText(jsonPath);
EstadoImagenActual = JsonConvert.DeserializeObject<ImagenEstado>(json);
var st = (ScaleTransform)ImagenEnTrabajoCanvas.LayoutTransform; var st = (ScaleTransform)ImagenEnTrabajoCanvas.LayoutTransform;
if (EstadoImagenActual.Load(NombreImagenEditando))
{
var EACargado = EstadoImagenActual.Get();
st.ScaleX= EstadoImagenActual.ZoomScaleX ; st.ScaleX = EACargado.ZoomScaleX;
st.ScaleY = EstadoImagenActual.ZoomScaleY; st.ScaleY = EACargado.ZoomScaleY;
// Aplicar el nuevo desplazamiento // Aplicar el nuevo desplazamiento
ImagenEnTrabajoScrollViewer.ScrollToHorizontalOffset(EstadoImagenActual.HorizontalOffset); ImagenEnTrabajoScrollViewer.ScrollToHorizontalOffset(EACargado.HorizontalOffset);
ImagenEnTrabajoScrollViewer.ScrollToVerticalOffset(EstadoImagenActual.VerticalOffset); ImagenEnTrabajoScrollViewer.ScrollToVerticalOffset(EACargado.VerticalOffset);
DibujarROIsEnCanvas(); DibujarROIsEnCanvas();
} else
{
var st = (ScaleTransform)ImagenEnTrabajoCanvas.LayoutTransform;
EstadoImagenActual.ZoomScaleX = st.ScaleX;
EstadoImagenActual.ZoomScaleY = st.ScaleY;
EstadoImagenActual.HorizontalOffset = EstadoImagenActual.HorizontalOffset;
EstadoImagenActual.VerticalOffset = EstadoImagenActual.VerticalOffset;
} }
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() private void SalvarEstadoImagen()
{ {
// Cambia la extensión del archivo de imagen a .json var ea = EstadoImagenActual.Get();
string jsonPath = EstadoImagenActual.PathPlantillasJson();
var st = (ScaleTransform)ImagenEnTrabajoCanvas.LayoutTransform; var st = (ScaleTransform)ImagenEnTrabajoCanvas.LayoutTransform;
EstadoImagenActual.ZoomScaleX = st.ScaleX; ea.ZoomScaleX = st.ScaleX;
EstadoImagenActual.ZoomScaleY = st.ScaleY; ea.ZoomScaleY = st.ScaleY;
EstadoImagenActual.HorizontalOffset = ImagenEnTrabajoScrollViewer.HorizontalOffset; ea.HorizontalOffset = ImagenEnTrabajoScrollViewer.HorizontalOffset;
EstadoImagenActual.VerticalOffset = ImagenEnTrabajoScrollViewer.VerticalOffset; ea.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);
EstadoImagenActual.Save(NombreImagenEditando);
} }
@ -442,7 +434,7 @@ namespace ROIEditor
} }
// Dibuja los ROIs // Dibuja los ROIs
foreach (var roi in ListaDeROIs.rois) foreach (var roi in ListaDeROIs.GetList())
{ {
Rectangle rect = roi.DibujarRoiEnCanvas(ImagenEnTrabajoCanvas); Rectangle rect = roi.DibujarRoiEnCanvas(ImagenEnTrabajoCanvas);
// Eventos // Eventos
@ -473,7 +465,7 @@ namespace ROIEditor
{ {
if (sender is Rectangle rect && rect.Tag is Roi roi) if (sender is Rectangle rect && rect.Tag is Roi roi)
{ {
int index = ListaDeROIs.rois.IndexOf(roi); int index = ListaDeROIs.IndexOf(roi);
if (index != -1) if (index != -1)
{ {
ListaROIs.SelectedIndex = index; // Selecciona el ROI en la lista ListaROIs.SelectedIndex = index; // Selecciona el ROI en la lista

148
ROI.cs
View File

@ -15,154 +15,6 @@ using static System.Runtime.InteropServices.JavaScript.JSType;
namespace ROIEditor namespace ROIEditor
{ {
public class dbROIs
{
public List<Roi> 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<Roi>();
}
public dbROIs(string nombreImagen)
{
NombreImagen = nombreImagen;
rois = new List<Roi>();
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 class Roi
{ {
public int X { get; set; } public int X { get; set; }