diff --git a/CLAUDE.md b/CLAUDE.md index 7c99e58..f1e0479 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -61,8 +61,10 @@ entrambi rimossi: ora l'unico programma è questo, con GUI e indicizzazione inte 5. **Verifica completezza e STEP** — "Verifica completezza assiemi" (ricorsivo sui percorsi originali in indice, non su `raw/`) e "Crea cartella step_finali": solo per i codici della distinta importata dal CSV (non i sotto-componenti di fase 4, che servono - solo a completare `raw/`) cerca in `step/` il file `.stp`, lo copia in - `step_finali/` se lo trova e mostra l'esito (creato/mancante) in `ReportStepForm`. + solo a completare `raw/`) cerca in `step/` il file `.stp` e lo copia in + `step_finali/` se lo trova. Per i mancanti distingue, incrociando l'indice CAD, + `EsitoStep.StepMancante` (il CAD c'è, manca solo l'esportazione STEP) da + `ComponenteNonTrovato` (il componente non è nemmeno nell'indice) — vedi `ReportStepForm`. - **Indexer.cs** — logica di scansione del disco e scrittura/aggiornamento del DB SQLite (`Indexer.ScanAsync`). Cammina tutte le cartelle di primo livello trovate sotto la radice (scoperte dinamicamente con `Directory.GetDirectories`, non un elenco fisso) diff --git a/CadSearchGui/Form1.cs b/CadSearchGui/Form1.cs index 6a22d3e..12c5a35 100644 --- a/CadSearchGui/Form1.cs +++ b/CadSearchGui/Form1.cs @@ -569,23 +569,38 @@ public partial class Form1 : Form .Distinct(StringComparer.OrdinalIgnoreCase) .ToList(); + // Per i codici senza STEP, distingue "il CAD c'è ma lo STEP non è stato esportato" da + // "il componente non è nemmeno nell'indice CAD" (riusa la verifica già fatta in fase 2/3 + // se disponibile, altrimenti la rifà). + var cadTrovati = _ultimaVerifica ?? TrovaPercorsiCad(tuttiICodici); + var cartellaStepFinali = Path.Combine(radice, "step_finali"); Directory.CreateDirectory(cartellaStepFinali); - var righeReport = new List<(string Componente, string Descrizione, bool Creato)>(); + var righeReport = new List<(string Componente, string Descrizione, EsitoStep Esito)>(); foreach (var codice in tuttiICodici) { var percorsoStp = Path.Combine(cartellaStep, codice + ".stp"); - bool trovato = File.Exists(percorsoStp); - if (trovato) + EsitoStep esito; + if (File.Exists(percorsoStp)) + { File.Copy(percorsoStp, Path.Combine(cartellaStepFinali, codice + ".stp"), overwrite: true); - righeReport.Add((codice, descrizioni.GetValueOrDefault(codice, ""), trovato)); + esito = EsitoStep.Creato; + } + else + { + esito = cadTrovati.ContainsKey(codice) ? EsitoStep.StepMancante : EsitoStep.ComponenteNonTrovato; + } + righeReport.Add((codice, descrizioni.GetValueOrDefault(codice, ""), esito)); } - int creati = righeReport.Count(r => r.Creato); + int creati = righeReport.Count(r => r.Esito == EsitoStep.Creato); + int stepMancanti = righeReport.Count(r => r.Esito == EsitoStep.StepMancante); + int nonTrovati = righeReport.Count(r => r.Esito == EsitoStep.ComponenteNonTrovato); ImpostaStatoImport( - $"STEP finali: {creati} componenti copiati su {righeReport.Count} " - + $"({righeReport.Count - creati} mancanti) in {cartellaStepFinali}.", + $"STEP finali: {creati} copiati, {stepMancanti} da esportare (CAD presente), " + + $"{nonTrovati} componenti non nell'indice, su {righeReport.Count} totali. " + + $"Cartella: {cartellaStepFinali}.", Color.DarkGreen); using var dialog = new ReportStepForm(righeReport, cartellaStepFinali); diff --git a/CadSearchGui/ReportStepForm.cs b/CadSearchGui/ReportStepForm.cs index e20858c..1f33800 100644 --- a/CadSearchGui/ReportStepForm.cs +++ b/CadSearchGui/ReportStepForm.cs @@ -2,13 +2,26 @@ using System.Diagnostics; namespace CadSearchGui; -/// Mostra, per ogni componente (distinta base + sotto-componenti risolti in fase 4), -/// se lo STEP corrispondente è stato trovato in "step" e copiato in "step_finali", o se manca. +public enum EsitoStep +{ + /// File .stp trovato in "step" e copiato in "step_finali". + Creato, + /// Il componente è nell'indice CAD (asm/prt trovato), ma nessuno STEP esportato. + StepMancante, + /// Il componente non è nemmeno nell'indice CAD. + ComponenteNonTrovato, +} + +/// Mostra, per ogni componente della distinta base, se lo STEP corrispondente è stato +/// trovato in "step" e copiato in "step_finali", se manca solo lo STEP (il CAD sorgente c'è, +/// ma non è ancora stato esportato) o se manca anche il CAD sorgente nell'indice. public class ReportStepForm : Form { - public ReportStepForm(List<(string Componente, string Descrizione, bool Creato)> righe, string cartellaStepFinali) + public ReportStepForm(List<(string Componente, string Descrizione, EsitoStep Esito)> righe, string cartellaStepFinali) { - int creati = righe.Count(r => r.Creato); + int creati = righe.Count(r => r.Esito == EsitoStep.Creato); + int stepMancanti = righe.Count(r => r.Esito == EsitoStep.StepMancante); + int nonTrovati = righe.Count(r => r.Esito == EsitoStep.ComponenteNonTrovato); Text = "Report STEP finali"; ClientSize = new Size(720, 440); @@ -21,8 +34,8 @@ public class ReportStepForm : Form AutoSize = false, Height = 32, Padding = new Padding(12, 8, 12, 8), - Text = $"{creati} componenti copiati su {righe.Count} ({righe.Count - creati} mancanti) " - + $"in \"{cartellaStepFinali}\".", + Text = $"{creati} copiati, {stepMancanti} da esportare (CAD presente), " + + $"{nonTrovati} non nell'indice, su {righe.Count} totali. In \"{cartellaStepFinali}\".", }; var grid = new DataGridView @@ -42,10 +55,16 @@ public class ReportStepForm : Form grid.Columns["descrizione"]!.FillWeight = 55; grid.Columns["step"]!.FillWeight = 25; - foreach (var (componente, descrizione, creato) in righe.OrderBy(r => r.Creato).ThenBy(r => r.Componente)) + foreach (var (componente, descrizione, esito) in righe.OrderBy(r => r.Esito).ThenBy(r => r.Componente)) { - int i = grid.Rows.Add(componente, descrizione, creato ? "Creato" : "Mancante"); - grid.Rows[i].DefaultCellStyle.ForeColor = creato ? Color.DarkGreen : Color.DarkRed; + var (testo, colore) = esito switch + { + EsitoStep.Creato => ("Creato", Color.DarkGreen), + EsitoStep.StepMancante => ("Da esportare (CAD presente)", Color.DarkOrange), + _ => ("Componente non trovato nel server", Color.DarkRed), + }; + int i = grid.Rows.Add(componente, descrizione, testo); + grid.Rows[i].DefaultCellStyle.ForeColor = colore; } var btnApriCartella = new Button { Text = "Apri cartella step_finali", Dock = DockStyle.Bottom, Height = 34 };