Add explicit working folder; rename project from CadSearchGui to PrepStep
Working folder (phase 1): CSV/raw/step/step_finali all used to live split across two different implicit locations (CSV in the "repo root" found by walking up for CLAUDE.md, raw/step next to the input distinta file) with neither shown to the user. That repo-root lookup also silently breaks once the app runs as a standalone published exe on a machine with no repo/ CLAUDE.md at all. Replaced both with one explicit "cartella di lavoro", auto-suggested (last used, remembered the same way as the DB path) and changeable from phase 1, with no dependency on any repo marker file. Rename: CadSearchGui was the working name from before the app had a product identity; renamed folders, csproj files, namespace and the AppData settings folder to PrepStep throughout, matching the exe name already in use. Product-facing name stays "Cevolani StepPrep". Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
6726dd2216
commit
13798ad47c
24 files changed
+211
-129
No files matched your search
+31
-22
@@ -1,9 +1,9 @@
|
||||
# Architettura di CadSearchGui (Cevolani StepPrep)
|
||||
# Architettura di PrepStep (Cevolani StepPrep)
|
||||
|
||||
Panoramica di tutti i file sorgente e di come collaborano. `CadSearchGui` è il nome
|
||||
tecnico del progetto; **Cevolani StepPrep** è il nome del programma per l'utente
|
||||
finale (titolo finestra, icona, versione — vedi `<Version>`/`<Product>` in
|
||||
`CadSearchGui.csproj`). Per il "come si usa" vedi il `README.md` in root; per il
|
||||
Panoramica di tutti i file sorgente e di come collaborano. `PrepStep` è il nome
|
||||
tecnico del progetto (cartella, namespace, csproj, eseguibile `PrepStep.exe`);
|
||||
**Cevolani StepPrep** è il nome mostrato all'utente finale (titolo finestra, icona,
|
||||
versione — vedi `<Version>`/`<Product>` in `PrepStep.csproj`). Per il "come si usa" vedi il `README.md` in root; per il
|
||||
formato binario `.asm` vedi `docs/formato-asm.md`; per la parallelizzazione della
|
||||
copia in `raw/` vedi `docs/copia-raw-parallela.md`.
|
||||
|
||||
@@ -40,14 +40,15 @@ Distinta (.xls/.xml) → CSV (componente;descrizione) → raw/ (CAD copiati
|
||||
|
||||
| # | Fase | Bottone → metodo | Cosa fa |
|
||||
|---|---|---|---|
|
||||
| 1 | Database | "Aggiorna indice" → `Indexer.ScanAsync` | Crea/aggiorna `cad_index.db` scansionando la share |
|
||||
| 2 | Importa Distinta Base | selezione file → `ImportaDistinta` → `DistintaBaseImporter.ConvertiInCsv` | Xls/Xml gestionale → CSV componente;descrizione, scritto nella root del repo (`TrovaRadiceRepo`) |
|
||||
| 3 | Crea cartella raw | "Crea cartella raw" → `CreaCartellaRaw` | `TrovaPercorsiCad` + `CopiaFileTrovati` (parallela) → `raw/` |
|
||||
| 1 | Database | "Aggiorna indice" → `Indexer.ScanAsync`; "Cambia cartella..." → `ScegliCartellaLavoro` | Crea/aggiorna `cad_index.db` scansionando la share; sceglie/mostra la 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 |
|
||||
| 4 | Trova componenti referenziati | "Trova componenti referenziati" → `TrovaPrtReferenziati` → `RisolviAlberoComponenti` | Legge i `.asm` in `raw/` con `AssemblyComponentScanner`, risolve ricorsivamente sotto-assiemi/parti nell'indice, li copia anch'essi in `raw/` |
|
||||
| 5 | Verifica completezza e STEP | "Verifica completezza assiemi" → `VerificaCompletezzaAssiemi`; "Crea cartella step_finali" → `GeneraReportStep` | Completezza ricorsiva sui percorsi in indice; confronto con `step/` → `step_finali/`. All'ingresso nella fase, `AggiornaAnteprimaAsm` mostra le icone trascinabili dei `.asm` della distinta già in `raw/` |
|
||||
| 5 | Verifica completezza e STEP | "Verifica completezza assiemi" → `VerificaCompletezzaAssiemi`; "Crea cartella step_finali" → `GeneraReportStep` | Completezza ricorsiva sui percorsi in indice; confronto con `step/` → `step_finali/` (entrambe dentro la cartella di lavoro). All'ingresso nella fase, `AggiornaAnteprimaAsm` mostra le icone trascinabili dei `.asm` della distinta già in `raw/` |
|
||||
|
||||
Stato condiviso tra le fasi (campi privati di `Form1`): `_dbPath`, `_percorsoInputCorrente`,
|
||||
`_righeCorrenti` (righe del CSV), `_ultimaVerifica` (cache percorsi CAD), `_ultimaCartellaRaw`.
|
||||
Stato condiviso tra le fasi (campi privati di `Form1`): `_dbPath`, `_cartellaLavoro`,
|
||||
`_percorsoInputCorrente`, `_righeCorrenti` (righe del CSV), `_ultimaVerifica` (cache percorsi
|
||||
CAD), `_ultimaCartellaRaw`.
|
||||
|
||||
Altre responsabilità in Form1.cs:
|
||||
- `TrovaPercorsiCad` / `CaricaCodiciNoti` — query sul DB (`files_ultima_versione`), la
|
||||
@@ -55,10 +56,14 @@ Distinta (.xls/.xml) → CSV (componente;descrizione) → raw/ (CAD copiati
|
||||
componenti sia da `AssemblyComponentScanner` per validare i token generici).
|
||||
- `CopiaFileTrovati` — copia (in parallelo, grado 6) i file trovati in `raw/`, saltando
|
||||
silenziosamente quelli irraggiungibili (share offline/permessi).
|
||||
- `PulisciRawEStep` — svuota `raw/`, `step/`, `step_finali/` (manutenzione, richiede conferma).
|
||||
- `InizializzaDatabase` / `ScegliDatabase` / `TrovaRadiceRepo` — localizzazione del DB e
|
||||
della root del repo (quest'ultima risalendo da `AppContext.BaseDirectory` fino alla
|
||||
cartella che contiene `CLAUDE.md`).
|
||||
- `PulisciRawEStep` — svuota `raw/`, `step/`, `step_finali/` nella cartella di lavoro
|
||||
(manutenzione, richiede conferma).
|
||||
- `InizializzaDatabase` / `ScegliDatabase` — localizzazione del DB (ultimo usato, salvato in
|
||||
`%AppData%/PrepStep/ultimo_db.txt`, o `cad_index.db` accanto all'eseguibile).
|
||||
- `InizializzaCartellaLavoro` / `ScegliCartellaLavoro` — stesso pattern per la cartella di
|
||||
lavoro (`ultima_cartella_lavoro.txt`), fallback `AppContext.BaseDirectory` se non c'è
|
||||
ancora nulla di salvato: nessuna dipendenza da un marker di repo, funziona identica
|
||||
sull'exe pubblicato standalone spostato su un'altra macchina.
|
||||
|
||||
## Indicizzazione
|
||||
|
||||
@@ -89,7 +94,8 @@ Distinta (.xls/.xml) → CSV (componente;descrizione) → raw/ (CAD copiati
|
||||
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
|
||||
in più (il foglio elenca solo i componenti sotto l'assieme). Scrive il CSV nella cartella
|
||||
passata da `Form1` (root del repo), non necessariamente accanto al file di input.
|
||||
passata da `Form1` (la cartella di lavoro scelta in fase 1), non necessariamente accanto al
|
||||
file di input.
|
||||
|
||||
## Finestre di dialogo (modali, mostrate a fine step)
|
||||
|
||||
@@ -130,9 +136,12 @@ Distinta (.xls/.xml) → CSV (componente;descrizione) → raw/ (CAD copiati
|
||||
Percorso: cercato accanto all'eseguibile o nella working directory all'avvio; altrimenti
|
||||
selezionabile con "Apri DB...". Radice disco di scansione di default `X:\`
|
||||
(`Form1.RadiceDiscoDefault`, hardcoded).
|
||||
- **File su disco**, tutti nella root del repo (non nella cartella dell'eseguibile): il CSV
|
||||
della distinta, `raw/` (CAD dei componenti e sotto-componenti), `step/` (STEP esportati a
|
||||
mano da Creo, input), `step_finali/` (STEP dei soli codici della distinta, output).
|
||||
- **Cartella di lavoro** — salvata in `%AppData%/PrepStep/ultima_cartella_lavoro.txt`
|
||||
(stesso meccanismo del DB sopra), proposta di default `AppContext.BaseDirectory` la prima
|
||||
volta; selezionabile/cambiabile con "Cambia cartella..." in fase 1. Tutti i file generati a
|
||||
valle ci finiscono dentro: il CSV della distinta, `raw/` (CAD dei componenti e
|
||||
sotto-componenti), `step/` (STEP esportati a mano da Creo, input), `step_finali/` (STEP dei
|
||||
soli codici della distinta, output).
|
||||
|
||||
## Script standalone (`scripts/`)
|
||||
|
||||
@@ -149,15 +158,15 @@ dipendenze extra con `#:package Nome@versione` in testa al file):
|
||||
`AssemblyComponentScanner`.
|
||||
- **Query.cs** — query SQL ad-hoc contro `cad_index.db` da riga di comando.
|
||||
|
||||
> ⚠️ Nota importante di sicurezza: se `dotnet run` viene lanciato dentro `CadSearchGui/`
|
||||
> ⚠️ Nota importante di sicurezza: se `dotnet run` viene lanciato dentro `PrepStep/`
|
||||
> (che contiene un `.csproj` di tipo `WinExe`), esegue l'app GUI vera invece dello script
|
||||
> standalone e resta bloccato in attesa che una finestra si chiuda. Lanciare gli script da
|
||||
> una cartella senza `.csproj` (es. la root del repo o `scripts/` stessa).
|
||||
|
||||
## Test
|
||||
|
||||
- **CadSearchGui.Tests/** (xUnit) — riferimento al progetto principale via `ProjectReference`
|
||||
+ `InternalsVisibleTo` (in `CadSearchGui.csproj`), così i test chiamano direttamente
|
||||
- **PrepStep.Tests/** (xUnit) — riferimento al progetto principale via `ProjectReference`
|
||||
+ `InternalsVisibleTo` (in `PrepStep.csproj`), così i test chiamano direttamente
|
||||
`Indexer.ParseFilename` e `AssemblyComponentScanner.EstraiCodiciReferenziati` senza esporli
|
||||
come API pubblica. File: `IndexerParseFilenameTests.cs`,
|
||||
`AssemblyComponentScannerTests.cs`, `DistintaBaseImporterTests.cs`,
|
||||
|
||||
+3
-3
@@ -33,7 +33,7 @@ ASCII leggibili in diversi campi ricorrenti:
|
||||
Un codice reale compare **più volte** nel file (una per feature/placement
|
||||
diverso); rumore binario che assomiglia casualmente a un codice compare quasi
|
||||
sempre una sola volta. Questa è la base del filtro in
|
||||
[`AssemblyComponentScanner.cs`](../CadSearchGui/AssemblyComponentScanner.cs)
|
||||
[`AssemblyComponentScanner.cs`](../PrepStep/AssemblyComponentScanner.cs)
|
||||
e in [`scripts/ExtractCreoStrings.cs`](../scripts/ExtractCreoStrings.cs):
|
||||
|
||||
```
|
||||
@@ -249,7 +249,7 @@ regex aggiuntiva: (?<=<)(?:UNI\d+|CUSCI_[A-Za-z0-9]+)(?=>)
|
||||
```
|
||||
|
||||
Implementata sia in [`scripts/ExtractCreoStrings.cs`](../scripts/ExtractCreoStrings.cs) sia in
|
||||
[`AssemblyComponentScanner.cs`](../CadSearchGui/AssemblyComponentScanner.cs) (fase "Trova componenti
|
||||
[`AssemblyComponentScanner.cs`](../PrepStep/AssemblyComponentScanner.cs) (fase "Trova componenti
|
||||
referenziati" dell'app). Il prefisso family table non è garantito essere solo `UNI`/`CUSCI`:
|
||||
se ricompaiono famiglie diverse (altri componenti normalizzati), vanno aggiunte allo stesso modo,
|
||||
verificando prima con `scripts/Analyze.cs` che il contenuto tra `<` e `>` corrisponda a un codice
|
||||
@@ -271,7 +271,7 @@ livello) serve una BFS:
|
||||
Stessa logica di estrazione candidati ed euristica del codice radice (sopra),
|
||||
duplicata in due punti del codice per scopi diversi:
|
||||
|
||||
- [`AssemblyComponentScanner.EstraiCodiciReferenziati`](../CadSearchGui/AssemblyComponentScanner.cs) + `CodiceRadice` — estrazione dei candidati da un file, usata dalla BFS in [`Form1.RisolviAlberoComponenti`](../CadSearchGui/Form1.cs) (fase "Trova componenti referenziati") e [`Form1.AssiemeCompleto`](../CadSearchGui/Form1.cs) (fase "Verifica completezza"). Entrambe seminano l'insieme dei codici visitati con codice + radice di ogni file di partenza, e caricano una volta sola tutti i codici noti all'indice (`Form1.CaricaCodiciNoti`) sia per validare i token generici delle parti commerciali sia per risolvere i percorsi dei componenti trovati, senza una query SQL per candidato.
|
||||
- [`AssemblyComponentScanner.EstraiCodiciReferenziati`](../PrepStep/AssemblyComponentScanner.cs) + `CodiceRadice` — estrazione dei candidati da un file, usata dalla BFS in [`Form1.RisolviAlberoComponenti`](../PrepStep/Form1.cs) (fase "Trova componenti referenziati") e [`Form1.AssiemeCompleto`](../PrepStep/Form1.cs) (fase "Verifica completezza"). Entrambe seminano l'insieme dei codici visitati con codice + radice di ogni file di partenza, e caricano una volta sola tutti i codici noti all'indice (`Form1.CaricaCodiciNoti`) sia per validare i token generici delle parti commerciali sia per risolvere i percorsi dei componenti trovati, senza una query SQL per candidato.
|
||||
- [`scripts/ExtractCreoStrings.cs`](../scripts/ExtractCreoStrings.cs) e [`scripts/BomViaDb.cs`](../scripts/BomViaDb.cs) — stessa BFS ricorsiva standalone da riga di comando (copia indipendente della stessa euristica, nessun `ProjectReference` verso la GUI). Usati per confrontare l'euristica contro l'albero Creo di un singolo file durante il reverse engineering, senza dover passare dalla UI/dal DB `raw`.
|
||||
|
||||
Nota: le query contro `files_ultima_versione` filtrano solo per
|
||||
|
||||
Reference in new issue
Block a user