The second week assignment was to make a press-fit construction kit. The first test I did was to get a clue of the width of the laser.
After experimenting and fine tunning the width, I have came up to the following settings using EPILOG at CBA shop.
- Power : 80% (~83% if you are cutting in large area)
- Speed : 20%
- Strip width : 0.149 in
I wanted to experiment different angles jointing. I thought it interesting that the joints will not be fixed independently. (less contact to gain friction)
Rhino+Grasshopper was used through modeling, but the majority of the process was to code and generate the shape automatically. (Fig.3 The big one in the middle is the python scripting coponent. see Appendix for a portion of the code.)
I wasn't sure if the peices will hold theirselves together, but as I was assembling, I understood that the worries were groundless.
One thing I came out good was the order of the parts. The order of the assembly was critical, because the nature of interlocking. The script did that for me, but I wasn't aware of that when I was using CAD.
I finished and put the object on my bedroom light stand. but...
- it was too big (bad propotion)
- the object was blocking too much light
So I did another iteration to overcome the errors. The final version has holes (which avoids to interfere with joints) to let light out.
Appendix.
Rhino-python script for process automation.
import rhinoscriptsyntax as rs
import math
BOARD_THICKNESS = 0.1655 * 25.4 #mm
CUT_THICKNESS = cut_thickness * 25.4 #mm
def angle_cut_length(_degree):
'''
simple math to get the pitch of angled cut
'''
if _degree > 90 :
degree = 180 - _degree
else:
degree = _degree
rad = math.radians(degree)
return CUT_THICKNESS * (1.0/math.sin(rad) + 1.0/math.tan(rad))
inter_points = []
inter_indices = []
cut_lines = []
for i in range(len(lines)):
for j in range(i+1,len(lines)):
intr = rs.CurveCurveIntersection(lines[i],lines[j])
if isinstance(intr,(list,tuple)):
inter_points.append(intr[0][1])
inter_indices.append([i,j])
start_pos =[]
string_num = []
sx = 0
for i in range(len(lines)):
#for i in [2]:
start_pos.append(sx+20)
if i<10 :
string_num.append('0'+str(i))
else:
string_num.append(str(i))
print 'No.'+str(i)
temp_indices =[]
temp_param = []
temp_intr_index = []
c = 0
for ii in inter_indices:
if ii[0]==i:
temp_indices.append(ii[1])
temp_intr_index.append(c)
if ii[1]==i:
temp_indices.append(ii[0])
temp_intr_index.append(c)
c += 1
crv_length = rs.CurveLength(lines[i])
#rs.Angle2() gets the angle from two lines in degrees.
intr_angles = [rs.Angle2(lines[i],lines[id])[0] for id in temp_indices]
crv_int_points =
[rs.Distance(rs.CurveStartPoint(lines[i]),inter_points[id])
for id in temp_intr_index]
db_points = [inter_points[id] for id in temp_intr_index]
print crv_int_points
#top,bottom
cut_lines.append(rs.AddLine([sx,0,0],[sx+crv_length,0,0]))
cut_lines.append(rs.AddLine([sx,height,0],[sx+crv_length,height,0]))
cut_lines.append(rs.AddLine([sx,0,0],[sx,height,0]))
for j in range(len(crv_int_points)):
acl = angle_cut_length(intr_angles[j])/2.0
cut_lines.append(rs.AddLine(
[sx+crv_int_points[j]-acl,height/2,0],
[sx+crv_int_points[j]+acl,height/2,0]
))
print str(i)+' connected_with ' + str(temp_indices[j])
if i < temp_indices[j] :
start_y = 0
else:
start_y = height/2.0
cut_lines.append(rs.AddLine(
[sx+crv_int_points[j]-acl,start_y,0],
[sx+crv_int_points[j]-acl,start_y+height/2,0]))
cut_lines.append(rs.AddLine(
[sx+crv_int_points[j]+acl,start_y,0],
[sx+crv_int_points[j]+acl,start_y+height/2,0]))
cut_lines.append(rs.AddLine([sx+crv_length,0,0],[sx+crv_length,height,0]))
sx += crv_length+20
print ''