diff --git a/CadSearchGui.Tests/AssemblyComponentScannerTests.cs b/CadSearchGui.Tests/AssemblyComponentScannerTests.cs index 60b129e..4d292ac 100644 --- a/CadSearchGui.Tests/AssemblyComponentScannerTests.cs +++ b/CadSearchGui.Tests/AssemblyComponentScannerTests.cs @@ -53,6 +53,20 @@ public class AssemblyComponentScannerTests finally { File.Delete(percorso); } } + [Fact] + public void Scarta_id_di_viste_salvate_ModelView() + { + // Visto su 9044207061.asm: "ModelView#1073741828" compare più volte ma è un ID + // interno di vista salvata, non un codice componente. + string percorso = ScriviAsmFinto("x ModelView#1073741828 y ModelView#1073741828 z"); + try + { + var codici = AssemblyComponentScanner.EstraiCodiciReferenziati(percorso); + Assert.DoesNotContain("1073741828", codici); + } + finally { File.Delete(percorso); } + } + [Fact] public void File_inesistente_lancia_eccezione_IO() => Assert.Throws(() => diff --git a/CadSearchGui/AssemblyComponentScanner.cs b/CadSearchGui/AssemblyComponentScanner.cs index 402ec9e..696a7f5 100644 --- a/CadSearchGui/AssemblyComponentScanner.cs +++ b/CadSearchGui/AssemblyComponentScanner.cs @@ -16,10 +16,15 @@ namespace CadSearchGui; /// 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. +/// +/// 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. /// static class AssemblyComponentScanner { - private static readonly Regex CodiceRegex = new(@"\b\d{8,12}(?:_[A-Za-z]\d{2,4}|[A-Za-z]{0,2})\b", RegexOptions.Compiled); + private static readonly Regex CodiceRegex = new( + @"(? EstraiCodiciReferenziati(string percorsoAsm)