def path(path_to_follow, feed_rate, z_feed_rate, from_z, to_z, step_z, safety_z): r"""Generate Gcode to follow a path (an array of 2D (X,Y) arrays)""" gcode = list() gcode.append(gcodes.g0_gcode(x=0, y=0, z=safety_z)) gcode.append(gcodes.g0_gcode(x=path_to_follow[0][0], y=path_to_follow[0][1])) for h in _generate_heights(from_z, to_z, step_z): gcode.append(gcodes.g1_gcode(z=h, feedrate=z_feed_rate)) for point in path_to_follow: gcode.append(gcodes.g1_gcode(x=point[0], y=point[1], feedrate=feed_rate)) gcode.append(gcodes.g1_gcode(z=safety_z, feedrate=feed_rate)) return ''.join(gcode)
def cylinder(x_center, y_center, cylinder_diameter, tool_diameter, feed_rate, from_z, to_z, step_z, safety_z): r"""Generate Gcode to cut a cylinder""" gcode = list() gcode.append(gcodes.g0_gcode(z=safety_z)) gcode.append(gcodes.g0_gcode(x=x_center - (cylinder_diameter + tool_diameter) / 2 + tool_diameter / 2, y=y_center)) for h in _generate_heights(from_z, to_z, step_z): gcode.append(gcodes.g3_gcode(x_center_offset=(cylinder_diameter + tool_diameter) / 2 - tool_diameter / 2, y_center_offset=0, spiral_end_altitude=h, feedrate=feed_rate)) gcode.append(gcodes.g1_gcode(z=safety_z, feedrate=feed_rate)) return ''.join(gcode)
def rectangle(x_dimension, y_dimension, x_mini, y_mini, tool_diameter, feed_rate, z_feed_rate, from_z, to_z, step_z, safety_z): r"""Generate Gcode to cut a rectangle Parameters ---------- x_dimension : float The dimension of the rectangle along the x axis y_dimension : float The dimension of the rectangle along the y axis feed_rate : float Feed rate in mm/min Note ---- The milling head travels CCW around the rectangle """ gcode = list() gcode.append(gcodes.g0_gcode(x=0, y=0, z=safety_z)) gcode.append(gcodes.g0_gcode(x=x_mini - tool_diameter / 2, y=y_mini - tool_diameter / 2)) for h in _generate_heights(from_z, to_z, step_z): gcode.append(gcodes.g1_gcode(z=h, feedrate=z_feed_rate)) gcode.append(gcodes.g1_gcode(x=x_mini + x_dimension + tool_diameter / 2, feedrate=feed_rate)) gcode.append(gcodes.g1_gcode(y=y_mini + y_dimension + tool_diameter / 2, feedrate=feed_rate)) gcode.append(gcodes.g1_gcode(x=x_mini-tool_diameter / 2, feedrate=feed_rate)) gcode.append(gcodes.g1_gcode(y=y_mini-tool_diameter / 2, feedrate=feed_rate)) gcode.append(gcodes.g1_gcode(z=safety_z, feedrate=feed_rate)) return ''.join(gcode)
def full_hole(x_center, y_center, hole_diameter, tool_diameter, feed_rate, z_feed_rate, from_z, to_z, step_z, safety_z, center_diameter=0.0): r"""Generate Gcode to cut a hole and remove the middle material If the hole diameter is bigger than 2 x tool_diameter the material in the center is removed """ if hole_diameter < tool_diameter: raise exceptions.WrongParameterError('Cannot make a hole smaller than the tool') gcode = list() gcode.append(gcodes.g0_gcode(z=safety_z)) # gcode.append(_g0_gcode(x=x_center-tool_diameter/2,y=y_center)) gcode.append(gcodes.g0_gcode(x=x_center - tool_diameter / 2, y=y_center)) for h in _generate_heights(from_z, to_z, step_z): gcode.append(gcodes.g1_gcode(z=h, feedrate=z_feed_rate)) for e in _generate_excentric(start=center_diameter/2.0, end=hole_diameter / 2, tool_diameter=tool_diameter): gcode.append(gcodes.g1_gcode(x=x_center-e, y=y_center, feedrate=feed_rate)) gcode.append(gcodes.g2_gcode(x_center_offset=e, y_center_offset=0, spiral_end_altitude=h, feedrate=feed_rate)) gcode.append(gcodes.g1_gcode(z=safety_z, feedrate=feed_rate)) return ''.join(gcode)
def thin(x_dimension, y_dimension, x_mini, y_mini, tool_diameter, feed_rate, z_feed_rate, from_z, to_z, step_z, safety_z): r"""Generate Gcode to remove some material from a region defined by the bottom left point of a rectangle and its dimensions It is intended to be used to make the stock thinner over a region before cutting a part from the thinned region """ x_center = x_mini + x_dimension / 2 y_center = y_mini+y_dimension / 2 gcode = list() gcode.append(gcodes.g0_gcode(x=0, y=0, z=safety_z)) gcode.append(gcodes.g0_gcode(x=x_center, y=y_center)) for h in _generate_heights(from_z, to_z, step_z): gcode.append(gcodes.g1_gcode(x=x_center, y=y_center, feedrate=feed_rate)) gcode.append(gcodes.g1_gcode(z=h, feedrate=z_feed_rate)) nb_turns = 0.00 # correction bug 25 SEP 2012 - parcours du perimètre exterieur sans prendre de matière # division par 2 de y_dimension dans l expression de la boucle while # while nb_turns/2*tool_diameter < x_dimension/2 or nb_turns/2*tool_diameter < y_dimension: while nb_turns / 2 * tool_diameter < x_dimension/2 or nb_turns / 2 * tool_diameter < y_dimension / 2: gcode.append(gcodes.g1_gcode(y=min(y_center + (nb_turns / 2 + 0.5) * tool_diameter, y_mini + y_dimension - tool_diameter / 2), feedrate=feed_rate)) gcode.append(gcodes.g1_gcode(x=min(x_center + (nb_turns / 2 + 0.5) * tool_diameter, x_mini + x_dimension - tool_diameter / 2), feedrate=feed_rate)) gcode.append(gcodes.g1_gcode(y=max(y_center - (nb_turns / 2 + 0.5) * tool_diameter, y_mini + tool_diameter / 2), feedrate=feed_rate)) gcode.append(gcodes.g1_gcode(x=max(x_center - (nb_turns / 2 + 0.5) * tool_diameter, x_mini + tool_diameter / 2), feedrate=feed_rate)) gcode.append(gcodes.g1_gcode(y=min(y_center + (nb_turns / 2 + 0.5) * tool_diameter, y_mini + y_dimension - tool_diameter / 2), feedrate=feed_rate)) gcode.append(gcodes.g1_gcode(x=x_center, feedrate=feed_rate)) nb_turns += 1.00 gcode.append(gcodes.g1_gcode(z=safety_z, feedrate=feed_rate)) return ''.join(gcode)
def rectangle_rounded_corners(x_center, y_center, x_dimension, y_dimension, corner_radius, tool_diameter, feed_rate, z_feed_rate, from_z, to_z, step_z, safety_z): r"""Generate Gcode to cut a rectangle with rounded corners Parameters ---------- x_dimension : float The dimension of the rectangle along the x axis y_dimension : float The dimension of the rectangle along the y axis feed_rate : float Feed rate in mm/min Note ---- The milling head travels CCW around the rectangle """ gcode = list() gcode.append(gcodes.g0_gcode(x=0, y=0, z=safety_z)) # go to start point (LOWER LEFT CORNER) gcode.append(gcodes.g0_gcode(x=x_center - x_dimension / 2 + corner_radius, y=y_center - y_dimension / 2 - tool_diameter / 2)) for h in _generate_heights(from_z, to_z, step_z): gcode.append(gcodes.g1_gcode(z=h, feedrate=z_feed_rate)) # LOWER EDGE gcode.append(gcodes.g1_gcode(x=x_center + x_dimension / 2 - corner_radius, feedrate=feed_rate)) # BOTTOM RIGHT CORNER gcode.append(gcodes.g3_gcode(x_end_point=x_center + x_dimension / 2 + tool_diameter / 2, y_end_point=y_center - y_dimension / 2 + corner_radius, x_center_offset=0.0, y_center_offset=corner_radius + tool_diameter / 2, spiral_end_altitude=h, feedrate=feed_rate)) # RIGHT EDGE gcode.append(gcodes.g1_gcode(y=y_center + y_dimension / 2 - corner_radius, feedrate=feed_rate)) # UPPER RIGHT CORNER gcode.append(gcodes.g3_gcode(x_end_point=x_center + x_dimension / 2 - corner_radius, y_end_point=y_center + y_dimension / 2 + tool_diameter / 2, x_center_offset=-corner_radius - tool_diameter / 2, y_center_offset=0.0, spiral_end_altitude=h, feedrate=feed_rate)) # TOP EDGE gcode.append(gcodes.g1_gcode(x=x_center - x_dimension / 2 + corner_radius, feedrate=feed_rate)) gcode.append(gcodes.g3_gcode(x_end_point=x_center - x_dimension / 2 - tool_diameter / 2, y_end_point=y_center + y_dimension / 2 - corner_radius, x_center_offset=0.0, y_center_offset=-corner_radius - tool_diameter / 2, spiral_end_altitude=h, feedrate=feed_rate)) gcode.append(gcodes.g1_gcode(y=y_center - y_dimension / 2 + corner_radius, feedrate=feed_rate)) gcode.append(gcodes.g3_gcode(x_end_point=x_center - x_dimension / 2 + corner_radius, y_end_point=y_center - y_dimension / 2 - tool_diameter / 2, x_center_offset=corner_radius + tool_diameter / 2, y_center_offset=0.0, spiral_end_altitude=h, feedrate=feed_rate)) gcode.append(gcodes.g1_gcode(z=safety_z, feedrate=feed_rate)) return ''.join(gcode)
def hole(x_center, y_center, hole_diameter, tool_diameter, feed_rate, from_z, to_z, step_z, safety_z): r"""Generate Gcode to cut a hole Note ---- If the hole diameter is bigger than 2 x tool_diameter the material in the center is not removed """ if hole_diameter < tool_diameter: raise exceptions.WrongParameterError('Cannot make a hole smaller than the tool') gcode = list() gcode.append(gcodes.g0_gcode(z=safety_z)) gcode.append(gcodes.g0_gcode(x=x_center - hole_diameter / 2 + tool_diameter / 2, y=y_center)) for h in _generate_heights(from_z, to_z, step_z): gcode.append(gcodes.g2_gcode(x_center_offset=hole_diameter / 2 - tool_diameter / 2, y_center_offset=0, spiral_end_altitude=h, feedrate=feed_rate)) gcode.append(gcodes.g1_gcode(z=safety_z, feedrate=feed_rate)) return ''.join(gcode)
def oval(x_center, y_center, x_width, y_height, tool_diameter, feed_rate, z_feed_rate, from_z, to_z, step_z, safety_z, angle=0.0): r"""Generate Gcode to cut an oval Parameters ---------- ... angle : float clockwise rotation angle ... """ point_center = Point(x_center, y_center) gcode = list() gcode.append(gcodes.g0_gcode(x=x_center, y=y_center, z=safety_z)) for h in _generate_heights(from_z, to_z, step_z): for d in _generate_excentric(0.00, y_height/2.0, tool_diameter): point_n = (Point(0.0, d) + point_center).rotate(point_center, angle) point_ne = (Point((x_width - y_height) / 2.0, d) + point_center).rotate(point_center, angle) point_e_arc_center = (Point((x_width-y_height)/2.0, 0.0) + point_center).rotate(point_center, angle) point_se = (Point((x_width - y_height) / 2.0, -d) + point_center).rotate(point_center, angle) point_sw = (Point(-(x_width-y_height)/2.0, -d) + point_center).rotate(point_center, angle) point_w_arc_center = (Point(-(x_width - y_height)/2.0, 0.0) + point_center).rotate(point_center, angle) point_nw = (Point(-(x_width - y_height)/2.0, d) + point_center).rotate(point_center, angle) gcode.append(gcodes.g1_gcode(z=h, feedrate=z_feed_rate)) gcode.append(gcodes.g1_gcode(x=point_n.x, y=point_n.y, feedrate=feed_rate)) gcode.append(gcodes.g1_gcode(x=point_ne.x, y=point_ne.y, feedrate=feed_rate)) gcode.append(gcodes.g2_gcode(x_end_point=point_se.x, y_end_point=point_se.y, spiral_end_altitude=h, x_center_offset=(point_e_arc_center - point_ne).x, y_center_offset=(point_e_arc_center - point_ne).y, feedrate=feed_rate)) gcode.append(gcodes.g1_gcode(x=point_sw.x, y=point_sw.y, feedrate=feed_rate)) gcode.append(gcodes.g2_gcode(x_end_point=point_nw.x, y_end_point=point_nw.y, spiral_end_altitude=h, x_center_offset=(point_w_arc_center - point_sw).x, y_center_offset=(point_w_arc_center - point_sw).y, feedrate=feed_rate)) gcode.append(gcodes.g1_gcode(x=point_n.x, y=point_n.y, feedrate=feed_rate)) gcode.append(gcodes.g1_gcode(z=safety_z, feedrate=feed_rate)) return ''.join(gcode)
def square_pocket(x_center, y_center, x_dimension, y_dimension, tool_diameter, feed_rate, z_feed_rate, from_z, to_z, step_z, safety_z): r"""Generate Gcode to dig a square and remove the middle material""" if x_dimension < tool_diameter or y_dimension < tool_diameter: raise exceptions.WrongParameterError('Cannot make a square pocket smaller than the tool') gcode = list() gcode.append(gcodes.g0_gcode(x=0, y=0, z=safety_z)) gcode.append(gcodes.g0_gcode(x=x_center, y=y_center)) x_absolute_maximum = x_center + x_dimension / 2 x_absolute_minimum = x_center - x_dimension / 2 x_maximum = x_absolute_maximum - tool_diameter / 2 x_minimum = x_absolute_minimum + tool_diameter / 2 y_maximum = y_center + y_dimension / 2 - tool_diameter / 2 y_minimum = y_center - y_dimension / 2 + tool_diameter / 2 path_to_follow = list() point1 = [x_center, y_maximum] point2 = [x_absolute_maximum, y_maximum] point3 = [x_maximum, y_maximum] point4 = [x_maximum, y_minimum] point5 = [x_absolute_maximum, y_minimum] point6 = [x_absolute_minimum, y_minimum] point7 = [x_minimum, y_minimum] point8 = [x_minimum, y_maximum] point9 = [x_absolute_minimum, y_maximum] path_to_follow.append(point1) path_to_follow.append(point2) path_to_follow.append(point3) path_to_follow.append(point4) path_to_follow.append(point5) path_to_follow.append(point6) path_to_follow.append(point7) path_to_follow.append(point8) path_to_follow.append(point9) path_to_follow.append(point1) for h in _generate_heights(from_z, to_z, step_z): gcode.append(gcodes.g1_gcode(x=x_center, y=y_center, feedrate=feed_rate)) gcode.append(gcodes.g1_gcode(z=h, feedrate=z_feed_rate)) nb_turns = 0.00 while nb_turns / 2 * tool_diameter < x_dimension / 2 or nb_turns / 2 * tool_diameter < y_dimension / 2.0: y_maxi = min(y_center + (nb_turns / 2 + 0.5) * tool_diameter, y_center + y_dimension / 2 - tool_diameter / 2) x_maxi = min(x_center + (nb_turns / 2 + 0.5) * tool_diameter, x_center + x_dimension / 2 - tool_diameter / 2) y_mini = max(y_center - (nb_turns / 2 + 0.5) * tool_diameter, y_center - y_dimension / 2 + tool_diameter / 2) x_mini = max(x_center - (nb_turns / 2 + 0.5) * tool_diameter, x_center - x_dimension / 2 + tool_diameter / 2) gcode.append(gcodes.g1_gcode(y=y_maxi, feedrate=feed_rate)) gcode.append(gcodes.g1_gcode(x=x_maxi, feedrate=feed_rate)) gcode.append(gcodes.g1_gcode(y=y_mini, feedrate=feed_rate)) gcode.append(gcodes.g1_gcode(x=x_mini, feedrate=feed_rate)) gcode.append(gcodes.g1_gcode(y=y_maxi, feedrate=feed_rate)) gcode.append(gcodes.g1_gcode(x=x_center, feedrate=feed_rate)) nb_turns += 1.00 # Cut the corners for point in path_to_follow: gcode.append(gcodes.g1_gcode(x=point[0], y=point[1], feedrate=feed_rate)) gcode.append(gcodes.g1_gcode(z=safety_z, feedrate=feed_rate)) return ''.join(gcode)