Add layer option to move_component to support flipping components

Adds an optional `layer` parameter (e.g., 'F.Cu', 'B.Cu') to the
move_component tool. When specified, the component is flipped to
the target layer if it's not already on it. The response now also
includes the component's layer after the move.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Mattia Fiumara
2026-03-25 18:09:24 +01:00
parent c48fa64e0f
commit dd388470be
2 changed files with 17 additions and 2 deletions

View File

@@ -176,6 +176,7 @@ class ComponentCommands:
reference = params.get("reference") reference = params.get("reference")
position = params.get("position") position = params.get("position")
rotation = params.get("rotation") rotation = params.get("rotation")
layer = params.get("layer")
if not reference or not position: if not reference or not position:
return { return {
@@ -204,6 +205,14 @@ class ComponentCommands:
angle = pcbnew.EDA_ANGLE(rotation, pcbnew.DEGREES_T) angle = pcbnew.EDA_ANGLE(rotation, pcbnew.DEGREES_T)
module.SetOrientation(angle) module.SetOrientation(angle)
# Flip to target layer if specified
if layer:
current_layer = self.board.GetLayerName(module.GetLayer())
if layer == "B.Cu" and current_layer != "B.Cu":
module.Flip(module.GetPosition(), False)
elif layer == "F.Cu" and current_layer != "F.Cu":
module.Flip(module.GetPosition(), False)
return { return {
"success": True, "success": True,
"message": f"Moved component: {reference}", "message": f"Moved component: {reference}",
@@ -214,7 +223,8 @@ class ComponentCommands:
"y": position["y"], "y": position["y"],
"unit": position["unit"] "unit": position["unit"]
}, },
"rotation": rotation if rotation is not None else module.GetOrientation().AsDegrees() "rotation": rotation if rotation is not None else module.GetOrientation().AsDegrees(),
"layer": self.board.GetLayerName(module.GetLayer())
} }
} }

View File

@@ -117,8 +117,12 @@ export function registerComponentTools(
.number() .number()
.optional() .optional()
.describe("Optional new rotation in degrees"), .describe("Optional new rotation in degrees"),
layer: z
.string()
.optional()
.describe("Optional target layer (e.g., 'F.Cu', 'B.Cu') - flips component if needed"),
}, },
async ({ reference, position, rotation }) => { async ({ reference, position, rotation, layer }) => {
logger.debug( logger.debug(
`Moving component: ${reference} to ${position.x},${position.y} ${position.unit}`, `Moving component: ${reference} to ${position.x},${position.y} ${position.unit}`,
); );
@@ -126,6 +130,7 @@ export function registerComponentTools(
reference, reference,
position, position,
rotation, rotation,
layer,
}); });
return { return {