// Clock // A clock with roman numerals // Define parameters clockDiameter = 500 clockThickness = 50 minuteHandLength = 100 nubDiameter = 30 numHeight = 10 minuteHandWidth = 25 hourHandWidth = 25 hourHandLargeDiameter = 230 minuteHandLargeDiameter = 310 filletRadius = 5 ridgeThickness = 10 numberThickness = 10 // Calculated parameters ridgeDiameter = clockDiameter - 50 hourHandArmLength = clockDiameter / 2 * .25 minuteHandArmLength = clockDiameter / 2 * .40 // Add assert for clockDiameter assert(clockDiameter, isGreaterThan = 450, error = "clock diameter needs to be greater than 400") // What time is it? hour = 9 minute = 29 // Calculate hand angles hourHandAngle = 90 - (hour * 30) minuteHandAngle = 90 - (minute * 6) // Create the clock body clockBodySketch = startSketchOn(XY) profile001 = circle( clockBodySketch, center = [0, 0], diameter = clockDiameter, tag = $seg02, ) clockBody = extrude(profile001, length = clockThickness, tagStart = $capStart001) |> fillet( radius = filletRadius, tags = [ getCommonEdge(faces = [seg02, capStart001]) ], ) // Create the ridge on the top face of the body clockRidgeSketch = startSketchOn(clockBody, face = END) profile002 = circle( clockRidgeSketch, center = [0, 0], diameter = clockDiameter, tag = $seg01, ) profile003 = circle(clockRidgeSketch, center = [0, 0], diameter = ridgeDiameter) subtract2d(profile002, tool = profile003) clockRidge = extrude(profile002, length = ridgeThickness, tagEnd = $capEnd001) |> fillet( radius = filletRadius, tags = [ getCommonEdge(faces = [seg01, capEnd001]) ], ) |> appearance(%, color = "#ab4321") // Create an object that has all of the x and y starting positions of every number numberObject = { // one = { i = [90, 160] }, one = { i = [ clockDiameter / 2 * 3 / 4 * cos(60), clockDiameter / 2 * 3 / 4 * sin(60) ] }, two = { i = [ clockDiameter / 2 * 3 / 4 * cos(30) - 10, clockDiameter / 2 * 3 / 4 * sin(30) ], i2 = [ clockDiameter / 2 * 3 / 4 * cos(30) + 5, clockDiameter / 2 * 3 / 4 * sin(30) ] }, three = { i = [ clockDiameter / 2 * 3 / 4 * cos(0) - 15, clockDiameter / 2 * 3 / 4 * sin(0) ], i2 = [ clockDiameter / 2 * 3 / 4 * cos(0), clockDiameter / 2 * 3 / 4 * sin(0) ], i3 = [ clockDiameter / 2 * 3 / 4 * cos(0) + 15, clockDiameter / 2 * 3 / 4 * sin(0) ] }, four = { i = [ clockDiameter / 2 * 3 / 4 * cos(-30) - 10, clockDiameter / 2 * 3 / 4 * sin(-30) ], v = [ clockDiameter / 2 * 3 / 4 * cos(-30) + 13, clockDiameter / 2 * 3 / 4 * sin(-30) ] }, five = { v = [ clockDiameter / 2 * 3 / 4 * cos(-60), clockDiameter / 2 * 3 / 4 * sin(-60) ] }, six = { v = [ clockDiameter / 2 * 3 / 4 * cos(-90) - 10, clockDiameter / 2 * 3 / 4 * sin(-90) ], i = [ clockDiameter / 2 * 3 / 4 * cos(-90) + 12, clockDiameter / 2 * 3 / 4 * sin(-90) ] }, seven = { v = [ clockDiameter / 2 * 3 / 4 * cos(-120) - 15, clockDiameter / 2 * 3 / 4 * sin(-120) ], i = [ clockDiameter / 2 * 3 / 4 * cos(-120) + 5, clockDiameter / 2 * 3 / 4 * sin(-120) ], i2 = [ clockDiameter / 2 * 3 / 4 * cos(-120) + 20, clockDiameter / 2 * 3 / 4 * sin(-120) ] }, eight = { v = [ clockDiameter / 2 * 3 / 4 * cos(-150) - 10, clockDiameter / 2 * 3 / 4 * sin(-150) ], i = [ clockDiameter / 2 * 3 / 4 * cos(-150) + 10, clockDiameter / 2 * 3 / 4 * sin(-150) ], i2 = [ clockDiameter / 2 * 3 / 4 * cos(-150) + 25, clockDiameter / 2 * 3 / 4 * sin(-150) ], i3 = [ clockDiameter / 2 * 3 / 4 * cos(-150) + 40, clockDiameter / 2 * 3 / 4 * sin(-150) ] }, nine = { i = [ clockDiameter / 2 * 3 / 4 * cos(180) - 15, clockDiameter / 2 * 3 / 4 * sin(180) ], x = [ clockDiameter / 2 * 3 / 4 * cos(180) + 15, clockDiameter / 2 * 3 / 4 * sin(180) ] }, ten = { x = [ clockDiameter / 2 * 3 / 4 * cos(150) + 5, clockDiameter / 2 * 3 / 4 * sin(150) ] }, eleven = { x = [ clockDiameter / 2 * 3 / 4 * cos(120), clockDiameter / 2 * 3 / 4 * sin(120) ], i = [ clockDiameter / 2 * 3 / 4 * cos(120) + 10, clockDiameter / 2 * 3 / 4 * sin(120) ] }, twelve = { x = [ clockDiameter / 2 * 3 / 4 * cos(90) - 10, clockDiameter / 2 * 3 / 4 * sin(90) ], i = [ clockDiameter / 2 * 3 / 4 * cos(90) + 5, clockDiameter / 2 * 3 / 4 * sin(90) ], i2 = [ clockDiameter / 2 * 3 / 4 * cos(90) + 20, clockDiameter / 2 * 3 / 4 * sin(90) ] } } // Function for the letter I fn letterI(startX, startY) { iWidth = 8 iLength = 40 return startSketchOn(offsetPlane(XY, offset = 50)) |> startProfile( %, at = [ startX - (iWidth / 2), startY + iLength / 2 ], ) |> xLine(%, length = iWidth) |> yLine(%, length = -iLength) |> xLine(%, length = -iWidth) |> close(%) |> extrude(%, length = numberThickness) |> appearance(%, color = "#140f0f") } // Function for the letter X fn letterX(startX, startY) { xWidth = 40 xLength = 40 return startSketchOn(offsetPlane(XY, offset = 50)) |> startProfile( %, at = [ startX - (xWidth / 2), startY + xLength / 2 ], ) |> xLine(%, length = xWidth / 6) |> angledLine(%, angle = -70, lengthY = xLength * 1 / 3) |> angledLine(%, angle = 70, lengthY = xLength * 1 / 3) |> xLine(%, length = xWidth / 6) |> angledLine(%, angle = 70 + 180, lengthY = xLength * 1 / 2) |> angledLine(%, angle = -70, lengthY = xLength * 1 / 2) |> xLine(%, length = -xWidth / 6) |> angledLine(%, angle = -70 - 180, lengthY = xLength * 1 / 3) |> angledLine(%, angle = 70 + 180, lengthY = xLength * 1 / 3) |> xLine(%, length = -xWidth / 6) |> angledLine(%, angle = 70, lengthY = xLength * 1 / 2) |> close(%) |> extrude(%, length = numberThickness) |> appearance(%, color = "#140f0f") } // Function for the letter V fn letterV(startX, startY) { vWidth = 25 vLength = 40 return startSketchOn(offsetPlane(XY, offset = 50)) |> startProfile( %, at = [ startX - (vWidth / 2), startY + vLength / 2 ], ) |> xLine(%, length = vWidth * 1 / 3) |> line(%, end = [vWidth / 6, -vLength / 2]) |> line(%, end = [vWidth / 6, vLength / 2]) |> xLine(%, length = vWidth * 1 / 3) |> line(%, end = [-vWidth * 1 / 2, -vLength]) |> close(%) |> extrude(%, length = numberThickness) |> appearance(%, color = "#140f0f") } // Create the numbers on the face of the clock // 1 // letterI(startX = numberObject.one.i[0], startY = numberObject.one.i[1]) // 2 // letterI(startX = numberObject.two.i[0], startY = numberObject.two.i[1]) letterI(startX = numberObject.two.i2[0], startY = numberObject.two.i2[1]) // 3 // letterI(startX = numberObject.three.i[0], startY = numberObject.three.i[1]) letterI(startX = numberObject.three.i2[0], startY = numberObject.three.i2[1]) letterI(startX = numberObject.three.i3[0], startY = numberObject.three.i3[1]) // 4 // letterI(startX = numberObject.four.i[0], startY = numberObject.four.i[1]) letterV(startX = numberObject.four.v[0], startY = numberObject.four.v[1]) // 5 // letterV(startX = numberObject.five.v[0], startY = numberObject.five.v[1]) // 6 // letterV(startX = numberObject.six.v[0], startY = numberObject.six.v[1]) letterI(startX = numberObject.six.i[0], startY = numberObject.six.i[1]) // 7 // letterV(startX = numberObject.seven.v[0], startY = numberObject.seven.v[1]) letterI(startX = numberObject.seven.i[0], startY = numberObject.seven.i[1]) letterI(startX = numberObject.seven.i2[0], startY = numberObject.seven.i2[1]) // 8 // letterV(startX = numberObject.eight.v[0], startY = numberObject.eight.v[1]) letterI(startX = numberObject.eight.i[0], startY = numberObject.eight.i[1]) letterI(startX = numberObject.eight.i2[0], startY = numberObject.eight.i2[1]) letterI(startX = numberObject.eight.i3[0], startY = numberObject.eight.i3[1]) // 9 // letterI(startX = numberObject.nine.i[0], startY = numberObject.nine.i[1]) letterX(startX = numberObject.nine.x[0], startY = numberObject.nine.x[1]) // 10 // letterX(startX = numberObject.ten.x[0], startY = numberObject.ten.x[1]) // 11 // letterX(startX = numberObject.eleven.x[0], startY = numberObject.eleven.x[1]) letterI(startX = numberObject.eleven.i[0], startY = numberObject.eleven.i[1]) // 12 // letterX(startX = numberObject.twelve.x[0], startY = numberObject.twelve.x[1]) letterI(startX = numberObject.twelve.i[0], startY = numberObject.twelve.i[1]) letterI(startX = numberObject.twelve.i2[0], startY = numberObject.twelve.i2[1]) // Create nub for the minute and hour hands startSketchOn(clockBody, face = END) |> circle(center = [0, 0], diameter = nubDiameter) |> extrude(%, length = numHeight) // Create the hour hand sketch005 = startSketchOn(offsetPlane(XY, offset = 55)) profile007 = startProfile( sketch005, at = [ nubDiameter / 2 * 1.375 * cos(hourHandAngle + 20), nubDiameter / 2 * 1.375 * sin(hourHandAngle + 20) ], ) |> arc( %, interiorAbsolute = [ nubDiameter / 2 * 1.375 * cos(hourHandAngle + 180), nubDiameter / 2 * 1.375 * sin(hourHandAngle + 180) ], endAbsolute = [ nubDiameter / 2 * 1.375 * cos(hourHandAngle + 340), nubDiameter / 2 * 1.375 * sin(hourHandAngle + 340) ], ) |> angledLine(%, angle = hourHandAngle, length = hourHandArmLength) |> angledLine( %, angle = hourHandAngle - 90, length = hourHandWidth / 2, tag = $seg004, ) |> line( %, endAbsolute = [ hourHandLargeDiameter / 2 * cos(hourHandAngle), hourHandLargeDiameter / 2 * sin(hourHandAngle) ], tag = $seg002, ) |> angledLine(%, angle = segAng(seg002) + 120, length = segLen(seg002)) // |> angledLineThatIntersects(%, angle = segAng(seg002) + hourHandAngle - 90, intersectTag = seg004) |> angledLine(%, angle = hourHandAngle - 90, length = segLen(seg004)) |> line(%, endAbsolute = [profileStartX(%), profileStartY(%)]) |> close(%) profile008 = circle(sketch005, center = [0, 0], diameter = nubDiameter) subtract2d(profile007, tool = profile008) |> extrude(%, length = 5) |> appearance(%, color = "#404040") // create the minute hand sketch006 = startSketchOn(offsetPlane(XY, offset = 50)) profile009 = startProfile( sketch006, at = [ nubDiameter / 2 * 1.375 * cos(minuteHandAngle + 20), nubDiameter / 2 * 1.375 * sin(minuteHandAngle + 20) ], ) |> arc( %, interiorAbsolute = [ nubDiameter / 2 * 1.375 * cos(minuteHandAngle + 180), nubDiameter / 2 * 1.375 * sin(minuteHandAngle + 180) ], endAbsolute = [ nubDiameter / 2 * 1.375 * cos(minuteHandAngle + 340), nubDiameter / 2 * 1.375 * sin(minuteHandAngle + 340) ], ) |> angledLine(%, angle = minuteHandAngle, length = minuteHandArmLength) |> angledLine( %, angle = minuteHandAngle - 90, length = minuteHandWidth / 2, tag = $seg003, ) |> line( %, endAbsolute = [ minuteHandLargeDiameter / 2 * cos(minuteHandAngle), minuteHandLargeDiameter / 2 * sin(minuteHandAngle) ], tag = $seg005, ) |> angledLine(%, angle = segAng(seg005) + 120, length = segLen(seg005)) |> angledLine(%, angle = minuteHandAngle - 90, length = segLen(seg003)) |> line(%, endAbsolute = [profileStartX(%), profileStartY(%)]) |> close(%) profile010 = circle(sketch006, center = [0, 0], diameter = 30) subtract2d(profile009, tool = profile010) |> extrude(%, length = 5) |> appearance(%, color = "#404040") // Define parameters of the screw slot for hanging the clock screwHeadDiameter = 9.53 screwTolerance = .5 slotWidth = (screwHeadDiameter + screwTolerance) / 2 slotLength = 40 // Create the screw slot sketch003 = startSketchOn(clockBody, face = START) profile004 = startProfile(sketch003, at = [-slotWidth / 2, 200]) |> yLine(length = -slotLength) |> arc( %, radius = screwHeadDiameter / 2 + screwTolerance, angleStart = 120, angleEnd = 420, ) |> yLine(%, length = slotLength) |> tangentialArc(endAbsolute = [profileStartX(%), profileStartY(%)]) |> close() |> extrude(%, length = -20) // todo: create cavity for the screw to slide into (need csg update)