120 lines
3.6 KiB
Python
120 lines
3.6 KiB
Python
"""Proof of concept models for SpoolStore."""
|
|
|
|
import solid2 as sp
|
|
from libdsps.grids import hex_grid
|
|
from libdsps.shapes import rect_frame
|
|
|
|
DRAWER_INNER_WIDTH = 220
|
|
DRAWER_INNER_LENGTH = 270
|
|
DRAWER_INNER_FLOOR_THICKNESS = 3
|
|
DRAWER_INNER_DEPTH = 75
|
|
|
|
SPOOL_OUTER_D = 200
|
|
SPOOL_INNER_D = 55
|
|
|
|
SPOOLPIN_FRONT_OFFSET = 110
|
|
SPOOLPIN_D = SPOOL_INNER_D - 10
|
|
SPOOLPIN_HEIGHT = 20
|
|
SPOOLPIN_RAISE = 5
|
|
|
|
SPLITTER_THICKNESS = 3
|
|
SPLITTER_FRONT_OFFSET = 220
|
|
|
|
LID_THICKNESS = 3
|
|
SIDE_THICKNESS = 3
|
|
|
|
FRAME_MARGIN = 8
|
|
GRID_STRIDE = 38
|
|
GRID_FILL_RATIO = 0.08
|
|
|
|
XX = 2
|
|
|
|
|
|
def _gen_hex_frame(
|
|
width: float, length: float, height: float, frame_size: float, stride: float, fill_ratio: float
|
|
) -> sp.OpenSCADObjectPlus:
|
|
frame = rect_frame(width, length, height, frame_size)
|
|
grid = hex_grid(width - frame_size * 2, length - frame_size * 2, height, stride, fill_ratio)
|
|
hex_frame = sp.union()(frame, grid)
|
|
return hex_frame
|
|
|
|
|
|
def _gen_spool_holder() -> sp.OpenSCADObjectPlus:
|
|
spool_raise = sp.cylinder(d=SPOOL_OUTER_D, h=SPOOLPIN_RAISE, center=False)
|
|
pin = sp.cylinder(d=SPOOLPIN_D, h=SPOOLPIN_HEIGHT, center=False)
|
|
pin = sp.up(SPOOLPIN_RAISE)(pin)
|
|
spool_holder = sp.union()(pin, spool_raise)
|
|
spool_holder = sp.color((0.75, 0.5, 0.5))(spool_holder)
|
|
return spool_holder
|
|
|
|
|
|
def _gen_splitter() -> sp.OpenSCADObjectPlus:
|
|
splitter = sp.cube([DRAWER_INNER_WIDTH - SIDE_THICKNESS * 2, SPLITTER_THICKNESS, DRAWER_INNER_DEPTH], center=True)
|
|
splitter = sp.up(DRAWER_INNER_DEPTH / 2)(splitter)
|
|
|
|
mask = sp.cube(
|
|
[
|
|
DRAWER_INNER_WIDTH - SIDE_THICKNESS * 2 - FRAME_MARGIN * 2,
|
|
SPLITTER_THICKNESS + XX,
|
|
DRAWER_INNER_DEPTH - FRAME_MARGIN + XX,
|
|
],
|
|
center=True,
|
|
)
|
|
mask = sp.up((DRAWER_INNER_DEPTH + FRAME_MARGIN + XX) / 2)(mask)
|
|
splitter = splitter - mask
|
|
|
|
splitter = sp.color((0.5, 0.75, 0.5))(splitter)
|
|
return splitter
|
|
|
|
|
|
def _gen_top() -> sp.OpenSCADObjectPlus:
|
|
lid = _gen_hex_frame(
|
|
DRAWER_INNER_WIDTH, SPLITTER_FRONT_OFFSET, LID_THICKNESS, FRAME_MARGIN, GRID_STRIDE, GRID_FILL_RATIO
|
|
)
|
|
lid = sp.forward(DRAWER_INNER_LENGTH / 2 - SPOOLPIN_FRONT_OFFSET)(lid)
|
|
|
|
frame = rect_frame(DRAWER_INNER_WIDTH, DRAWER_INNER_LENGTH - SPLITTER_FRONT_OFFSET, LID_THICKNESS, FRAME_MARGIN)
|
|
frame = sp.forward(-SPLITTER_FRONT_OFFSET / 2)(frame)
|
|
frame = sp.color((0.2, 0.2, 0.2))(frame)
|
|
|
|
top = sp.union()(frame, lid)
|
|
return top
|
|
|
|
|
|
def _gen_side() -> sp.OpenSCADObjectPlus:
|
|
return _gen_hex_frame(
|
|
DRAWER_INNER_DEPTH, DRAWER_INNER_LENGTH, SIDE_THICKNESS, FRAME_MARGIN, GRID_STRIDE, GRID_FILL_RATIO
|
|
)
|
|
|
|
#def _gen_back()
|
|
|
|
|
|
def gen_drawer() -> sp.OpenSCADObjectPlus:
|
|
inner_floor = sp.cube([DRAWER_INNER_WIDTH, DRAWER_INNER_LENGTH, DRAWER_INNER_FLOOR_THICKNESS], center=True)
|
|
inner_floor = sp.up(DRAWER_INNER_FLOOR_THICKNESS / 2)(inner_floor)
|
|
|
|
spool_holder = _gen_spool_holder()
|
|
spool_holder = sp.forward(DRAWER_INNER_LENGTH / 2 - SPOOLPIN_FRONT_OFFSET)(spool_holder)
|
|
|
|
splitter = _gen_splitter()
|
|
splitter = sp.forward(DRAWER_INNER_LENGTH / 2 - SPLITTER_FRONT_OFFSET)(splitter)
|
|
|
|
top = _gen_top()
|
|
top = sp.up(DRAWER_INNER_DEPTH)(top)
|
|
|
|
left = _gen_side()
|
|
left = sp.rotateY(90)(left)
|
|
left = sp.up(DRAWER_INNER_DEPTH / 2)(left)
|
|
left = sp.left(-DRAWER_INNER_WIDTH / 2 + SIDE_THICKNESS)(left)
|
|
|
|
right = _gen_side()
|
|
right = sp.rotateY(-90)(right)
|
|
right = sp.up(DRAWER_INNER_DEPTH / 2)(right)
|
|
right = sp.right(-DRAWER_INNER_WIDTH / 2 + SIDE_THICKNESS)(right)
|
|
|
|
drawer = sp.up(DRAWER_INNER_FLOOR_THICKNESS)(
|
|
sp.union()(sp.down(DRAWER_INNER_FLOOR_THICKNESS)(inner_floor), spool_holder, splitter, top, left, right)
|
|
)
|
|
|
|
return drawer
|