def create_tabcut_program(params, remove=False, pos_nums=None, contour=False):

    prog = gcode_cmd.GCodeProg()
    prog.add(gcode_cmd.GenericStart())
    prog.add(gcode_cmd.Space())
    prog.add(gcode_cmd.FeedRate(params['finishing']['feedrate']))

    safe_z = params['safe_z']

    tabcut_data = get_tabcut_data(params,
                                  remove=remove,
                                  pos_nums=pos_nums,
                                  contour=contour)

    for data in tabcut_data:
        tabcut_params = {
            'centerX': data['x'],
            'centerY': data['y'],
            'radius': data['radius'],
            'depth': data['depth'],
            'startZ': data['start_z'],
            'angles': data['angles'],
            'safeZ': params['safe_z'],
            'maxCutDepth': params['finishing']['step_size'],
            'toolDiam': params['finishing']['diam_tool'],
            'startDwell': params['start_dwell'],
        }
        arc = ArcRoutine(tabcut_params)
        prog.add(arc)

    prog.add(gcode_cmd.Space())
    prog.add(gcode_cmd.End(), comment=True)
    return prog
def create_alignment_drill(params):
    prog = gcode_cmd.GCodeProg()
    prog.add(gcode_cmd.GenericStart())
    prog.add(gcode_cmd.Space())
    prog.add(gcode_cmd.FeedRate(params['stockcut']['feedrate']))

    thickness = params['stockcut']['thickness']
    overcut = params['stockcut']['overcut']
    drill_step = params['stockcut']['drill_step']
    start_dwell = params['start_dwell']
    safe_z = params['safe_z']
    start_z = 0.0

    param = {
        'centerX': 0.0,
        'centerY': 0.0,
        'startZ': start_z,
        'stopZ': start_z - (thickness + 2 * overcut),
        'safeZ': safe_z,
        'stepZ': drill_step,
        'startDwell': start_dwell,
    }

    drill = cnc_drill.PeckDrill(param)
    prog.add(drill)

    prog.add(gcode_cmd.Space())
    prog.add(gcode_cmd.End(), comment=True)
    return prog
Exemple #3
0
def createNGCFile(display=False):
    standoffParam = param['standoffPocket']
    motorPocketParam = param['motorPocket']
    motorHoleParam = param['motorHole']
    boundaryParam = param['boundaryCut']

    prog = gcode_cmd.GCodeProg()
    prog.add(gcode_cmd.GenericStart())
    prog.add(gcode_cmd.Space())

    for x0, y0 in param['partPos']:

        # Standoff pockets
        prog.add(gcode_cmd.Comment('-' * 60))
        prog.add(
            gcode_cmd.Comment('Standoff pocket, partPos = ({0}, {1})'.format(
                x0, y0)))
        prog.add(gcode_cmd.Comment('-' * 60))
        prog.add(gcode_cmd.FeedRate(standoffParam['feedRate']))
        for i in (-1, 1):
            for j in (-1, 1):
                x = x0 + i * 0.5 * standoffParam['holeSpacing']
                y = y0 + j * 0.5 * standoffParam['holeSpacing']
                pocketDict = {
                    'centerX': x,
                    'centerY': y,
                    'radius': 0.5 * standoffParam['holeDiam'],
                    'depth': standoffParam['depth'],
                    'startZ': standoffParam['startZ'],
                    'safeZ': standoffParam['safeZ'],
                    'overlap': standoffParam['overlap'],
                    'overlapFinish': standoffParam['overlapFinish'],
                    'maxCutDepth': standoffParam['maxCutDepth'],
                    'toolDiam': standoffParam['toolDiam'],
                    'direction': standoffParam['direction'],
                    'startDwell': standoffParam['startDwell'],
                }

                pocket = cnc_pocket.CircPocketXY(pocketDict)
                prog.add(pocket)
                prog.add(gcode_cmd.Space())

    prog.add(gcode_cmd.End(), comment=True)
    baseName, ext = os.path.splitext(__file__)
    fileName = '{0}.ngc'.format(baseName)
    if display:
        print(prog)
    else:
        print('creating: {0}'.format(fileName))
    prog.write(fileName)
