← test

Bevelled Ridge Board

v3 AI approved

Create Bevelled ridge board (RidgeBoard), 14756.0x90x300mm. pitch_degrees 30deg (use this exact value for pitch_degrees — do NOT guess or derive from other dimensions). Ends bear on east and west gable walls' internal ridge notches (bearing pockets); double-bevelled top faces bear the two roof slope undersides in full contact Connects to east_wall, west_wall, gable_roof_south, gable_roof_north.

Dependencies

east_wall.ridge_pocket west_wall.ridge_pocket

Interfaces Provided

connection (connection)
◉
Agent initialized (status: waiting_for_dependencies, action: check_dependencies)
◉
Provider: claude_code | Profile: balanced
◉
Provider updated to claude_code / balanced
◉
Provider updated to claude_code / balanced
◉
Provider updated to claude_code / balanced
◉
Provider updated to anthropic / balanced
◉
Provider updated to anthropic / balanced
◉
Provider updated to anthropic / balanced
◉
Agent initialized (status: waiting_for_dependencies, action: check_dependencies)
◉
Provider: anthropic | Profile: balanced
◉
Provider updated to anthropic / balanced
◉
Provider updated to anthropic / balanced
◉
Provider updated to anthropic / balanced
◉
Provider updated to anthropic / balanced
◉
Agent initialized (status: waiting_for_dependencies, action: check_dependencies)
◉
Provider: anthropic | Profile: balanced
◉
Provider updated to anthropic / balanced
◉
Provider updated to anthropic / balanced
◉
Provider updated to anthropic / balanced
◉
Provider updated to anthropic / balanced
◉
Provider updated to anthropic / balanced
◉
Provider updated to anthropic / balanced
◉
Provider updated to anthropic / balanced
◉
Provider updated to anthropic / balanced
◉
Provider updated to anthropic / balanced
◉
Agent initialized (status: waiting_for_dependencies, action: check_dependencies)
◉
Provider: anthropic | Profile: balanced
◉
Provider updated to anthropic / balanced
◉
Provider updated to anthropic / balanced
◉
Provider updated to claude_code / balanced
◉
Provider updated to claude_code / balanced
◉
Agent initialized (status: waiting_for_dependencies, action: check_dependencies)
◉
Provider: claude_code | Profile: balanced
◉
Provider updated to claude_code / balanced
◉
Provider updated to claude_code / balanced
◉
Provider updated to claude_code / balanced
◉
Provider updated to claude_code / balanced
◉
Provider updated to claude_code / balanced
◉
Agent initialized (status: waiting_for_dependencies, action: check_dependencies)
◉
Provider: claude_code | Profile: balanced
◉
Provider updated to claude_code / balanced
◉
Provider updated to claude_code / balanced
◉
Provider updated to claude_code / balanced
◉
Provider updated to claude_code / balanced
◇
Received interface east_wall.ridge_pocket: %{name: "ridge_pocket", type: nil, value: %{}, agent_id: "east_wall"}
◉
Provider updated to claude_code / balanced
◇
Received interface west_wall.ridge_pocket: %{name: "ridge_pocket", type: nil, value: %{}, agent_id: "west_wall"}
◉
All dependencies resolved, starting generation
◉
Refreshed placement from design spec (bbox %{"x" => 14716.0, "y" => 90.0, "z" => 300.0})
◉
Generating v1
◉
[ElixiFree] not active for this component — using raw FreeCAD scripting
○
Calling Claude (local subscription) for code generation (claude-sonnet-5)...
◉
Generation token budget: max_tokens=12288, thinking_budget=0 (retry_count=0)
◉
Provider updated to claude_code / balanced
◉
Provider updated to claude_code / balanced
◉
Provider updated to claude_code / balanced
●
Received response ( tokens)
◆
ridge_beam_v1.py · 53 lines
import FreeCAD
import Part
import math
from FreeCAD import Vector

