craft-puzzle
Version:
craft parameterized puzzle pieces
166 lines (142 loc) • 6.88 kB
text/xml
<craft>
<parameter name="side1" type="string" default="none"/>
<parameter name="side2" type="string" default="none"/>
<parameter name="side3" type="string" default="none"/>
<parameter name="side4" type="string" default="none"/>
<script type="text/openjscad">
function main(params) {
// to do: deal with minus sign
// if minus -> difference
// if plus -> union
// to do: deal with no sideN parameter e.g.) only side1, side2?
var connectors = []; //for connector addtion
var holes = []; //for connector hole
if (params.side1 != 'none') { //bottom
var direction = params.side1[0]
console.log(direction)
var shape = params.side1.substring(1,params.side1.length)
if(shape === 'triangle'){
var connector1 = cylinder({r:5,fn:3})
.rotateZ(60)
}else if(shape === 'rectangle'){
var connector1 = cylinder({r:4,fn:4})
.rotateZ(45)
}else if(shape === 'circle'){
var connector1 = cylinder({r:4,fn:50})
}else if(shape === 'pentagon'){
var connector1 = cylinder({r:4,fn:5})
}else if(shape === 'hexagon'){
var connector1 = cylinder({r:4,fn:6})
}else if(shape === 'heptagon'){
var connector1 = cylinder({r:4,fn:7})
}else if(shape === 'octagon'){
var connector1 = cylinder({r:4,fn:10})
}
if(direction === '+')
connectors.push(connector1.translate([10,0,0]));
else if(direction === '-')
holes.push(connector1.translate([10,0,0]))
else
console.log("You need to specify the direction of connector at the bottom.\nconvex: + \nconcave: -")
}
if (params.side2 != 'none') { //left
var direction = params.side2[0]
var shape = params.side2.substring(1,params.side2.length)
if(shape === 'triangle'){
var connector2 = cylinder({r:5,fn:3}).rotateZ(180)
}else if(shape === 'rectangle'){
var connector2 = cylinder({r:4,fn:4})
.rotateZ(45)
}else if(shape === 'circle'){
var connector2 = cylinder({r:4,fn:50})
}else if(shape === 'pentagon'){
var connector2 = cylinder({r:4,fn:5})
}else if(shape === 'hexagon'){
var connector2 = cylinder({r:4,fn:6})
}else if(shape === 'heptagon'){
var connector2 = cylinder({r:4,fn:7})
}else if(shape === 'octagon'){
var connector2 = cylinder({r:4,fn:10})
}
if(direction === '+')
connectors.push(connector2.translate([0,10,0]));
else if(direction === '-')
holes.push(connector2.translate([0,10,0]));
else
console.log("You need to specify the direction of connector at the left.\nconvex: + \nconcave: -")
}
if (params.side3 != 'none') { //top
var direction = params.side3[0]
var shape = params.side3.substring(1,params.side3.length)
if(shape === 'triangle'){
var connector3 = cylinder({r:5,fn:3}).rotateZ(180)
}else if(shape === 'rectangle'){
var connector3 = cylinder({r:4,fn:4})
.rotateZ(45)
}else if(shape === 'circle'){
var connector3 = cylinder({r:4,fn:50})
}else if(shape === 'pentagon'){
var connector3 = cylinder({r:4,fn:5})
}else if(shape === 'hexagon'){
var connector3 = cylinder({r:4,fn:6})
}else if(shape === 'heptagon'){
var connector3 = cylinder({r:4,fn:7})
}else if(shape === 'octagon'){
var connector3 = cylinder({r:4,fn:10})
}
if(direction === '+')
connectors.push(connector3.translate([10,20,0]));
else if(direction === '-')
holes.push(connector3.translate([10,20,0]));
else
console.log("You need to specify the direction of connector at the top of \nconvex: + \nconcave: -")
}
if (params.side4 != 'none') { //top
var direction = params.side4[0]
var shape = params.side4.substring(1,params.side4.length)
if(shape === 'triangle'){
var connector4 = cylinder({r:5,fn:3}).rotateZ(180)
}else if(shape === 'rectangle'){
var connector4 = cylinder({r:4,fn:4})
.rotateZ(45)
}else if(shape === 'circle'){
var connector4 = cylinder({r:4,fn:50})
}else if(shape === 'pentagon'){
var connector4 = cylinder({r:4,fn:5})
}else if(shape === 'hexagon'){
var connector4 = cylinder({r:4,fn:6})
}else if(shape === 'heptagon'){
var connector4 = cylinder({r:4,fn:7})
}else if(shape === 'octagon'){
var connector4 = cylinder({r:4,fn:10})
}
if(direction === '+')
connectors.push(connector4.translate([20,10,0]));
else if(direction === '-')
holes.push(connector4.translate([20,10,0]));
else
console.log("You need to specify the direction of connector at the right.\nconvex: + \nconcave: -")
}
var piece = cube([20,20,1])
connectors.forEach(function(c){
console.log("now adding side")
piece = union(piece, c)
return piece;
})
holes.forEach(function(h){
console.log("now subtracting side")
piece = difference(piece, h)
return piece;
})
return piece;
/*
return union(
cube([20, 20, 1]) //flat canvas
,connector1 //should deal with case withough sideN param
,connector2
,connector3
,connector4
);*/
} // end of main
</script>
</craft>