def create_stockcut_drill(params):
    prog = gcode_cmd.GCodeProg()
    prog.add(gcode_cmd.GenericStart())
    prog.add(gcode_cmd.Space())
    prog.add(gcode_cmd.FeedRate(params['stockcut']['feedrate']))

    thickness = params['stockcut']['thickness']
    overcut = params['stockcut']['overcut']
    diam_tool = params['stockcut']['diam_tool']
    step_size = params['stockcut']['step_size']
    start_dwell = params['start_dwell']
    drill_step = params['stockcut']['drill_step']
    drill_inset = params['stockcut']['drill_inset']
    safe_z = params['safe_z']
    start_z = 0.0

    pocket_data = get_stockcut_pocket_data(params)

    for data in pocket_data:
        for i in (-1, 1):
            for j in (-1, 1):
                cx = data['x'] + 0.5 * data['w'] + i * (0.5 * data['w'] -
                                                        drill_inset)
                cy = data['y'] + 0.5 * data['h'] + j * (0.5 * data['h'] -
                                                        drill_inset)

                param = {
                    'centerX': cx,
                    'centerY': cy,
                    'startZ': start_z,
                    'stopZ': start_z - (thickness + overcut),
                    'safeZ': safe_z,
                    'stepZ': drill_step,
                    'startDwell': start_dwell,
                }

                drill = cnc_drill.PeckDrill(param)
                prog.add(drill)

    prog.add(gcode_cmd.Space())
    prog.add(gcode_cmd.End(), comment=True)
    return prog
def create_jigcut_program(params):

    prog = gcode_cmd.GCodeProg()
    prog.add(gcode_cmd.GenericStart())
    prog.add(gcode_cmd.Space())
    prog.add(gcode_cmd.FeedRate(params['stockcut']['feedrate']))

    margin = params['jigcut']['margin']
    depth = params['jigcut']['depth']
    safe_z = params['safe_z']
    step_size = params['jigcut']['step_size']
    diam_tool = params['jigcut']['diam_tool']
    start_dwell = params['start_dwell']
    dx = params['stockcut']['cut_sheet_x'] + margin
    dy = params['stockcut']['cut_sheet_y'] + margin

    cx = 0.5 * dx
    cy = 0.5 * dy

    param = {
        'centerX': cx,
        'centerY': cy,
        'width': dx,
        'height': dy,
        'depth': depth,
        'startZ': 0.0,
        'safeZ': safe_z,
        'overlap': 0.5,
        'overlapFinish': 0.5,
        'maxCutDepth': step_size,
        'toolDiam': diam_tool,
        'cornerCut': True,
        'direction': 'ccw',
        'startDwell': start_dwell,
    }
    pocket = cnc_pocket.RectPocketXY(param)
    prog.add(pocket)

    prog.add(gcode_cmd.Space())
    prog.add(gcode_cmd.End(), comment=True)
    return prog
def create_stockcut_program(params):

    prog = gcode_cmd.GCodeProg()
    prog.add(gcode_cmd.GenericStart())
    prog.add(gcode_cmd.Space())
    prog.add(gcode_cmd.FeedRate(params['stockcut']['feedrate']))

    thickness = params['stockcut']['thickness']
    overcut = params['stockcut']['overcut']
    diam_tool = params['stockcut']['diam_tool']
    step_size = params['stockcut']['step_size']
    start_dwell = params['start_dwell']
    start_z = 0.0
    safe_z = params['safe_z']

    pocket_data = get_stockcut_pocket_data(params)

    for data in pocket_data:
        param = {
            'centerX': data['x'] + 0.5 * data['w'],
            'centerY': data['y'] + 0.5 * data['h'],
            'width': data['w'],
            'height': data['h'],
            'depth': thickness + overcut,
            'radius': None,
            'startZ': start_z,
            'safeZ': safe_z,
            'toolDiam': diam_tool,
            'cutterComp': 'outside',
            'direction': 'ccw',
            'maxCutDepth': step_size,
            'startDwell': start_dwell,
        }
        boundary = cnc_boundary.RectBoundaryXY(param)
        prog.add(boundary)

    prog.add(gcode_cmd.Space())
    prog.add(gcode_cmd.End(), comment=True)
    return prog
