From 60dfd26e8b945c10efa3ced936bb131e6f142e13 Mon Sep 17 00:00:00 2001 From: Davide Grilli Date: Mon, 21 Sep 2026 15:41:22 +0200 Subject: [PATCH] Snellisci CLAUDE.md: rimuovi duplicazione con docs/architettura.md e db-cad-index.md La sezione Architettura ripeteva quasi verbatim il dettaglio file-per-file gia' in docs/architettura.md e docs/db-cad-index.md, gonfiando il contesto caricato in ogni sessione senza aggiungere informazione. Sostituita con un riepilogo delle 5 fasi del wizard e rimandi puntuali; nessun contenuto perso, solo spostato dove viveva gia' in dettaglio. Co-Authored-By: Claude Sonnet 5 --- CLAUDE.md | 140 +++++++++++++++--------------------------------------- 1 file changed, 37 insertions(+), 103 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 9de393c..1d63550 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -38,112 +38,46 @@ pubblica. ## Architettura -Il programma è tutto in `PrepStep/` (nessun altro progetto nella solution — in -passato esisteva anche una CLI separata e uno script Python di indicizzazione, -entrambi rimossi: ora l'unico programma è questo, con GUI e indicizzazione integrate). +Il programma è tutto in `PrepStep/` (nessun altro progetto nella solution). Dettaglio +completo file-per-file in [`docs/architettura.md`](docs/architettura.md); qui solo il flusso +che conta per capire il prodotto. -- **Program.cs** — entry point WinForms standard, avvia `Form1`. -- **Form1.cs** / **Form1.Designer.cs** — finestra principale, costruita come wizard: una - sola fase alla volta occupa tutta la finestra (`_panelFasi[]`/`NomiFasi`), si avanza - con "Avanti" solo quando la fase corrente è pronta (`AvantiConsentito`). La UI è - costruita interamente in codice in `Form1.BuildUi()` (nessun designer visuale usato). - `Form1.Designer.cs` contiene solo lo scheletro minimo (`InitializeComponent`/`Dispose`) - generato dal template. Le fasi, in ordine: - 1. **Database** — carica/aggiorna l'indice, mostra data ultimo aggiornamento; qui vive - anche la **cartella di lavoro** (`_cartellaLavoro`, mostrata in `_lblCartellaLavoro`, - cambiabile con "Cambia cartella..." → `ScegliCartellaLavoro`): destinazione di CSV, - `raw/` per tutte le fasi successive (gli STEP esportati a mano con Creo vanno in - `step/`, dentro la stessa cartella). All'avvio - `InizializzaCartellaLavoro` propone l'ultima usata (ricordata in - `%AppData%/PrepStep/ultima_cartella_lavoro.txt`, stesso pattern di - `ultimo_db.txt` per il DB) se esiste ancora, altrimenti `AppContext.BaseDirectory` - — non dipende da un marker di repo (niente più `CLAUDE.md`/`TrovaRadiceRepo`), - quindi funziona identica anche sull'exe pubblicato standalone (`PrepStep.exe`) - copiato su un'altra macchina. Qui vive anche "Pulisci raw e step" (manutenzione, - non fa parte del flusso a valle). - 2. **Importa Distinta Base** — `DistintaBaseImporter.ConvertiInCsv` genera il CSV dei - componenti nella cartella di lavoro; se il nome del file segue la convenzione del - gestionale (`DBP__`), l'assieme generale viene aggiunto come riga - in più nel CSV stesso (il foglio elenca solo i componenti sotto l'assieme, non - l'assieme in sé). Da qui in avanti l'assieme generale è un componente come tutti - gli altri, nessun caso speciale nel resto del codice. - 3. **Crea cartella raw** — cerca nell'indice il percorso CAD di ogni componente del CSV - (`TrovaPercorsiCad`) e lo copia in `raw/` dentro la cartella di lavoro - (`CopiaFileTrovati`, parallela — vedi `docs/copia-raw-parallela.md`). - 4. **Trova componenti referenziati** — legge euristicamente i metadati binari dei `.asm` - già in `raw/` (`AssemblyComponentScanner`) per risolvere ricorsivamente i - sotto-assiemi/parti che contengono (`RisolviAlberoComponenti`), copiandoli anch'essi - in `raw/`. - 5. **Verifica completezza** — appena si entra nella fase, `AggiornaAnteprimaAsm` - mostra in una `ListView` a icone i file `.asm` della distinta importata (esclusi i - sotto-assiemi di fase 4) già presenti in `raw/` — letti dal filesystem locale, non - dall'indice/share — trascinabili (drag&drop, `ItemDrag` → `DoDragDrop` con - `DataFormats.FileDrop`) direttamente su Creo o Esplora risorse, per l'esportazione - STEP con Creo Distributed Batch. "Verifica completezza assiemi" controlla - ricorsivamente (sui percorsi originali in indice, non su `raw/`) se tutti i - sotto-componenti di ogni assieme della distinta sono nell'indice. -- **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) - con un walk manuale a stack (`Walk`, più veloce di `EnumerateFiles(..., AllDirectories)` - su share di rete con centinaia di migliaia di file), estrae da ogni nome file il - pattern Pro-E `..` via regex, e fa un upsert incrementale - riga per riga (confronto per `percorso_completo` + dimensione + data modifica). - Riporta il progresso tramite `IProgress`, marshalato automaticamente - sul thread UI. Contiene anche lo schema SQL del DB (tabella `files` + vista - `files_ultima_versione`, che seleziona solo l'ultima versione per - `(cartella_radice, codice, tipo_file)` usando `ROW_NUMBER() OVER (...)` — non un - self-join con `GROUP BY`, che su ~200k righe degenera in tempi quasi quadratici). -- **ProgressForm.cs** — dialog modale mostrato durante l'aggiornamento indice: barra - di progresso, conteggi nuovi/aggiornati/invariati/rimossi, tempo trascorso e stima - del tempo rimanente (calcolata dal ritmo file/secondo rispetto al totale atteso, - preso dal conteggio della scansione precedente salvato nel DB). -- **UiStile.cs** — stile bottoni condiviso da `Form1` e dai dialog secondari - (`Primario`/`Secondario`, entrambi `AutoSize` col padding invece di una `Size` fissa - in pixel, per evitare che il testo vada a capo e si tagli quando non ci sta) e - `Arrotonda` per gli angoli dei bottoni "Avanti"/"Indietro" del wizard. -- **app.ico** — icona dell'app (logo Cevolani + pezzo + STEP, sfondo trasparente), - referenziata da `` in `PrepStep.csproj` e riletta a runtime in - `Form1.BuildUi()` via `Icon.ExtractAssociatedIcon(Application.ExecutablePath)` per - la titlebar (stessa icona dell'exe, nessun file duplicato nell'output). +`Form1.cs` è un wizard a 5 fasi (una sola visibile alla volta, `_panelFasi[]`, si avanza con +"Avanti" solo se `AvantiConsentito`), UI costruita interamente in codice (`BuildUi`, nessun +designer visuale): -### Schema del DB (`cad_index.db`) - -Tabella `files`: un record per ogni file trovato, con `percorso_completo` (chiave -univoca), `cartella_radice`, `famiglia` (primo livello di sottocartella), -`codice`/`tipo_file`/`versione` estratti dal nome file, dimensione, data modifica e -timestamp dell'ultima scansione (`scansionato_il`, usato per rilevare ed eliminare i -file non più presenti su disco a fine scansione). - -Vista `files_ultima_versione`: stessa struttura, filtrata alla sola versione più -recente per codice+tipo. - -### Percorso del DB - -All'avvio la app cerca `cad_index.db` accanto all'eseguibile o nella working -directory corrente; se non lo trova, l'utente può selezionarlo con "Apri DB...". -Il bottone "Aggiorna indice" rilancia `Indexer.ScanAsync` sullo stesso path (radice -disco di default `X:\`, hardcoded in `Form1.RadiceDiscoDefault`). +1. **Database** — carica/aggiorna `cad_index.db` (`Indexer.ScanAsync`, radice disco di + default `X:\` hardcoded in `RadiceDiscoDefault`); qui vive anche la **cartella di lavoro** + (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 + risoluzione del percorso DB. +2. **Importa Distinta Base** — `DistintaBaseImporter.ConvertiInCsv` genera il CSV + componente;descrizione nella cartella di lavoro; se il file segue la convenzione del + gestionale (`DBP__`), aggiunge l'assieme generale come riga in più (da + quel momento è un componente come tutti gli altri, nessun caso speciale nel resto del + codice). +3. **Crea cartella raw** — `TrovaPercorsiCad` + `CopiaFileTrovati` (parallela, vedi + `docs/copia-raw-parallela.md`) copiano in `raw/` i file CAD dei componenti del CSV trovati + nell'indice. +4. **Trova componenti referenziati** — `AssemblyComponentScanner` legge euristicamente i + `.asm` in `raw/` per risolvere ricorsivamente sotto-assiemi/parti (`RisolviAlberoComponenti`), + copiandoli anch'essi in `raw/`. Euristica e falsi positivi noti in `docs/formato-asm.md`. +5. **Verifica completezza** — mostra i `.asm` della distinta già in `raw/`, trascinabili su + Creo per l'esportazione STEP (Distributed Batch, manuale, fuori dall'app); "Verifica + completezza assiemi" controlla ricorsivamente sull'indice (non su `raw/`) se tutti i + sotto-componenti di ogni assieme sono presenti. ## Script standalone (`scripts/`) -`scripts/` contiene C# file-based apps (.NET 10, `dotnet run scripts/Nome.cs -- arg1 arg2`), -senza csproj proprio — dipendenze NuGet extra si aggiungono con `#:package Nome@versione` in -cima al file. `ExtractCreoStrings.cs` e `BomViaDb.cs` risolvono ricorsivamente l'albero -componenti di un `.asm` contro `cad_index.db` da riga di comando (stessa logica di -`Form1.RisolviAlberoComponenti`/`AssiemeCompleto`): entrambi referenziano -`PrepStep/PrepStep.csproj` via `#:project` (più `#:property TargetFramework=net10.0-windows`, -richiesto perché il progetto principale è WinForms) invece di duplicare l'euristica di -estrazione/placement, che vive solo in `PrepStep/AssemblyComponentScanner.cs` — un'unica -fonte di verità condivisa da GUI e script, vedi `docs/formato-asm.md`. Le due varianti restano -distinte solo nel candidato passato a `EstraiCodiciReferenziati`: `ExtractCreoStrings.cs` non -passa `codiciNoti` (riconosce solo i codici numerici Pro-E, dalla forma, senza bisogno del -DB); `BomViaDb.cs` lo passa, per intercettare anche i nomi alfabetici delle parti commerciali -validati contro l'indice. `Analyze.cs` dumpa il contesto testo/hex attorno a un pattern in un -file binario, per investigare a mano nuovi falsi positivi prima di toccare la regex; `Query.cs` -esegue una query SQL ad-hoc contro `cad_index.db` da riga di comando. +`scripts/` contiene C# file-based apps (.NET 10, `dotnet run scripts/Nome.cs -- arg1 arg2`, +lanciati dalla root del repo — **non** da dentro `PrepStep/`, che ha un `.csproj` `WinExe`: +`dotnet run` lì avvia la GUI vera invece dello script). Elenco e dettaglio di ciascuno in +`docs/architettura.md`. -Il formato binario `.asm`, l'euristica di estrazione codici e i falsi positivi noti (ID vista -`ModelView#`, self-reference, riferimenti fantasma a codici superati/rinominati — sintatticamente -identici a un componente vero, non filtrabili in modo affidabile) sono documentati in -`docs/formato-asm.md`. +Il pattern da preservare: `ExtractCreoStrings.cs`/`BomViaDb.cs` referenziano +`PrepStep/PrepStep.csproj` via `#:project` invece di duplicare l'euristica di +estrazione/placement, che vive **solo** in `PrepStep/AssemblyComponentScanner.cs` — un'unica +fonte di verità condivisa da GUI e script (vedi `docs/formato-asm.md` per l'euristica e i +falsi positivi noti). `CreoBom.cs` è l'eccezione deliberata: legge la struttura a record del +binario invece di contare occorrenze testuali (`docs/formato-asm-record.md`), non passa da +`AssemblyComponentScanner`/`cad_index.db` e non la sostituisce nella GUI.