From 7c1e7a0e12ee9b2ce5e3154e471f5638ae81a158 Mon Sep 17 00:00:00 2001 From: Diogo Diniz Date: Thu, 23 Jul 2026 23:17:32 +0100 Subject: [PATCH] feat: Complete drawer, needs turning into parts --- spoolstore/poc.py | 103 +++++++++++++++++++++++++++++++++++++++------- 1 file changed, 88 insertions(+), 15 deletions(-) diff --git a/spoolstore/poc.py b/spoolstore/poc.py index 42284f4..15792cd 100644 --- a/spoolstore/poc.py +++ b/spoolstore/poc.py @@ -32,6 +32,8 @@ RAIL_SPOOL_FRONT_DIST = 5 RAIL_PARKED_SPOOL = True RAIL_CRITICAL_SPOOL = True +TOP_LID_RATIO = .4 + DRAWER_OUTER_WIDTH = DRAWER_INNER_WIDTH + SIDE_THICKNESS * 2 DRAWER_OUTER_LENGTH = DRAWER_INNER_LENGTH + LID_THICKNESS + BACK_THICKNESS @@ -39,6 +41,13 @@ FRAME_MARGIN = 8 GRID_STRIDE = 38 GRID_FILL_RATIO = 0.08 +COLOR_BOTTOM = (.2, .2, .2) +COLOR_LEFT = (.0, .6, .0) +COLOR_RIGHT = (.6, .0, .0) +COLOR_BACK = (.6, .6, .0) +COLOR_TOP = (.0, .0, .6) +COLOR_LID = (.0, .6, .6) + XX = .1 @@ -86,9 +95,6 @@ def _gen_rail() -> sp.OpenSCADObjectPlus: def _gen_spool_rails() -> sp.OpenSCADObjectPlus: - parked_spool = _gen_spool() - parked_spool = sp.up(RAIL_SPOOL_HEIGHT)(parked_spool) - rail_pos_radius = SPOOL_OUTER_D / 2 + RAIL_RADIUS f_y_off = sin(radians(RAIL_FRONT_ANGLE)) * rail_pos_radius f_z_off = (1-cos(radians(RAIL_FRONT_ANGLE))) * rail_pos_radius - RAIL_RADIUS + RAIL_SPOOL_HEIGHT @@ -105,54 +111,121 @@ def _gen_spool_rails() -> sp.OpenSCADObjectPlus: rail_base = sp.cylinder(h=RAIL_SUPPORT_THICKNESS, r=RAIL_RADIUS+RAIL_SUPPORT_EXTRA_RADIUS, center=True) rail_base = sp.rotateY(90)(rail_base) + back_rail_base = sp.up(b_z_off)(rail_base) back_rail_base = sp.forward(b_y_off)(back_rail_base) front_rail_base = sp.up(f_z_off)(rail_base) front_rail_base = sp.forward(f_y_off)(front_rail_base) - #TODO: Mid rail to reduce overlap with spool contents + + mid_base = sp.cube([RAIL_SUPPORT_THICKNESS, RAIL_RADIUS*2, 1], center=True) back_base = sp.forward(b_y_off)(sp.cube([RAIL_SUPPORT_THICKNESS, RAIL_RADIUS*2, 1], center=True)) front_base = sp.forward(f_y_off)(sp.cube([RAIL_SUPPORT_THICKNESS, RAIL_RADIUS*2, 1], center=True)) + back_support = sp.hull()(back_rail_base, back_base) front_support = sp.hull()(front_rail_base, front_base) - inter_support = sp.hull()(front_rail_base, back_rail_base) - rail_support = sp.union()(back_support, front_support, inter_support) + back_mid_support = sp.hull()(mid_base, back_rail_base) + front_mid_support = sp.hull()(front_rail_base, mid_base) + rail_support = sp.union()(back_support, front_support, back_mid_support, front_mid_support) support_offset = SPOOL_WIDTH/2 - SPOOL_SIDE_THICK - RAIL_SUPPORT_THICKNESS/2 - RAIL_SUPPORT_SIDE_MARGIN left_support = sp.left(support_offset)(rail_support) right_support = sp.right(support_offset)(rail_support) rail_supports = sp.union()(left_support, right_support) - critical_spool = _gen_spool((1, 0, 0), 0.3) - critical_spool = sp.up(f_z_off + RAIL_RADIUS)(critical_spool) - critical_spool = sp.forward(f_y_off)(critical_spool) - critical_spool = sp.right(XX)(critical_spool) - final = sp.union()(back_rail, front_rail, rail_supports) if RAIL_PARKED_SPOOL: + parked_spool = _gen_spool() + parked_spool = sp.up(RAIL_SPOOL_HEIGHT)(parked_spool) final = sp.union()(final, parked_spool) if RAIL_CRITICAL_SPOOL: + critical_spool = _gen_spool((1, 0, 0), 0.3) + critical_spool = sp.up(f_z_off + RAIL_RADIUS)(critical_spool) + critical_spool = sp.forward(f_y_off)(critical_spool) + critical_spool = sp.right(XX)(critical_spool) final = sp.union()(final, critical_spool) + final = sp.forward(DRAWER_INNER_LENGTH/2 - SPOOL_OUTER_D/2 - RAIL_SPOOL_FRONT_DIST)(final) return final +def _gen_back() -> sp.OpenSCADObjectPlus: + face = _gen_hex_frame( + DRAWER_OUTER_WIDTH, DRAWER_INNER_DEPTH, BACK_THICKNESS, FRAME_MARGIN, GRID_STRIDE, GRID_FILL_RATIO + ) + return face + + +def _gen_top() -> sp.OpenSCADObjectPlus: + top = _gen_hex_frame( + DRAWER_OUTER_WIDTH, DRAWER_OUTER_LENGTH * (1-TOP_LID_RATIO), LID_THICKNESS, FRAME_MARGIN, GRID_STRIDE, GRID_FILL_RATIO + ) + return top + + +def _gen_lid() -> sp.OpenSCADObjectPlus: + front = _gen_hex_frame( + DRAWER_OUTER_WIDTH, DRAWER_INNER_DEPTH, LID_THICKNESS, FRAME_MARGIN, GRID_STRIDE, GRID_FILL_RATIO + ) + + front = sp.back(LID_THICKNESS/2)(front) + + top = _gen_hex_frame( + DRAWER_OUTER_WIDTH, DRAWER_OUTER_LENGTH * TOP_LID_RATIO, LID_THICKNESS, FRAME_MARGIN, GRID_STRIDE, GRID_FILL_RATIO + ) + + top = sp.rotateX(-90)(top) + top = sp.up(DRAWER_OUTER_LENGTH * TOP_LID_RATIO / 2)(top) + top = sp.forward(DRAWER_INNER_DEPTH/2 - LID_THICKNESS/2)(top) + + lid = sp.union()(front, top) + return lid + + +def _gen_lid_at_hinge(angle: float = 0) -> sp.OpenSCADObjectPlus: + lid = _gen_lid() + + lid = sp.down(DRAWER_OUTER_LENGTH * TOP_LID_RATIO)(lid) + lid = sp.back(DRAWER_INNER_DEPTH/2 + LID_THICKNESS/2)(lid) + lid = sp.rotateX(90+angle)(lid) + + return lid + + def gen_drawer() -> sp.OpenSCADObjectPlus: + bottom = _gen_bottom() + bottom = sp.down(FLOOR_THICKNESS)(bottom) + bottom = sp.color(COLOR_BOTTOM)(bottom) + left = _gen_side() left = sp.rotateY(-90)(left) left = sp.left(DRAWER_INNER_WIDTH / 2)(left) left = sp.up(DRAWER_INNER_DEPTH / 2)(left) + left = sp.color(COLOR_LEFT)(left) right = _gen_side() right = sp.rotateY(90)(right) right = sp.right(DRAWER_INNER_WIDTH / 2)(right) right = sp.up(DRAWER_INNER_DEPTH / 2)(right) + right = sp.color(COLOR_RIGHT)(right) - bottom = _gen_bottom() - bottom = sp.down(FLOOR_THICKNESS)(bottom) - bottom = sp.color((0.2, 0.2, 0.2))(bottom) + back = _gen_back() + back = sp.rotateX(90)(back) + back = sp.back(DRAWER_INNER_LENGTH/2)(back) + back = sp.up(DRAWER_INNER_DEPTH / 2)(back) + back = sp.color(COLOR_BACK)(back) + + top = _gen_top() + top = sp.up(DRAWER_INNER_DEPTH)(top) + top = sp.back(DRAWER_OUTER_LENGTH*TOP_LID_RATIO/2)(top) + top = sp.color(COLOR_TOP)(top) + + lid = _gen_lid_at_hinge() + lid = sp.up(DRAWER_INNER_DEPTH + LID_THICKNESS)(lid) + lid = sp.forward(DRAWER_OUTER_LENGTH * (.5 - TOP_LID_RATIO))(lid) + lid = sp.color(COLOR_LID)(lid) rails = _gen_spool_rails() - final = sp.union()(left, right, bottom, rails) + final = sp.union()(bottom, left, right, back, top, lid, rails) final = sp.up(FLOOR_THICKNESS)(final) return final