Exemple #7
0
def createNGCFile(display=False):
    motorParam = param['motorDrill']

    prog = gcode_cmd.GCodeProg()
    prog.add(gcode_cmd.GenericStart())
    prog.add(gcode_cmd.Space())

    # Motor mount holes
    for x0, y0 in param['partPos']:
        prog.add(gcode_cmd.Comment('-' * 60))
        prog.add(
            gcode_cmd.Comment('Motor mount holes, partPos = ({0},{1})'.format(
                x0, y0)))
        prog.add(gcode_cmd.Comment('-' * 60))
        prog.add(gcode_cmd.FeedRate(motorParam['feedRate']))
        for i in (-1, 1):
            x = x0 + i * 0.5 * motorParam['holeSpacing']
            drillDict = {
                'centerX': x,
                'centerY': y0,
                'startZ': motorParam['startZ'],
                'stopZ': motorParam['stopZThru'],
                'safeZ': motorParam['safeZ'],
                'stepZ': motorParam['stepZ'],
                'startDwell': motorParam['startDwell'],
            }
            drill = cnc_drill.PeckDrill(drillDict)
            prog.add(drill)
            prog.add(gcode_cmd.Space())

    prog.add(gcode_cmd.End(), comment=True)
    baseName, ext = os.path.splitext(__file__)
    fileName = '{0}.ngc'.format(baseName)
    if display:
        print(prog)
    else:
        print('creating: {0}'.format(fileName))
    prog.write(fileName)
Exemple #8
0
def createNGCFile(display=False):
    surfaceParam = param['surface']

    prog = gcode_cmd.GCodeProg()
    prog.add(gcode_cmd.GenericStart())
    prog.add(gcode_cmd.Space())

    # Standoff holes
    prog.add(gcode_cmd.Comment('-' * 60))
    prog.add(gcode_cmd.Comment("Surface"))
    prog.add(gcode_cmd.Comment('-' * 60))
    prog.add(gcode_cmd.FeedRate(surfaceParam['feedRate']))
    pocket = cnc_pocket.RectPocketXY(surfaceParam)
    prog.add(pocket)

    prog.add(gcode_cmd.End(), comment=True)
    baseName, ext = os.path.splitext(__file__)
    fileName = '{0}.ngc'.format(baseName)
    if display:
        print(prog)
    else:
        print('creating: {0}'.format(fileName))
    prog.write(fileName)
def create_finishing_program(params):

    prog = gcode_cmd.GCodeProg()
    prog.add(gcode_cmd.GenericStart())
    prog.add(gcode_cmd.Space())
    prog.add(gcode_cmd.FeedRate(params['finishing']['feedrate']))

    pos_list = pocket_centers(params)
    toolpath_params = {
        'diam_sphere': params['diam_sphere'],
        'diam_tool': params['finishing']['diam_tool'],
        'margin': params['finishing']['margin'],
        'step_size': params['finishing']['step_size'],
        'tab_thickness': params['tab_thickness'],
        'center_z': params['center_z'],
    }
    toolpath_annulus_data = ball_endmill.get_toolpath_annulus_data(
        toolpath_params)

    for pos in pos_list:
        start_z = toolpath_annulus_data[0]['step_z'] + params['roughing'][
            'margin']
        routine_params = {
            'centerX': pos['x'],
            'centerY': pos['y'],
            'startZ': start_z,
            'safeZ': params['safe_z'],
            'startDwell': params['start_dwell'],
            'toolpathData': toolpath_annulus_data,
            'direction': 'ccw',
        }
        routine = SphereFinishingRoutine(routine_params)
        prog.add(routine)

    prog.add(gcode_cmd.Space())
    prog.add(gcode_cmd.End(), comment=True)
    return prog
Exemple #10
0
def createNGCFile(display=False):
    standoffParam = param['standoffDrill']

    prog = gcode_cmd.GCodeProg()
    prog.add(gcode_cmd.GenericStart())
    prog.add(gcode_cmd.Space())

    # Standoff holes
    prog.add(gcode_cmd.Comment("Standoff holes"))
    prog.add(gcode_cmd.FeedRate(standoffParam['feedRate']))
    for x0, y0 in param['partPos']:
        for i in (-1, 1):
            for j in (-1, 1):
                x = x0 + i * 0.5 * standoffParam['holeSpacing']
                y = y0 + j * 0.5 * standoffParam['holeSpacing']
                drillDict = {
                    'centerX': x,
                    'centerY': y,
                    'startZ': standoffParam['startZ'],
                    'stopZ': standoffParam['stopZThru'],
                    'safeZ': standoffParam['safeZ'],
                    'stepZ': standoffParam['stepZ'],
                    'startDwell': standoffParam['startDwell'],
                }
                drill = cnc_drill.PeckDrill(drillDict)
                prog.add(drill)
                prog.add(gcode_cmd.Space())

    prog.add(gcode_cmd.End(), comment=True)
    baseName, ext = os.path.splitext(__file__)
    fileName = '{0}.ngc'.format(baseName)
    if display:
        print(prog)
    else:
        print('creating: {0}'.format(fileName))
    prog.write(fileName)
