diff --git a/package-lock.json b/package-lock.json index 3344ab8..f05631b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -848,9 +848,9 @@ } }, "node_modules/brace-expansion": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", - "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz", + "integrity": "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==", "dev": true, "license": "MIT", "dependencies": { diff --git a/python/commands/component_schematic.py b/python/commands/component_schematic.py index 6236906..0c49a7b 100644 --- a/python/commands/component_schematic.py +++ b/python/commands/component_schematic.py @@ -255,8 +255,9 @@ class ComponentManager: # Generate new UUID new_symbol.uuid.value = str(uuid.uuid4()) - # Append to schematic - schematic.symbol.append(new_symbol) + # NOTE: clone() already inserts the raw element into the schematic tree. + # Calling schematic.symbol.append() again causes NamedCollection to detect + # the reference as "taken" and rename it to "R1_" (trailing underscore). logger.info(f"Successfully added component {reference} to schematic") return new_symbol diff --git a/python/commands/pin_locator.py b/python/commands/pin_locator.py index bfddca1..d7ede25 100644 --- a/python/commands/pin_locator.py +++ b/python/commands/pin_locator.py @@ -180,7 +180,7 @@ class PinLocator: self._schematic_cache[sch_key] = Schematic(sch_key) sch = self._schematic_cache[sch_key] for symbol in sch.symbol: - if symbol.property.Reference.value == symbol_reference: + if symbol.property.Reference.value.rstrip("_") == symbol_reference: return symbol.lib_id.value if hasattr(symbol, "lib_id") else None except Exception: pass @@ -203,7 +203,7 @@ class PinLocator: target_symbol = None for symbol in sch.symbol: - if symbol.property.Reference.value == symbol_reference: + if symbol.property.Reference.value.rstrip("_") == symbol_reference: target_symbol = symbol break @@ -258,10 +258,11 @@ class PinLocator: self._schematic_cache[sch_key] = Schematic(sch_key) sch = self._schematic_cache[sch_key] - # Find the symbol instance + # Find the symbol instance. + # skip may write references with a trailing "_" (e.g. "R1_") — strip it when comparing. target_symbol = None for symbol in sch.symbol: - ref = symbol.property.Reference.value + ref = symbol.property.Reference.value.rstrip("_") if ref == symbol_reference: target_symbol = symbol break @@ -313,9 +314,11 @@ class PinLocator: pin_data = pins[pin_number] - # Get pin position relative to symbol origin + # Get pin position relative to symbol origin. + # lib_symbols uses library y-up convention; schematic uses y-down. + # Negate y here before rotation, matching KiCad's transform order. pin_rel_x = pin_data["x"] - pin_rel_y = pin_data["y"] + pin_rel_y = -pin_data["y"] logger.debug(f"Pin {pin_number} relative position: ({pin_rel_x}, {pin_rel_y})") @@ -361,7 +364,7 @@ class PinLocator: # Find symbol target_symbol = None for symbol in sch.symbol: - if symbol.property.Reference.value == symbol_reference: + if symbol.property.Reference.value.rstrip("_") == symbol_reference: target_symbol = symbol break @@ -412,9 +415,7 @@ if __name__ == "__main__": # Create test schematic with components (cross-platform temp directory) test_path = Path(tempfile.gettempdir()) / "test_pin_locator.kicad_sch" - template_path = ( - Path(__file__).parent.parent / "templates" / "template_with_symbols_expanded.kicad_sch" - ) + template_path = Path(__file__).parent.parent / "templates" / "template_with_symbols.kicad_sch" shutil.copy(template_path, test_path) print(f"\nāœ“ Created test schematic: {test_path}")