Copia in raw anche i modelli citati per riferimento esterno
Terzo caso di "[-4] Dati di input non completi" in Creo Distributed Batch, dopo i soppressi e le copie ambigue del commit precedente: falliva 9255728001, e solo lui fra i sei assiemi del batch. Il file in raw/ era identico bit per bit a quello sulla share, quindi non era il modello: mancava il contorno. Il suo sottoassieme _200 e' legato ad altri due (9255708017, 9255708018) da assembly feature e datum copiati, e monta una vite V6-12--_-_U5933_C il cui generico uni5933.prt non era in raw/. Nessuno dei sei file compariva in "members" ne' fra i piazzamenti: i due lettori esistenti non potevano vederli. Quei modelli stanno in una tabella a parte del .asm - array \xf2\xf7\x05 … \xf3 con elementi \xe3\xe2<tipo><nome>\0 - che ora si legge con EstraiCodiciRiferimentiEsterni, riusando la normalizzazione di #AF<n> e istanza<generico> gia' fatta per i membri. A differenza dei soppressi si ricorre dentro: Creo carica il modello citato con tutto il suo albero, e infatti 9255700182 arriva solo per quella via. La tabella contiene anche nomi di feature (MIRROR3, CHAMFER1) che dal record non si distinguono dai modelli. Non e' un problema: come per i soppressi si cerca ogni nome nell'indice e si ignora quello che non c'e'. Per lo stesso motivo questi codici restano fuori dai "non trovati", e la coda di scansione porta ora un flag che tiene fuori anche i rami raggiunti per riferimento esterno - la lista dei componenti mancanti continua a parlare solo della distinta. Documentato in docs/formato-asm-record.md §7.5. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
1 parent
54f267b508
commit
13f6de6402
5 files changed
+147
-15
No files matched your search
@@ -48,6 +48,17 @@ public class AsmRecordReaderTests
|
||||
Bytes(0xe0, 0x01, "model_t_type", 0, 2, 0xe0, 0x0a, "model_name", 0, nome, 0,
|
||||
0xe0, 0x0a, "generic_name", 0, 0);
|
||||
|
||||
// array dei modelli referenziati: \xf2\xf7\x05 <elementi> \xf3, ogni elemento
|
||||
// \xe3\xe2<tipo><nome>\0 - vedi docs/formato-asm-record.md §7.5
|
||||
private static byte[] Riferimenti(params string[] nomi)
|
||||
{
|
||||
var parti = new List<object> { 0xf2, 0xf7, 0x05 };
|
||||
foreach (var nome in nomi)
|
||||
parti.AddRange(new object[] { 0xe3, 0xe2, 0x02, nome, 0 });
|
||||
parti.Add(0xf3);
|
||||
return Bytes(parti.ToArray());
|
||||
}
|
||||
|
||||
private static byte[] Asm(int conteggioDichiarato, byte[] membri, byte[]? extra = null) =>
|
||||
Bytes("header ", extra ?? Array.Empty<byte>(), "\0members\0", 0xf1, 0xf8, conteggioDichiarato, membri, "#MdlStatus");
|
||||
|
||||
@@ -229,6 +240,28 @@ public class AsmRecordReaderTests
|
||||
finally { File.Delete(percorso); }
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Riferimenti_esterni_non_sono_fra_i_membri_e_si_risolvono_sul_generico()
|
||||
{
|
||||
// Un modello legato da riferimento esterno (assembly feature "#AFn", datum copiati) non
|
||||
// compare ne' in "members" ne' fra i piazzamenti, ma senza il suo file Creo non apre
|
||||
// l'assieme: e' il caso che faceva fallire 9255728001_200 in Distributed Batch. Per le
|
||||
// istanze di family table il file su disco e' il generico fra parentesi angolari.
|
||||
byte[] dati = Asm(1, Membro(1, 2, "9244206098"),
|
||||
extra: Bytes(Riferimenti("9255708017#AF2<9255708017>", "9255708018"),
|
||||
Riferimenti("V6-12--_-_U5933_C<UNI5933>")));
|
||||
|
||||
Assert.Equal(new[] { "9244206098" }, AsmRecordReader.LeggiMembri(dati).Select(m => m.Nome));
|
||||
|
||||
string percorso = ScriviFile(dati);
|
||||
try
|
||||
{
|
||||
Assert.Equal(new[] { "9255708017", "9255708018", "UNI5933" },
|
||||
AsmRecordReader.EstraiCodiciRiferimentiEsterni(percorso).OrderBy(c => c, StringComparer.Ordinal));
|
||||
}
|
||||
finally { File.Delete(percorso); }
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Sezione_members_assente_lancia_eccezione()
|
||||
{
|
||||
|
||||
Reference in new issue
Block a user