From 52d126372d334c0c568ad1a4312d4c35947daffd Mon Sep 17 00:00:00 2001 From: Davide Grilli Date: Thu, 17 Sep 2026 10:23:35 +0200 Subject: [PATCH] Redesign the final STEP phase to build a step_finali folder Previously it only compared the top-level BOM against step/ and reported matches, without copying anything. Now it unions the BOM codes with the sub-components resolved in phase 4, copies every matching .stp into a new step_finali/ folder, and reports what got created vs what's still missing. Co-Authored-By: Claude Sonnet 5 --- .gitignore | 1 + CLAUDE.md | 6 ++-- CadSearchGui/Form1.cs | 58 +++++++++++++++++++++++----------- CadSearchGui/ReportStepForm.cs | 24 +++++++------- 4 files changed, 57 insertions(+), 32 deletions(-) diff --git a/.gitignore b/.gitignore index dc97586..ff27164 100644 --- a/.gitignore +++ b/.gitignore @@ -28,6 +28,7 @@ publish/ /*.csv /raw/ /step/ +/step_finali/ *.dxc # Report BOM generati manualmente da Creo per debug/validazione: mai una dipendenza diff --git a/CLAUDE.md b/CLAUDE.md index 00f6106..2c6a516 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -59,8 +59,10 @@ entrambi rimossi: ora l'unico programma è questo, con GUI e indicizzazione inte sotto-assiemi/parti che contengono (`RisolviAlberoComponenti`), copiandoli anch'essi in `raw/`. 5. **Verifica completezza e STEP** — "Verifica completezza assiemi" (ricorsivo sui - percorsi originali in indice, non su `raw/`) e "Report STEP realizzati" (confronto - con `step/`). + percorsi originali in indice, non su `raw/`) e "Crea cartella step_finali": unisce i + codici della distinta con quelli risolti in fase 4 (`_componentiRisolti`), cerca in + `step/` il file `.stp` di ciascuno, lo copia in `step_finali/` se lo trova + e mostra l'esito (creato/mancante) in `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 38e46bd..f35dcba 100644 --- a/CadSearchGui/Form1.cs +++ b/CadSearchGui/Form1.cs @@ -46,6 +46,7 @@ public partial class Form1 : Form private List<(string Componente, string Descrizione)>? _righeCorrenti; private Dictionary>? _ultimaVerifica; private string? _ultimaCartellaRaw; + private List<(string Codice, string Tipo, string Percorso)>? _componentiRisolti; public Form1() { @@ -432,13 +433,13 @@ public partial class Form1 : Form AutoSize = true, ForeColor = SystemColors.GrayText, Margin = new Padding(0, 0, 0, 8), - Text = "Dopo aver esportato gli STEP con Creo, premi qui per confrontare i " - + "componenti della distinta con i file .stp presenti in 'step' e vedere quali " - + "sono già stati realizzati e quali mancano ancora.", + Text = "Dopo aver esportato gli STEP con Creo, premi qui per confrontare i componenti " + + "della distinta (e i sotto-componenti trovati in fase 4) con i file .stp presenti " + + "in 'step', copiare quelli trovati in 'step_finali' e vedere quali mancano ancora.", }; contenuto.Controls.Add(lblIstruzioniStep); - _btnReport.Text = "Report STEP realizzati"; + _btnReport.Text = "Crea cartella step_finali"; _btnReport.Size = new Size(220, 32); _btnReport.Click += (_, _) => GeneraReportStep(); contenuto.Controls.Add(_btnReport); @@ -475,6 +476,7 @@ public partial class Form1 : Form _gridRaw.Rows.Clear(); _ultimaCartellaRaw = null; _ultimaVerifica = null; + _componentiRisolti = null; ImpostaStatoImport($"CSV generato ({righe.Count} righe): {csv}", Color.DarkGreen); } @@ -551,33 +553,52 @@ public partial class Form1 : Form if (_percorsoInputCorrente is null || _righeCorrenti is null) return; - var cartellaStep = Path.Combine(Path.GetDirectoryName(Path.GetFullPath(_percorsoInputCorrente))!, "step"); + string radice = Path.GetDirectoryName(Path.GetFullPath(_percorsoInputCorrente))!; + var cartellaStep = Path.Combine(radice, "step"); if (!Directory.Exists(cartellaStep)) { ImpostaStatoImport($"Cartella 'step' non trovata in {cartellaStep}.", Color.DarkRed); return; } - var codiciConStep = new HashSet( - Directory.GetFiles(cartellaStep, "*.stp").Select(Path.GetFileNameWithoutExtension)!); + var descrizioni = new Dictionary(StringComparer.OrdinalIgnoreCase); + foreach (var r in _righeCorrenti) + descrizioni[r.Componente] = r.Descrizione; - var righeReport = _righeCorrenti - .Select(r => (r.Componente, r.Descrizione, Realizzato: codiciConStep.Contains(r.Componente))) + // Il confronto include sia i componenti della distinta sia i sotto-componenti scoperti + // ricorsivamente in fase 4 (_componentiRisolti): un assieme può avere lo STEP fatto solo + // per i suoi pezzi, non per l'assieme intero, o viceversa. + var tuttiICodici = _righeCorrenti.Select(r => r.Componente) + .Concat((_componentiRisolti ?? Enumerable.Empty<(string Codice, string Tipo, string Percorso)>()).Select(c => c.Codice)) + .Distinct(StringComparer.OrdinalIgnoreCase) .ToList(); - int realizzati = righeReport.Count(r => r.Realizzato); + + var cartellaStepFinali = Path.Combine(radice, "step_finali"); + Directory.CreateDirectory(cartellaStepFinali); + + var righeReport = new List<(string Componente, string Descrizione, bool Creato)>(); + foreach (var codice in tuttiICodici) + { + var percorsoStp = Path.Combine(cartellaStep, codice + ".stp"); + bool trovato = File.Exists(percorsoStp); + if (trovato) + File.Copy(percorsoStp, Path.Combine(cartellaStepFinali, codice + ".stp"), overwrite: true); + righeReport.Add((codice, descrizioni.GetValueOrDefault(codice, ""), trovato)); + } + int creati = righeReport.Count(r => r.Creato); ImpostaStatoImport( - $"Report STEP: {realizzati} componenti realizzati su {righeReport.Count} " - + $"({righeReport.Count - realizzati} mancanti).", + $"STEP finali: {creati} componenti copiati su {righeReport.Count} " + + $"({righeReport.Count - creati} mancanti) in {cartellaStepFinali}.", Color.DarkGreen); - using var dialog = new ReportStepForm(righeReport, cartellaStep); + using var dialog = new ReportStepForm(righeReport, cartellaStepFinali); dialog.ShowDialog(this); } - /// Svuota in un colpo solo le cartelle "raw" e "step" nella root (stessa cartella - /// base del file distinta importato), previa un'unica conferma. Non tocca l'indice CAD: solo - /// le copie locali generate dalla pipeline. + /// Svuota in un colpo solo le cartelle "raw", "step" e "step_finali" nella root + /// (stessa cartella base del file distinta importato), previa un'unica conferma. Non tocca + /// l'indice CAD: solo le copie locali generate dalla pipeline. private void PulisciRawEStep() { string radice; @@ -595,12 +616,12 @@ public partial class Form1 : Form radice = dialog.SelectedPath; } - var cartelle = new[] { Path.Combine(radice, "raw"), Path.Combine(radice, "step") } + var cartelle = new[] { Path.Combine(radice, "raw"), Path.Combine(radice, "step"), Path.Combine(radice, "step_finali") } .Where(Directory.Exists) .ToList(); if (cartelle.Count == 0) { - ImpostaStatoImport($"Nessuna cartella 'raw' o 'step' trovata in {radice}.", Color.DarkRed); + ImpostaStatoImport($"Nessuna cartella 'raw', 'step' o 'step_finali' trovata in {radice}.", Color.DarkRed); return; } @@ -730,6 +751,7 @@ public partial class Form1 : Form progressForm.ShowDialog(this); var (trovati, codiciNonTrovati) = await task; + _componentiRisolti = trovati; int numPrt = trovati.Count(r => r.Tipo == "prt"); int numAsm = trovati.Count(r => r.Tipo == "asm"); diff --git a/CadSearchGui/ReportStepForm.cs b/CadSearchGui/ReportStepForm.cs index 693bd82..e20858c 100644 --- a/CadSearchGui/ReportStepForm.cs +++ b/CadSearchGui/ReportStepForm.cs @@ -2,15 +2,15 @@ using System.Diagnostics; namespace CadSearchGui; -/// Mostra, per ogni componente della distinta base, se lo STEP corrispondente -/// è già stato esportato (file .stp presente in "step") o manca ancora. +/// 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 class ReportStepForm : Form { - public ReportStepForm(List<(string Componente, string Descrizione, bool Realizzato)> righe, string cartellaStep) + public ReportStepForm(List<(string Componente, string Descrizione, bool Creato)> righe, string cartellaStepFinali) { - int realizzati = righe.Count(r => r.Realizzato); + int creati = righe.Count(r => r.Creato); - Text = "Report STEP realizzati"; + Text = "Report STEP finali"; ClientSize = new Size(720, 440); StartPosition = FormStartPosition.CenterParent; Font = new Font("Segoe UI", 9.5f); @@ -21,8 +21,8 @@ public class ReportStepForm : Form AutoSize = false, Height = 32, Padding = new Padding(12, 8, 12, 8), - Text = $"{realizzati} componenti realizzati su {righe.Count} ({righe.Count - realizzati} mancanti), " - + $"confrontati con \"{cartellaStep}\".", + Text = $"{creati} componenti copiati su {righe.Count} ({righe.Count - creati} mancanti) " + + $"in \"{cartellaStepFinali}\".", }; var grid = new DataGridView @@ -42,16 +42,16 @@ public class ReportStepForm : Form grid.Columns["descrizione"]!.FillWeight = 55; grid.Columns["step"]!.FillWeight = 25; - foreach (var (componente, descrizione, realizzato) in righe.OrderBy(r => r.Realizzato).ThenBy(r => r.Componente)) + foreach (var (componente, descrizione, creato) in righe.OrderBy(r => r.Creato).ThenBy(r => r.Componente)) { - int i = grid.Rows.Add(componente, descrizione, realizzato ? "Realizzato" : "Mancante"); - grid.Rows[i].DefaultCellStyle.ForeColor = realizzato ? Color.DarkGreen : Color.DarkRed; + int i = grid.Rows.Add(componente, descrizione, creato ? "Creato" : "Mancante"); + grid.Rows[i].DefaultCellStyle.ForeColor = creato ? Color.DarkGreen : Color.DarkRed; } - var btnApriCartella = new Button { Text = "Apri cartella step", Dock = DockStyle.Bottom, Height = 34 }; + var btnApriCartella = new Button { Text = "Apri cartella step_finali", Dock = DockStyle.Bottom, Height = 34 }; btnApriCartella.Click += (_, _) => { - try { Process.Start("explorer.exe", cartellaStep); } + try { Process.Start("explorer.exe", cartellaStepFinali); } catch (Exception ex) { MessageBox.Show(this, $"Impossibile aprire Esplora risorse:\n{ex.Message}", "Errore",