Created
February 3, 2015 10:14
-
-
Save bmcage/a6c6b234911971bc390a to your computer and use it in GitHub Desktop.
This file contains 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
// title: Lasercut box | |
// author: Benny Malengier | |
// license: MIT License | |
var openlid = true; // "Create an box with no lid, so open at top") | |
var width = 100; // "Width of the box in mm. Default 100mm") | |
var heigth = 100; // "Height of the box in mm. Default 100mm") | |
var depth = 50; // "Depth of the box in mm. Default 50mm") | |
var mitersize = 10;// "Size of miter in mm. Default 10mm") | |
var thick = 3.0;// "Thickness of material in mm. Default 3.0") | |
var kerf = 0.16; //"Kerf of laserbeam (width of the cut) in mm." | |
//" See http://blog.ponoko.com/2008/09/11/how-much-material-does-the-laser-burn-away/. " | |
//"Default 0.16mm") | |
var recthole1 = false; //', help="Add rectangular hole rw,rh in side 1") | |
var recthole2 = false; //"Add rectangular hole rw,rh in side 2") | |
var recthole3 = false; //"Add rectangular hole rw,rh in side 3") | |
var recthole4 = false; //"Add rectangular hole rw,rh in side 4") | |
var recthole5 = false; //"Add rectangular hole rw,rh in side 5") | |
var recthole6 = false; //"Add rectangular hole rw,rh in side 6") | |
var nrmiterh = 0; | |
var nrmiterw = 0; | |
var nrmited = 0; | |
function main(params) | |
{ | |
var sidenr = 0; | |
var startx = 5+width/2; | |
var starty = 5+heigth/2; | |
checkinput(); | |
var polypoints = squareframe(startx, starty, width, heigth, nrmiterw, nrmiterh, | |
thick, false, false); | |
OpenJsCad.log(polypoints); | |
var shape1 = new CSG.Polygon2D( polypoints ).extrude({offset: [0, 0, thick]}); | |
//var shape1 = CAG.fromPoints( polypoints ); | |
var points = [new CSG.Vector2D(0,0)]; | |
points[1] = new CSG.Vector2D(0,10); | |
points[2] = new CSG.Vector2D(10,10); | |
//var shape1 = CAG.fromPoints( points ); | |
return shape1; | |
} | |
function float2int (value) { | |
return ~~value; | |
} | |
function checkinput() | |
{ | |
nrmiterw = float2int(round(width / mitersize )); | |
if (nrmiterw % 2 === 0) { nrmiterw += 1; } | |
if (width/nrmiterw < 2*thick) { | |
nrmiterw -= 2; | |
} | |
nrmiterh = float2int(round(heigth / mitersize )); | |
if (nrmiterh % 2 === 0) { nrmiterh += 1;} | |
if (heigth/nrmiterh < 2*thick) { | |
nrmiterh -= 2; | |
} | |
nrmiterd = float2int(round(depth / mitersize )); | |
if (nrmiterd % 2 === 0) { nrmiterd += 1;} | |
if (depth/nrmiterd < 2*thick) { | |
nrmiterd -= 2; | |
} | |
if (nrmiterw < 1 || nrmiterh < 1 || nrmiterd < 1) { | |
throw new Error("ERROR: reduce mitersize, corners will break off otherwise!"); | |
} | |
OpenJsCad.log("Check OK"); | |
} | |
//one of 4 sides of a box sde | |
function side(w,h,corner_sizex,corner_sizey,thick,cut_width, div_x, div_y, | |
invertX, invertY, xm, ym, openlid) | |
{ | |
var outpx = []; | |
var outpy = []; | |
if (openlid) { | |
miter = 0; | |
} else { | |
miter = 1; | |
} | |
var dx = corner_sizex*xm; | |
var dy = corner_sizey*ym; | |
if (invertX) {dx-=thick*xm;} | |
if (invertY) {dy-=thick*ym;} | |
half_cut = cut_width/2 * (xm+ym); | |
if (invertY && xm) { | |
half_cut = -half_cut; | |
} | |
if (invertX && ym) { | |
half_cut = -half_cut; | |
} | |
d = xm-ym; | |
if (invertY && xm) d = -d; | |
if (invertX && ym) d = -d; | |
outpx.push(dx+half_cut*Math.abs(xm)); // += PathMove(dx+half_cut*Math.abs(xm),dy+half_cut*Math.abs(ym)) | |
outpy.push(dy+half_cut*Math.abs(ym)); | |
dy = thick *d *Math.abs(xm) *miter; | |
dx = thick *d *Math.abs(ym) *miter; | |
d = -d; | |
outpx.push(dx); // += PathMove(dx,dy) | |
outpy.push(dy); | |
half_cut = -half_cut; | |
//All but the center one | |
ax = (w-2*corner_sizex) / (2*div_x+1); | |
ay = (h-2*corner_sizey) / (2*div_y+1); | |
//the center one | |
bx = w-2*corner_sizex-ax*(2*div_x); | |
by = h-2*corner_sizey-ay*(2*div_y); | |
for (i = 0; i < Math.abs(div_x*xm+div_y*ym); i++) { | |
dx = ax*xm; | |
dy = ay*ym; | |
outpx.push(dx+half_cut*Math.abs(xm)); // PathMove(dx+half_cut*Math.abs(xm),dy+half_cut*Math.abs(ym)) | |
outpy.push(dy+half_cut*Math.abs(ym)); | |
dy = thick *d*Math.abs(xm) *miter; | |
dx = thick *d*Math.abs(ym) *miter; | |
d = -d; | |
outpx.push(dx); //PolyPoint(dx,dy) | |
outpy.push(dy); | |
half_cut = -half_cut; | |
} | |
dx = bx*xm; | |
dy = by*ym; | |
outpx.push(dx+half_cut*Math.abs(xm)); // PathMove(dx+half_cut*Math.abs(xm), dy+half_cut*Math.abs(ym)) | |
outpy.push(dy+half_cut*Math.abs(ym)); | |
dy = thick *d*Math.abs(xm) *miter; | |
dx = thick *d*Math.abs(ym) *miter; | |
d = -d; | |
outpx.push(dx); //PolyPoint(dx,dy) | |
outpy.push(dy); | |
half_cut = -half_cut; | |
for (i = 0; i < Math.abs(div_x*xm+div_y*ym); i++) { | |
dx = ax*xm; | |
dy = ay*ym; | |
outpx.push(dx+half_cut*Math.abs(xm)); //PolyPoint(dx+half_cut*Math.abs(xm), dy+half_cut*Math.abs(ym) | |
outpy.push(dy+half_cut*Math.abs(ym)); | |
dy = thick *d*Math.abs(xm) *miter; | |
dx = thick *d*Math.abs(ym) *miter; | |
d = -d; | |
outpx.push(dx); //PathMove(dx,dy) | |
outpy.push(dy); | |
half_cut = -half_cut; | |
} | |
dx = corner_sizex*xm; | |
dy = corner_sizey*ym; | |
if (invertX && xm) dx -= thick * xm; | |
if (invertY && ym) dy -= thick * ym; | |
outpx.push(dx); //PathMove(dx,dy) | |
outpy.push(dy); | |
return [outpx, outpy]; | |
} | |
// x,y: origin of start in mm | |
// w,h: width and height in mm | |
// nrmiterw/h: number of miter intervals along w and h | |
// thick: thickness of material | |
// invert: invert in x or y direction the logic | |
function squareframe(x, y, w, h, nrmiterw, nrmiterh, thick, invertX, invertY, openlid) | |
{ | |
var i; | |
div_x = float2int((nrmiterw-3) / 2); | |
div_y = float2int((nrmiterh-3) / 2); | |
corner_sizex = w/nrmiterw; | |
corner_sizey = h/nrmiterh; | |
//convert to 1/10th mm | |
//x = 10*x; y=10*y; w=10*w; h=10*h;thick=10*thick; | |
//corner_sizex = corner_sizex*10;corner_sizey = corner_sizey*10; | |
//cut_width = kerf*10; | |
cut_width = kerf; | |
x = x-w/2; | |
if (invertX) x+=thick; | |
y = y-h/2; | |
if (invertY) y+=thick; | |
//start point | |
var xstart = x; | |
var ystart = y; | |
var nrpoly = 0; | |
var polypt = [new CSG.Vector2D( xstart, ystart)]; | |
//top side | |
var sidetop = side(w,h,corner_sizex,corner_sizey,thick,cut_width, | |
div_x,div_y, invertX, invertY, 1, 0, openlid===1); | |
//Right Side | |
var sideright= side(w,h,corner_sizex,corner_sizey,thick,cut_width, | |
div_x,div_y, invertX, invertY, 0, 1, openlid===2); | |
// bottom Side | |
var sidebottom = side(w,h,corner_sizex,corner_sizey,thick,cut_width, | |
div_x,div_y, invertX, invertY, -1, 0, openlid===3); | |
// Left side | |
var sideleft = side(w,h,corner_sizex,corner_sizey,thick,cut_width, | |
div_x,div_y, invertX, invertY, 0, -1, openlid===4); | |
// add all in a polygon | |
for (i=0; i<sidetop[0].length; i++ ) { | |
polypt[nrpoly+1] = new CSG.Vector2D( sidetop[0][i]+polypt[nrpoly].x , | |
sidetop[1][i]+polypt[nrpoly].y ); | |
nrpoly += 1; | |
} | |
for (i=0; i<sideright[0].length; i++ ) { | |
polypt[nrpoly+1] = new CSG.Vector2D( sideright[0][i]+polypt[nrpoly].x , | |
sideright[1][i]+polypt[nrpoly].y ); | |
nrpoly += 1; | |
} | |
for (i=0; i<sidebottom[0].length; i++ ) { | |
polypt[nrpoly+1] = new CSG.Vector2D( sidebottom[0][i]+polypt[nrpoly].x , | |
sidebottom[1][i]+polypt[nrpoly].y ); | |
nrpoly += 1; | |
} | |
for (i=0; i<sideleft[0].length; i++ ) { | |
polypt[nrpoly+1] = new CSG.Vector2D( sideleft[0][i]+polypt[nrpoly].x , | |
sideleft[1][i]+polypt[nrpoly].y ); | |
nrpoly += 1; | |
} | |
return polypt ; | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment