# CLAUDE.md This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. ## Cos'è questo progetto `PrepStep` è il nome tecnico del progetto (cartella, namespace, csproj, eseguibile `PrepStep.exe`); il nome mostrato all'utente finale è **Cevolani StepPrep** (``/ `` in `PrepStep/PrepStep.csproj`, usato nel titolo della finestra insieme alla versione, ``, attualmente `0.1.0`). È un'app Windows Forms (.NET 10, WinForms) che indicizza e permette di cercare i file CAD Pro-ENGINEER/Creo contenuti in tutte le cartelle di primo livello di un disco/share di rete (radice di default `X:\`), salvando i metadati in un DB SQLite locale (`cad_index.db`). Il flusso a valle (fasi 2-5, vedi sotto) prepara i file `raw/` da passare a Creo Distributed Batch per l'esportazione STEP: la app è quindi un pre-processo per quel passaggio, non lo sostituisce. ## Comandi Tutti da eseguire dentro `PrepStep/`. ```powershell dotnet build -c Release dotnet run -c Release ``` Pubblicazione come eseguibile standalone (single-file, self-contained, Windows x64): ```powershell dotnet publish -c Release -r win-x64 --self-contained true -p:PublishSingleFile=true -o publish ``` `PrepStep.Tests/` (xUnit) contiene unit e integration test — vedi `dotnet test` da dentro quella cartella. Riferimento al progetto principale via `ProjectReference` + `InternalsVisibleTo` (in `PrepStep.csproj`), così i test possono chiamare direttamente `Indexer.ParseFilename` e `AssemblyComponentScanner.EstraiCodiciReferenziati` senza esporli come API pubblica. ## Architettura 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. `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): 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** — legge i `.asm` in `raw/` per risolvere ricorsivamente sotto-assiemi/parti (`RisolviAlberoComponenti`), copiandoli anch'essi in `raw/`. Usa `AsmRecordReader` (parser esatto dei record binari, `docs/formato-asm-record.md`) e ripiega su `AssemblyComponentScanner` (euristica testuale, `docs/formato-asm.md`) solo se il file non rispetta il formato validato (`InvalidDataException`). Due punti da non confondere, entrambi imparati facendo fallire Creo (`docs/formato-asm-record.md` §7.3 e §7.4): i **componenti soppressi** non sono nella distinta ma il loro file serve per aprire l'assieme (`EstraiCodiciSoppressi`, copiati senza finire fra i "non trovati"); e quando lo stesso codice esiste in più cartelle della share — succede per il 13% dei codici — va copiata la copia nella **stessa cartella dell'assieme che la referenzia** (`ScegliPerCartella`), perché il `.asm` non registra quale usa e sbagliarla impedisce a Creo di aprire l'assieme. 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/`, stessa `AsmRecordReader`/fallback della fase 4) 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`, 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 pattern da preservare: gli script referenziano `PrepStep/PrepStep.csproj` via `#:project` invece di duplicare la logica di lettura dei `.asm`, che vive **solo** nel progetto principale — un'unica fonte di verità condivisa da GUI e script. Due famiglie distinte, non intercambiabili: - `ExtractCreoStrings.cs`/`BomViaDb.cs` usano `AssemblyComponentScanner` (euristica testuale, `docs/formato-asm.md`) e risolvono i sottoassiemi contro `cad_index.db`. - `CreoBom.cs` usa `AsmRecordReader` (parser esatto dei record binari, `docs/formato-asm-record.md`, condiviso con la GUI in fase 4/5) e risolve i sottoassiemi cercandoli in cartelle locali (`-p`), non contro `cad_index.db`.