Sposta 'Pulisci raw e step' e 'Cambia cartella' nel menu File, rinomina 'Nuovo'

Fase 1 (Database) aveva 4 bottoni tutti sullo stesso piano visivo: due
configurano il DB, gli altri due (cambio cartella di lavoro, pulizia
raw/step) sono azioni occasionali di manutenzione, non passi del wizard.
Spostate in File → "Scegli cartella di lavoro..." e "Pulisci raw e
step...", raggiungibili in qualunque momento invece che solo dalla fase 1.

"File → Nuova estrazione" diventa "Nuovo"; corretto anche un bug per cui
InizializzaCartellaLavoro non richiamava AggiornaStatoAvanti, lasciando
"Avanti" disabilitato in fase 1 finché non si toccava un altro controllo
anche a DB e cartella già caricati all'avvio.

Doc aggiornati nello stesso commit: CLAUDE.md, docs/architettura.md,
GuidaForm.cs.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
davideandClaude Sonnet 5 committed 2026-09-22 14:44:27 +02:00
1 parent e29a1bf90a
commit 3e9c78074c
4 files changed
+55 -53

No files matched your search

+10 -6
View File
@@ -73,10 +73,11 @@ che conta per capire il prodotto.
designer visuale): designer visuale):
1. **Database** — carica/aggiorna `cad_index.db` (`Indexer.ScanAsync`, radice disco di 1. **Database** — carica/aggiorna `cad_index.db` (`Indexer.ScanAsync`, radice disco di
default `X:\` hardcoded in `RadiceDiscoDefault`); qui vive anche la **cartella di lavoro** default `X:\` hardcoded in `RadiceDiscoDefault`); mostra anche la **cartella di lavoro**
(destinazione di CSV/`raw/`/`step/`), proposta dall'ultima usata o dalla cartella del DB se (destinazione di CSV/`raw/`/`step/`), proposta dall'ultima usata o dalla cartella del DB se
non c'è ancora nulla di salvato — vedi `docs/db-cad-index.md` per il dettaglio di schema e non c'è ancora nulla di salvato — cambiabile da "File → Scegli cartella di lavoro..." (non
risoluzione del percorso DB. più un bottone in fase 1: azione occasionale, non un passo del flusso) — vedi
`docs/db-cad-index.md` per il dettaglio di schema e risoluzione del percorso DB.
2. **Importa Distinta Base** — `DistintaBaseImporter.ConvertiInCsv` genera il CSV 2. **Importa Distinta Base** — `DistintaBaseImporter.ConvertiInCsv` genera il CSV
componente;descrizione nella cartella di lavoro; se il file segue la convenzione del componente;descrizione nella cartella di lavoro; se il file segue la convenzione del
gestionale (`DBP_<codice>_<timestamp>`), aggiunge l'assieme generale come riga in più (da gestionale (`DBP_<codice>_<timestamp>`), aggiunge l'assieme generale come riga in più (da
@@ -103,9 +104,12 @@ designer visuale):
5. **Verifica completezza** — mostra i `.asm` della distinta già in `raw/`, trascinabili su 5. **Verifica completezza** — mostra i `.asm` della distinta già in `raw/`, trascinabili su
Creo per l'esportazione STEP (Distributed Batch, manuale, fuori dall'app). Creo per l'esportazione STEP (Distributed Batch, manuale, fuori dall'app).
Menu in cima alla finestra: "File → Nuova estrazione" (Ctrl+N) azzera lo stato delle fasi 2-5 Menu in cima alla finestra: "File → Nuovo" (Ctrl+N) azzera lo stato delle fasi 2-5
per ripartire con una nuova distinta, senza toccare DB/cartella di lavoro della fase 1; per ripartire con una nuova distinta, senza toccare DB/cartella di lavoro della fase 1 (va
"Aiuto → Guida" (F1) apre una sintesi interattiva delle 5 fasi (`GuidaForm.cs`). volutamente alla fase 2, non alla 1: quei dati restano quelli già caricati); "File → Scegli
cartella di lavoro..." cambia la cartella di CSV/`raw/`/`step/` in qualunque momento; "File →
Pulisci raw e step..." svuota le cartelle `raw/`/`step/` nella cartella di lavoro (non tocca
l'indice); "Aiuto → Guida" (F1) apre una sintesi interattiva delle 5 fasi (`GuidaForm.cs`).
## Script standalone (`scripts/`) ## Script standalone (`scripts/`)
+16 -28
View File
@@ -11,18 +11,18 @@ public partial class Form1 : Form
private readonly Button _btnTrovaPrt = new(); private readonly Button _btnTrovaPrt = new();
private readonly Button _btnVerifica = new(); private readonly Button _btnVerifica = new();
private readonly ListView _lstAnteprimaAsm = new(); private readonly ListView _lstAnteprimaAsm = new();
private readonly Button _btnPulisci = new();
private readonly Label _lblStatus = new(); private readonly Label _lblStatus = new();
private readonly Label _lblDb = new(); private readonly Label _lblDb = new();
private readonly Label _lblUltimoAggiornamento = new(); private readonly Label _lblUltimoAggiornamento = new();
private readonly Label _lblCartellaLavoro = new(); private readonly Label _lblCartellaLavoro = new();
private readonly Button _btnCambiaCartella = new();
private readonly DataGridView _gridImport = new(); private readonly DataGridView _gridImport = new();
private readonly DataGridView _gridRaw = new(); private readonly DataGridView _gridRaw = new();
private readonly Label _lblImportStatus = new(); private readonly Label _lblImportStatus = new();
private readonly ToolTip _tipImportStatus = new(); private readonly ToolTip _tipImportStatus = new();
private readonly MenuStrip _menu = new(); private readonly MenuStrip _menu = new();
private readonly ToolStripMenuItem _mnuNuovaEstrazione = new("Nuova estrazione"); private readonly ToolStripMenuItem _mnuNuovaEstrazione = new("Nuovo");
private readonly ToolStripMenuItem _mnuPulisci = new("Pulisci raw e step...");
private readonly ToolStripMenuItem _mnuCambiaCartella = new("Scegli cartella di lavoro...");
// Wizard: una fase alla volta occupa tutta la finestra, si avanza solo quando quella // Wizard: una fase alla volta occupa tutta la finestra, si avanza solo quando quella
// corrente è "pronta" (vedi AvantiConsentito). NomiFasi/_panelFasi sono paralleli per indice. // corrente è "pronta" (vedi AvantiConsentito). NomiFasi/_panelFasi sono paralleli per indice.
@@ -152,6 +152,12 @@ public partial class Form1 : Form
_mnuNuovaEstrazione.Click += (_, _) => NuovaEstrazione(); _mnuNuovaEstrazione.Click += (_, _) => NuovaEstrazione();
mnuFile.DropDownItems.Add(_mnuNuovaEstrazione); mnuFile.DropDownItems.Add(_mnuNuovaEstrazione);
_mnuCambiaCartella.Click += (_, _) => ScegliCartellaLavoro();
mnuFile.DropDownItems.Add(_mnuCambiaCartella);
_mnuPulisci.Click += (_, _) => PulisciRawEStep();
mnuFile.DropDownItems.Add(_mnuPulisci);
var mnuAiuto = new ToolStripMenuItem("Aiuto"); var mnuAiuto = new ToolStripMenuItem("Aiuto");
var mnuGuida = new ToolStripMenuItem("Guida") { ShortcutKeys = Keys.F1 }; var mnuGuida = new ToolStripMenuItem("Guida") { ShortcutKeys = Keys.F1 };
mnuGuida.Click += (_, _) => new GuidaForm().ShowDialog(this); mnuGuida.Click += (_, _) => new GuidaForm().ShowDialog(this);
@@ -259,7 +265,7 @@ public partial class Form1 : Form
{ {
if (_dbPath is null || _cartellaLavoro is null) if (_dbPath is null || _cartellaLavoro is null)
{ {
MessageBox.Show(this, "Carica prima il database in fase 1.", "Nuova estrazione", MessageBox.Show(this, "Carica prima il database in fase 1.", "Nuovo",
MessageBoxButtons.OK, MessageBoxIcon.Information); MessageBoxButtons.OK, MessageBoxIcon.Information);
return; return;
} }
@@ -337,7 +343,7 @@ public partial class Form1 : Form
Text = "Cartella di lavoro: qui vengono scritti il CSV della distinta e la " Text = "Cartella di lavoro: qui vengono scritti il CSV della distinta e la "
+ "cartella 'raw' (gli STEP esportati con Creo vanno invece in 'step', " + "cartella 'raw' (gli STEP esportati con Creo vanno invece in 'step', "
+ "dentro la stessa cartella). Proposta automaticamente (ricordata da un " + "dentro la stessa cartella). Proposta automaticamente (ricordata da un "
+ "avvio all'altro), modificabile con 'Cambia cartella...'.", + "avvio all'altro), modificabile da 'File → Scegli cartella di lavoro...'.",
}; };
contenuto.Controls.Add(lblIstruzioniCartella); contenuto.Controls.Add(lblIstruzioniCartella);
@@ -347,27 +353,6 @@ public partial class Form1 : Form
_lblCartellaLavoro.Margin = new Padding(0, 0, 0, 4); _lblCartellaLavoro.Margin = new Padding(0, 0, 0, 4);
contenuto.Controls.Add(_lblCartellaLavoro); contenuto.Controls.Add(_lblCartellaLavoro);
_btnCambiaCartella.Text = "Cambia cartella...";
UiStile.Secondario(_btnCambiaCartella);
_btnCambiaCartella.Click += (_, _) => ScegliCartellaLavoro();
contenuto.Controls.Add(_btnCambiaCartella);
var lblManutenzione = new Label
{
Dock = DockStyle.Top,
AutoSize = true,
ForeColor = SystemColors.GrayText,
Margin = new Padding(0, 20, 0, 8),
Text = "Manutenzione: svuota le cartelle 'raw' e 'step' nella cartella di lavoro "
+ "prima di un nuovo giro (non tocca l'indice, solo le copie locali).",
};
contenuto.Controls.Add(lblManutenzione);
_btnPulisci.Text = "Pulisci raw e step";
UiStile.Secondario(_btnPulisci);
_btnPulisci.Click += (_, _) => PulisciRawEStep();
contenuto.Controls.Add(_btnPulisci);
var panel = new Panel(); var panel = new Panel();
panel.Controls.Add(contenuto); panel.Controls.Add(contenuto);
return panel; return panel;
@@ -707,7 +692,8 @@ public partial class Form1 : Form
.ToList(); .ToList();
if (cartelle.Count == 0) if (cartelle.Count == 0)
{ {
ImpostaStatoImport($"Nessuna cartella 'raw' o 'step' trovata in {radice}.", Color.DarkRed); MessageBox.Show(this, $"Nessuna cartella 'raw' o 'step' trovata in {radice}.",
"Pulisci raw e step", MessageBoxButtons.OK, MessageBoxIcon.Information);
return; return;
} }
@@ -734,7 +720,8 @@ public partial class Form1 : Form
} }
} }
ImpostaStatoImport($"{eliminati} file eliminati da {string.Join(" e ", cartelle)}.", Color.DarkGreen); MessageBox.Show(this, $"{eliminati} file eliminati da {string.Join(" e ", cartelle)}.",
"Pulisci raw e step", MessageBoxButtons.OK, MessageBoxIcon.Information);
} }
/// <summary>Tutti i codici prt/asm noti all'indice, con i relativi percorsi (ultima /// <summary>Tutti i codici prt/asm noti all'indice, con i relativi percorsi (ultima
@@ -1112,6 +1099,7 @@ public partial class Form1 : Form
? ultima ? ultima
: (_dbPath is not null ? Path.GetDirectoryName(_dbPath) : null) ?? AppContext.BaseDirectory; : (_dbPath is not null ? Path.GetDirectoryName(_dbPath) : null) ?? AppContext.BaseDirectory;
AggiornaLabelCartellaLavoro(); AggiornaLabelCartellaLavoro();
AggiornaStatoAvanti();
} }
private void ScegliCartellaLavoro() private void ScegliCartellaLavoro()
+4 -3
View File
@@ -12,13 +12,14 @@ public class GuidaForm : Form
Distributed Batch per l'esportazione STEP: indicizza i file di una share di Distributed Batch per l'esportazione STEP: indicizza i file di una share di
rete e guida attraverso 5 fasi, una alla volta, con "Avanti"/"Indietro". rete e guida attraverso 5 fasi, una alla volta, con "Avanti"/"Indietro".
"File ▸ Nuova estrazione" (Ctrl+N) azzera distinta/raw/verifica per "File ▸ Nuovo" (Ctrl+N) azzera distinta/raw/verifica per
ripartire con una nuova distinta base, senza dover ricaricare il database. ripartire con una nuova distinta base, senza dover ricaricare il database.
"""), """),
("1. Database", """ ("1. Database", """
Carica o aggiorna l'indice "cad_index.db" a partire dalle cartelle di primo Carica o aggiorna l'indice "cad_index.db" a partire dalle cartelle di primo
livello del disco/share (radice di default X:\). Qui si sceglie anche la livello del disco/share (radice di default X:\). Mostra anche la cartella di
cartella di lavoro, dove finiscono CSV, "raw" e "step". lavoro corrente, dove finiscono CSV, "raw" e "step" (cambiabile da
"File ▸ Scegli cartella di lavoro...").
"""), """),
("2. Importa Distinta Base", """ ("2. Importa Distinta Base", """
Converte il file della distinta (trascinabile nella finestra) in un CSV Converte il file della distinta (trascinabile nella finestra) in un CSV
+25 -16
View File
@@ -92,7 +92,7 @@ trascinano i `.asm` su Creo Distributed Batch, che scrive in `step/`.
| # | Fase | Bottone → metodo | Cosa fa | | # | Fase | Bottone → metodo | Cosa fa |
|---|---|---|---| |---|---|---|---|
| 1 | Database | "Aggiorna indice" → `Indexer.ScanAsync`; "Cambia cartella..." → `ScegliCartellaLavoro` | Crea/aggiorna `cad_index.db` scansionando la share; sceglie/mostra la cartella di lavoro | | 1 | Database | "Aggiorna indice" → `Indexer.ScanAsync` | Crea/aggiorna `cad_index.db` scansionando la share; mostra anche la cartella di lavoro corrente (cambiabile da "File → Scegli cartella di lavoro...") |
| 2 | Importa Distinta Base | selezione file → `ImportaDistinta` → `DistintaBaseImporter.ConvertiInCsv` | Xls/Xml gestionale → CSV componente;descrizione, scritto nella cartella di lavoro | | 2 | Importa Distinta Base | selezione file → `ImportaDistinta` → `DistintaBaseImporter.ConvertiInCsv` | Xls/Xml gestionale → CSV componente;descrizione, scritto nella cartella di lavoro |
| 3 | Crea cartella raw | "Crea cartella raw" → `CreaCartellaRaw` | `TrovaPercorsiCad` + `CopiaFileTrovati` (parallela) → `raw/` dentro la cartella di lavoro | | 3 | Crea cartella raw | "Crea cartella raw" → `CreaCartellaRaw` | `TrovaPercorsiCad` + `CopiaFileTrovati` (parallela) → `raw/` dentro la cartella di lavoro |
| 4 | Trova componenti referenziati | "Trova componenti referenziati" → `TrovaPrtReferenziati` → `RisolviAlberoComponenti` | Legge i `.asm` in `raw/`, risolve ricorsivamente sotto-assiemi/parti nell'indice e li copia anch'essi in `raw/`, insieme ai componenti soppressi e ai modelli citati per riferimento esterno che servono a Creo per aprire l'assieme | | 4 | Trova componenti referenziati | "Trova componenti referenziati" → `TrovaPrtReferenziati` → `RisolviAlberoComponenti` | Legge i `.asm` in `raw/`, risolve ricorsivamente sotto-assiemi/parti nell'indice e li copia anch'essi in `raw/`, insieme ai componenti soppressi e ai modelli citati per riferimento esterno che servono a Creo per aprire l'assieme |
@@ -102,10 +102,14 @@ trascinano i `.asm` su Creo Distributed Batch, che scrive in `step/`.
`_percorsoInputCorrente`, `_righeCorrenti` (righe del CSV), `_ultimaVerifica` (cache percorsi `_percorsoInputCorrente`, `_righeCorrenti` (righe del CSV), `_ultimaVerifica` (cache percorsi
CAD), `_ultimaCartellaRaw`. CAD), `_ultimaCartellaRaw`.
Menu (`MenuStrip`, in cima alla finestra): "File → Nuova estrazione" (Ctrl+N) azzera lo Menu (`MenuStrip`, in cima alla finestra): "File → Nuovo" (Ctrl+N) azzera lo
stato delle fasi 2-5 (`NuovaEstrazione`) per ripartire con una nuova distinta senza stato delle fasi 2-5 (`NuovaEstrazione`) e va direttamente alla fase 2, senza passare dalla
ricaricare il database/la cartella di lavoro (fase 1, che resta invariata); "Aiuto → Guida" fase 1: database e cartella di lavoro restano quelli già caricati, non serve rifare lo scan;
(F1) apre `GuidaForm`, sintesi interattiva delle 5 fasi per chi non ha letto questi docs. "File → Scegli cartella di lavoro..." → `ScegliCartellaLavoro`, cambia in qualunque momento
la destinazione di CSV/`raw/`/`step/`; "File → Pulisci raw e step..." svuota le cartelle
`raw/`/`step/` nella cartella di lavoro (`PulisciRawEStep`, non tocca l'indice); "Aiuto →
Guida" (F1) apre `GuidaForm`, sintesi interattiva delle 5 fasi per chi non ha letto questi
docs.
Altre responsabilità in Form1.cs: Altre responsabilità in Form1.cs:
- `TrovaPercorsiCad` / `CaricaCodiciNoti` — query sul DB (`files_ultima_versione`), la - `TrovaPercorsiCad` / `CaricaCodiciNoti` — query sul DB (`files_ultima_versione`), la
@@ -189,8 +193,8 @@ completi".
file) nelle sole colonne Componente/Descrizione, foglio `"Distinta Base"`. Se il nome del file) nelle sole colonne Componente/Descrizione, foglio `"Distinta Base"`. Se il nome del
file segue la convenzione `DBP_<codice>_<timestamp>`, aggiunge l'assieme generale come riga file segue la convenzione `DBP_<codice>_<timestamp>`, aggiunge l'assieme generale come riga
in più (il foglio elenca solo i componenti sotto l'assieme). Scrive il CSV nella cartella in più (il foglio elenca solo i componenti sotto l'assieme). Scrive il CSV nella cartella
passata da `Form1` (la cartella di lavoro scelta in fase 1), non necessariamente accanto al passata da `Form1` (la cartella di lavoro, impostabile da "File → Scegli cartella di lavoro..."),
file di input. non necessariamente accanto al file di input.
## Finestre di dialogo (modali, mostrate a fine step) ## Finestre di dialogo (modali, mostrate a fine step)
@@ -225,15 +229,20 @@ completi".
## Persistenza ## Persistenza
- **DB** (`cad_index.db`, SQLite) — vedi tabella `files`/vista `files_ultima_versione` sopra. - **DB** (`cad_index.db`, SQLite) — vedi tabella `files`/vista `files_ultima_versione` sopra.
Percorso: cercato accanto all'eseguibile o nella working directory all'avvio; altrimenti Percorso ricordato tra un avvio e l'altro in `%AppData%/PrepStep/ultimo_db.txt`
selezionabile con "Apri DB...". Radice disco di scansione di default `X:\` (`SalvaUltimoDbUsato`/`LeggiUltimoDbUsato`), scritto ogni volta che si carica un DB
(`Form1.RadiceDiscoDefault`, hardcoded). (all'avvio se già noto, oppure da "Apri DB..." o al termine di "Aggiorna indice"); se il
- **Cartella di lavoro** — salvata in `%AppData%/PrepStep/ultima_cartella_lavoro.txt` file non c'è o punta a un percorso cancellato, `InizializzaDatabase` ripiega su
(stesso meccanismo del DB sopra), proposta di default `AppContext.BaseDirectory` la prima `cad_index.db` accanto all'eseguibile o nella working directory. Radice disco di scansione
volta; selezionabile/cambiabile con "Cambia cartella..." in fase 1. Tutti i file generati a di default `X:\` (`Form1.RadiceDiscoDefault`, hardcoded).
valle ci finiscono dentro: il CSV della distinta, `raw/` (CAD dei componenti e - **Cartella di lavoro** — stesso meccanismo del DB sopra, salvata in
sotto-componenti); `step/` non è scritta dall'app ma è dove l'utente esporta gli STEP a `%AppData%/PrepStep/ultima_cartella_lavoro.txt`; se non c'è una preferenza salvata (o punta
mano con Creo Distributed Batch, a partire dai file trascinati da `raw/` in fase 5. a una cartella cancellata) si propone la cartella del DB caricato, o in ultima istanza
`AppContext.BaseDirectory`; cambiabile in qualunque momento da "File → Scegli cartella di
lavoro...". Tutti i file generati a valle ci finiscono dentro: il CSV della distinta, `raw/`
(CAD dei componenti e sotto-componenti); `step/` non è scritta dall'app ma è dove l'utente
esporta gli STEP a mano con Creo Distributed Batch, a partire dai file trascinati da `raw/`
in fase 5.
## Script standalone (`scripts/`) ## Script standalone (`scripts/`)