Copia in raw i file che servono a Creo, non solo quelli della distinta
Creo Distributed Batch falliva su 8 dei 22 assiemi con "[-4] Dati di input non completi", un messaggio che non nomina il file mancante. Erano due cause distinte, entrambe emerse aprendo gli assiemi da raw/ e cercando nell'albero il componente con l'icona rossa. Copia sbagliata del componente. Lo stesso codice esiste spesso in piu' cartelle della share con pari versione e contenuto diverso (13% dei codici): non sono revisioni, sono istantanee parallele lasciate da studi, allestimenti fiera e cartelle temporanee. La vista dell'indice rompeva il pareggio in modo arbitrario, e poteva vincere una copia obsoleta - nascondendo del tutto quella buona. Creo poi caricava un modello diverso da quello atteso, non risolveva i vincoli e non apriva l'assieme. Il .asm non dice quale copia usa (ne' percorso, ne' UOBJ_ID del figlio, ne' revisione attesa), quindi si replica la regola di Creo: vince la copia nella stessa cartella dell'assieme che la referenzia. La vista ora rompe il pareggio in modo deterministico e viene ricreata a ogni scan, cosi' un DB esistente prende la definizione nuova senza reindicizzare. Componenti soppressi. Spariscono da "members" ma restano citati dalla feature che li posiziona, e il loro file serve comunque per aprire l'assieme. Da quando la lettura usa il parser esatto - che legge solo "members", ed e' la scelta giusta per la BOM - non venivano piu' copiati. Ora si copiano a parte, senza entrare nel conteggio dei "non trovati": non sono componenti della distinta, segnalarli come mancanti sarebbe un falso allarme. Documentate entrambe in docs/formato-asm-record.md §7.3 e §7.4, insieme alla distinzione che le accomuna: la lista della distinta e la lista dei file necessari a Creo non coincidono, e la seconda e' piu' lunga. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
1 parent
0ae2a5e7cf
commit
54f267b508
8 files changed
+316
-18
No files matched your search
@@ -201,4 +201,34 @@ public static class AsmRecordReader
|
||||
var membri = LeggiMembri(File.ReadAllBytes(percorsoAsm));
|
||||
return new HashSet<string>(membri.Select(m => m.Generico), StringComparer.OrdinalIgnoreCase);
|
||||
}
|
||||
|
||||
/// <summary>Codici che compaiono come piazzamento ma non fra i membri: sono i componenti
|
||||
/// **soppressi**, che spariscono da "members" senza lasciare traccia (§7.1) ma restano
|
||||
/// citati dalla feature che li posiziona.
|
||||
///
|
||||
/// Non fanno parte della BOM - Creo non li elenca - ma il loro file serve comunque per
|
||||
/// **aprire** l'assieme: senza, il caricamento fallisce con "dati di input non completi".
|
||||
/// Sono quindi due domande diverse: cosa compare nella distinta (<see
|
||||
/// cref="EstraiCodiciReferenziati"/>) e cosa serve avere su disco (questo metodo in
|
||||
/// aggiunta), e la seconda lista e' piu' lunga della prima.</summary>
|
||||
public static HashSet<string> EstraiCodiciSoppressi(string percorsoAsm)
|
||||
{
|
||||
byte[] dati = File.ReadAllBytes(percorsoAsm);
|
||||
var membri = LeggiMembri(dati);
|
||||
var noti = new HashSet<string>(
|
||||
membri.Select(m => m.Generico).Concat(membri.Select(m => m.Nome)), StringComparer.OrdinalIgnoreCase);
|
||||
|
||||
var soppressi = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
|
||||
foreach (Match m in PlacementRegex.Matches(Encoding.Latin1.GetString(dati)))
|
||||
if (!noti.Contains(m.Groups[1].Value))
|
||||
soppressi.Add(m.Groups[1].Value);
|
||||
return soppressi;
|
||||
}
|
||||
|
||||
// "Componente ID 52 (9230100043.PRT)" - la stringa cambia con la localizzazione Creo del
|
||||
// file, come in AssemblyComponentScanner.HaPlacement. Minimo 3 caratteri per lo stesso
|
||||
// motivo per cui li' i token generici partono da 3: sotto quella soglia si raccoglie
|
||||
// rumore (sulla share esistono davvero modelli chiamati "1.prt", "2.prt"...).
|
||||
private static readonly Regex PlacementRegex = new(
|
||||
@"Component(?:e)? [Ii][Dd] \d+ \(([A-Za-z0-9_\-]{3,})\.(?:PRT|ASM)\)", RegexOptions.Compiled);
|
||||
}
|
||||
Reference in new issue
Block a user