From a6c417569badeadec687384688a11cd6dc32f8f6 Mon Sep 17 00:00:00 2001 From: David Rice Date: Wed, 1 Apr 2026 16:25:54 +0100 Subject: [PATCH] Updates --- BOM/Elemaster Details NEXIO.xlsx | Bin 0 -> 105792 bytes nexarxclaude.py | 376 +++++++++++++++++++++++++++---- 2 files changed, 333 insertions(+), 43 deletions(-) create mode 100644 BOM/Elemaster Details NEXIO.xlsx diff --git a/BOM/Elemaster Details NEXIO.xlsx b/BOM/Elemaster Details NEXIO.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..bcfcfe6f43e99f95b4dc848c4cc555b07f6e5705 GIT binary patch literal 105792 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÷vPkX3k;$P-ABs+r(gvube9s{ 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

YTp7 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 literal 0 HcmV?d00001 diff --git a/nexarxclaude.py b/nexarxclaude.py index 1f8b004..6f1828b 100644 --- a/nexarxclaude.py +++ b/nexarxclaude.py @@ -1,8 +1,9 @@ """ -List all projects in Altium 365 workspaces via the Nexar GraphQL API. +List all projects in Altium 365 workspaces via the Nexar GraphQL API, +then export schematic sheet components to an xlsx file. Requirements: - pip install requests + pip install requests openpyxl Environment variables: NEXAR_CLIENT_ID - Your Nexar application client ID @@ -21,6 +22,7 @@ import sys import webbrowser from urllib.parse import parse_qs, urlparse +import openpyxl import requests TOKEN_URL = "https://identity.nexar.com/connect/token" @@ -61,6 +63,80 @@ query GetVariants($projectId: ID!) { } """ +QUERY_SCHEMATICS = """ +query GetSchematics($projectId: ID!) { + desProjectById(id: $projectId) { + design { + workInProgress { + variants { + name + schematics { + documentName + documentId + } + } + } + } + } +} +""" + +QUERY_SHEET_COMPONENTS = """ +query GetSheetComponents($projectId: ID!, $cursor: String) { + desProjectById(id: $projectId) { + design { + workInProgress { + variants { + name + schematics { + documentId + designItems(first: 100, after: $cursor) { + pageInfo { + hasNextPage + endCursor + } + nodes { + designator + component { + name + description + manufacturerParts { + partNumber + companyName + } + } + } + } + } + } + } + } + } +} +""" + +QUERY_FITTED_DESIGNATORS = """ +query GetFittedDesignators($projectId: ID!) { + desProjectById(id: $projectId) { + design { + workInProgress { + variants { + name + bom { + bomItems { + bomItemInstances { + designator + isFitted + } + } + } + } + } + } + } +} +""" + _CALLBACK_HTML = """ Nexar Login @@ -70,10 +146,9 @@ _CALLBACK_HTML = """ def _make_callback_handler(code_bucket): - """Return an HTTPRequestHandler that captures the OAuth2 auth code.""" class _Handler(http.server.BaseHTTPRequestHandler): def log_message(self, *_): - pass # silence request logs + pass def do_GET(self): parsed = urlparse(self.path) @@ -92,15 +167,12 @@ def _make_callback_handler(code_bucket): def get_token(client_id: str, client_secret: str) -> str: - """Obtain a Nexar access token via Authorization Code + PKCE flow.""" - # Generate PKCE verifier and challenge code_verifier = base64.urlsafe_b64encode(os.urandom(40)).decode() code_verifier = re.sub(r"[^a-zA-Z0-9]+", "", code_verifier) digest = hashlib.sha256(code_verifier.encode()).digest() code_challenge = base64.urlsafe_b64encode(digest).decode().rstrip("=") - # Build authorization URL auth_params = ( f"?response_type=code" f"&client_id={client_id}" @@ -111,7 +183,6 @@ def get_token(client_id: str, client_secret: str) -> str: ) auth_url = AUTH_URL + auth_params - # Start local callback server and open browser code_bucket = [] server = http.server.HTTPServer(("localhost", 3000), _make_callback_handler(code_bucket)) @@ -127,7 +198,6 @@ def get_token(client_id: str, client_secret: str) -> str: print("Error: no authorization code received.", file=sys.stderr) sys.exit(1) - # Exchange auth code for token response = requests.post( TOKEN_URL, data={ @@ -164,33 +234,161 @@ def graphql(token: str, url: str, query: str, variables: dict = None) -> dict: return result["data"] +def prompt_choice(prompt: str, count: int) -> int: + while True: + try: + choice = int(input(prompt)) + if 1 <= choice <= count: + return choice + print(f" Please enter a number between 1 and {count}.") + except ValueError: + print(" Please enter a valid number.") + + +def normalise(s: str) -> str: + """Lowercase and strip all non-alphanumeric characters for fuzzy matching.""" + return re.sub(r"[^a-z0-9]", "", s.lower()) + + +def _prefix_match(a: str, b: str) -> bool: + """True if normalised strings match or one is a prefix of the other.""" + na, nb = normalise(a), normalise(b) + return bool(na and nb and (na == nb or na.startswith(nb) or nb.startswith(na))) + + +def load_bom_data(bom_path: str) -> list | None: + """Load BOM xlsx and return a list of entry dicts. + Returns None if no 'bom' tab is found.""" + wb = openpyxl.load_workbook(bom_path, data_only=True) + + bom_sheet = next((wb[n] for n in wb.sheetnames if n.lower() == "bom"), None) + if bom_sheet is None: + return None + + header_row = next(bom_sheet.iter_rows(min_row=1, max_row=1, values_only=True)) + headers = {str(v).lower().strip(): i for i, v in enumerate(header_row) if v is not None} + + def find_col(*candidates): + for c in candidates: + if c in headers: + return headers[c] + return None + + mfr_col = find_col("manufacturer", "mfr", "manufacturer name") + mpn_col = find_col("mpn", "manufacturer part number", "manufacturer part no", "part number") + cost_col = find_col("unit cost", "unit price", "cost", "price") + + entries = [] + for row in bom_sheet.iter_rows(min_row=2, values_only=True): + mfr = str(row[mfr_col]).strip() if mfr_col is not None and len(row) > mfr_col and row[mfr_col] is not None else "" + mpn = str(row[mpn_col]).strip() if mpn_col is not None and len(row) > mpn_col and row[mpn_col] is not None else "" + if not mfr and not mpn: + continue + try: + cost = float(row[cost_col]) if cost_col is not None and len(row) > cost_col and row[cost_col] is not None else 0.0 + except (ValueError, TypeError): + cost = 0.0 + entries.append({"manufacturer": mfr, "mpn": mpn, "unit_cost": cost}) + + return entries + + +def _find_bom_match(bom_data: list, mfr_name: str, mpn: str) -> dict | None: + """Return the highest unit cost BOM entry that prefix-matches both manufacturer and MPN.""" + candidates = [ + e for e in bom_data + if _prefix_match(e["manufacturer"], mfr_name) and _prefix_match(e["mpn"], mpn) + ] + return max(candidates, key=lambda e: e["unit_cost"]) if candidates else None + + +MAX_MFR_PARTS = 5 + +def export_to_xlsx(project_name: str, variant_name: str, schematics: list, bom_data: dict | None) -> str: + wb = openpyxl.Workbook() + wb.remove(wb.active) + + # Build header row + mfr_headers = [] + for n in range(1, MAX_MFR_PARTS + 1): + mfr_headers += [f"Manufacturer {n}", f"Manufacturer Part Number {n}"] + headers = ["Designator", "Reference", "Description"] + mfr_headers + if bom_data is not None: + headers += ["Matched Manufacturer", "Matched MPN", "Unit Cost"] + + col_letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + + for sheet in schematics: + sheet_name = sheet["documentName"] or sheet["documentId"] + safe_name = re.sub(r"[\\/*?:\[\]]", "_", sheet_name)[:31] + ws = wb.create_sheet(title=safe_name) + ws.append(headers) + + for i, h in enumerate(headers): + col = col_letters[i] if i < 26 else col_letters[i // 26 - 1] + col_letters[i % 26] + ws.column_dimensions[col].width = 28 if "Manufacturer" in h or "Part" in h else 16 if i == 0 else 36 + + nodes = (sheet.get("designItems") or {}).get("nodes") or [] + for node in sorted(nodes, key=lambda n: n.get("designator") or ""): + comp = node.get("component") or {} + mfr_parts = comp.get("manufacturerParts") or [] + + # Collect up to MAX_MFR_PARTS manufacturer/MPN pairs + pairs = [] + for mp in mfr_parts[:MAX_MFR_PARTS]: + mfr_name = mp.get("companyName") or "-" + mpn = mp.get("partNumber") or "-" + pairs.append((mfr_name, mpn)) + # Pad with '-' if fewer than MAX_MFR_PARTS + while len(pairs) < MAX_MFR_PARTS: + pairs.append(("-", "-")) + + flat_pairs = [v for pair in pairs for v in pair] + row = [node.get("designator") or "", comp.get("name") or "", comp.get("description") or ""] + flat_pairs + + if bom_data is not None: + match = None + for mfr_name, mpn in pairs: + if mfr_name == "-" and mpn == "-": + continue + match = _find_bom_match(bom_data, mfr_name, mpn) + if match: + break + if match: + row += [match["manufacturer"], match["mpn"], match["unit_cost"]] + else: + row += ["-", "-", "-"] + + ws.append(row) + + output_dir = os.path.join(os.path.dirname(__file__), "output") + safe_project = re.sub(r'[\\/:*?"<>|]', "_", project_name).strip() + filename = os.path.join(output_dir, f"{safe_project} - {variant_name}.xlsx") + wb.save(filename) + return filename + + def main(): client_id = os.environ.get("NEXAR_CLIENT_ID") client_secret = os.environ.get("NEXAR_CLIENT_SECRET") if not client_id or not client_secret: - print( - "Error: NEXAR_CLIENT_ID and NEXAR_CLIENT_SECRET must be set.", - file=sys.stderr, - ) + print("Error: NEXAR_CLIENT_ID and NEXAR_CLIENT_SECRET must be set.", file=sys.stderr) sys.exit(1) token = get_token(client_id, client_secret) print("Authenticated.\n") + # --- Project selection --- print(f"Fetching projects from workspace '{WORKSPACE_NAME}'...") data = graphql(token, NEXAR_API_URL, QUERY_WORKSPACES_AND_PROJECTS, {"workspace": WORKSPACE_NAME}) workspaces = data["desWorkspaces"] if not workspaces: - print( - "No workspaces found. Ensure the 'design' scope is enabled on your " - "Nexar application and you are a member of an Altium 365 workspace." - ) + print("No workspaces found.") return projects = workspaces[0].get("projects") or [] - if not projects: print("No projects found in this workspace.") return @@ -198,28 +396,18 @@ def main(): print(f"\nProjects in '{WORKSPACE_NAME}':") print("-" * 60) for i, project in enumerate(projects, start=1): - description = project.get("description") or "" - desc_str = f" — {description}" if description else "" - print(f" [{i}] {project['name']}{desc_str}") + desc = project.get("description") or "" + print(f" [{i}] {project['name']}" + (f" — {desc}" if desc else "")) print() - while True: - try: - choice = int(input(f"Select a project (1-{len(projects)}): ")) - if 1 <= choice <= len(projects): - break - print(f" Please enter a number between 1 and {len(projects)}.") - except ValueError: - print(" Please enter a valid number.") - + choice = prompt_choice(f"Select a project (1-{len(projects)}): ", len(projects)) selected_project = projects[choice - 1] print(f"\nSelected project: {selected_project['name']}") - # Fetch variants for the selected project + # --- Variant selection --- print("\nFetching variants...") data = graphql(token, NEXAR_API_URL, QUERY_VARIANTS, {"projectId": selected_project["id"]}) - wip = data["desProjectById"]["design"]["workInProgress"] - variants = wip.get("variants") or [] + variants = data["desProjectById"]["design"]["workInProgress"].get("variants") or [] if not variants: print("No variants found for this project.") @@ -231,18 +419,120 @@ def main(): print(f" [{i}] {variant['name']}") print() - while True: - try: - choice = int(input(f"Select a variant (1-{len(variants)}): ")) - if 1 <= choice <= len(variants): - break - print(f" Please enter a number between 1 and {len(variants)}.") - except ValueError: - print(" Please enter a valid number.") - + choice = prompt_choice(f"Select a variant (1-{len(variants)}): ", len(variants)) selected_variant = variants[choice - 1] print(f"\nSelected variant: {selected_variant['name']}") + # --- BOM file selection --- + bom_dir = os.path.join(os.path.dirname(__file__), "BOM") + bom_files = sorted(f for f in os.listdir(bom_dir) if f.lower().endswith(".xlsx")) + + if not bom_files: + print(f"\nNo xlsx files found in {bom_dir}.") + return + + print(f"\nBOM files available:") + print("-" * 60) + for i, name in enumerate(bom_files, start=1): + print(f" [{i}] {name}") + + print() + choice = prompt_choice(f"Select a BOM file (1-{len(bom_files)}): ", len(bom_files)) + selected_bom = os.path.join(bom_dir, bom_files[choice - 1]) + print(f"\nSelected BOM: {bom_files[choice - 1]}") + + # --- Fetch schematic sheet list --- + print("\nFetching schematic sheets...") + data = graphql(token, NEXAR_API_URL, QUERY_SCHEMATICS, {"projectId": selected_project["id"]}) + all_variants = data["desProjectById"]["design"]["workInProgress"].get("variants") or [] + + variant_data = next((v for v in all_variants if v["name"] == selected_variant["name"]), None) + if not variant_data: + print("Could not find schematic data for the selected variant.") + return + + sheet_list = variant_data.get("schematics") or [] + if not sheet_list: + print("No schematic sheets found.") + return + + print(f"Found {len(sheet_list)} schematic sheet(s). Fetching components...") + + # Build a map of documentId -> {documentName, nodes[]} + sheet_map = {s["documentId"]: {"documentName": s["documentName"], "nodes": []} for s in sheet_list} + + # Paginate all components across all sheets + cursor = None + while True: + variables = {"projectId": selected_project["id"]} + if cursor: + variables["cursor"] = cursor + + data = graphql(token, NEXAR_API_URL, QUERY_SHEET_COMPONENTS, variables) + fetched_variants = data["desProjectById"]["design"]["workInProgress"].get("variants") or [] + fetched_variant = next((v for v in fetched_variants if v["name"] == selected_variant["name"]), None) + if not fetched_variant: + break + + has_next = False + next_cursor = None + for sheet in fetched_variant.get("schematics") or []: + doc_id = sheet["documentId"] + if doc_id not in sheet_map: + continue + design_items = sheet.get("designItems") or {} + sheet_map[doc_id]["nodes"].extend(design_items.get("nodes") or []) + page_info = design_items.get("pageInfo") or {} + if page_info.get("hasNextPage"): + has_next = True + next_cursor = page_info.get("endCursor") + + if not has_next: + break + cursor = next_cursor + + # Rebuild schematics list in original order for export + schematics = [ + {"documentName": sheet_map[s["documentId"]]["documentName"], + "documentId": s["documentId"], + "designItems": {"nodes": sheet_map[s["documentId"]]["nodes"]}} + for s in sheet_list + ] + + # --- Fetch fitted designators for selected variant --- + print("Fetching fitted components for variant...") + data = graphql(token, NEXAR_API_URL, QUERY_FITTED_DESIGNATORS, {"projectId": selected_project["id"]}) + bom_variants = data["desProjectById"]["design"]["workInProgress"].get("variants") or [] + bom_variant = next((v for v in bom_variants if v["name"] == selected_variant["name"]), None) + + fitted_designators = set() + if bom_variant: + for bom_item in (bom_variant.get("bom") or {}).get("bomItems") or []: + for instance in bom_item.get("bomItemInstances") or []: + if instance.get("isFitted"): + fitted_designators.add(instance["designator"]) + + # Filter each sheet's nodes to fitted components only + for s in schematics: + s["designItems"]["nodes"] = [ + n for n in s["designItems"]["nodes"] + if n.get("designator") in fitted_designators + ] + + total_components = sum(len(s["designItems"]["nodes"]) for s in schematics) + print(f"Total: {total_components} fitted component(s) across {len(schematics)} sheet(s).") + + # --- Load BOM cross-reference data --- + bom_data = load_bom_data(selected_bom) + if bom_data is None: + print("No 'bom' tab found in the selected BOM file — exporting without BOM data.") + else: + print(f"Loaded {len(bom_data)} entries from BOM.") + + # --- Export --- + filename = export_to_xlsx(selected_project["name"], selected_variant["name"], schematics, bom_data) + print(f"\nExported to: {filename}") + if __name__ == "__main__": - main() \ No newline at end of file + main()