Files
kickdrawers/cds.py
2022-06-27 12:12:44 -04:00

256 lines
6.9 KiB
Python

import os
print(os.getcwd())
import cadquery as cq
import numpy as np
dp = 2
print("Starting")
r_hole = 4.6/2
if dp == 0:
box_depth = 550
box_width = 160
box_height = 76
prefix = 'bench'
t_small = 4.6
t_large = 4.6
elif dp == 1:
box_depth = 100
box_width = 50
box_height = 50
prefix = 'small'
t_small = 3.175
t_large = t_small*2
force_tab_width = True
tab_width_if_forced = 5
elif dp == 2:
box_depth = 540 + 25.4/2
box_width = 472
box_height = 3.15*25.4
prefix = 'orig'
t_small = 3.175
t_large = t_small*2
force_tab_width = False
tab_width_if_forced = 25
t1 = t_small
t2 = t_large
objs = list()
def copy(obj):
return obj.translate((0, 0, 0))
def intersect(wp1, wp2):
"""
Return geometric intersection between 2 cadquery.Workplane instances by
exploiting.
A n B = (A u B) - ((A - B) u (B - A))
"""
neg1 = copy(wp1).cut(wp2)
neg2 = copy(wp2).cut(wp1)
negative = neg1.union(neg2)
return copy(wp1).union(wp2).cut(negative)
def add_rect(wplane, w, d):
return wplane.lineTo(0,d).lineTo(w,d).lineTo(w,0).close()
def add_fingers(r_side, f_side, num_tabs = 6, tab_width = None, cut = True):
sliver = intersect(r_side, f_side)
pts = list()
for h in sliver.vertices().vals():
pts.append( ( h.X, h.Y, h.Z))
pt=np.asarray(pts)
min_pts = np.min(pt, axis=0)
max_pts = np.max(pt, axis=0)
axis_step = np.argmax(max_pts - min_pts)
axis_sq = list(set([0,1,2]).difference([axis_step]))
sq_dim = (max_pts-min_pts)[axis_sq]
total_sz = (max_pts-min_pts)[axis_step]
if tab_width is not None:
num_tabs = int(np.ceil(total_sz/tab_width))
elif force_tab_width:
num_tabs = int(np.ceil(total_sz / tab_width_if_forced))
step_sz = total_sz / num_tabs
box_sz = max_pts-min_pts
box_sz[axis_step] /= num_tabs
tbj = list()
tbh = list()
for i in range(num_tabs):
xstep = [0,0,0]
if (axis_sq[1]-axis_sq[0]) > 1:
xstep[axis_sq[1]] = 1
flip = True
else:
xstep[axis_sq[0]] = 1
flip = False
normal = [0,0,0]
normal[axis_step] = 1
origin = min_pts.copy()
origin[axis_step] += i * step_sz
t_plane = cq.Plane(tuple(origin), tuple(xstep), tuple(normal))
if flip:
tbj.append( add_rect(cq.Workplane(t_plane), sq_dim[1], sq_dim[0]).extrude(step_sz) )
else:
tbj.append( add_rect(cq.Workplane(t_plane), sq_dim[0], sq_dim[1]).extrude(step_sz) )
if cut:
for i in range(num_tabs):
if i % 2 == 0:
r_side = r_side.cut(tbj[i])
if i % 2 == 1:
f_side = f_side.cut(tbj[i])
return r_side, f_side, tbj
l_plane = cq.Plane(origin = (box_width,0,0), xDir=(0,1,0), normal=(1,0,0))
r_plane = cq.Plane(origin = (0,0,0), xDir=(0,1,0), normal=(1,0,0))
f_plane=cq.Plane(origin=(box_width, box_depth,0), xDir=(-1,0,0), normal = (0,1,0))
xy_wp = lambda: cq.Workplane('XY')
xz_wp = lambda: cq.Workplane('XZ')
yz_wp = lambda: cq.Workplane('YZ')
l_wp = lambda: cq.Workplane(l_plane)
f_wp = lambda: cq.Workplane(f_plane)
bottom = add_rect(xy_wp(), box_width, box_depth).extrude(t2).translate((0,0,2))
l_side = add_rect(l_wp(), box_depth, box_height).extrude(-t2)
r_side = add_rect(yz_wp(), box_depth, box_height).extrude(t2)
b_side = add_rect(xz_wp(), box_width, box_height).extrude(-t2)
f_side = add_rect(f_wp(), box_width, box_height).extrude(-t2)
def ret_front_pts(bd, bh, spread = 96):
pts = list()
if spread == 0:
pts.append( (bd/2, bh))
else:
pts.append( (bd/2 - spread/2, bh))
pts.append( (bd/2 + spread/2, bh))
return pts
def ret_pts(bd, bh, center = False, max_num = None, spacing = 32):
pts = list()
if center:
ix = int(np.ceil(bd/spacing)/2)
for i in range((-ix+1), ix ):
pts.append((bd/2 + i*spacing, bh))
else:
for i in range(1,int(np.ceil(bd/spacing)) - 1):
pts.append((i*spacing, bh))
pts = tuple(pts)
return pts
def slide_pts(bd, bh, offset_from_back = 54, spacing = (192, 192)):
pts = list()
curr_pt = offset_from_back
pts.append([curr_pt, bh])
for spc in spacing:
curr_pt += spc
pts.append([ curr_pt, bh])
return pts
if 1:
if dp==2:
pts_holes = slide_pts(box_depth, box_height/2)
r_side = r_side.cut(yz_wp().pushPoints(pts_holes).circle(r_hole).extrude(10))
l_side = l_side.cut(l_wp().pushPoints(pts_holes).circle(r_hole).extrude(-10))
bw = box_width * 0.6
f_side = f_side.cut(f_wp().pushPoints(ret_front_pts(box_width, box_height*0.3, spread=bw)).circle(r_hole).extrude(-10))
f_side = f_side.cut(f_wp().pushPoints(ret_front_pts(box_width, box_height * (0.7), spread=bw)).circle(r_hole).extrude(-10))
f_side = f_side.cut(f_wp().pushPoints(ret_front_pts(box_width, box_height * (0.7), spread=0)).circle(r_hole).extrude(-10))
f_side = f_side.cut(f_wp().pushPoints(ret_front_pts(box_width, box_height * (0.3), spread=0)).circle(r_hole).extrude(-10))
else:
r_side = r_side.cut(yz_wp().pushPoints(ret_pts(box_depth, box_height/2)).circle(r_hole).extrude(10))
l_side = l_side.cut(l_wp().pushPoints(ret_pts(box_depth, box_height/2)).circle(r_hole).extrude(-10))
f_side = f_side.cut(f_wp().pushPoints(ret_front_pts(box_width, box_height/2, spread=96)).circle(r_hole).extrude(-10))
# if 1:
r_side, f_side, _ = add_fingers(r_side, f_side)
l_side, f_side, _ = add_fingers(l_side, f_side)
l_side, b_side, _ = add_fingers(l_side, b_side)
r_side, b_side, _ = add_fingers(r_side, b_side)
bottom,l_side, _ = add_fingers(bottom,l_side, num_tabs = 15)
bottom, r_side,_ = add_fingers(bottom,r_side, num_tabs = 15)
bottom,f_side, _= add_fingers(bottom,f_side, num_tabs = 15)
bottom,b_side, _ = add_fingers(bottom,b_side, num_tabs = 15)
show_object(l_side)
show_object(f_side)
show_object(r_side)
show_object(b_side)
print(type(b_side))
t_w = 10
l_d = 50
l_w = 50 # <--->
n_w = int(box_width / (2*l_w))
n_d = int(box_depth / (2*l_d))
b_dcent = box_depth/2 - t1/2
b_wcent = box_width/2 - t_w/2
d_dcent = box_depth/2 - t_w
d_wcent = box_width/2 - t1/2
rectadd = None
show_object(bottom)
from cadquery import exporters as et
import os
models_export = ['bottom', 'l_side', 'r_side', 'f_side', 'b_side']
rt_dir = r'C:\\Users\\TheBears\\Seafile\\Designs\\Projects\\kickdrawers\\cadfree\\output\\'
print(globals()['bottom'])
for mod in models_export:
fpath = os.path.join(rt_dir, prefix + '_'+ mod+'.stl')
et.exportShape(globals()[mod], et.ExportTypes.STL, open(fpath,'w'))