From 987c88409a0b1d579827f8ef1ea34dcfac355089 Mon Sep 17 00:00:00 2001 From: Michael Williams Date: Thu, 5 Sep 2024 21:33:13 +1200 Subject: [PATCH 1/4] Dowel Holder --- models/dowel-holder.js | 51 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 models/dowel-holder.js diff --git a/models/dowel-holder.js b/models/dowel-holder.js new file mode 100644 index 0000000..c1ff353 --- /dev/null +++ b/models/dowel-holder.js @@ -0,0 +1,51 @@ +/** @import * as Replicad from 'replicad' */ + +export const defaultParams = { + gridSpacingInMm: 40, + dowelDiameterInMm: 22, + fastenerHoleDiameterInMm: 8, + fastenerCapDiameterInMm: 13, + bottomThicknessInMm: 1, + edgeThicknessInMm: 2, +} + +/** + * @param {typeof defaultParams} params + */ +export default function main(params) { + const { draw, drawCircle } = replicad + const { + gridSpacingInMm, + dowelDiameterInMm, + fastenerHoleDiameterInMm, + fastenerCapDiameterInMm, + bottomThicknessInMm, + edgeThicknessInMm, + } = params + + let bottomProfile = draw() + .movePointerTo([ + -(1 / 2) * gridSpacingInMm, + (1 / 2) * fastenerCapDiameterInMm + edgeThicknessInMm, + ]) + .halfEllipseTo( + [-(1 / 2) * gridSpacingInMm, -(1 / 2) * fastenerCapDiameterInMm - edgeThicknessInMm], + (1 / 2) * fastenerCapDiameterInMm + edgeThicknessInMm, + true, + ) + .hLineTo((1 / 2) * gridSpacingInMm) + .halfEllipseTo( + [(1 / 2) * gridSpacingInMm, (1 / 2) * fastenerCapDiameterInMm + edgeThicknessInMm], + (1 / 2) * fastenerCapDiameterInMm + edgeThicknessInMm, + true, + ) + .close() + + bottomProfile = bottomProfile + .cut(drawCircle((1 / 2) * fastenerHoleDiameterInMm).translate([(1 / 2) * gridSpacingInMm, 0])) + .cut(drawCircle((1 / 2) * fastenerHoleDiameterInMm).translate([-(1 / 2) * gridSpacingInMm, 0])) + + const bottom = bottomProfile.sketchOnPlane().extrude(bottomThicknessInMm) + + return bottom +} From e378e512b305cd93b69b7483e4fb145b3061c9cc Mon Sep 17 00:00:00 2001 From: Michael Williams Date: Thu, 5 Sep 2024 21:58:00 +1200 Subject: [PATCH 2/4] hmm --- models/dowel-holder.js | 70 ++++++++++++++++++++++++++++-------------- 1 file changed, 47 insertions(+), 23 deletions(-) diff --git a/models/dowel-holder.js b/models/dowel-holder.js index c1ff353..1e55087 100644 --- a/models/dowel-holder.js +++ b/models/dowel-holder.js @@ -23,29 +23,53 @@ export default function main(params) { edgeThicknessInMm, } = params - let bottomProfile = draw() - .movePointerTo([ - -(1 / 2) * gridSpacingInMm, - (1 / 2) * fastenerCapDiameterInMm + edgeThicknessInMm, - ]) - .halfEllipseTo( - [-(1 / 2) * gridSpacingInMm, -(1 / 2) * fastenerCapDiameterInMm - edgeThicknessInMm], - (1 / 2) * fastenerCapDiameterInMm + edgeThicknessInMm, - true, - ) - .hLineTo((1 / 2) * gridSpacingInMm) - .halfEllipseTo( - [(1 / 2) * gridSpacingInMm, (1 / 2) * fastenerCapDiameterInMm + edgeThicknessInMm], - (1 / 2) * fastenerCapDiameterInMm + edgeThicknessInMm, - true, - ) - .close() - - bottomProfile = bottomProfile - .cut(drawCircle((1 / 2) * fastenerHoleDiameterInMm).translate([(1 / 2) * gridSpacingInMm, 0])) - .cut(drawCircle((1 / 2) * fastenerHoleDiameterInMm).translate([-(1 / 2) * gridSpacingInMm, 0])) - - const bottom = bottomProfile.sketchOnPlane().extrude(bottomThicknessInMm) + return createHolder() + + const bottom = createBottom() return bottom + + function createBottom() { + let bottomProfile = draw() + .movePointerTo([ + -(1 / 2) * gridSpacingInMm, + (1 / 2) * fastenerCapDiameterInMm + edgeThicknessInMm, + ]) + .halfEllipseTo( + [-(1 / 2) * gridSpacingInMm, -(1 / 2) * fastenerCapDiameterInMm - edgeThicknessInMm], + (1 / 2) * fastenerCapDiameterInMm + edgeThicknessInMm, + true, + ) + .hLineTo((1 / 2) * gridSpacingInMm) + .halfEllipseTo( + [(1 / 2) * gridSpacingInMm, (1 / 2) * fastenerCapDiameterInMm + edgeThicknessInMm], + (1 / 2) * fastenerCapDiameterInMm + edgeThicknessInMm, + true, + ) + .close() + + bottomProfile = bottomProfile + .cut(drawCircle((1 / 2) * fastenerHoleDiameterInMm).translate([(1 / 2) * gridSpacingInMm, 0])) + .cut( + drawCircle((1 / 2) * fastenerHoleDiameterInMm).translate([-(1 / 2) * gridSpacingInMm, 0]), + ) + + const bottom = bottomProfile.sketchOnPlane().extrude(bottomThicknessInMm) + } + + function createHolder() { + const profile = draw() + .movePointerTo([0, -(1 / 2) * dowelDiameterInMm]) + .ellipseTo( + [0, (1 / 2) * dowelDiameterInMm], + (1 / 2) * dowelDiameterInMm, + (1 / 2) * dowelDiameterInMm, + 180, + false, + true, + ) + .close() + + return profile + } } From 9a3810f2522c4fb2de93504f6671c0aa547d7d89 Mon Sep 17 00:00:00 2001 From: Michael Williams Date: Fri, 6 Sep 2024 10:28:18 +1200 Subject: [PATCH 3/4] wip --- models/dowel-holder.js | 60 +++++++++++++++++++++++++++++++----------- 1 file changed, 45 insertions(+), 15 deletions(-) diff --git a/models/dowel-holder.js b/models/dowel-holder.js index 1e55087..3610454 100644 --- a/models/dowel-holder.js +++ b/models/dowel-holder.js @@ -5,6 +5,8 @@ export const defaultParams = { dowelDiameterInMm: 22, fastenerHoleDiameterInMm: 8, fastenerCapDiameterInMm: 13, + holderThicknessInMm: 10, + holderOffsetIsUp: true, bottomThicknessInMm: 1, edgeThicknessInMm: 2, } @@ -19,15 +21,16 @@ export default function main(params) { dowelDiameterInMm, fastenerHoleDiameterInMm, fastenerCapDiameterInMm, + holderThicknessInMm, + holderOffsetIsUp, bottomThicknessInMm, edgeThicknessInMm, } = params - return createHolder() - + const holder = createHolder() const bottom = createBottom() - return bottom + return holder.fuse(bottom) function createBottom() { let bottomProfile = draw() @@ -54,22 +57,49 @@ export default function main(params) { drawCircle((1 / 2) * fastenerHoleDiameterInMm).translate([-(1 / 2) * gridSpacingInMm, 0]), ) - const bottom = bottomProfile.sketchOnPlane().extrude(bottomThicknessInMm) + return bottomProfile.sketchOnPlane().extrude(bottomThicknessInMm) } function createHolder() { - const profile = draw() - .movePointerTo([0, -(1 / 2) * dowelDiameterInMm]) - .ellipseTo( - [0, (1 / 2) * dowelDiameterInMm], - (1 / 2) * dowelDiameterInMm, - (1 / 2) * dowelDiameterInMm, - 180, - false, - true, - ) + const topAngleInDeg = 30 + + const innerRadius = (1 / 2) * dowelDiameterInMm + const outerRadius = innerRadius + edgeThicknessInMm + + const topInnerX = innerRadius * Math.cos(degToRad(topAngleInDeg)) + const topOuterX = topInnerX + edgeThicknessInMm + const topY = innerRadius * Math.sin(degToRad(topAngleInDeg)) + + let holderProfile = draw() + .movePointerTo([0, -innerRadius]) + .ellipseTo([topInnerX, topY], innerRadius, innerRadius, 0, false, true) + .lineTo([topOuterX, topY]) + .ellipseTo([-topOuterX, topY], outerRadius, outerRadius, 0, true, false) + .lineTo([-topInnerX, topY]) + .ellipseTo([0, -innerRadius], innerRadius, innerRadius, 0, false, true) .close() - return profile + // if need to offset to make space for fastener cap + if (outerRadius > ((1 / 2) * gridSpacingInMm - (1 / 2) * fastenerCapDiameterInMm)) { + const direction = holderOffsetIsUp ? 1 : -1 + const offset = + holderProfile = holderProfile.translate([0, + } + + return holderProfile.sketchOnPlane().extrude(holderThicknessInMm + bottomThicknessInMm) } } + +/** + * @param {number} degrees + */ +function degToRad(degrees) { + return 2 * Math.PI * (degrees / 360) +} + +/** + * @param {number} radians + */ +function radToDeg(radians) { + return 360 * (radians / (2 * Math.PI)) +} From 477727a2be76e760ad0cf74f3e8cd8f44911cd79 Mon Sep 17 00:00:00 2001 From: Michael Williams Date: Fri, 4 Oct 2024 11:31:28 +1300 Subject: [PATCH 4/4] do dah doo --- models/dowel-holder.js | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/models/dowel-holder.js b/models/dowel-holder.js index 3610454..89d77ab 100644 --- a/models/dowel-holder.js +++ b/models/dowel-holder.js @@ -70,7 +70,7 @@ export default function main(params) { const topOuterX = topInnerX + edgeThicknessInMm const topY = innerRadius * Math.sin(degToRad(topAngleInDeg)) - let holderProfile = draw() + const holderProfile = draw() .movePointerTo([0, -innerRadius]) .ellipseTo([topInnerX, topY], innerRadius, innerRadius, 0, false, true) .lineTo([topOuterX, topY]) @@ -79,14 +79,17 @@ export default function main(params) { .ellipseTo([0, -innerRadius], innerRadius, innerRadius, 0, false, true) .close() + return holderProfile.sketchOnPlane().extrude(holderThicknessInMm + bottomThicknessInMm) + + /* // if need to offset to make space for fastener cap if (outerRadius > ((1 / 2) * gridSpacingInMm - (1 / 2) * fastenerCapDiameterInMm)) { const direction = holderOffsetIsUp ? 1 : -1 - const offset = - holderProfile = holderProfile.translate([0, - } - return holderProfile.sketchOnPlane().extrude(holderThicknessInMm + bottomThicknessInMm) + const offset = + holderProfile = holderProfile.translate([0, + } + */ } }