Aggiungi la lista personalizzata di codici nella fase 2

In alternativa al file del gestionale si possono digitare i codici uno alla
volta (Invio/Aggiungi, Canc per togliere). Tutto a valle legge solo
_righeCorrenti, quindi basta una nuova sorgente; la selezione della griglia
mantiene il colore verde/rosso della verifica.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
davideandClaude Sonnet 5.5 committed 2026-10-07 08:52:05 +02:00
1 parent ccfa00ff52
commit 6d1e36a2ae
5 files changed
+138 -11

No files matched your search

+1
View File
@@ -9,6 +9,7 @@ aderisce a [Semantic Versioning](https://semver.org/lang/it/).
### Aggiunto ### Aggiunto
- Fase 2: modalità "Lista personalizzata" per inserire i codici a mano, uno alla volta, in alternativa al file del gestionale.
- Docs-as-code: `scripts/CheckDocs.cs`, markdownlint, `docs/README.md` (indice Diátaxis e fonte unica). - Docs-as-code: `scripts/CheckDocs.cs`, markdownlint, `docs/README.md` (indice Diátaxis e fonte unica).
- Nuovi doc: `tutorial-primo-giro`, `risoluzione-problemi`, `sviluppo`, `rilascio`, `glossario` e registro delle decisioni `docs/decisioni/` (6 ADR). - Nuovi doc: `tutorial-primo-giro`, `risoluzione-problemi`, `sviluppo`, `rilascio`, `glossario` e registro delle decisioni `docs/decisioni/` (6 ADR).
+125 -8
View File
@@ -12,6 +12,11 @@ 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 FlowLayoutPanel _rigaVerifica = new(); private readonly FlowLayoutPanel _rigaVerifica = new();
private readonly FlowLayoutPanel _rigaFile = new();
private readonly FlowLayoutPanel _rigaCustom = new();
private readonly RadioButton _rbFile = new() { Text = "Da file del gestionale", Checked = true, AutoSize = true };
private readonly RadioButton _rbCustom = new() { Text = "Lista personalizzata", AutoSize = true };
private readonly TextBox _txtCodice = new() { Width = 220, Margin = new Padding(0, 3, 8, 0) };
private readonly ListView _lstAnteprimaAsm = new(); private readonly ListView _lstAnteprimaAsm = new();
private readonly Label _lblStatus = new(); private readonly Label _lblStatus = new();
private readonly Label _lblDb = new(); private readonly Label _lblDb = new();
@@ -50,7 +55,7 @@ public partial class Form1 : Form
private string? _dbPath; private string? _dbPath;
private string? _cartellaLavoro; private string? _cartellaLavoro;
private string? _percorsoInputCorrente; private bool _ripristinoModalita;
private List<(string Componente, string Descrizione)>? _righeCorrenti; private List<(string Componente, string Descrizione)>? _righeCorrenti;
private Dictionary<string, List<string>>? _ultimaVerifica; private Dictionary<string, List<string>>? _ultimaVerifica;
private string? _ultimaCartellaRaw; private string? _ultimaCartellaRaw;
@@ -266,7 +271,12 @@ public partial class Form1 : Form
return; return;
} }
_percorsoInputCorrente = null; AzzeraDistinta();
VaiAllaFase(1);
}
private void AzzeraDistinta()
{
_righeCorrenti = null; _righeCorrenti = null;
_ultimaCartellaRaw = null; _ultimaCartellaRaw = null;
_ultimaVerifica = null; _ultimaVerifica = null;
@@ -275,8 +285,68 @@ public partial class Form1 : Form
_lstAnteprimaAsm.Items.Clear(); _lstAnteprimaAsm.Items.Clear();
ImpostaStatoImport("", Color.Black); ImpostaStatoImport("", Color.Black);
_rigaVerifica.Visible = false; _rigaVerifica.Visible = false;
}
VaiAllaFase(1); private void CambiaModalitaDistinta()
{
if (_ripristinoModalita)
return;
if (_gridImport.Rows.Count > 0 && MessageBox.Show(this,
"Cambiando modalità la distinta corrente viene azzerata. Continuare?", "Distinta",
MessageBoxButtons.YesNo, MessageBoxIcon.Question) != DialogResult.Yes)
{
_ripristinoModalita = true;
(_rbCustom.Checked ? _rbFile : _rbCustom).Checked = true;
_ripristinoModalita = false;
return;
}
AzzeraDistinta();
_rigaFile.Visible = _rbFile.Checked;
_rigaCustom.Visible = _rbCustom.Checked;
AggiornaStatoAvanti();
}
private void AggiungiCodice()
{
string codice = _txtCodice.Text.Trim();
if (codice.Length == 0)
return;
_righeCorrenti ??= new();
if (_righeCorrenti.Any(r => string.Equals(r.Componente, codice, StringComparison.OrdinalIgnoreCase)))
{
_txtCodice.SelectAll();
return;
}
_righeCorrenti.Add((codice, ""));
_gridImport.Rows.Add(codice, "");
InvalidaVerifica();
_txtCodice.Clear();
_txtCodice.Focus();
}
private void RimuoviCodiceSelezionato()
{
if (_gridImport.CurrentRow is not { } riga || _righeCorrenti is null)
return;
_righeCorrenti.RemoveAt(riga.Index); // griglia e lista hanno lo stesso ordine
_gridImport.Rows.Remove(riga);
InvalidaVerifica();
}
/// <summary>La lista è cambiata: la verifica presenza e il raw già creato non valgono più.</summary>
private void InvalidaVerifica()
{
_ultimaVerifica = null;
_ultimaCartellaRaw = null;
_gridRaw.Rows.Clear();
foreach (DataGridViewRow r in _gridImport.Rows)
{
r.DefaultCellStyle.BackColor = Color.Empty;
r.DefaultCellStyle.SelectionBackColor = Color.Empty;
r.DefaultCellStyle.SelectionForeColor = Color.Empty;
}
_rigaVerifica.Visible = _righeCorrenti is { Count: > 0 };
AggiornaStatoAvanti();
} }
private Panel BuildFaseDatabase() private Panel BuildFaseDatabase()
@@ -400,12 +470,51 @@ public partial class Form1 : Form
}; };
contenuto.Controls.Add(lblIstruzioni); contenuto.Controls.Add(lblIstruzioni);
var rigaImporta = new FlowLayoutPanel var rigaModalita = new FlowLayoutPanel
{ {
AutoSize = true, AutoSize = true,
FlowDirection = FlowDirection.LeftToRight, FlowDirection = FlowDirection.LeftToRight,
Margin = new Padding(0, 0, 0, 8), Margin = new Padding(0, 0, 0, 8),
}; };
rigaModalita.Controls.Add(_rbFile);
rigaModalita.Controls.Add(_rbCustom);
_rbCustom.CheckedChanged += (_, _) => CambiaModalitaDistinta();
contenuto.Controls.Add(rigaModalita);
_rigaCustom.AutoSize = true;
_rigaCustom.FlowDirection = FlowDirection.LeftToRight;
_rigaCustom.Margin = new Padding(0, 0, 0, 8);
_rigaCustom.Visible = false;
var btnAggiungi = new Button { Text = "Aggiungi", Margin = new Padding(0, 0, 8, 0) };
UiStile.Secondario(btnAggiungi);
btnAggiungi.Click += (_, _) => AggiungiCodice();
_txtCodice.KeyDown += (_, e) =>
{
if (e.KeyCode != Keys.Enter)
return;
e.SuppressKeyPress = true;
AggiungiCodice();
};
_rigaCustom.Controls.Add(_txtCodice);
_rigaCustom.Controls.Add(btnAggiungi);
_rigaCustom.Controls.Add(new Label
{
AutoSize = true,
ForeColor = SystemColors.GrayText,
Margin = new Padding(0, 9, 0, 0),
Text = "Digita un codice e premi Invio (Canc sulla riga per toglierlo)",
});
contenuto.Controls.Add(_rigaCustom);
_gridImport.KeyDown += (_, e) =>
{
if (e.KeyCode == Keys.Delete && _rbCustom.Checked)
RimuoviCodiceSelezionato();
};
var rigaImporta = _rigaFile;
rigaImporta.AutoSize = true;
rigaImporta.FlowDirection = FlowDirection.LeftToRight;
rigaImporta.Margin = new Padding(0, 0, 0, 8);
var btnSfoglia = new Button var btnSfoglia = new Button
{ {
Text = "Scegli file distinta...", Text = "Scegli file distinta...",
@@ -646,10 +755,15 @@ public partial class Form1 : Form
private void ImportaDistinta(string percorso) private void ImportaDistinta(string percorso)
{ {
if (_rbCustom.Checked)
{
_rbFile.Checked = true; // chiede conferma se c'è una lista; se rifiuta resta in custom
if (_rbCustom.Checked)
return;
}
try try
{ {
var (_, righe) = DistintaBaseImporter.ConvertiInCsv(percorso, _cartellaLavoro!); var (_, righe) = DistintaBaseImporter.ConvertiInCsv(percorso, _cartellaLavoro!);
_percorsoInputCorrente = percorso;
_righeCorrenti = righe; _righeCorrenti = righe;
_gridImport.Rows.Clear(); _gridImport.Rows.Clear();
@@ -666,7 +780,6 @@ public partial class Form1 : Form
} }
catch (Exception ex) catch (Exception ex)
{ {
_percorsoInputCorrente = null;
_righeCorrenti = null; _righeCorrenti = null;
_gridImport.Rows.Clear(); _gridImport.Rows.Clear();
ImpostaStatoImport($"Errore durante la conversione: {ex.Message}", Color.DarkRed); ImpostaStatoImport($"Errore durante la conversione: {ex.Message}", Color.DarkRed);
@@ -694,16 +807,20 @@ public partial class Form1 : Form
foreach (DataGridViewRow riga in _gridImport.Rows) foreach (DataGridViewRow riga in _gridImport.Rows)
{ {
string componente = (string)riga.Cells["componente"].Value!; string componente = (string)riga.Cells["componente"].Value!;
riga.DefaultCellStyle.BackColor = trovati.ContainsKey(componente) var colore = trovati.ContainsKey(componente)
? Color.FromArgb(198, 239, 206) ? Color.FromArgb(198, 239, 206)
: Color.FromArgb(255, 199, 206); : Color.FromArgb(255, 199, 206);
// la selezione mantiene il colore verde/rosso, altrimenti il blu nasconde l'esito
riga.DefaultCellStyle.BackColor = colore;
riga.DefaultCellStyle.SelectionBackColor = colore;
riga.DefaultCellStyle.SelectionForeColor = Color.Black;
} }
AggiornaStatoAvanti(); AggiornaStatoAvanti();
} }
private void CreaCartellaRaw() private void CreaCartellaRaw()
{ {
if (_percorsoInputCorrente is null || _righeCorrenti is null) if (_righeCorrenti is null)
return; return;
// L'assieme generale è già una riga di _righeCorrenti (aggiunta da // L'assieme generale è già una riga di _righeCorrenti (aggiunta da
+4 -1
View File
@@ -104,7 +104,10 @@ public class GuidaForm : Form
[ [
"Carica la distinta: trascina il file .xls nella finestra, oppure premi " + "Carica la distinta: trascina il file .xls nella finestra, oppure premi " +
"\"Scegli file distinta...\". Le righe importate compaiono nella griglia " + "\"Scegli file distinta...\". Le righe importate compaiono nella griglia " +
"(Componente/Descrizione) e viene scritto un CSV nella cartella di lavoro.", "(Componente/Descrizione) e viene scritto un CSV nella cartella di lavoro. " +
"In alternativa scegli \"Lista personalizzata\" e digita i codici uno alla " +
"volta (Invio per aggiungere, Canc per togliere): nessun CSV, l'assieme " +
"generale va inserito a mano.",
"Verifica la presenza dei file sul server: compare solo dopo un import " + "Verifica la presenza dei file sul server: compare solo dopo un import " +
"riuscito. Cerca ogni componente nel database — le righe della griglia si " + "riuscito. Cerca ogni componente nel database — le righe della griglia si " +
"colorano di verde (trovato) o rosso (non trovato nell'indice).", "colorano di verde (trovato) o rosso (non trovato nell'indice).",
+1 -1
View File
@@ -94,7 +94,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` | Crea/aggiorna `cad_index.db` scansionando la share; un pallino verde/rosso accanto al titolo indica se un DB è caricato. La cartella di lavoro non è mostrata qui (cambiabile in qualunque momento da "File → Scegli cartella di lavoro...") | | 1 | Database | "Aggiorna indice" → `Indexer.ScanAsync` | Crea/aggiorna `cad_index.db` scansionando la share; un pallino verde/rosso accanto al titolo indica se un DB è caricato. La cartella di lavoro non è mostrata qui (cambiabile in qualunque momento da "File → Scegli cartella di lavoro...") |
| 2 | Importa Distinta Base | selezione file/drag&drop → `ImportaDistinta` → `DistintaBaseImporter.ConvertiInCsv`, poi "Verifica presenza" → `VerificaCodiciNelDb` | Xls/Xml gestionale → CSV componente;descrizione, scritto nella cartella di lavoro; "Verifica presenza" (visibile solo dopo un import riuscito) cerca i componenti nell'indice e colora le righe della griglia — è quella che sblocca "Avanti", non il solo import | | 2 | Importa Distinta Base | selezione file/drag&drop → `ImportaDistinta` → `DistintaBaseImporter.ConvertiInCsv`, poi "Verifica presenza" → `VerificaCodiciNelDb` | Xls/Xml gestionale → CSV componente;descrizione, scritto nella cartella di lavoro (oppure "Lista personalizzata": codici digitati uno alla volta con `AggiungiCodice`, solo in memoria, senza CSV; tutto a valle legge solo `_righeCorrenti`); "Verifica presenza" (visibile solo dopo un import riuscito) cerca i componenti nell'indice e colora le righe della griglia — è quella che sblocca "Avanti", non il solo import |
| 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 |
| 5 | Verifica completezza | (ingresso in fase) → `AggiornaAnteprimaAsm` | Mostra le icone trascinabili dei `.asm` della distinta già in `raw/`, da trascinare su Creo per l'esportazione STEP (Distributed Batch) | | 5 | Verifica completezza | (ingresso in fase) → `AggiornaAnteprimaAsm` | Mostra le icone trascinabili dei `.asm` della distinta già in `raw/`, da trascinare su Creo per l'esportazione STEP (Distributed Batch) |
+7 -1
View File
@@ -76,7 +76,13 @@ Premi **Avanti** quando il database è caricato.
oppure premi **Scegli file distinta...** e selezionalo da Esplora risorse. Le righe importate oppure premi **Scegli file distinta...** e selezionalo da Esplora risorse. Le righe importate
compaiono nella griglia (Componente/Descrizione) e viene scritto un CSV nella cartella compaiono nella griglia (Componente/Descrizione) e viene scritto un CSV nella cartella
di lavoro. di lavoro.
- **2. Verifica la presenza dei file sul server**: compare solo dopo un import riuscito. In alternativa scegli **Lista personalizzata**: digita un codice e premi **Invio** (o
**Aggiungi**) per inserirlo, ripeti per ogni codice; **Canc** sulla riga selezionata lo
toglie. La lista non scrive nessun CSV e, passando da una modalità all'altra, viene azzerata
(con conferma). Inserisci anche l'assieme generale, se serve: qui non viene aggiunto da solo.
- **2. Verifica la presenza dei file sul server**: compare solo dopo un import riuscito
(o dopo il primo codice aggiunto alla lista personalizzata; ogni modifica della lista
richiede di rifare la verifica).
Premila per cercare ogni componente nel database — le righe della griglia si colorano Premila per cercare ogni componente nel database — le righe della griglia si colorano
di verde (trovato) o rosso (non trovato nell'indice). di verde (trovato) o rosso (non trovato nell'indice).