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

West Wall Assembly

v1 Gemini approved

Create the full west wall SIP assembly, 100x1800x2310mm. Cut a 45mm deep routed channel on the bottom for the base plate. Route a 1000x250mm rectangular window cutout centered at Z=1600mm. Provide internal face mount for the roof ledger.

Dependencies

base_plate_west.base_spline

Interfaces Provided

ledger_mount (face) back_spline (spline)
◉
Agent initialized (status: waiting_for_dependencies, action: check_dependencies)
◉
Provider: google | Profile: quality
◇
Received interface base_plate_west.base_spline: %{name: "base_spline", type: "spline", value: %{}, agent_id: "base_plate_west"}
◉
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 (982 tokens)
◆
west_wall_assembly_v1.py · 81 lines
import FreeCAD
import Part
import Sketcher
import math
from FreeCAD import Vector, Placement, Rotation

# Force load PartDesign module before usage to prevent errors
FreeCAD.loadModule("PartDesign")
import PartDesign

# === PARAMETRIC CONSTANTS ===
LENGTH = 1800.0         # X dimension (mm)
THICKNESS = 100.0       # Y dimension (mm)
HEIGHT = 2310.0         # Z dimension (mm)

OSB_THICKNESS = 15.0    # Standard SIP skin thickness
CORE_THICKNESS = THICKNESS - (2 * OSB_THICKNESS) # 70mm EPS core

BASE_CHANNEL_DEPTH = 45.0

WINDOW_W = 1000.0
WINDOW_H = 250.0
WINDOW_Z = 1600.0       # Center elevation of the window
# === END PARAMETRIC CONSTANTS ===

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

# === FEATURES ===

# 1. Base SIP Panel
panel = doc.addObject("PartDesign::AdditiveBox", "SIP_Panel")
panel.Length = LENGTH
panel.Width = THICKNESS
panel.Height = HEIGHT
panel.Placement = Placement(Vector(0, 0, 0), Rotation())
body.addObject(panel)
doc.recompute()

# 2. Base Plate Channel (Route out the foam core at the bottom)
base_channel = doc.addObject("PartDesign::SubtractiveBox", "BaseChannel")
base_channel.Length = LENGTH
base_channel.Width = CORE_THICKNESS
base_channel.Height = BASE_CHANNEL_DEPTH
# Positioned exactly in the core (skipping the OSB skin) at Z=0
base_channel.Placement = Placement(Vector(0, OSB_THICKNESS, 0), Rotation())
body.addObject(base_channel)
doc.recompute()

# 3. Window Cutout
window_cut = doc.addObject("PartDesign::SubtractiveBox", "WindowCutout")
window_cut.Length = WINDOW_W
window_cut.Width = THICKNESS + 2.0  # Oversized by 2mm in Y for a clean through-cut
window_cut.Height = WINDOW_H
# Centered in X, offset in Y for clean cut, centered vertically at WINDOW_Z
win_x = (LENGTH - WINDOW_W) / 2.0
win_y = -1.0
win_z = WINDOW_Z - (WINDOW_H / 2.0)
window_cut.Placement = Placement(Vector(win_x, win_y, win_z), Rotation())
body.addObject(window_cut)
doc.recompute()

# === INTERFACES (LCS) ===

# Provide Ledger Mount interface (Internal face, near the top)
lcs_ledger = body.newObject('PartDesign::CoordinateSystem', 'ledger_mount')
# Positioned at the horizontal center, on the inner face (Y=THICKNESS), below top plate
lcs_ledger.AttachmentOffset = Placement(Vector(LENGTH / 2.0, THICKNESS, HEIGHT - 200.0), Rotation())
doc.recompute()

# Provide Back Spline interface (For joining to the adjacent wall)
lcs_spline = body.newObject('PartDesign::CoordinateSystem', 'back_spline')
# Positioned at the end edge
lcs_spline.AttachmentOffset = Placement(Vector(LENGTH, THICKNESS / 2.0, HEIGHT / 2.0), Rotation())
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 anthropic
◉
Provider updated to google / balanced
◉
Provider updated to google / balanced
v0.0.985