Risolve i membri family table senza ConfigName e la scritta troncata in "Componenti referenziati"
Alcuni membri di family table non-UNI portano la notazione "<istanza><generico>" direttamente nel campo name/family_name di members, senza un ConfigName associato: AsmRecordReader cercava quella stringa intera (parentesi comprese) nell'indice e non la trovava mai. Ora separa istanza e generico. Corretta anche l'etichetta di PrtMancantiForm, che usciva dal bordo della finestra invece di andare a capo. Documentato il nuovo meccanismo in docs/formato-asm-record.md, e aggiunta una nota sul segnale di rilevamento family table di assiemi: validato su un caso reale ma non affidabile al 100% su scala (trovato un falso positivo).
This commit is contained in:
1 parent
9af426ca1b
commit
cf4c2e8e29
4 files changed
+106
-4
No files matched your search
@@ -59,6 +59,14 @@ public static class AsmRecordReader
|
||||
@"\xe0\x01model_t_type\x00" + Int + @"\xe0\x0amodel_name\x00([\x20-\x7e]+)\x00\xe0\x0ageneric_name\x00\x00",
|
||||
RegexOptions.Compiled);
|
||||
|
||||
// Alcuni membri di family table non-UNI (es. viti/dadi commerciali) non passano da
|
||||
// ConfigName: il campo "name" del record members porta gia' la forma "<istanza><generico>"
|
||||
// (stessa notazione di §4.1, li' sconsigliata per la BOM perche' e' un elenco di
|
||||
// riferimenti geometrici - qui invece e' il valore vero del componente, va solo separato).
|
||||
// Osservato su 9244248577a_c01.asm: "V6-12--_-_U5931_GC<UNI5931>" - senza questo split il
|
||||
// codice cercato nell'indice sarebbe la stringa intera con le parentesi, mai trovata.
|
||||
private static readonly Regex IstanzaConGenericoRegex = new(@"^([\x20-\x7e]+?)<([\x20-\x7e]+)>$", RegexOptions.Compiled);
|
||||
|
||||
// sintomo vero e proprio (docs/formato-asm-record.md §7): il file e' esso stesso
|
||||
// un'istanza di family table (il suo "model_name" ha il suffisso "_C0n" delle istanze,
|
||||
// stessa convenzione di SuffissoArrayFeatureRegex/ConfigName sopra) - "members" descrive
|
||||
@@ -163,7 +171,15 @@ public static class AsmRecordReader
|
||||
if (grezzi.Count != conteggio)
|
||||
throw new InvalidDataException($"attesi {conteggio} membri, trovati {grezzi.Count}: lettura disallineata");
|
||||
|
||||
return grezzi.Select(g => new Membro(g.Id, g.Tipo, istanze.GetValueOrDefault(g.Id, g.Nome), g.Nome)).ToList();
|
||||
return grezzi.Select(g =>
|
||||
{
|
||||
if (istanze.TryGetValue(g.Id, out var nomeIstanza))
|
||||
return new Membro(g.Id, g.Tipo, nomeIstanza, g.Nome);
|
||||
var bracket = IstanzaConGenericoRegex.Match(g.Nome);
|
||||
return bracket.Success
|
||||
? new Membro(g.Id, g.Tipo, bracket.Groups[1].Value, bracket.Groups[2].Value)
|
||||
: new Membro(g.Id, g.Tipo, g.Nome, g.Nome);
|
||||
}).ToList();
|
||||
}
|
||||
|
||||
/// <summary>Codici dei componenti diretti (il generico su disco, non il nome istanza),
|
||||
|
||||
@@ -20,6 +20,7 @@ public class PrtMancantiForm : Form
|
||||
{
|
||||
Dock = DockStyle.Top,
|
||||
AutoSize = true,
|
||||
MaximumSize = new Size(ClientSize.Width - 24, 0),
|
||||
Padding = new Padding(12, 8, 12, 8),
|
||||
Text = $"Copiati in \"{cartellaRaw}\": {numPrt} PRT e {numAsm} sotto-assiemi trovati nell'indice."
|
||||
+ (codiciNonTrovati.Count > 0
|
||||
@@ -70,5 +71,7 @@ public class PrtMancantiForm : Form
|
||||
Controls.Add(grid);
|
||||
Controls.Add(lblInfo);
|
||||
Controls.Add(btnApriCartella);
|
||||
|
||||
Resize += (_, _) => lblInfo.MaximumSize = new Size(ClientSize.Width - 24, 0);
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user