Skip to content

Instantly share code, notes, and snippets.

@bmcage
Created February 3, 2015 10:14
Show Gist options
  • Save bmcage/a6c6b234911971bc390a to your computer and use it in GitHub Desktop.
Save bmcage/a6c6b234911971bc390a to your computer and use it in GitHub Desktop.
// 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