From 2da2d2e10a519b3bf9f94190b0046deba16e149a Mon Sep 17 00:00:00 2001 From: David Rice Date: Mon, 13 Apr 2026 07:15:42 +0100 Subject: [PATCH] Changes --- nexarxclaude.py | 53 +++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 47 insertions(+), 6 deletions(-) diff --git a/nexarxclaude.py b/nexarxclaude.py index ea0ab3a..9fbe40f 100644 --- a/nexarxclaude.py +++ b/nexarxclaude.py @@ -494,16 +494,57 @@ def export_to_xlsx(project_name: str, variant_name: str, schematics: list, bom_d if bom_data is not None: match = None - for mfr_name, mpn in pairs: - if mfr_name == "-" and mpn == "-": - continue + designator = node.get("designator") or "" + ref = comp.get("name") or "" + nexar_desc = comp.get("description") or "" + + valid_pairs = [(m, p) for m, p in pairs if m != "-" or p != "-"] + + # --- MPN / manufacturer match --- + for mfr_name, mpn in valid_pairs: match = _find_bom_match(bom_data, mfr_name, mpn) if match: break + + # --- Passive fallback (R / C) --- if not match: - match = _find_passive_bom_match( - bom_data, node.get("designator") or "", params, comp.get("description") or "" - ) + match = _find_passive_bom_match(bom_data, designator, params, nexar_desc) + + # --- Diagnostics when no match --- + if not match: + if not valid_pairs: + print(f" NO MATCH [{designator}] {ref}: no manufacturer data in Nexar") + else: + tried_mpns = [p for _, p in valid_pairs] + # Check if any Nexar MPN exists in BOM ignoring manufacturer + mpn_in_bom = next( + (e for e in bom_data for mpn in tried_mpns if _mpn_match(e["mpn"], mpn)), + None + ) + if mpn_in_bom: + print( + f" NO MATCH [{designator}] {ref}: " + f"MPN '{mpn_in_bom['mpn']}' found in BOM but manufacturer differs " + f"(BOM: '{mpn_in_bom['manufacturer']}' vs Nexar: '{valid_pairs[0][0]}')" + ) + else: + # Check if BOM has the manufacturer but with a different MPN + mfr_in_bom = next( + (e for e in bom_data for mfr, _ in valid_pairs if _prefix_match(e["manufacturer"], mfr)), + None + ) + if mfr_in_bom: + print( + f" NO MATCH [{designator}] {ref}: " + f"manufacturer '{mfr_in_bom['manufacturer']}' found in BOM " + f"but MPN differs (BOM: '{mfr_in_bom['mpn']}' vs Nexar: {tried_mpns})" + ) + else: + print( + f" NO MATCH [{designator}] {ref}: " + f"Nexar MPN(s) {tried_mpns} not found in BOM at all" + ) + if match: row += [match["manufacturer"], match["mpn"], match["unit_cost"]] else: