Two more real placement forms found by comparing against Creo BOM reports:
- A sub-assembly can be referenced only through a "family_name\0<code>\0"
metadata field instead of a textual "Componente ID" placement or the
doubled-NUL pattern (case 9284202452 inside 9284208188_D400.asm, which
contains 9284202452_C01/_C02/_C03 - previously dropped entirely, along
with its three children).
- A bare numeric code immediately followed by a family-table bracket
(<code><GENERIC>, e.g. bearing instances like 2510060303<CUSCI_ACBB7>)
is a real reference to that instance, even though only the generic file
is indexed on disk. Previously the instance code silently vanished before
ever reaching the DB lookup; now it survives placement filtering and ends
up in the "scartati" (discarded) list instead, so it's traceable rather
than invisible.
docs/formato-asm.md documents both, bringing the total to four recognized
placement forms.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
The bare root code of an assembly (e.g. 9284208188, without a _D... suffix)
is always referenced inside its own suffixed sub-assemblies as a genuine
placement pointing back to the general assembly. Following it during
recursive resolution pulled in the entire product tree instead of just the
requested sub-assembly (598 components collected instead of ~65 on
9284208188_D600). Fixed by seeding the visited-codes set with each starting
assembly's root code, in both scripts/ExtractCreoStrings.cs and the two BFS
call sites in Form1.cs (RisolviAlberoComponenti, AssiemeCompleto).
Also closes two recall gaps found by comparing against a real Creo BOM
report: some real placements only show up as the code repeated twice
separated by a NUL byte rather than the usual "Componente ID N (...)" text,
and family-table bearing codes (CUSCI_...) use the same <...> bracket
convention as UNI hardware but weren't recognized.
docs/formato-asm.md documents all three findings.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- Batch the DB lookup per file instead of per code in scripts/ExtractCreoStrings.cs:
files_ultima_versione is an unmaterialized view, so each query rescanned the whole
files table (~230ms) - batching cuts a multi-minute BFS to seconds.
- Widen the code regex to accept a revision letter and a "_..." suffix together
(e.g. "9284200366A_C01"), and purely numeric "_NNNN" suffixes (e.g. dimensional
variants like "2702220182_8188"), not just letter+digits.
- Require bare digit-only candidates to also appear inside a real
"Componente ID N (...)"/"Component id N (...)" placement, filtering out
incidental references to a containing assembly's own code.
- scripts/ExtractCreoStrings.cs now reports only the direct references of the given
.asm (one level, matching Creo's own tree for that file) instead of recursing into
sub-assemblies.
- Port the regex and placement-check refinements to the production
AssemblyComponentScanner.cs used by the app's "Trova componenti referenziati" and
"Verifica completezza" phases.
- Document the new false-positive categories (parent/container self-reference,
suppressed/removed components with residual placement, placement missing
suffix/bracket detail) in docs/formato-asm.md, generalized beyond the specific
assemblies used to find them.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
These appear in the .asm binary as a family-table instance name (e.g.
"R6--_-_U6592<UNI6592>"), not a separate file on disk - only the generic
"uni6592.prt" is actually indexed. Extract just the "<UNI...>" content
instead of the full instance name, in both the standalone script and the
production scanner, so standard hardware stops being silently dropped as
"not found in index".
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
The standalone script already excluded internal saved-view IDs
(ModelView#<numero>) 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 <noreply@anthropic.com>
Restructure Form1 into a sequential wizard (database -> import -> raw ->
recursive component resolution -> completeness/STEP report), fix
case-sensitivity bugs in codice/tipo_file lookups and a word-boundary gap
in the assembly scanner that missed _D100-style sub-assembly references,
and treat the distinta's general assembly as an ordinary CSV row (derived
from the DBP_<codice>_<timestamp> filename) instead of special-casing it
throughout. Also adds CadSearchGui.Tests (xUnit) covering the scanner,
filename parsing, and the case-insensitive DB lookup behavior.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Assemblies reference other assemblies and parts internally; a flat
single-level copy into raw/ left Creo unable to load models ("Dati di
input non completi"). AssemblyComponentScanner heuristically extracts
component codes embedded as readable strings inside the otherwise
binary .asm files; each candidate is validated against the index (which
filters out scan noise), copied into raw/, and if it's itself an
assembly, queued for the same treatment until the whole tree resolves
to PRT leaves. PrtMancantiForm reports what was found and copied.
Also ignore Creo Distributed Batch job files (*.dxc).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>