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

North Wall Assembly

v1 Gemini approved

Create the north wall SIP assembly, 3000x100x2310mm. Route a 150mm circular vent cutout at X=1500mm, Z=2100mm. Provide internal face mount for the roof ledger.

Dependencies

west_wall_assembly.back_spline

Interfaces Provided

ledger_mount (face) side_spline_right (spline)
Agent initialized (status: waiting_for_dependencies, action: check_dependencies)
Provider: google | Profile: quality
Received interface west_wall_assembly.ledger_mount: %{name: "ledger_mount", type: "face", value: %{}, agent_id: "west_wall_assembly"}
Received interface west_wall_assembly.back_spline: %{name: "back_spline", type: "spline", value: %{}, agent_id: "west_wall_assembly"}
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 (725 tokens)
north_wall_assembly_v1.py · 69 lines
import FreeCAD
import Part
import math
from FreeCAD import Vector

# === PARAMETERS ===
# All dimensions in mm
LENGTH = 3000.0
WIDTH = 100.0
HEIGHT = 2310.0

# Vent cutout
VENT_DIAMETER = 150.0
VENT_RADIUS = VENT_DIAMETER / 2.0
VENT_X = 1500.0
VENT_Z = 2100.0

# Spline groove (for SIP corner/edge joints)
SPLINE_W = 40.0  # Width of the spline pocket
SPLINE_D = 20.0  # Depth of the spline pocket

# === DOCUMENT ===
doc = FreeCAD.ActiveDocument or FreeCAD.newDocument("North_Wall_SIP")

# === BUILD GEOMETRY ===
# 1. Base SIP panel (Starting at origin)
panel = Part.makeBox(LENGTH, WIDTH, HEIGHT)

# 2. Vent cutout (Cylinder along Y-axis, extending past both faces for a clean cut)
vent_hole = Part.makeCylinder(
    VENT_RADIUS, 
    WIDTH + 20.0, 
    Vector(VENT_X, -10.0, VENT_Z), 
    Vector(0, 1, 0)
)

# 3. Left spline groove (consumes west_wall_assembly.back_spline)
# Located at X=0, centered on the Y-axis (thickness)
left_groove = Part.makeBox(
    SPLINE_D + 10.0, 
    SPLINE_W, 
    HEIGHT + 20.0, 
    Vector(-10.0, (WIDTH - SPLINE_W) / 2.0, -10.0)
)

# 4. Right spline groove (provides side_spline_right)
# Located at X=LENGTH, centered on the Y-axis (thickness)
right_groove = Part.makeBox(
    SPLINE_D + 10.0, 
    SPLINE_W, 
    HEIGHT + 20.0, 
    Vector(LENGTH - SPLINE_D, (WIDTH - SPLINE_W) / 2.0, -10.0)
)

# Apply Boolean cuts sequentially to ensure robust CSG evaluation
result = panel.cut(vent_hole)
result = result.cut(left_groove)
result = result.cut(right_groove)

# === ADD TO DOCUMENT ===
# Named exactly "Body" to ensure the export system processes it correctly
feature = doc.addObject("Part::Feature", "Body")
feature.Shape = result

# Final recompute to update the document tree
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