From bb99c4f4c5ccbcd8cafd1a1bef06f62f65d7e6ac Mon Sep 17 00:00:00 2001 From: Davide Grilli Date: Thu, 17 Sep 2026 09:55:06 +0200 Subject: [PATCH] Apply the ModelView# false-positive fix to the production scanner The standalone script already excluded internal saved-view IDs (ModelView#) from the referenced-codes heuristic; the app's own "Trova componenti referenziati" phase used the same regex without the fix. Ports the lookbehind so both stay consistent, per docs/formato-asm.md. Co-Authored-By: Claude Sonnet 5 --- .../AssemblyComponentScannerTests.cs | 14 ++++++++++++++ CadSearchGui/AssemblyComponentScanner.cs | 7 ++++++- 2 files changed, 20 insertions(+), 1 deletion(-) 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)