fix(copper-pour): add outline parameter and fallback to board outline

Two issues fixed:
1. TypeScript schema was missing the outline parameter entirely,
   so MCP clients couldn't send pour boundary points.
2. Python code read "points" key but schema defined "outline" key.

Now accepts "outline" (with "points" as fallback for backwards
compatibility). When no outline is provided, automatically uses
the board edge bounding box as the pour boundary.
This commit is contained in:
Roman PASSLER
2026-03-01 18:40:24 +01:00
parent 246050001a
commit ec1939bef4
2 changed files with 27 additions and 6 deletions

View File

@@ -1058,16 +1058,31 @@ class RoutingCommands:
net = params.get("net") net = params.get("net")
clearance = params.get("clearance") clearance = params.get("clearance")
min_width = params.get("minWidth", 0.2) min_width = params.get("minWidth", 0.2)
points = params.get("points", []) points = params.get("outline", params.get("points", []))
priority = params.get("priority", 0) priority = params.get("priority", 0)
fill_type = params.get("fillType", "solid") # solid or hatched fill_type = params.get("fillType", "solid") # solid or hatched
# If no outline provided, use board outline
if not points or len(points) < 3: if not points or len(points) < 3:
return { board_box = self.board.GetBoardEdgesBoundingBox()
"success": False, if board_box.GetWidth() > 0 and board_box.GetHeight() > 0:
"message": "Missing points", scale = 1000000 # nm to mm
"errorDetails": "At least 3 points are required for copper pour outline", x1 = board_box.GetX() / scale
} y1 = board_box.GetY() / scale
x2 = (board_box.GetX() + board_box.GetWidth()) / scale
y2 = (board_box.GetY() + board_box.GetHeight()) / scale
points = [
{"x": x1, "y": y1},
{"x": x2, "y": y1},
{"x": x2, "y": y2},
{"x": x1, "y": y2},
]
else:
return {
"success": False,
"message": "Missing outline",
"errorDetails": "Provide an outline array or add a board outline first",
}
# Get layer ID # Get layer ID
layer_id = self.board.GetLayerID(layer) layer_id = self.board.GetLayerID(layer)

View File

@@ -105,6 +105,12 @@ export function registerRoutingTools(
layer: z.string().describe("PCB layer"), layer: z.string().describe("PCB layer"),
net: z.string().describe("Net name"), net: z.string().describe("Net name"),
clearance: z.number().optional().describe("Clearance in mm"), clearance: z.number().optional().describe("Clearance in mm"),
outline: z
.array(z.object({ x: z.number(), y: z.number() }))
.optional()
.describe(
"Array of {x, y} points defining the pour boundary. If omitted, the board outline is used.",
),
}, },
async (args: any) => { async (args: any) => {
const result = await callKicadScript("add_copper_pour", args); const result = await callKicadScript("add_copper_pour", args);