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>
This commit is contained in:
@@ -0,0 +1,138 @@
|
||||
# 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 (7–8 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 |
|
||||
Reference in New Issue
Block a user