ROIEditor/ROI.cs

230 lines
9.0 KiB
C#
Raw Normal View History

2024-04-11 06:51:12 -03:00
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Shapes;
using Microsoft.Data.Sqlite;
using System;
using System.Collections.Generic;
using static System.Runtime.InteropServices.JavaScript.JSType;
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 int X { get; set; }
public int Y { get; set; }
public int Width { get; set; }
public int Height { get; set; }
public string Nombre { get; set; }
public string NombreImagen { get; set; }
public int CodigoNumerico { get; set; }
public string Descripcion { get; set; }
public string CampoTexto1 { get; set; }
public string CampoTexto2 { get; set; }
public string CampoTexto3 { get; set; }
// Constructor sin parámetros para facilitar la deserialización
public Roi() { }
// Puedes agregar un constructor con parámetros si lo necesitas,
// para facilitar la creación de instancias de Roi con información específica.
public Roi(string nombreImagen, int x, int y, int width, int height, string nombre, int codigoNumerico, string descripcion, string campoTexto1, string campoTexto2, string campoTexto3)
{
X = x;
Y = y;
Width = width;
Height = height;
Nombre = nombre;
NombreImagen = nombreImagen;
CodigoNumerico = codigoNumerico;
Descripcion = descripcion;
CampoTexto1 = campoTexto1;
CampoTexto2 = campoTexto2;
CampoTexto3 = campoTexto3;
}
public Roi(string nombreImagen, int x, int y, int width, int height)
{
X = x;
Y = y;
Width = width;
Height = height;
NombreImagen = nombreImagen;
}
public Rectangle DibujarRoiEnCanvas(System.Windows.Controls.Canvas ImagenEnTrabajoCanvas)
{
Rectangle rect = new Rectangle
{
Stroke = Brushes.Red,
StrokeThickness = 2, // Grosor normal
Width = Width, // No ajustar aquí por el zoom; ajustar al aplicar el zoom si es necesario
Height = Height, // No ajustar aquí por el zoom; ajustar al aplicar el zoom si es necesario
Fill = Brushes.Transparent, // Permite la detección de eventos MouseEnter en todo el rectángulo
Tag = this // Almacena el Roi en el Tag para identificarlo después
};
Canvas.SetLeft(rect, X);
Canvas.SetTop(rect, Y);
ImagenEnTrabajoCanvas.Children.Add(rect); // Asegúrate de que esto se refiere al Canvas, no al ScrollViewer
return rect;
}
}
}