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 <noreply@anthropic.com>
This commit is contained in:
1 parent
35009b5cd3
commit
60dfd26e8b
1 file changed
+37
-103
@@ -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_<codice>_<timestamp>`), 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 `<codice>.<tipo>.<versione>` via regex, e fa un upsert incrementale
|
||||
riga per riga (confronto per `percorso_completo` + dimensione + data modifica).
|
||||
Riporta il progresso tramite `IProgress<ScanProgress>`, 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 `<ApplicationIcon>` 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_<codice>_<timestamp>`), 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.
|
||||
Reference in new issue
Block a user