# === ANCHOR POINTS ===
ANCHOR_TOP_FACE = (7378.0, 45.0, 300.0)
ANCHOR_BOTTOM_FACE = (7378.0, 45.0, 0.0)
ANCHOR_FRONT_FACE = (7378.0, 0.0, 150.0)
ANCHOR_BACK_FACE = (7378.0, 90.0, 150.0)
ANCHOR_LEFT_FACE = (0.0, 45.0, 150.0)
ANCHOR_RIGHT_FACE = (14756.0, 45.0, 150.0)
# === END ANCHOR POINTS ===

# === PARAMETERS ===
LENGTH      = 14716.0   # mm — span along X (board length)
WIDTH       = 90.0      # mm — width along Y
HEIGHT      = 300.0     # mm — total height along Z (peak/arris height)
BEVEL_ANGLE = 30.0      # degrees — roof pitch bevel angle from horizontal
# === END PARAMETERS ===

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

# === GEOMETRY ===
# Cross-section profile in YZ plane (at X=0), extruded along +X.
# Peak (arris) sits at the center-top (Y=WIDTH/2, Z=HEIGHT).
# Each side slopes down at BEVEL_ANGLE from horizontal to the outer top edges.
half_width = WIDTH / 2.0
drop = half_width * math.tan(math.radians(BEVEL_ANGLE))
edge_top_z = HEIGHT - drop

profile_pts = [
    Vector(0, 0, 0),
    Vector(0, WIDTH, 0),
    Vector(0, WIDTH, edge_top_z),
    Vector(0, half_width, HEIGHT),   # arris / peak
    Vector(0, 0, edge_top_z),
    Vector(0, 0, 0),                  # close profile
]

wire = Part.makePolygon(profile_pts)
face = Part.Face(wire)
solid = face.extrude(Vector(LENGTH, 0, 0))

# === ADD TO DOCUMENT ===
feature = doc.addObject("Part::Feature", "Body")
feature.Shape = solid

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
★
Ready for review (v1)
◉
Provider updated to claude_code
◉
Component approved by user
◉
Provider updated to claude_code / balanced
◉
Provider updated to claude_code / balanced
◉
Provider updated to claude_code / balanced
◉
Provider updated to claude_code / balanced
◉
[ElixiFree] not active for this component — using raw FreeCAD scripting
○
Calling Claude (local subscription) for code generation (claude-sonnet-5)...
◉
Generation token budget: max_tokens=12288, thinking_budget=0 (retry_count=0)
●
Received response ( tokens)
◆
ridge_beam_v2.py · 50 lines
import FreeCAD
import Part
import math
from FreeCAD import Vector

# === ANCHOR POINTS ===
ANCHOR_TOP_FACE = (7378.0, 45.0, 300.0)
ANCHOR_BOTTOM_FACE = (7378.0, 45.0, 0.0)
ANCHOR_FRONT_FACE = (7378.0, 0.0, 150.0)
ANCHOR_BACK_FACE = (7378.0, 90.0, 150.0)
ANCHOR_LEFT_FACE = (0.0, 45.0, 150.0)
ANCHOR_RIGHT_FACE = (14756.0, 45.0, 150.0)
# === END ANCHOR POINTS ===

# === PARAMETERS ===
LENGTH        = 14756.0   # mm — span along X
WIDTH         = 90.0      # mm — depth (board width) along Y
HEIGHT        = 300.0     # mm — total height along Z (to ridge apex)
PITCH_DEGREES = 30.0      # deg — bevel angle of each top face (exact, per spec)
# === END PARAMETERS ===

doc = FreeCAD.ActiveDocument or FreeCAD.newDocument("Model")

# Shoulder height: where vertical side walls end and the bevel begins.
# Bevel rises from each shoulder (at y=0 and y=90) up to the centreline
# apex (y=45, z=HEIGHT) at the given pitch angle.
half_width = WIDTH / 2.0
rise = half_width * math.tan(math.radians(PITCH_DEGREES))
shoulder_z = HEIGHT - rise

# Pentagonal cross-section profile in the YZ plane (at X=0):
#   bottom-front -> bottom-back -> shoulder-back -> apex -> shoulder-front -> close
p1 = Vector(0, 0,      0)
p2 = Vector(0, WIDTH,  0)
p3 = Vector(0, WIDTH,  shoulder_z)
p4 = Vector(0, half_width, HEIGHT)
p5 = Vector(0, 0,      shoulder_z)

wire = Part.makePolygon([p1, p2, p3, p4, p5, p1])
face = Part.Face(wire)

# Extrude along X to full board length
solid = face.extrude(Vector(LENGTH, 0, 0))

feature = doc.addObject("Part::Feature", "RidgeBoard")
feature.Shape = solid
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
◉
Agent initialized (status: waiting_for_dependencies, action: check_dependencies)
◉
Provider: claude_code | Profile: balanced
◇
Seeded interface east_wall.ridge_pocket from DB (provider already approved)
◇
Seeded interface west_wall.ridge_pocket from DB (provider already approved)
◉
All dependencies resolved, starting generation
◉
Refreshed placement from design spec (bbox %{"x" => 14716.0, "y" => 90.0, "z" => 300.0})
◉
Generating v2
◉
Regeneration requested by user
◉
[ElixiFree] not active for this component — using raw FreeCAD scripting
◉
Refreshed placement from design spec (bbox %{"x" => 14716.0, "y" => 90.0, "z" => 300.0})
◉
Refreshed placement from design spec (bbox %{"x" => 14716.0, "y" => 90.0, "z" => 300.0})
○
Calling Claude (local subscription) for code generation (claude-sonnet-5)...
◉
Generating v2
◉
Generation token budget: max_tokens=12288, thinking_budget=0 (retry_count=0)
◉
[ElixiFree] not active for this component — using raw FreeCAD scripting
○
Calling Claude (local subscription) for code generation (claude-sonnet-5)...
◉
Generation token budget: max_tokens=12288, thinking_budget=0 (retry_count=0)
◉
Provider updated to claude_code / balanced
●
Received response ( tokens)
◆
ridge_beam_v2.py · 55 lines
import FreeCAD
import Part
import math
from FreeCAD import Vector

# === ANCHOR POINTS ===
ANCHOR_TOP_FACE = (7378.0, 45.0, 300.0)
ANCHOR_BOTTOM_FACE = (7378.0, 45.0, 0.0)
ANCHOR_FRONT_FACE = (7378.0, 0.0, 150.0)
ANCHOR_BACK_FACE = (7378.0, 90.0, 150.0)
ANCHOR_LEFT_FACE = (0.0, 45.0, 150.0)
ANCHOR_RIGHT_FACE = (14756.0, 45.0, 150.0)
# === END ANCHOR POINTS ===

# === PARAMETERS ===
LENGTH     = 14716.0   # mm — span along X (ridge board length)
WIDTH      = 90.0      # mm — depth/thickness along Y
HEIGHT     = 300.0     # mm — height along Z (peak height at arris)
BEVEL_DEG  = 30.0      # degrees — roof pitch, double-bevelled top
# === END PARAMETERS ===

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

# === BUILD GEOMETRY ===
# Cross-section (in YZ plane, at any fixed X): a flat-bottomed pentagon.
# Base rectangle from Y=0..WIDTH, Z=0..Z_EDGE, with two bevelled top faces
# rising from each edge (Y=0 and Y=WIDTH) to meet at a single ridge line
# (the arris) centred at Y=WIDTH/2, Z=HEIGHT.
DROP = (WIDTH / 2.0) * math.tan(math.radians(BEVEL_DEG))
Z_EDGE = HEIGHT - DROP  # height of the vertical side faces before the bevel starts

profile_pts = [
    Vector(0.0, 0.0,          0.0),
    Vector(0.0, WIDTH,        0.0),
    Vector(0.0, WIDTH,        Z_EDGE),
    Vector(0.0, WIDTH / 2.0,  HEIGHT),   # arris peak
    Vector(0.0, 0.0,          Z_EDGE),
    Vector(0.0, 0.0,          0.0),      # close profile
]

wire = Part.makePolygon(profile_pts)
face = Part.Face(wire)

# Extrude along +X to form the full-length ridge board
solid = face.extrude(Vector(LENGTH, 0.0, 0.0))

# === ADD TO DOCUMENT ===
feature = doc.addObject("Part::Feature", "Body")
feature.Shape = solid

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
v0.0.985