2026-09-16 11:40:34 +02:00
|
|
|
using System.Text;
|
|
|
|
|
using System.Text.RegularExpressions;
|
|
|
|
|
|
|
|
|
|
namespace CadSearchGui;
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Estrae i codici componente referenziati dentro un file .asm Pro-E/Creo.
|
|
|
|
|
/// Il formato è per lo più binario, ma i codici dei sotto-componenti compaiono
|
|
|
|
|
/// come stringhe ASCII leggibili al suo interno: si scansiona il file come testo
|
|
|
|
|
/// cercando pattern che assomigliano a un codice (stesso stile usato nei nomi file,
|
|
|
|
|
/// vedi Indexer.FilenameRegex) e si lascia poi al chiamante il compito di verificarli
|
|
|
|
|
/// contro l'indice DB, che scarta automaticamente i falsi positivi (numeri che non
|
|
|
|
|
/// corrispondono a nessun codice reale).
|
2026-09-16 16:25:52 +02:00
|
|
|
///
|
|
|
|
|
/// Verificato su un caso reale confrontando con un report BOM generato da Creo: i
|
|
|
|
|
/// riferimenti veri compaiono più volte nel file (una volta per feature/placement),
|
|
|
|
|
/// mentre il rumore binario casuale che assomiglia a un codice compare quasi sempre
|
|
|
|
|
/// una sola volta. Si scartano quindi i candidati con una sola occorrenza.
|
2026-09-17 09:55:06 +02:00
|
|
|
///
|
|
|
|
|
/// Falso positivo noto ed escluso: gli ID interni di viste salvate, nel formato
|
|
|
|
|
/// "ModelView#<numero>", hanno la stessa forma di un codice (8-12 cifre) e
|
|
|
|
|
/// compaiono più volte come un riferimento vero. Vedi docs/formato-asm.md.
|
2026-09-16 11:40:34 +02:00
|
|
|
/// </summary>
|
|
|
|
|
static class AssemblyComponentScanner
|
|
|
|
|
{
|
2026-09-17 09:55:06 +02:00
|
|
|
private static readonly Regex CodiceRegex = new(
|
|
|
|
|
@"(?<!ModelView#)\b\d{8,12}(?:_[A-Za-z]\d{2,4}|[A-Za-z]{0,2})\b", RegexOptions.Compiled);
|
2026-09-16 16:25:52 +02:00
|
|
|
private const int OccorrenzeMinime = 2;
|
2026-09-16 11:40:34 +02:00
|
|
|
|
|
|
|
|
public static HashSet<string> EstraiCodiciReferenziati(string percorsoAsm)
|
|
|
|
|
{
|
|
|
|
|
var testo = Encoding.Latin1.GetString(File.ReadAllBytes(percorsoAsm));
|
2026-09-16 16:25:52 +02:00
|
|
|
var occorrenze = new Dictionary<string, int>();
|
2026-09-16 11:40:34 +02:00
|
|
|
foreach (Match m in CodiceRegex.Matches(testo))
|
|
|
|
|
{
|
2026-09-16 16:25:52 +02:00
|
|
|
occorrenze[m.Value] = occorrenze.GetValueOrDefault(m.Value) + 1;
|
2026-09-16 11:40:34 +02:00
|
|
|
}
|
2026-09-16 16:25:52 +02:00
|
|
|
return occorrenze.Where(kv => kv.Value >= OccorrenzeMinime).Select(kv => kv.Key).ToHashSet();
|
2026-09-16 11:40:34 +02:00
|
|
|
}
|
|
|
|
|
}
|