diff --git a/docs/formato-prt-feature.md b/docs/formato-prt-feature.md index 1319540..3e0edcd 100644 Binary files a/docs/formato-prt-feature.md and b/docs/formato-prt-feature.md differ diff --git a/docs/formato-prt-geometria.md b/docs/formato-prt-geometria.md index 105ce44..2fd4126 100644 --- a/docs/formato-prt-geometria.md +++ b/docs/formato-prt-geometria.md @@ -34,6 +34,7 @@ scritti in forma compatta. Si distinguono per il primo byte, `tag`: | `2a` | 2 | `3f b1 b2 00...` | livello 2: `2a f4 00` = 1,25, il passo di M8x1.25 | | `48` | 2 | `c0 b1 b2 00...` (negativo) | **livello 1** (−12,5; −69,5) | | `47` / `46` | 2 / 7 | stessa famiglia di `48`, con ripetizione / precisione piena | non isolati | +| `e4`-`e7` | 0 | `K − 3` zeri di seguito, `K` = byte − `e0` (solo dentro le matrici, §6.1) | **livello 1** (matrici di `9239902104`) | | `ed`, `32`... | 8-9 | altri byte alti | non decodificato | **La regola, ricavata dai dati** (non da una specifica): a ogni *byte alto* `T` del `double` @@ -116,6 +117,20 @@ modo per attribuire la quota a "Foro 1" o a "Estrusione 2". | Estrusione 1 / taglio (118) | 62 / 14 / 5 / 20 | 4 / 45 / 8 / 3 | non verificate | | Foro 1 (157) | 4 / 9 / 2 / 10 / 2 | 8 / 20 / 6,8 / 118 / 25 | **confermate da Creo** (§6.4): 8 = diametro nominale, 20 = profondità filetto, 118 = angolo punta, 25 = profondità foro | +`9239902104.prt.1` (piastra con tre fori, §6.4.1): + +| Feature | `dim_type` | Valore | Interpretazione | +|---|---|---|---| +| Sketch 1 / Estrusione 1 (84) | 1 / 5 / 1 | 21 / 54 / 125 (+ 46) | quote del profilo a L (§3.2) | +| Estrusione 1 (84) | 62 | 6 | profondità, coerente con y = 0 ... 6 delle facce | +| Sketch 2 / Foro 1 (124 / 131) | 8 / 2 / 2 / 7 | 38 / 8 / 8 / 30 | quote dei 4 punti (§6.4.1) | +| Foro 1 (131) | 4 | 5,5 | diametro | +| Sketch 3 / Foro 2 (1095 / 1099) | 2 / 2 | 4 / 5 | distanze del punto dai bordi: l'origine `(67, 6, -5)` = 71 − 4 e 5 | +| Foro 2 (1099) | 4 | 5 | diametro | +| Foro 3 (1132) | 4 / 9 / 2 / 2 | 3 / 6 / 2,5 / 137,5 | diametro nominale M3, profondità filetto, punta, lunghezza (distanza fino all'estremo, §6.1) | +| Sketch 4 / Estrusione 2 (1903 / 1911) | 1 / 62 | 3,5 / 3 | quota dello schizzo e profondità | +| Arrotondamento 1 (2777) | 3 | 3 | raggio, confermato dallo storico | + **Cosa è provato e cosa no.** I valori `25` e `139` di *Rivoluzione 1* sono confermati da Creo (§5). Per tutte le altre righe il *numero* è decodificato in modo plausibile ma il *significato* (profondità? diametro?) è dedotto dal codice `dim_type`, da cui non ho una tabella certa. I codici @@ -168,6 +183,23 @@ quotato 25 come diametro rispetto all'asse tratteggiato, simmetrico rispetto a ` Nota: nel file la quota `25` è un **diametro** (Ø25), anche se in geometria il lato è 12,5. Per questo non si può dedurre la forma dalle sole quote: servono anche le linee. +### 3.2 Secondo esempio: il profilo a L di *Estrusione 1* (`9239902104.prt.1`) + +Le linee del profilo (`entity(line)`, estremi `(x, y)` nel sistema dello schizzo, `z = 0`): + +| Linea | Da | A | +|---|---|---| +| 1 | (71, 0) | (−54, 0) | +| 2 | (−54, 0) | (−54, 46) | +| 3 | (−54, 46) | (0, 46) | +| 4 | (0, 46) | (0, 21) | +| 5 | (0, 21) | (71, 21) | +| 6 | (71, 21) | (71, 0) | + +più una linea d'asse. Le quote 125 (= 54 + 71), 54, 46 e 21 sono tutte spiegate dal profilo. Qui le +linee stanno in `FeatDefs` (record della feature, sezione `S2D0006`), non in `BasFullData` come in +§3: la posizione del blocco `p_saved_result` dipende dal tipo di feature. + ## 4. Da schizzo + quote alla forma: la rivoluzione Con le due cose sopra, *Rivoluzione 1* è determinata così: @@ -200,16 +232,32 @@ ma nella definizione della feature (§7). ### 6.1 Matrici 4×3 -Piani di riferimento, assi, sistemi di coordinate e schizzi hanno un `local_sys`: array `f9 04 03`, -cioè 4 righe per 3 colonne = 12 numeri (3 versori degli assi + l'origine). Lo schizzo sul piano -base ha la matrice identità, scritta `0f 18 e5 0f 18 e5 0f 18 e5`: tre gruppi uguali, ciascuno -`1, 0, 0, 0`, cioè 12 numeri `1,0,0,0, 1,0,0,0, 1,0,0,0`. Da qui l'ipotesi che `e4`-`e7` dopo uno -zero valgano "altri K−3 zeri". +Piani di riferimento, assi, sistemi di coordinate, schizzi e feature hanno un `local_sys`: array +`f9 04 03` = 4 righe per 3 colonne = 12 numeri: **tre versori e, per ultima, l'origine**. Si leggono +con i numeri di §1 più un codice di ripetizione: un byte `e4`-`e7` vale **"altri `K − 3` zeri"**, +con `K` = byte − `e0` (`e4` = 1 zero, `e5` = 2, `e6` = 3, `e7` = 4). L'identità è quindi +`0f 18 e5 0f 18 e5 0f 18 e5` = `1,0,0,0, 1,0,0,0, 1,0,0,0`. -**Questa lettura è un'ipotesi, non verificata.** L'identità non permette di distinguere -"per righe" da "per colonne", né di sapere quale gruppo è l'origine. Servono matrici *non* -identità (un piano ruotato, un'origine fuori dallo zero) con il valore atteso da Creo. Finché non -c'è, rotazione e origine di piani e schizzi sono **non decodificate**. +**Verificato su `9239902104.prt.1`** (livello 1: i valori coincidono con quelli mostrati da Creo, +sotto), con le 4 righe `(e1, e2, e3, origine)`: + +| Feature | Matrice letta | Significato | +|---|---|---| +| Foro 1 | `(1,0,0) (0,0,-1) (0,1,0)`, origine `(-46, 6, -38)` | uno dei 4 punti dello schizzo `(-46, 38)`: x = x dello schizzo, z = **−**y dello schizzo, y = 6 = faccia superiore (la piastra è spessa 6) | +| Foro 2 | `(1,0,0) (0,0,-1) (0,1,0)`, origine `(67, 6, -5)` | 71 − 4 e 5 dal bordo: le due quote 4 e 5 della feature | +| Foro 3 | `(0,1,0) (-1,0,0) (0,0,1)`, origine `(-66.5, 3, -5)` | y = 3: l'**offset 3,00** dalla faccia superiore (y = 6) che Creo mostra; z = −5: allineato all'asse di Foro 2 (**"Allinea" con `A_7`**); x = −66,5 = 71 − 137,5, cioè il foro parte 137,5 prima dell'estremo destro (71) | + +Quindi **la posizione di un foro si legge dall'origine della sua matrice**: le quote di +posizionamento (4, 5, 3,00) non servono, sono già il risultato. Nei tre fori l'`y` e la `z` tornano +esattamente con le quote e con i riferimenti mostrati da Creo. + +Dalla stessa matrice: nel modello di questa piastra lo schizzo di Estrusione 1 sta nel piano `x–z` +(x dello schizzo = x, y dello schizzo = −z) e l'estrusione cresce lungo +y fino a 6. + +**Resta incerta l'interpretazione dell'asse del foro.** Per Foro 1 e 2 il terzo versore è `(0,1,0)` +(perpendicolare alla piastra, come deve essere). Per Foro 3 è `(0,0,1)`, ma il foro in Creo entra +dalla faccia laterale: o la convenzione del versore dell'asse è diversa, o la direzione di foratura +sta in un altro campo. Non risolto. ### 6.2 Dove stanno @@ -333,6 +381,48 @@ riferimento l'asse `A_1`: non ho agganciato quegli id perché le coppie `id_type ho decifrate. La geometria generata dal foro (cilindro, cono, piani con `feat_id` 157) è invece in `VisibGeom` e `NovisGeom`, e `geometry2_id` 175 delle istruzioni è un suo piano. +### 6.4.1 Foro a punti di schizzo e facce piane: `9239902104.prt.1` + +*Foro 1* è definito da *Sketch 2* con **4 punti**. Cosa si legge, tutto da `local_sys` (§6.1): + +**I punti.** Nello schizzo (`entity(point)`, campo `pnt`, un `[x, y, z]` per punto) sono +`(-46, 8)`, `(-8, 8)`, `(-8, 38)`, `(-46, 38)`, con quote 8, 8, 30 e 38. Nel modello ogni punto +diventa un'**istanza** del foro, e ogni istanza ha un piano proprio in `NovisGeom` (superficie +piana con `feat_id` 131, §6.3) con la matrice del punto: l'**origine** è la posizione assoluta. + +| Piano (`geom_id`) | Origine nel modello | +|---|---| +| 135 | `(-46, 6, -8)` | +| 147 | `(-8, 6, -8)` | +| 159 | `(-8, 6, -38)` | +| 171 | `(-46, 6, -38)` | + +Quindi `x` = `x` dello schizzo, `z` = **−**`y` dello schizzo (confermato dai quattro punti e da Foro +2, §6.1) e `y` = 6. + +**La faccia.** La superficie su cui stanno è la faccia piana superiore di *Estrusione 1*: ha +`y = 6` e la stessa matrice del sistema di coordinate dello schizzo (origine `(0, 6, 0)`, +versori `(1,0,0)`, `(0,0,1)`, `(0,-1,0)`). Le facce piane di *Estrusione 1* (`feat_id` 84, in +`VisibGeom`) sono, con origine e normale (il terzo versore): + +| `geom_id` | Origine | Normale | Faccia | +|---|---|---|---| +| 95 | `(0, 6, 0)` | `(0,-1,0)` | **superiore** (`y = 6`), dove sono i fori | +| 107 | `(71, 0, 0)` | `(-1,0,0)` | estremo destro (`x = 71`) | +| 113 | `(-54, 0, -46)` | `(1,0,0)` | estremo sinistro (`x = -54`) | +| 115 | `(-54, 0, 0)` | `(0,0,1)` | lato `z = 0` | +| 2999 | `(71, 0, -21)` | `(0,0,-1)` | lato del gradino (`z = -21`) | +| 3001 | `(0, 0, -21)` | `(-1,0,0)` | alzata del gradino (`x = 0`) | +| 3003 | `(0, 0, -46)` | `(0,0,-1)` | lato `z = -46` | + +La piastra a L di Estrusione 1 (§3.2, profilo `x` da −54 a 71, `y` dello schizzo da 0 a 46, gradino +a 21) torna in coordinate modello con `z = −y` dello schizzo, e spessore 6 lungo `y`. Gli altri +tre fori cadono dentro il materiale (`x` −46 e −8, `z` −8 e −38). + +**Non risolto:** quale `geom_id` il foro usi *formalmente* come faccia di riferimento (95, per +coincidenza di piano e di origine) non è scritto in un campo che io abbia identificato: è +un'identificazione per posizione, non una lettura. + ### 6.5 Lo smusso: `feat_defs_914` Riferimento: *Smusso 1* di `9252000507.prt.11` (feature 252), in modifica in Creo: modalità @@ -368,6 +458,24 @@ che io abbia decifrato), e **90** non l'ho risolto. - l'istruzione `14741`, con un valore `11,476` in precisione piena: non corrisponde a niente di mostrato. +**Foro filettato con posizionamento lineare** (*Foro 3* di `9239902104.prt.1`). Creo mostra: tipo +Standard, Diritto, Maschiato, ISO **M3x.5**, Ø2,50 (punta), campo profondità vuoto, posizionamento +**Lineare** con riferimento primario `Supfce:F6(ESTRUSIONE_1)` e due riferimenti di offset +(`Supfce:F6(ESTRUSIONE_1)` con offset 3,00 e `A_7(ASSE):F10(FORO 2)` allineato). Dal file: + +| Informazione | Letto | Prova | +|---|---|---| +| Filetto | stringhe `ISO`, `M3x.5`, punta `2.5`; `scrsize_val` = 12 | concorda con Creo | +| Ø della punta | istruzione 5104, offset 2,5 | concorda con Creo (Ø2,50) | +| Quote del foro | 3 (`dim_type` 4), 6 (9), 2,5 (2), 137,5 (2) | numeri letti; 137,5 con campo "Profondità" vuoto in Creo: probabilmente un foro passante, valore non verificato | +| Posizione risultante (offset 3,00 e allineamento a `A_7`) | **letta dalla matrice** `local_sys` (§6.1): origine `(-66.5, 3, -5)`, con y = 3 e z = −5 uguali a quelli di Foro 2 | concorda con Creo; la quota 3,00 non è una quota a sé nel `dim_array` | +| Riferimenti `F6` e `A_7` | non risolti | gli id stanno in blocchi `plin_info_ref` come per DTM1 (§6.3) | + +Correzione: il primo codice delle istruzioni è 5542 anche qui, come nel foro coassiale di +`9252000507`; il `12266` che avevo letto nella prima versione di questo doc veniva da un'istruzione +di un altro record. Il tipo di posizionamento (coassiale / lineare) **non** è quel codice. Quale sia +non lo so: la posizione finale si legge comunque dalla matrice (§6.1). + ## 7. Cosa manca per determinare un `.prt` in modo univoco Tabella di verità: ogni informazione necessaria, se l'ho decodificata e quanto è provata. @@ -383,13 +491,15 @@ Tabella di verità: ogni informazione necessaria, se l'ho decodificata e quanto | Cerchi, archi, spline dello schizzo | non verificato (cerchio visto in `test.prt.1`, raggio 50) | `entity(circle)`, `entity(arc_z)`, `entity(spline)` | | Valori non "tondi" | **non decodificato** (tag diversi da `2f`/`48`) | ovunque | | Piano e orientamento dello schizzo | **non decodificato** | `gsec3d_ptr`, `sec_orient_data` | -| Posizione/rotazione di piani, assi, punti | **non decodificato** (§6.1) | `ActDatums`, `MdlRefInfo` | +| Posizione/rotazione di fori e feature | **fatto**: matrice 4×3 (§6.1) | `local_sys` | +| Posizione/rotazione di piani, assi, punti | stessa matrice, da verificare su un piano ruotato | `ActDatums`, `MdlRefInfo` | | Vincoli e riferimenti di un piano (come DTM1) | **fatto per DTM1 di `9252000507`** (riferimenti sì, nome del vincolo da un esempio) | `FeatDefsDtm`, §6.3 | | Offset di un piano da un altro | **non decodificato**: mai visto un offset non nullo | quota in `dim_array` (`dim_id`) | | Direzione/lato e angolo di una rivoluzione, profondità e direzione di un'estrusione | **non decodificato** | `feat_defs_917`/`916` (`place_instruction_ptrs`, `plin_info_arr`) | | Parametri del foro (misura, punta, passo, profondità, angolo) | **fatto**, provato contro Creo su `9252000507` | `feat_defs_911`, §6.4 | | Opzioni del foro (maschiato, diritto, superficie del filetto) | **non individuato** | §6.4 | -| Posizione del foro (riferimenti e offset) | **non decodificato**: le istruzioni di posizionamento ci sono (`plin_info_arr`), come per DTM1 | `feat_defs_911` | +| Posizione assoluta del foro (origine e versori) | **fatto**, provato contro i riferimenti di Creo su `9239902104` (§6.1) | `local_sys` del record | +| Riferimenti del posizionamento (quale faccia/asse) | **non decodificato** | `plin_info_ref` in `feat_defs_911` | | Valore di raccordi e smussi | **fatto**, provato contro Creo su `9252000507` (D = 0,5) | `dim_array` | | Spigoli a cui si applicano raccordi/smussi | **parziale**: si risolvono le superfici (feature di origine), non lo spigolo né l'insieme | `feat_defs_914`, §6.5 | | Schema quote e insiemi dello smusso | **non decodificato** | `feat_defs_914` |