Files
pdm/README.md
T
davideandClaude Opus 5 bc84407a6f Lettore di metadati per file nativi Creo Parametric
Prototipo CLI in Python che estrae parametri e proprieta' dai file .prt
senza avviare Creo e senza SDK commerciali. Solo libreria standard.

I file nativi Creo sono container con header ASCII e un indice delle
sezioni (UGC_TOC); la maggior parte delle sezioni non e' compressa e la
tabella dei parametri e' leggibile direttamente.

Ogni parametro compare in due rappresentazioni indipendenti (tabella
estesa in LargeText e copia neutra in NeuPrtSld). Il lettore le confronta
entrambe, e ne ricava:

- confidence: 0.99 quando le due copie concordano, valori inferiori se il
  dato compare una volta sola o se divergono (status "conflict");
- owner: distingue i parametri del modello da quelli delle feature, che
  vivono solo nella copia neutra.

I parametri numerici (PESO, DENSITA) usano una codifica a lunghezza
variabile non ancora risolta: vengono riportati come
"encoded_not_decoded" conservando i byte grezzi, senza inventare valori.

Validato su file PART e PART/SHEETMETAL scritti da Creo 9.0.3.0. Assiemi,
family table e versioni precedenti non sono ancora stati verificati.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-06 11:45:39 +02:00

139 lines
5.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# creoparams
Estrae parametri e proprietà dai file nativi Creo Parametric (`.prt`, `.asm`,
`.drw`) **senza avviare Creo** e senza SDK commerciali. Solo Python 3, nessuna
dipendenza esterna.
## Uso
Un file alla volta — è il caso d'uso principale:
```bash
python3 -m creoparams 9258400201.prt.12 # tabella a video
python3 -m creoparams 9258400201.prt.12 --quiet -o - # JSON su stdout
python3 -m creoparams 9258400201.prt.12 -o scheda.json
```
Con un solo file l'output JSON è un **oggetto**; con più file una **lista**.
`-o -` scrive su stdout, quindi il comando si può mettere in pipe.
Un file indicato esplicitamente viene sempre elaborato così com'è: la scelta
automatica dell'ultima versione riguarda solo l'esplorazione di una cartella.
In lotto, quando serve:
```bash
python3 -m creoparams . --csv metadati.csv # cartella corrente
python3 -m creoparams /rete/archivio -r --csv indice.csv
```
Opzioni principali:
| Opzione | Effetto |
|---|---|
| `-o`, `--json FILE` | scrive il JSON su file, oppure su stdout con `-` |
| `--csv FILE` | tabella riepilogativa CSV (Excel, separatore `;`) |
| `-r`, `--recursive` | esplora le sottocartelle |
| `--all-versions` | elabora tutte le versioni (`.prt.1`, `.prt.2`, …) invece della sola più recente |
| `--features` | include i parametri delle feature (fori, lavorazioni) oltre a quelli di modello |
| `--system` | include i parametri generati da Creo (`PTC_*`, `SMT_*`) |
| `--quiet` | non stampa la tabella |
Codici di uscita: `0` estrazione riuscita, `1` nessun file trovato, `2` nessun
file elaborabile (file mancante o non nativo Creo). I messaggi diagnostici
vanno su stderr, così stdout resta pulito per le pipe.
Nella tabella a video, il marcatore a inizio riga indica l'affidabilità:
spazio = confermato in due rappresentazioni indipendenti, `?` = trovato una
volta sola, `~` = valore binario non decodificato, `!` = valori discordanti,
`-` = parametro atteso ma assente.
## Come funziona
Un file nativo Creo è un container con header ASCII in chiaro, un indice delle
sezioni (`UGC_TOC`) e un corpo binario. La maggior parte delle sezioni **non è
compressa**, e la tabella dei parametri è leggibile direttamente.
Ogni parametro è presente in due rappresentazioni indipendenti:
- la **tabella estesa** (sezione `LargeText`), che contiene i parametri di modello;
- la **copia neutra** (sezione `NeuPrtSld`), che contiene anche quelli delle feature.
Il lettore percorre entrambe e confronta i risultati. Da qui derivano due
informazioni che finiscono nell'output:
- `owner`: `model` se il parametro compare nella tabella estesa, `feature` se
vive solo nella copia neutra (è un parametro di un foro, non del pezzo);
- `confidence`: `0.99` se le due rappresentazioni concordano, valori più bassi
se il dato compare una volta sola o se le copie divergono (`status: conflict`).
## Formato di output
```json
{
"schema_version": 1,
"file": { "name": "9258400201.prt.12", "sha256": "994dd3a8…", "size": 450797 },
"model": { "name": "9258400201", "kind": "PART", "creo_version": "9.0.3.0" },
"extraction": { "method": "ugc_native_reader", "holds_model_parameters": true },
"parameters": {
"DENOMINAZIONE": {
"type": "string", "owner": "model", "scope": "user",
"value": "Carter lato destro", "status": "found", "confidence": 0.99,
"sections": ["LargeText", "NeuPrtSld"]
},
"PESO": {
"type": "real", "status": "encoded_not_decoded",
"raw": "90f8382356ca2d", "driven_by": "value(d_val)"
}
}
}
```
L'`sha256` permette di verificare in seguito se un record estratto corrisponde
ancora al file da cui proviene.
## Limiti noti
**Parametri numerici non decodificati.** `PESO` e `DENSITA` usano una codifica
binaria a lunghezza variabile (78 byte osservati) che non è un double IEEE
lineare. Non vengono inventati valori: lo stato è `encoded_not_decoded` e i byte
grezzi sono conservati in `raw`, così da poter essere interpretati in seguito
senza rileggere l'archivio. Per decifrare la codifica servono alcuni valori di
riferimento letti da Creo.
**Disegni.** I `.drw` vengono riconosciuti e ne viene letto l'header, ma non
contengono la tabella parametri del modello: espongono note e cartiglio, con una
struttura diversa non ancora implementata. Il campo `holds_model_parameters`
lo dichiara esplicitamente.
**Copertura verificata.** Il lettore è stato validato su file `PART` e
`PART/SHEETMETAL` scritti da **Creo 9.0.3.0**. Non è stato provato su assiemi,
family table, né su file di versioni Creo precedenti. Prima di usarlo
sull'archivio storico, va verificato su un campione di file più vecchi.
**Family table.** Le istanze non hanno un file proprio: vivono nel generic. Su
un generic con family table il lettore restituirebbe i valori del generic, non
quelli dell'istanza. Nei file campione la sezione `FamilyInf` è vuota, quindi
il caso non è mai stato esercitato.
## Test
```bash
python3 -m unittest test_regression -v
```
I test girano sui `.prt` presenti nella cartella e verificano che i parametri
aziendali obbligatori siano letti con confidenza alta. `KNOWN` in
`test_regression.py` contiene i valori verificati a mano: **è la rete di
sicurezza vera del progetto** e va estesa ogni volta che si confronta un nuovo
file con Creo.
## Struttura
| File | Contenuto |
|---|---|
| [creoparams/ugc.py](creoparams/ugc.py) | header e indice delle sezioni del container |
| [creoparams/params.py](creoparams/params.py) | riconoscimento dei record parametro nel binario |
| [creoparams/extract.py](creoparams/extract.py) | aggregazione, confidenza, record di output |
| [creoparams/cli.py](creoparams/cli.py) | riga di comando ed esportazioni |