Exemple #11
0
feedrate = 150.0
fileName = 'bottom_in.dxf'
finishDepth = 0.56
roughDepth = 0.5
startZ = 0.0
safeZ = 0.5
maxCutDepth = 0.05
toolDiam = 0.5
direction = 'ccw'
cutterComp = 'outside'
startDwell = 1.0
startCond = 'minX'

prog = gcode_cmd.GCodeProg()
prog.add(gcode_cmd.GenericStart())
prog.add(gcode_cmd.Space())
prog.add(gcode_cmd.FeedRate(feedrate))

prog.add(gcode_cmd.PathBlendMode(P=0.01))

roughParam = {
    'fileName': fileName,
    'layers': ['rough_boundary'],
    'depth': roughDepth,
    'startZ': startZ,
    'safeZ': safeZ,
    'toolDiam': toolDiam,
    'direction': direction,
    'cutterComp': cutterComp,
    'maxCutDepth': maxCutDepth,
def create_roughing_program(params):

    prog = gcode_cmd.GCodeProg()
    prog.add(gcode_cmd.GenericStart())
    prog.add(gcode_cmd.Space())
    prog.add(gcode_cmd.FeedRate(params['roughing']['feedrate']))

    pos_list = pocket_centers(params)
    toolpath_params = {
        'diam_sphere': params['diam_sphere'],
        'diam_tool': params['roughing']['diam_tool'],
        'margin': params['roughing']['margin'],
        'step_size': params['roughing']['step_size'],
        'tab_thickness': params['tab_thickness'],
        'center_z': params['center_z'],
    }
    toolpath_annulus_data = flat_endmill.get_toolpath_annulus_data(
        toolpath_params)

    toolpath_radii = [data['radius'] for data in toolpath_annulus_data]
    max_radius = max(toolpath_radii) + 0.5 * params['roughing']['diam_tool']
    first_step_z = toolpath_annulus_data[0]['step_z']

    for pos in pos_list:
        # Remove material down to first step
        annulus_params = {
            'centerX': pos['x'],
            'centerY': pos['y'],
            'radius': max_radius,
            'thickness': max_radius,
            'depth': abs(first_step_z),
            'startZ': 0.0,
            'safeZ': params['safe_z'],
            'overlap': 0.5,
            'overlapFinish': 0.5,
            'maxCutDepth': params['roughing']['step_size'],
            'toolDiam': params['roughing']['diam_tool'],
            'direction': 'ccw',
            'startDwell': params['start_dwell'],
        }
        pocket = cnc_pocket.CircAnnulusPocketXY(annulus_params)
        prog.add(pocket)

        # Rough out half sphere pocket
        last_step_z = first_step_z
        for data in toolpath_annulus_data:

            thickness = min(
                max_radius, max_radius -
                (data['radius'] - 0.5 * params['roughing']['diam_tool']))
            if abs(thickness - params['roughing']['diam_tool']) < 1.0e-9:
                thickness = params['roughing']['diam_tool']

            annulus_params = {
                'centerX': pos['x'],
                'centerY': pos['y'],
                'radius': max_radius,
                'thickness': thickness,
                'depth': abs(data['step_z']) - abs(last_step_z),
                'startZ': last_step_z,
                'safeZ': params['safe_z'],
                'overlap': 0.5,
                'overlapFinish': 0.5,
                'maxCutDepth': params['roughing']['step_size'],
                'toolDiam': params['roughing']['diam_tool'],
                'direction': 'ccw',
                'startDwell': params['start_dwell'],
            }
            pocket = cnc_pocket.CircAnnulusPocketXY(annulus_params)
            prog.add(pocket)
            last_step_z = data['step_z']

        # Final cut at sphere boundary to remove chamfer
        thickness = params['roughing']['diam_tool']
        radius = 0.5 * params['diam_sphere'] + thickness
        start_z = toolpath_annulus_data[-2]['step_z']
        stop_z = toolpath_annulus_data[-1]['step_z']
        annulus_params = {
            'centerX': pos['x'],
            'centerY': pos['y'],
            'radius': radius,
            'thickness': thickness,
            'depth': abs(stop_z - start_z),
            'startZ': start_z,
            'safeZ': params['safe_z'],
            'overlap': 0.5,
            'overlapFinish': 0.5,
            'maxCutDepth': params['roughing']['step_size'],
            'toolDiam': params['roughing']['diam_tool'],
            'direction': 'ccw',
            'startDwell': params['start_dwell'],
        }
        pocket = cnc_pocket.CircAnnulusPocketXY(annulus_params)
        prog.add(pocket)

    prog.add(gcode_cmd.Space())
    prog.add(gcode_cmd.End(), comment=True)
    return prog
Exemple #13
0
def createNGCFile(display=False):
    standoffParam = param['standoffPocket']
    motorPocketParam = param['motorPocket']
    motorHoleParam = param['motorHole']
    boundaryParam = param['boundaryCut']
    
    prog = gcode_cmd.GCodeProg()
    prog.add(gcode_cmd.GenericStart())
    prog.add(gcode_cmd.Space())
    
    for x0, y0 in param['partPos']:
    
        # Motor pocket
        prog.add(gcode_cmd.Comment('-'*60))
        prog.add(gcode_cmd.Comment('Motor pocket, partPos = ({0}, {1})'.format(x0,y0)))
        prog.add(gcode_cmd.Comment('-'*60))
        prog.add(gcode_cmd.FeedRate(motorPocketParam['feedRate']))
        pocketDict = dict(motorPocketParam)
        pocketDict['centerX'] = x0
        pocketDict['centerY'] = y0
        pocket = cnc_pocket.CircPocketXY(pocketDict)
        prog.add(pocket)
    
        # Motor hole
        prog.add(gcode_cmd.FeedRate(motorHoleParam['feedRate']))
        prog.add(gcode_cmd.Comment('-'*60))
        prog.add(gcode_cmd.Comment('Motor hole, partPos = ({0}, {1})'.format(x0,y0)))
        prog.add(gcode_cmd.Comment('-'*60))
        holeDict = dict(motorHoleParam)
        holeDict['centerX'] = x0
        holeDict['centerY'] = y0
        pocket = cnc_pocket.CircPocketXY(holeDict)
        prog.add(pocket)

        # Boundary cut
        prog.add(gcode_cmd.FeedRate(boundaryParam['feedRate']))
        prog.add(gcode_cmd.Comment('-'*60))
        prog.add(gcode_cmd.Comment('Boundary cut norm, partPos = ({0}, {1})'.format(x0,y0)))
        prog.add(gcode_cmd.Comment('-'*60))
        boundaryDict = dict(boundaryParam)
        boundaryDict['centerX'] = x0
        boundaryDict['centerY'] = y0
        boundaryDict['depth'] = boundaryParam['normDepth']
        boundaryDict['maxCutDepth'] = boundaryParam['normMaxCutDepth']
        boundaryDict['startZ'] = boundaryParam['normStartZ']
        pocket = cnc_pocket.RectAnnulusPocketXY(boundaryDict)
        prog.add(pocket)

        prog.add(gcode_cmd.Comment('-'*60))
        prog.add(gcode_cmd.Comment('Boundary cut sep, partPos = ({0}, {1})'.format(x0,y0)))
        prog.add(gcode_cmd.Comment('-'*60))
        boundaryDict = dict(boundaryParam)
        boundaryDict['centerX'] = x0
        boundaryDict['centerY'] = y0
        boundaryDict['depth'] = boundaryParam['sepDepth'] - boundaryParam['normDepth']
        boundaryDict['maxCutDepth'] = boundaryParam['sepMaxCutDepth']
        boundaryDict['startZ'] = -boundaryParam['normDepth']
        pocket = cnc_pocket.RectAnnulusPocketXY(boundaryDict)
        prog.add(pocket)

    prog.add(gcode_cmd.End(),comment=True)
    baseName, ext = os.path.splitext(__file__)
    fileName = '{0}.ngc'.format(baseName)
    if display:
        print(prog)
    else:
        print('creating: {0}'.format(fileName))
    prog.write(fileName)
Exemple #14
0
y0 = -0.1
y1 = 1.7

z0 = 0
z1 = -0.3

step = 0.03
retDist = 0.1

startDwell = 2.0
coordSystem = 1
feedrate = 20.0

prog = gcode_cmd.GCodeProg()
prog.add(gcode_cmd.GenericStart(coord=coordSystem, feedrate=feedrate))

for x, sgn in zip(xList, sgnList):

    if sgn == '+':
        xCut = x - 0.5 * endMillDiam
        xRet = x - 0.5 * endMillDiam - retDist
        y0Mod, y1Mod = y1, y0
    else:
        xCut = x + 0.5 * endMillDiam
        xRet = x + 0.5 * endMillDiam + retDist
        y0Mod, y1Mod = y0, y1

    print(xCut)

    prog.add(gcode_cmd.Space())