diff --git a/hookdemo.html b/hookdemo.html
index b360a75..7eb90db 100644
--- a/hookdemo.html
+++ b/hookdemo.html
@@ -69,13 +69,13 @@ and use the OpenJsCad parser. For more inf
// Here we define the user editable parameters:
function getParameterDefinitions() {
return [
- { name: 'topdiameter', caption: 'Inner diameter of top hook:', type: 'float', default: 10 },
- { name: 'clampfactor', caption: 'Snugness of top hook (0 - 100):', type: 'float', default: 20 },
+ { name: 'topdiameter', caption: 'Inner diameter of top hook:', type: 'float', default: 16.7 },
+ { name: 'clampfactor', caption: 'Snugness of top hook (0 - 100):', type: 'float', default: 25 },
{ name: 'cliplength', caption: 'Top hook clip length:', type: 'float', default: 5 },
- { name: 'bottomdiameter', caption: 'Inner diameter of bottom hook:', type: 'float', default: 15 },
- { name: 'height', caption: 'Outer height of the hook:', type: 'float', default: 50 },
+ { name: 'bottomdiameter', caption: 'Inner diameter of bottom hook:', type: 'float', default: 20 },
+ { name: 'height', caption: 'Outer height of the hook:', type: 'float', default: 60 },
{ name: 'thickness', caption: 'Thickness:', type: 'float', default: 5 },
- { name: 'width', caption: 'Width:', type: 'float', default: 10 },
+ { name: 'width', caption: 'Width:', type: 'float', default: 7 },
{
name: 'rounded',
type: 'choice',
@@ -84,13 +84,17 @@ function getParameterDefinitions() {
captions: ["No", "Yes (rendering will take a long time!)"],
default: 0,
},
- { name: 'roundness', caption: 'Diameter of rounded edges (if enabled):', type: 'float', default: 1 },
+ { name: 'roundness', caption: 'Diameter of rounded edges (if enabled):', type: 'float', default: 1.5 },
+ { name: 'buildwidth', caption: 'Width (x) of build area (to print multiple copies):', type: 'float', default: 90 },
+ { name: 'builddepth', caption: 'Depth (y) of build area (to print multiple copies):', type: 'float', default: 90 },
];
}
function main(params) {
+ if(OpenJsCad.log) OpenJsCad.log("start");
+
var pathresolution = 16;
- var expandresolution = 16;
+ var expandresolution = 6;
// construct the 2D path:
var topradius = params.topdiameter/2;
@@ -162,17 +166,44 @@ function main(params) {
path = path.transform(matrix);
// extrude the path to create a 3D solid
- var result = path.rectangularExtrude(2*(halfthickness-roundness), params.width-2*roundness, pathresolution, true);
- result = result.translate([0, 0, -params.width/2+roundness]);
+ var hook = path.rectangularExtrude(2*(halfthickness-roundness), params.width-2*roundness, pathresolution, true);
+ hook = hook.translate([0, 0, -params.width/2+roundness]);
// expand to create rounded corners:
if(roundness > 0)
{
- result = result.expand(roundness, expandresolution);
+ hook = hook.expand(roundness, expandresolution);
}
+ // hook = hook.toPointCloud(0.1);
+
+ // determine how many objects will fit in the build area:
+ var bounds = hook.getBounds();
+ var objsize = bounds[1].minus(bounds[0]);
+ var margin = 5; // distance between the copies
+ var numx = Math.floor((params.buildwidth + margin) / (objsize.x + margin));
+ var numy = Math.floor((params.builddepth + margin) / (objsize.y + margin));
+ if(numx < 1) numx = 1;
+ if(numy < 1) numy = 1;
+
+ // and make the copies:
+ var result = new CSG();
+ for(var x = 0; x < numx; x++)
+ {
+ var deltax = ((1-numx)/2+x) * (objsize.x + margin);
+ var colresult = new CSG();
+ for(var y = 0; y < numy; y++)
+ {
+ var deltay = ((1-numy)/2+y) * (objsize.y + margin);
+ var translated = hook.translate(new CSG.Vector3D(deltax, deltay, 0));
+ colresult = colresult.union(translated);
+ }
+ result = result.union(colresult);
+ }
+ if(OpenJsCad.log) OpenJsCad.log("finish");
return result;
-}
+}
+