Last active
August 29, 2015 14:17
-
-
Save pablinhob/3d20315384e870e80126 to your computer and use it in GitHub Desktop.
BoardCad multiple layers deck
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| """ | |
| G-code generation for the deck | |
| """ | |
| import boardcad.gui.jdk.BoardCAD | |
| import boardcam.cutters.FlatCutter | |
| import boardcam.cutters.STLCutter | |
| import boardcam.BoardMachine | |
| import cadcore.NurbsPoint | |
| from javax.swing import * | |
| import math | |
| # Read machine configuration from shapebot.properties | |
| prerough_space = 10 | |
| rough_space = 0.08 | |
| rough_margins = 100 | |
| # Bock Blank | |
| blankHeigh = 85 | |
| utilCut = 20 | |
| startLevel = 3 | |
| def blankHeighTop( zValue, level ): | |
| finalzValue = zValue + (utilCut * level) | |
| retval = finalzValue | |
| if(finalzValue > blankHeigh): | |
| retval = False | |
| return retval | |
| machine=boardcam.BoardMachine() | |
| machine.read_machine_data() | |
| width_steps=machine.deckCuts | |
| length_steps=50 | |
| filename=machine.deckFileName | |
| zmax=machine.zMaxHeight | |
| feedrate=machine.speed | |
| feedrate_stringer=machine.stringerSpeed | |
| feedrate_outline=machine.outlineSpeed | |
| supportEnd=machine.endSupportPosition | |
| supportEndX=supportEnd[0] | |
| supportEndY=supportEnd[1] | |
| supportEndZ=supportEnd[2] | |
| cut_stringer = machine.cutStringer | |
| stringer_offset = machine.stringerOffset | |
| stringerOffsetZ=[10, 5, 0] | |
| stringerCutoff=machine.stringerCutoff | |
| outlineOffsetZ=[] | |
| outlineOffsetY=machine.outlineOffset | |
| # Create a cutter | |
| cutter=boardcam.cutters.FlatCutter() | |
| cutter.setRadius(10.0) | |
| #cutter=boardcam.cutters.STLCutter() | |
| #cutter.init(machine.toolName) | |
| #cutter.scale(1.0,1.0,1.0) | |
| # Get the deck surface from BoardCAD | |
| boardhandler=boardcad.gui.jdk.BoardCAD.getInstance().getBoardHandler() | |
| board=boardhandler.getActiveBoard(); | |
| deck=board.getDeck() | |
| # find parameter value for outline | |
| max_width = 0.0 | |
| t=deck.getMinT() | |
| p = deck.getPoint((deck.getMaxS()-deck.getMinS())/2, t) | |
| while (max_width - math.fabs(p.z) <= 0): | |
| t=t+0.01 | |
| p = deck.getPoint((deck.getMaxS()-deck.getMinS())/2, t) | |
| if (math.fabs(p.z) > max_width): | |
| max_width = math.fabs(p.z) | |
| t_outline=t | |
| # Calculate step length | |
| width_step=((deck.getMaxT()-deck.getMinT())/2-t_outline-0.01)/width_steps | |
| length_step=(deck.getMaxS()-deck.getMinS())/length_steps | |
| # calculate tool path stringer | |
| stringer_cut=[] | |
| s=deck.getMaxS() | |
| t=(deck.getMaxT()-deck.getMinT())/2 | |
| p=deck.getPoint(s,t) | |
| p=cutter.calcOffset(p,cadcore.NurbsPoint(1,0,0)) | |
| stringer_cut.append(p) | |
| while (s>deck.getMinS()): | |
| p=deck.getPoint(s,t) | |
| n=deck.getNormal(s,t) | |
| p=cutter.calcOffset(p,n) | |
| stringer_cut.append(p) | |
| s=s-length_step | |
| s=deck.getMinS() | |
| p=deck.getPoint(s,t) | |
| p=cutter.calcOffset(p,cadcore.NurbsPoint(-1,0,0)) | |
| stringer_cut.append(p) | |
| # calculate tool path outline | |
| outline_cut=[] | |
| t=t_outline | |
| s=deck.getMinS() | |
| while (s<deck.getMaxS()): | |
| p=deck.getPoint(s,t) | |
| n=deck.getNormal(s,t) | |
| p=cutter.calcOffset(p,n) | |
| outline_cut.append(p) | |
| s=s+length_step | |
| # calculate tool path deck | |
| deck_cut=[] | |
| s=deck.getMinS(); | |
| t=(deck.getMaxT()-deck.getMinT())/2-00.1 | |
| while (t>t_outline): | |
| while (s<deck.getMaxS()): | |
| p=deck.getPoint(s,t) | |
| n=deck.getNormal(s,t) | |
| p=cutter.calcOffset(p,n) | |
| deck_cut.append(p) | |
| s=s+length_step | |
| t=t-width_step | |
| while (s>deck.getMinS()): | |
| p=deck.getPoint(s,t) | |
| n=deck.getNormal(s,t) | |
| p=cutter.calcOffset(p,n) | |
| deck_cut.append(p) | |
| s=s-length_step | |
| t=t-width_step | |
| # calculate tool path rough | |
| rough_cut=[] | |
| ''' | |
| prerough_space = 10 | |
| rough_space = 0.08 | |
| rough_margins = 100 | |
| distance_from_rough = 20 | |
| ''' | |
| currentLevel = startLevel | |
| while( currentLevel >= 0 ): | |
| s=deck.getMinS(); | |
| t=(deck.getMaxT()-deck.getMinT())/2-00.1 | |
| # ROUGH pre deck | |
| p_ini = deck.getPoint(s,t) | |
| final_p_ini_x = p_ini.x | |
| distancia_rough_inicial = rough_margins * 3/2 | |
| p_ini.x = p_ini.x - rough_margins+prerough_space | |
| current_p_ini_x = p_ini.x | |
| #rough_cut.append(p_ini) | |
| while ( current_p_ini_x + prerough_space*2 <= final_p_ini_x): | |
| p_ini = deck.getPoint(s,t) | |
| current_p_ini_x = current_p_ini_x + prerough_space | |
| p_ini.x = current_p_ini_x | |
| rough_cut.append(p_ini) | |
| p_ini = deck.getPoint(s,t) | |
| p_ini.z = distancia_rough_inicial | |
| p_ini.x = current_p_ini_x | |
| rough_cut.append(p_ini) | |
| p_ini = deck.getPoint(s,t) | |
| current_p_ini_x = current_p_ini_x + prerough_space | |
| p_ini.z = distancia_rough_inicial | |
| p_ini.x = current_p_ini_x | |
| rough_cut.append(p_ini) | |
| p_ini = deck.getPoint(s,t) | |
| p_ini.z = 0 | |
| p_ini.x = current_p_ini_x | |
| rough_cut.append(p_ini) | |
| anterior_pz = 0 | |
| # ROUGH the deck | |
| while (s<deck.getMaxS()): | |
| p=deck.getPoint(s,t) | |
| n=deck.getNormal(s,t) | |
| p=cutter.calcOffset(p,n) | |
| p.z = 0 | |
| altura = p.y | |
| anterior_pz = 0 | |
| rough_cut.append(p) | |
| s=s+rough_space | |
| p=deck.getPoint(s,t) | |
| n=deck.getNormal(s,t) | |
| p=cutter.calcOffset(p,n) | |
| p.z = 0 | |
| rough_cut.append(p) | |
| p=deck.getPoint(s,0) | |
| n=deck.getNormal(s,0) | |
| p=cutter.calcOffset(p,n) | |
| p.y=altura | |
| rough_cut.append(p) | |
| p.z = p.z +rough_margins | |
| s=s+rough_space | |
| p=deck.getPoint(s,0) | |
| n=deck.getNormal(s,0) | |
| p=cutter.calcOffset(p,n) | |
| p.y=altura | |
| p.z = p.z +rough_margins | |
| rough_cut.append(p) | |
| # ROUGH post deck | |
| currentLevel = currentLevel - 1 | |
| # Avoid stringer collision | |
| if(cut_stringer==0): | |
| stringerOffsetZ=[] | |
| for p in outline_cut: | |
| if(p.z<stringer_offset): | |
| p.z=stringer_offset | |
| for p in deck_cut: | |
| if(p.z<stringer_offset): | |
| p.z=stringer_offset | |
| # Write g-code | |
| toolpath=[] | |
| f=open(filename, 'w') | |
| zsafe='g0 Z%d\n' %(zmax) | |
| f.write('(cutting stringer)\n') | |
| p=stringer_cut[0] | |
| for offsetZ in stringerOffsetZ: | |
| f.write(zsafe) | |
| toolpath.append(cadcore.NurbsPoint(p.x,zmax-supportEndZ,0.0)) | |
| p=stringer_cut[0] | |
| f.write('g0 Y%.3f X%.3f\n' % (p.x+supportEndX, supportEndY)) | |
| toolpath.append(cadcore.NurbsPoint(p.x,zmax-supportEndZ,0.0)) | |
| f.write('g1 Y%.3f Z%.3f F%d\n' % (p.x+supportEndX, p.y+supportEndZ+offsetZ-stringerCutoff, feedrate_stringer)) | |
| toolpath.append(cadcore.NurbsPoint(p.x,p.y+offsetZ-stringerCutoff,0.0)) | |
| for p in stringer_cut: | |
| f.write('g1 Y%.3f Z%.3f\n' % (p.x+supportEndX, p.y+supportEndZ+offsetZ)) | |
| toolpath.append(cadcore.NurbsPoint(p.x,p.y+offsetZ,0.0)) | |
| f.write('g1 Y%.3f Z%.3f\n' % (p.x+supportEndX, p.y+supportEndZ+offsetZ-stringerCutoff)) | |
| toolpath.append(cadcore.NurbsPoint(p.x,p.y+offsetZ-stringerCutoff,0.0)) | |
| for offsetZ in outlineOffsetZ: | |
| f.write('(cutting outline right)\n') | |
| f.write(zsafe) | |
| toolpath.append(cadcore.NurbsPoint(p.x,zmax-supportEndZ,0.0)) | |
| p=outline_cut[0] | |
| f.write('g0 Y%.3f X%.3f\n' % (p.x+supportEndX, -p.z+supportEndY-outlineOffsetY-200)) | |
| toolpath.append(cadcore.NurbsPoint(p.x,zmax-supportEndZ,-p.z-outlineOffsetY-200)) | |
| f.write('g1 Y%.3f X%.3f Z%.3f F%d\n' % (p.x+supportEndX, -p.z+supportEndY-outlineOffsetY-200, p.y+supportEndZ+offsetZ, feedrate_outline)) | |
| toolpath.append(cadcore.NurbsPoint(p.x,p.y+offsetZ,-p.z-outlineOffsetY-200)) | |
| mycount=0 | |
| for p in outline_cut: | |
| mycount=mycount+1 | |
| f.write('g1 Y%.3f X%.3f Z%.3f\n' % (p.x+supportEndX, -p.z+supportEndY-outlineOffsetY, p.y+supportEndZ+offsetZ)) | |
| toolpath.append(cadcore.NurbsPoint(p.x,p.y+offsetZ,-p.z-outlineOffsetY)) | |
| f.write('g1 Y%.3f X%.3f Z%.3f\n' % (p.x+supportEndX, -p.z+supportEndY-outlineOffsetY-200, p.y+supportEndZ+offsetZ)) | |
| toolpath.append(cadcore.NurbsPoint(p.x,p.y+offsetZ,-p.z-outlineOffsetY-200)) | |
| f.write('(cutting outline left)\n') | |
| f.write(zsafe) | |
| toolpath.append(cadcore.NurbsPoint(p.x,zmax-supportEndZ,-p.z-outlineOffsetY-200)) | |
| p=outline_cut[mycount-1] | |
| f.write('g0 Y%.3f X%.3f\n' % (p.x+supportEndX, p.z+supportEndY+outlineOffsetY+200)) | |
| toolpath.append(cadcore.NurbsPoint(p.x,zmax-supportEndZ, p.z-outlineOffsetY+200)) | |
| f.write('g1 Y%.3f X%.3f Z%.3f\n' % (p.x+supportEndX, p.z+supportEndY+outlineOffsetY+200, p.y+supportEndZ+offsetZ)) | |
| toolpath.append(cadcore.NurbsPoint(p.x, p.y+offsetZ, p.z-outlineOffsetY+200)) | |
| for i in range(mycount): | |
| p=outline_cut[mycount-i-1] | |
| f.write('g1 Y%.3f X%.3f Z%.3f\n' % (p.x+supportEndX, p.z+supportEndY+outlineOffsetY, p.y+supportEndZ+offsetZ)) | |
| toolpath.append(cadcore.NurbsPoint(p.x, p.y+offsetZ,p.z-outlineOffsetY)) | |
| f.write('g1 Y%.3f X%.3f Z%.3f\n' % (p.x+supportEndX, p.z+supportEndY+outlineOffsetY+200, p.y+supportEndZ+offsetZ)) | |
| toolpath.append(cadcore.NurbsPoint(p.x, p.y+offsetZ, p.z-outlineOffsetY+200)) | |
| toolpath.append(cadcore.NurbsPoint(p.x, zmax-supportEndZ, p.z-outlineOffsetY+200)) | |
| f.write(zsafe) | |
| f.write('(cutting rough right)\n'); | |
| p=rough_cut[0] | |
| f.write('g0 Y%.3f X%.3f\n' % (p.x+supportEndX, -p.z+supportEndY)) | |
| toolpath.append(cadcore.NurbsPoint(p.x, zmax-supportEndZ, p.z)) | |
| f.write('g1 Y%.3f X%.3f Z%.3f F%d\n' % (p.x+supportEndX, -p.z+supportEndY, p.y+supportEndZ, feedrate)) | |
| toolpath.append(cadcore.NurbsPoint(p.x, p.y, -p.z)) | |
| for p in rough_cut: | |
| f.write('g1 Y%.3f X%.3f Z%.3f\n' % (p.x+supportEndX, -p.z+supportEndY, p.y+supportEndZ)) | |
| toolpath.append(cadcore.NurbsPoint(p.x, p.y, -p.z)) | |
| f.write(zsafe) | |
| toolpath.append(cadcore.NurbsPoint(p.x, zmax-supportEndZ, -p.z)) | |
| f.write('(cutting rough left)\n'); | |
| p=rough_cut[0] | |
| f.write('g0 Y%.3f X%.3f\n' % (p.x+supportEndX, p.z+supportEndY)) | |
| toolpath.append(cadcore.NurbsPoint(p.x, zmax-supportEndZ, p.z)) | |
| f.write('g1 Y%.3f X%.3f Z%.3f F%d\n' % (p.x+supportEndX, p.z+supportEndY, p.y+supportEndZ, feedrate)) | |
| toolpath.append(cadcore.NurbsPoint(p.x, p.y, p.z)) | |
| for p in rough_cut: | |
| f.write('g1 Y%.3f X%.3f Z%.3f\n' % (p.x+supportEndX, p.z+supportEndY, p.y+supportEndZ)) | |
| toolpath.append(cadcore.NurbsPoint(p.x, p.y, p.z)) | |
| f.write(zsafe) | |
| f.write('(cutting deck right)\n'); | |
| p=deck_cut[0] | |
| f.write('g0 Y%.3f X%.3f\n' % (p.x+supportEndX, -p.z+supportEndY)) | |
| toolpath.append(cadcore.NurbsPoint(p.x, zmax-supportEndZ, p.z)) | |
| f.write('g1 Y%.3f X%.3f Z%.3f F%d\n' % (p.x+supportEndX, -p.z+supportEndY, p.y+supportEndZ, feedrate)) | |
| toolpath.append(cadcore.NurbsPoint(p.x, p.y, -p.z)) | |
| for p in deck_cut: | |
| f.write('g1 Y%.3f X%.3f Z%.3f\n' % (p.x+supportEndX, -p.z+supportEndY, p.y+supportEndZ)) | |
| toolpath.append(cadcore.NurbsPoint(p.x, p.y, -p.z)) | |
| f.write(zsafe) | |
| toolpath.append(cadcore.NurbsPoint(p.x, zmax-supportEndZ, -p.z)) | |
| f.write('(cutting deck left)\n'); | |
| p=deck_cut[0] | |
| f.write('g0 Y%.3f X%.3f\n' % (p.x+supportEndX, p.z+supportEndY)) | |
| toolpath.append(cadcore.NurbsPoint(p.x, zmax-supportEndZ, p.z)) | |
| f.write('g1 Y%.3f X%.3f Z%.3f F%d\n' % (p.x+supportEndX, p.z+supportEndY, p.y+supportEndZ, feedrate)) | |
| toolpath.append(cadcore.NurbsPoint(p.x, p.y, p.z)) | |
| for p in deck_cut: | |
| f.write('g1 Y%.3f X%.3f Z%.3f\n' % (p.x+supportEndX, p.z+supportEndY, p.y+supportEndZ)) | |
| toolpath.append(cadcore.NurbsPoint(p.x, p.y, p.z)) | |
| f.write(zsafe) | |
| toolpath.append(cadcore.NurbsPoint(p.x, zmax-supportEndZ, p.z)) | |
| f.write("M2"); | |
| f.close() | |
| # Visualize toolpath in BoardCAD | |
| i=0 | |
| for p in toolpath: | |
| machine.deck_cut[i]=p; | |
| i=i+1 | |
| machine.nr_of_cuts_deck=i | |
| JOptionPane.showMessageDialog(None, "Finished g-code generation") | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment