kcl-samples

lego

lego

KCL

// Lego Brick

// A standard lego brick. There are a lot of hacks used to product this

// Define constants
const lbumps = 5 // number of bumps long
const wbumps = 3 // number of bumps wide
const pitch = 8.0
const clearance = 0.1
const bumpDiam = 4.8
const bumpHeight = 1.8
const height = 3.2
const t = (pitch - (2 * clearance) - bumpDiam) / 2.0
const postDiam = pitch - t // works out to 6.5
const totalLength = lbumps * pitch - (2.0 * clearance)
const totalWidth = wbumps * pitch - (2.0 * clearance)

const lSegments = totalLength / (lbumps)
const wSegments = totalWidth / (wbumps)

// Create the plane for the pegs. This is a hack so that the pegs can be patterned along the face of the lego base.
const pegFace = {
  plane: {
  origin: { x: 0, y: 0, z: height },
  x_axis: { x: 1, y: 0, z: 0 },
  y_axis: { x: 0, y: 1, z: 0 },
  z_axis: { x: 0, y: 0, z: 1 }
}
}

// Create the plane for the tubes underneath the lego. This is a hack so that the tubes can be patterned underneath the lego.
const tubeFace = {
  plane: {
  origin: { x: 0, y: 0, z: height - t },
  x_axis: { x: 1, y: 0, z: 0 },
  y_axis: { x: 0, y: 1, z: 0 },
  z_axis: { x: 0, y: 0, z: 1 }
}
}

// make the base
const s = startSketchOn('XY')
  |> startProfileAt([-totalWidth / 2, -totalLength / 2], %)
  |> line([totalWidth, 0], %)
  |> line([0, totalLength], %)
  |> line([-totalWidth, 0], %)
  |> close(%)
  |> extrude(height, %)

// Sketch and extrude a rectangular shape to create the shell underneath the lego. This is a hack until we have a shell function.
const shellExtrude = startSketchOn(s, "start")
  |> startProfileAt([
       -(totalWidth / 2 - t),
       -(totalLength / 2 - t)
     ], %)
  |> line([totalWidth - (2 * t), 0], %)
  |> line([0, totalLength - (2 * t)], %)
  |> line([-(totalWidth - (2 * t)), 0], %)
  |> close(%)
  |> extrude(-(height - t), %)

// Create the pegs on the top of the base
const peg = startSketchOn(s, 'end')
  |> circle([
       -(pitch*(wbumps-1)/2),
       -(pitch*(lbumps-1)/2)
     ], bumpDiam / 2, %)
  |> patternLinear2d({
       axis: [1, 0],
       repetitions: wbumps-1,
       distance: pitch
     }, %)
  |> patternLinear2d({
       axis: [0, 1],
       repetitions: lbumps-1,
       distance: pitch
     }, %)
  |> extrude(bumpHeight, %)

// Create the pegs on the bottom of the base
const tubePattern = startSketchOn(tubeFace)
  |> circle([
    -(pitch*(wbumps-1)/2-pitch/2),
    -(pitch*(lbumps-1)/2-pitch/2)
  ], bumpDiam/2, %)
  |> patternLinear2d({
       axis: [1, 0],
       repetitions: wbumps-2,
       distance: pitch
     }, %)
  |> patternLinear2d({
       axis: [0, 1],
       repetitions: lbumps-2,
       distance: pitch
     }, %)
  |> extrude(-bumpHeight, %)