コード例 #1
0
ファイル: core.py プロジェクト: BryceSchroeder/pycnc
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)
コード例 #2
0
ファイル: core.py プロジェクト: BryceSchroeder/pycnc
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)
コード例 #3
0
ファイル: core.py プロジェクト: BryceSchroeder/pycnc
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)
コード例 #4
0
ファイル: core.py プロジェクト: BryceSchroeder/pycnc
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)
コード例 #5
0
ファイル: core.py プロジェクト: BryceSchroeder/pycnc
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)
コード例 #6
0
ファイル: core.py プロジェクト: BryceSchroeder/pycnc
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)
コード例 #7
0
ファイル: core.py プロジェクト: BryceSchroeder/pycnc
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)
コード例 #8
0
ファイル: core.py プロジェクト: BryceSchroeder/pycnc
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)
コード例 #9
0
ファイル: core.py プロジェクト: BryceSchroeder/pycnc
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)