← Test Lab — Gemini — 2026-05-15T12:44

Base Plate South Left

v1 Gemini approved

Create a timber base plate, 1900x100x45mm, C24 structural pine. It acts as an anchor to the concrete slab and provides an upward 45mm timber spline interface to slot into the routed channel of the SIP columns above.

Interfaces Provided

base_spline (spline)
Agent initialized (status: waiting_for_dependencies, action: check_dependencies)
Provider: google | Profile: quality
All dependencies resolved, starting generation
Generating v1
Calling Gemini API for code generation (gemini-3.1-pro-preview)...
Generation token budget: max_tokens=12288, thinking_budget=0 (retry_count=0)
Received response (729 tokens)
base_plate_south_left_v1.py · 60 lines
import FreeCAD
import Part
import math
from FreeCAD import Vector, Placement, Rotation

# Force-load PartDesign module
FreeCAD.loadModule("PartDesign")
import PartDesign

# === PARAMETRIC CONSTANTS ===
LENGTH = 1900.0      # mm
WIDTH = 100.0        # mm
HEIGHT = 45.0        # mm

ANCHOR_HOLE_DIA = 14.0       # mm (Clearance for M12 anchor bolts)
ANCHOR_CB_DIA = 30.0         # mm (Counterbore for heavy washers)
ANCHOR_CB_DEPTH = 15.0       # mm (Recess depth so SIP slot sits flush over bolt heads)

# Distribute 4 anchor points evenly along the 1900mm length
ANCHOR_POSITIONS = [200.0, 700.0, 1200.0, 1700.0]

# === DOCUMENT & BODY ===
doc = FreeCAD.ActiveDocument or FreeCAD.newDocument("TimberBasePlate")
body = doc.addObject("PartDesign::Body", "Body")

# === FEATURES ===

# 1. Main Base Plate / Spline Solid
base_box = doc.addObject("PartDesign::AdditiveBox", "BaseSpline")
base_box.Length = LENGTH
base_box.Width = WIDTH
base_box.Height = HEIGHT
# Position bottom-left-front corner at origin
base_box.Placement = Placement(Vector(0, 0, 0), Rotation())
body.addObject(base_box)
doc.recompute()

# 2. Anchor Bolt Counterbores and Clearance Holes
for i, x_pos in enumerate(ANCHOR_POSITIONS):
    # Through clearance hole
    hole = doc.addObject("PartDesign::SubtractiveCylinder", f"ClearanceHole_{i}")
    hole.Radius = ANCHOR_HOLE_DIA / 2.0
    hole.Height = HEIGHT + 2.0  # +2mm to ensure clean cut through bottom
    hole.Placement = Placement(Vector(x_pos, WIDTH / 2.0, -1.0), Rotation())
    body.addObject(hole)
    doc.recompute()

    # Counterbore from the top face
    cb = doc.addObject("PartDesign::SubtractiveCylinder", f"Counterbore_{i}")
    cb.Radius = ANCHOR_CB_DIA / 2.0
    cb.Height = ANCHOR_CB_DEPTH + 1.0  # +1mm to ensure clean cut through top surface
    # Start cylinder at the base of the counterbore depth
    cb.Placement = Placement(Vector(x_pos, WIDTH / 2.0, HEIGHT - ANCHOR_CB_DEPTH), Rotation())
    body.addObject(cb)
    doc.recompute()

# === FINAL ===
doc.recompute()
if FreeCAD.GuiUp:
    FreeCAD.Gui.ActiveDocument.ActiveView.fitAll()
Executing in FreeCAD...
StepAnalyzer failed: FreeCAD could not read STEP file: FreeCAD exception thrown (File to load not existing or not readable) — skipping
FreeCAD execution succeeded
Exported: model.stl
Generation succeeded and component was auto-approved (v1)
Provider updated to google / balanced
Provider updated to google / balanced
Provider updated to google / balanced
Provider updated to google / balanced
Provider updated to google / balanced
Provider updated to google / balanced
Provider updated to google / balanced
Provider updated to google / balanced
v0.0.542