chore: Initial commit
This commit is contained in:
119
spoolstore/poc.py
Normal file
119
spoolstore/poc.py
Normal file
@@ -0,0 +1,119 @@
|
||||
"""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
|
||||
Reference in New Issue
Block a user