def lens_groove(left_c, right_c, height): """Generates the toolpath for the lens holes (holes, groove and tabs).""" print 'Generating lens grooves' if not poly.is_ccw(left_c): left_c = poly.reverse(left_c) if not poly.is_ccw(right_c): right_c = poly.reverse(right_c) lgroove = poly.erode(1.8, left_c)[0] rgroove = poly.erode(1.8, right_c)[0] left_entry = poly.erode(7.0, left_c)[0][0]; right_entry = poly.erode(7.0, right_c)[0][0]; r = [ "(Lens Grooves)", cam.change_tool("vgroove"), cam.start_spindle(20000), cam.dwell(5), cam.feedrate(2000), cam.rmp(right_entry + [height]), cam.contour(rgroove, True), cam.move(right_entry), # Get out from under the overhang cam.rmp(left_entry + [height]), cam.contour(lgroove, True), cam.move(left_entry), # Get out from under the overhang ] return r
def rough_temple_bevel(temple, thinning): p1 = extendLine(temple[-1], temple[-2], 3.175/2 - 0.5) p2 = extendLine(temple[0], temple[1], 3.175/2 - 0.5) p3 = extendLine(temple[0], temple[1], 15) p4 = extendLine(temple[-1], temple[-2], 15) # room for dovetail # p1 and p2 are just extensions of the temple - move them to the side a bit to # clearance for when the dovetail cutter comes through p1 = extendLine(p1, p2, 3) p2 = extendLine(p2, p1, 3) p3 = extendLine(p3, p4, 3) p4 = extendLine(p4, p3, 3) # Move to the dovetail cutter entry point, helix through stock. # Cut a circle big enough to admit the dovetail cutter. # Rough cut the end of the temple # Clear a return path for the dovetail cutter. return [ cam.change_tool("1/8in endmill"), cam.feedrate(1000), cam.rmh(p4 + [-5-thinning], 1, pitch=1), cam.move(p1), cam.move(p2), cam.move(p3), cam.move(p4), cam.rapid(p4 + [10]) ]
def temple_hinge_clearance(temple, thinning): # Endpoints for the top bevel entry = extendLine(temple[-1], temple[-2], 7.5) p1 = extendLine(temple[0], temple[-1], 1) p2 = extendLine(temple[-1], temple[0], 1) return [ cam.change_tool("engraver"), cam.feedrate(750), cam.start_spindle(20000), cam.rmp(entry + [-2 - thinning]), cam.move(p1), cam.move(p2), cam.move(entry), cam.move(entry + [10]), ]
def nose_contour(nose_rad, nose_h, nose_sa, nose_ra, face_con, thickness): """Creates the nose contour feature toolpath. Angular arguments are in degrees.""" nr = nose_rad h = nose_h sa = math.radians(nose_sa) ra = math.radians(nose_ra) xfloor = poly.left(face_con) - 3.175 # bottom most point minus tool radius xfloor = max(xfloor, -27.0) # miminum safe distance without hitting clamp nose_tool_radius = 3.175 nextpoly = nose.nose_poly(nr, h, sa, ra, xfloor, nose_tool_radius, 0.0) r = [ "(Nose Contour)", cam.change_tool("1/4in ballmill"), cam.start_spindle(20000), cam.feedrate(2000), cam.rmp(nextpoly[0] + [2.0]) # Start near our first contour ] direction = 1 for i in range(-20, (thickness + 2) * 10): z = -i / 10.0 # r += cam.move(nextpoly[0]) if (direction < 0): nextpoly.reverse() direction = direction * -1 r += cam.contour(nextpoly, False) r += cam.move([None, None, z]) nextpoly = nose.nose_poly(nr, h, sa, ra, xfloor, nose_tool_radius, z) return r
def nose_contour(nose_rad, nose_h, nose_sa, nose_ra, face_con, thickness): """Creates the nose contour feature toolpath. Angular arguments are in degrees.""" nr = nose_rad h = nose_h sa = math.radians(nose_sa) ra = math.radians(nose_ra) xfloor = poly.left(face_con) - 3.175 # bottom most point minus tool radius xfloor = max(xfloor, -27.0) # miminum safe distance without hitting clamp nose_tool_radius = 3.175 nextpoly = nose.nose_poly(nr, h, sa, ra, xfloor, nose_tool_radius, 0.0) r = [ "(Nose Contour)", cam.change_tool("1/4in ballmill"), cam.start_spindle(20000), cam.feedrate(2000), cam.rmp(nextpoly[0] + [2.0]) # Start near our first contour ] direction = 1 for i in range(-20, (thickness+2)*10): z = -i/10.0 # r += cam.move(nextpoly[0]) if(direction < 0): nextpoly.reverse() direction = direction * -1 r += cam.contour(nextpoly, False) r += cam.move([None, None, z]) nextpoly = nose.nose_poly(nr, h, sa, ra, xfloor, nose_tool_radius, z) return r
def temple_hinge_pockets(temples): # We're operating in a 90 degree rotated fixture #l_hinge = poly.rotate_90(temples["left_hinge_contour"]) #r_hinge = poly.rotate_90(temples["right_hinge_contour"]) l_hinge = temples["left_hinge_contour"] r_hinge = temples["right_hinge_contour"] if not poly.is_ccw(l_hinge): l_hinge = poly.reverse(l_hinge) if not poly.is_ccw(r_hinge): r_hinge = poly.reverse(r_hinge) left_hinge_pocket_contours = [] while len(l_hinge) > 0: l_hinge = poly.erode(1.5875 / 2, l_hinge) if len(l_hinge) > 0: l_hinge = l_hinge[0] left_hinge_pocket_contours.append(l_hinge) right_hinge_pocket_contours = [] while len(r_hinge) > 0: r_hinge = poly.erode(1.5875 / 2, r_hinge) if len(r_hinge) > 0: r_hinge = r_hinge[0] right_hinge_pocket_contours.append(r_hinge) r = [ cam.comment("Hinge Pockets"), cam.feedrate(750), cam.change_tool("1/16in endmill"), cam.start_spindle(15000), cam.dwell(3), cam.comment("Right Hinge Pocket"), cam.pocket(right_hinge_pocket_contours, -abs(temples['pocket_depth']), retract=0), cam.rapid([None, None, 20.0]), cam.comment("Left Hinge Pocket"), cam.pocket(left_hinge_pocket_contours, -abs(temples['pocket_depth']), retract=0), cam.rapid([None, None, 20.0]), cam.comment("Hinge Holes"), cam.change_tool("1mm drill"), cam.start_spindle(4500), cam.dwell(2), [ cam.rmp(p + [-8.0], retract=10.0) for p in temples['right_hinge_holes'] ], [ cam.rmp(p + [-8.0], retract=10.0) for p in temples['left_hinge_holes'] ], cam.rapid([None, None, 20.0]), cam.move([None, None, 0]), cam.contour(poly.rotate_90(temples['left_temple_contour']), True), cam.contour(poly.rotate_90(temples['right_temple_contour']), True), ] return r
def bevel_temple(temple, thinning): # Assume a 20 degree dovetail cutter, cutting 5mm from bottom dovetail_offset = 9.52/2 - 1.82 entry = extendLine(temple[-1], temple[-2], 7.5) # Endpoints for the undercut p1 = extendLine(temple[-1], temple[-2], dovetail_offset) p2 = extendLine(temple[0], temple[1], dovetail_offset) p2 = extendLine(p2, p1, 2) return [ cam.change_tool("dovetail"), cam.feedrate(750), cam.start_spindle(20000), cam.rmp(entry + [-5-thinning]), cam.move(p1), cam.move(p2), cam.move(entry), cam.move(entry + [10]), ]
def temple_hinge_pockets(temples): # We're operating in a 90 degree rotated fixture #l_hinge = poly.rotate_90(temples["left_hinge_contour"]) #r_hinge = poly.rotate_90(temples["right_hinge_contour"]) l_hinge = temples["left_hinge_contour"] r_hinge = temples["right_hinge_contour"] if not poly.is_ccw(l_hinge): l_hinge = poly.reverse(l_hinge) if not poly.is_ccw(r_hinge): r_hinge = poly.reverse(r_hinge) left_hinge_pocket_contours = []; while len(l_hinge) > 0: l_hinge = poly.erode(1.5875/2, l_hinge) if len(l_hinge) > 0: l_hinge = l_hinge[0] left_hinge_pocket_contours.append(l_hinge) right_hinge_pocket_contours = []; while len(r_hinge) > 0: r_hinge = poly.erode(1.5875/2, r_hinge) if len(r_hinge) > 0: r_hinge = r_hinge[0] right_hinge_pocket_contours.append(r_hinge) r = [ cam.comment("Hinge Pockets"), cam.feedrate(750), cam.change_tool("1/16in endmill"), cam.start_spindle(15000), cam.dwell(3), cam.comment("Right Hinge Pocket"), cam.pocket(right_hinge_pocket_contours, -abs(temples['pocket_depth']), retract=0), cam.rapid([None, None, 20.0]), cam.comment("Left Hinge Pocket"), cam.pocket(left_hinge_pocket_contours, -abs(temples['pocket_depth']), retract=0), cam.rapid([None, None, 20.0]), cam.comment("Hinge Holes"), cam.change_tool("1mm drill"), cam.start_spindle(4500), cam.dwell(2), [cam.rmp(p + [-8.0], retract=10.0) for p in temples['right_hinge_holes']], [cam.rmp(p + [-8.0], retract=10.0) for p in temples['left_hinge_holes']], cam.rapid([None, None, 20.0]), cam.move([None, None, 0]), cam.contour(poly.rotate_90(temples['left_temple_contour']), True), cam.contour(poly.rotate_90(temples['right_temple_contour']), True), ] return r
def nose_contour(nose_rad, nose_h, nose_sa, nose_ra, face_con, thickness, thin_back, centering_shift): """Creates the nose contour feature toolpath. Angular arguments are in degrees."""# print 'Generating nose contour' nr = nose_rad nose_tool_radius = 3.175 # We're cutting with a ball-end mill. Where it actually cuts is dependent on the # ridge angle. If you draw a line at the ridge angle and put it tangent to the ball mill, # that is the cutting line. The angle between the center of the ball mill and the intersection # of the cutting line and the surface is 1/2 of the ridge angle. From that and the radius # of the ball mill we can figure out the offset. cutter_offset = (nose_tool_radius)*math.tan(math.radians(nose_ra/2)) sa = math.radians(nose_sa) ra = math.radians(nose_ra) h = nose_h + centering_shift print 'centering shift', centering_shift # h = nose_h xfloor = poly.left(face_con) - 3.175 # bottom most point minus tool radius xfloor = max(xfloor, -27.0) # miminum safe distance without hitting clamp z_depth = -thin_back # Start a bit above the surface of the glasses nextpoly = nose.nose_poly(nr, h, sa, ra, xfloor, cutter_offset, z_depth) r = [ "(Nose Contour)", cam.change_tool("1/4in ballmill"), cam.start_spindle(20000), cam.feedrate(4000), cam.rmp(nextpoly[0] + [2.0]), # Start near our first contour ] direction = 1 z_start = int((z_depth)*10) # We have to use integers for the range, also step in 1/10 mm steps for i in range(-z_start, int(((thickness)+3)*10)): z = -i/10.0 # r += cam.move(nextpoly[0]) if(direction < 0): nextpoly.reverse() direction = direction * -1 r += cam.move([None, None, z-thin_back]) # Z adjusted for any surfacing that happened r += cam.contour(nextpoly, False) nextpoly = nose.nose_poly(nr, h, sa, ra, xfloor, cutter_offset, z) return r
def bevel_temple_ends(path1, path2, thinning): depth = -4 - thinning # Assume a 14 degree dovetail cutter, cutting 5mm from bottom dovetail_offset = 12.35/2 - 1.25 return [ cam.comment("Bevel temple ends"), cam.change_tool("dovetail"), cam.start_spindle(20000), cam.feedrate(750), cam.rapid(path1[0]), cam.rapid([None, None, depth]), cam.move(path1[1]), cam.move(path1[2]), cam.move(path1[0]), cam.rapid([None, None, 10]), cam.rapid(path2[0]), cam.rapid([None, None, depth]), cam.move(path2[1]), cam.move(path2[2]), cam.move(path2[0]), cam.move([None, None, 20]) ]