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 <noreply@anthropic.com>
This commit is contained in:
davideandClaude Sonnet 5 committed 2026-09-17 10:23:35 +02:00
1 parent ee408219bd
commit 52d126372d
4 files changed
+57 -32

No files matched your search

+40 -18
View File
@@ -46,6 +46,7 @@ public partial class Form1 : Form
private List<(string Componente, string Descrizione)>? _righeCorrenti;
private Dictionary<string, List<string>>? _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<string>(
Directory.GetFiles(cartellaStep, "*.stp").Select(Path.GetFileNameWithoutExtension)!);
var descrizioni = new Dictionary<string, string>(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);
}
/// <summary>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.</summary>
/// <summary>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.</summary>
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");