From eadd9cf355d35bd57d4dd960969705d43cb955f2 Mon Sep 17 00:00:00 2001 From: Stewart Allen Date: Mon, 14 Dec 2020 14:51:36 -0500 Subject: [PATCH] complete basic auto support generation --- src/kiri/conf.js | 1 + src/kiri/init.js | 1 + src/mode/fdm/driver.js | 2 +- src/mode/fdm/slice.js | 23 ++++++++++------------- web/kiri/lang/en.js | 2 ++ 5 files changed, 15 insertions(+), 14 deletions(-) diff --git a/src/kiri/conf.js b/src/kiri/conf.js index 2d9d865d..e6b33feb 100644 --- a/src/kiri/conf.js +++ b/src/kiri/conf.js @@ -295,6 +295,7 @@ sliceSupportArea: 1, sliceSupportExtra: 0, sliceSupportSpan: 5, + sliceSupportAngle: 50, sliceSupportNozzle: 0, sliceSolidMinArea: 1, sliceSolidLayers: 3, diff --git a/src/kiri/init.js b/src/kiri/init.js index 535602bf..6a0ae65a 100644 --- a/src/kiri/init.js +++ b/src/kiri/init.js @@ -1619,6 +1619,7 @@ fdmSep: UC.newBlank({class:"pop-sep", modes:FDM}), sliceSupportSpan: UC.newInput(LANG.sp_span_s, {title:LANG.sp_span_l, bound:UC.bound(0.0,200.0), convert:UC.toFloat, modes:FDM, show: () => UI.sliceSupportEnable.checked}), sliceSupportEnable: UC.newBoolean(LANG.sp_auto_s, onBooleanClick, {title: LANG.sp_auto_l, modes:FDM, trigger:true}), + sliceSupportAngle: LOCAL ? UC.newInput(LANG.sp_angl_s, {title:LANG.sp_angl_l, bound:UC.bound(0.0,90.0), convert:UC.toFloat, modes:FDM}) : null, fdmSep: UC.newBlank({class:"pop-sep", modes:FDM}), sliceSupportGen: LOCAL ? UC.newRow([ diff --git a/src/mode/fdm/driver.js b/src/mode/fdm/driver.js index eccdea0e..c89a721b 100644 --- a/src/mode/fdm/driver.js +++ b/src/mode/fdm/driver.js @@ -42,7 +42,7 @@ KIRI.client.sync(); let settings = API.conf.get(); let widgets = API.widgets.map(); - send('fdm_support_generate', {}, (gen) => { + send('fdm_support_generate', { settings }, (gen) => { for (let g of gen) g.widget = widgets[g.id]; ondone(gen); }); diff --git a/src/mode/fdm/slice.js b/src/mode/fdm/slice.js index 0d6e4aab..d2fa576f 100644 --- a/src/mode/fdm/slice.js +++ b/src/mode/fdm/slice.js @@ -1077,27 +1077,24 @@ FDM.supports = function(settings, widget) { let buf = new THREE.BufferGeometry(); buf.setAttribute('position', new THREE.BufferAttribute(widget.vertices, 3)); + let mat = new THREE.MeshBasicMaterial(); let geo = new THREE.Geometry().fromBufferGeometry(buf); - // console.log('geo', - // geo, - // { - // "<": geo.faces.filter(f => f.normal.z < 0), - // ">": geo.faces.filter(f => f.normal.z > 0), - // "=": geo.faces.filter(f => f.normal.z == 0) - // } - // ); - let mesh = new THREE.Mesh(geo, new THREE.MeshBasicMaterial()); + let angle = (Math.PI / 180) * settings.process.sliceSupportAngle; + let thresh = -Math.sin(angle); + let mesh = new THREE.Mesh(geo, mat); let dir = new THREE.Vector3(0,0,-1) let add = []; - geo.faces.filter(f => f.normal.z < 0).forEach(face => { + let platform = new THREE.Mesh( + new THREE.PlaneGeometry(1000,1000,1), mat + ); + geo.faces.filter(f => f.normal.z < thresh).forEach(face => { let a = geo.vertices[face.a]; let b = geo.vertices[face.b]; let c = geo.vertices[face.c]; let point = a.add(b).add(c).divideScalar(3); let ray = new THREE.Raycaster(point, dir); - let int = ray.intersectObjects([ mesh ], false); - if (int && int.length) { - console.log(int); + let int = ray.intersectObjects([ mesh, platform ], false); + if (int && int.length && int[0].distance > 0.01) { let mid = new THREE.Vector3().add(point).add(int[0].point).divideScalar(2); add.push({from: point, to: int[0].point, mid}); } diff --git a/web/kiri/lang/en.js b/web/kiri/lang/en.js index f0a08717..e08674e9 100644 --- a/web/kiri/lang/en.js +++ b/web/kiri/lang/en.js @@ -235,6 +235,8 @@ kiri.lang['en-us'] = { sp_gaps_l: "number of layers\noffset from part", sp_span_s: "max span", sp_span_l: "unsupported span that causes\na new support to be generated\nin millimeters", + sp_angl_s: "max angle", + sp_angl_l: "max overhang angle before\nsupporting pillar is generated", sp_area_s: "min area", sp_area_l: "minimum area for\na support column\nin millimeters", sp_xpnd_s: "expand",