fix: prevent header corruption when sexpdata compacts schematic to single line
create_component_instance used line-based insertion which placed new symbols BEFORE (kicad_sch ...) header when the file was written as a single line by sexpdata.dumps(). Switch to rfind()-based string insertion which is format-independent. Also remove StreamHandler(sys.stdout) from logging — Python logs now go only to file (~/.kicad-mcp/logs/kicad_interface.log) to avoid polluting MCP stderr with INFO/DEBUG entries shown as [error].
This commit is contained in:
@@ -450,29 +450,17 @@ class DynamicSymbolLoader:
|
|||||||
with open(schematic_path, "r", encoding="utf-8") as f:
|
with open(schematic_path, "r", encoding="utf-8") as f:
|
||||||
content = f.read()
|
content = f.read()
|
||||||
|
|
||||||
# Insert before (sheet_instances or at end before final )
|
# Insert before (sheet_instances using direct string search.
|
||||||
lines = content.split("\n")
|
# This works for both pretty-printed and sexpdata-compacted single-line files.
|
||||||
insert_pos = None
|
insert_marker = "(sheet_instances"
|
||||||
|
insert_at = content.rfind(insert_marker)
|
||||||
for i, line in enumerate(lines):
|
if insert_at == -1:
|
||||||
if "(sheet_instances" in line:
|
|
||||||
insert_pos = i
|
|
||||||
break
|
|
||||||
|
|
||||||
if insert_pos is None:
|
|
||||||
# Insert before the last closing parenthesis
|
|
||||||
for i in range(len(lines) - 1, -1, -1):
|
|
||||||
if lines[i].strip() == ")":
|
|
||||||
insert_pos = i
|
|
||||||
break
|
|
||||||
|
|
||||||
if insert_pos is None:
|
|
||||||
raise ValueError("Could not find insertion point in schematic")
|
raise ValueError("Could not find insertion point in schematic")
|
||||||
|
|
||||||
lines.insert(insert_pos, instance_block)
|
content = content[:insert_at] + instance_block + "\n " + content[insert_at:]
|
||||||
|
|
||||||
with open(schematic_path, "w", encoding="utf-8") as f:
|
with open(schematic_path, "w", encoding="utf-8") as f:
|
||||||
f.write("\n".join(lines))
|
f.write(content)
|
||||||
|
|
||||||
logger.info(
|
logger.info(
|
||||||
f"Added component instance {reference} ({full_lib_id}) at ({x}, {y})"
|
f"Added component instance {reference} ({full_lib_id}) at ({x}, {y})"
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ log_file = os.path.join(log_dir, "kicad_interface.log")
|
|||||||
logging.basicConfig(
|
logging.basicConfig(
|
||||||
level=logging.DEBUG,
|
level=logging.DEBUG,
|
||||||
format="%(asctime)s [%(levelname)s] %(message)s",
|
format="%(asctime)s [%(levelname)s] %(message)s",
|
||||||
handlers=[logging.FileHandler(log_file), logging.StreamHandler(sys.stdout)],
|
handlers=[logging.FileHandler(log_file)],
|
||||||
)
|
)
|
||||||
logger = logging.getLogger("kicad_interface")
|
logger = logging.getLogger("kicad_interface")
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user